From ecafa110f23c6f9414d5f38897aaab32c40729a9 Mon Sep 17 00:00:00 2001 From: laoyang Date: Tue, 29 Sep 2026 23:48:45 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=B6=E6=AE=B5=200=20=E8=B5=B7=E6=AD=A5?= =?UTF-8?q?=EF=BC=9A=E5=9B=BE=E6=A0=87=E4=B8=8E=E7=8E=AF=E5=A2=83=E8=87=AA?= =?UTF-8?q?=E6=A3=80=E8=84=9A=E6=89=8B=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - assets/icons 全套图标:SVG 源文件 + maskable + 12 档 PNG - favicon.ico / apple-touch-icon.png / site.webmanifest - index.php 环境自检页(PHP 版本 / 必需扩展 / 配置 / 数据库连接), 详情页默认不打印连接错误原文,避免泄露数据库账号名 - config.example.php:数据库与 app_key 的配置模板(config.php 不入库) - README 补充项目定位与六阶段路线图;.gitignore 沿用既有约定 --- .gitignore | 15 +++ README.md | 63 +++++++++- apple-touch-icon.png | Bin 0 -> 3665 bytes assets/icons/familybook-icon-maskable.svg | 29 +++++ assets/icons/familybook-icon.svg | 45 +++++++ assets/icons/icon-128.png | Bin 0 -> 2919 bytes assets/icons/icon-144.png | Bin 0 -> 3530 bytes assets/icons/icon-16.png | Bin 0 -> 475 bytes assets/icons/icon-180.png | Bin 0 -> 4649 bytes assets/icons/icon-192-maskable.png | Bin 0 -> 3229 bytes assets/icons/icon-192.png | Bin 0 -> 4696 bytes assets/icons/icon-256.png | Bin 0 -> 6548 bytes assets/icons/icon-32.png | Bin 0 -> 789 bytes assets/icons/icon-384.png | Bin 0 -> 11205 bytes assets/icons/icon-48.png | Bin 0 -> 1117 bytes assets/icons/icon-512-maskable.png | Bin 0 -> 12300 bytes assets/icons/icon-512.png | Bin 0 -> 16926 bytes assets/icons/icon-64.png | Bin 0 -> 1388 bytes assets/icons/icon-96.png | Bin 0 -> 2238 bytes config.example.php | 41 +++++++ favicon.ico | Bin 0 -> 8339 bytes index.php | 141 ++++++++++++++++++++++ site.webmanifest | 17 +++ 23 files changed, 350 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 apple-touch-icon.png create mode 100644 assets/icons/familybook-icon-maskable.svg create mode 100644 assets/icons/familybook-icon.svg create mode 100644 assets/icons/icon-128.png create mode 100644 assets/icons/icon-144.png create mode 100644 assets/icons/icon-16.png create mode 100644 assets/icons/icon-180.png create mode 100644 assets/icons/icon-192-maskable.png create mode 100644 assets/icons/icon-192.png create mode 100644 assets/icons/icon-256.png create mode 100644 assets/icons/icon-32.png create mode 100644 assets/icons/icon-384.png create mode 100644 assets/icons/icon-48.png create mode 100644 assets/icons/icon-512-maskable.png create mode 100644 assets/icons/icon-512.png create mode 100644 assets/icons/icon-64.png create mode 100644 assets/icons/icon-96.png create mode 100644 config.example.php create mode 100644 favicon.ico create mode 100644 index.php create mode 100644 site.webmanifest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..52e1306 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# ── 本地配置(含数据库口令与加密密钥),不入库 ────────────────────────────── +# 部署时由服务器上的 config.php 提供;新环境请复制 config.example.php 再改。 +config.php + +# ── 用户上传内容(头像 / 照片 / 附件),不入库 ────────────────────────────── +# 只保留「禁止执行脚本」的保护规则,否则上传的 .php 能被直接访问。 +uploads/* +!uploads/.htaccess + +# ── 临时产物 ──────────────────────────────────────────────────────────────── +*.bak +*.bak.* +*~ +.DS_Store +Thumbs.db diff --git a/README.md b/README.md index 235e150..bf5b472 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,64 @@ # FamilyBook -家书,记录家庭的全部生活,一本用岁月写成的家谱。 \ No newline at end of file +**家书,记录家庭的全部生活,一本用岁月写成的家谱。** + +> 把一个家的「人」「日子」「去过的地方、看过的电影」收进同一本书里。 + +--- + +## 它是什么 + +一个自托管的家庭生活系统。它不是又一个待办清单,而是**这个家的长期档案** —— +十年之后还能翻出孩子第一次观影的票根、那年暑假走过的路线。 + +围绕三个圈展开: + +- **人**:家庭成员、亲友通讯录,以及他们之间的共享关系 +- **时间**:日历、日程、提醒,以及任务的期限 +- **事件**:观影、旅行、其他活动 —— 一切都落在同一条时间轴上 + +## 它在做什么 + +| 阶段 | 主题 | 内容 | +| --- | --- | --- | +| 0 | 地基 | 名册、账号、登录、权限模型、安装向导 | +| 1 | 通信 | 通讯录、共享给某个成员、CardDAV 服务端 | +| 2 | 时间 | 日历本、重复日程、提醒、CalDAV 服务端 | +| 3 | 归一 | 观影与旅行迁入统一事件模型 | +| 4 | 任务 | 任务管理,期限自动映射成日历事件 | +| 5 | 回看 | 统计、年度家书、时间轴 | + +当前进度:**阶段 0 起步**,仓库里只有图标与脚手架。 + +## 技术选型 + +- PHP 7.4+(无框架、无 Composer,上传到站点目录即可运行) +- MySQL 5.7+ / 8.0(`utf8mb4`) +- 前端为原生 HTML / CSS / JavaScript,无构建步骤 + +⚠️ 注意 CalDAV / CardDAV 是**双向协议**,和单纯的 `.ics` 文件导出不是一个量级的东西。 + +## 部署 + +1. 把代码放到站点根目录; +2. 复制 `config.example.php` 为 `config.php`,填写数据库与 `app_key`; +3. 访问站点根,按引导页确认 PHP 版本、扩展、配置、数据库连接四项都通过。 + +`config.php` 不入库(已在 `.gitignore` 中忽略),其中包含数据库口令与加密密钥。 + +⚠️ **`app_key` 一旦开始记录数据就不能再改**(换掉即解不开已有数据), +并且它必须单独备份 —— 密钥丢失等同于数据永久丢失。 + +## 隐私 + +身份证号、手机号属于敏感个人信息,一律加密存储。 +(就家庭自用而言,身份证号其实没有多少必须存的场景,启用前请三思。) + +## 图标 + +见 `assets/icons/`。概念是「**这本书就是家**」:屋顶即一本摊开的书, +屋顶下纸做的墙上,三行横线是这个家写下的日子。 + +## 开源协议 + +[Apache License 2.0](LICENSE) diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0078552c8380280d18199a581339b1a12559166b GIT binary patch literal 3665 zcmaJ^c{CJW`$vPZ%ot17vF|0zB#ms@DN866Nim3uL7A`J48}T`>_kx{%OLx{@5Y|! zYcFIS6hoHZIKAim{&>%M|G3X{KF@RSvwWU=|G1HNO!PsFyo^*-R3JkG9dnAVIA1^- ziYzB2ASjB#!{ELb6_u^t`J(1X)Yhb;0$(uH(Y%Yw+?+Y|;z01ylMXHRQ(jIyd^kD% zlFO&Rp0ziMSJ#RIf}p*nrOgp%?;WDsE(~0-ZV{mtUxolegu+APL*q?gX|~#?U{CDN zUd=oe96R1|Kf!_3LufPR`N{MNzYz&Ce|nY76~lx>GdpR28_*zf9A z4W#rML7`-oPSYHVe8!Av2J4+%sco(Jd8Uyxo@*t>$|}X7excR$fkz8ZmvAAk&hKUp zJ-||03BciVL=PKIC}KYB!V-;OXxZhO4l3}=dm*30u$m&R(JDaPa2?xysR8!1!OB_A z+*_+-T~cP_m%HMSiSY3ZDO=AvWE|GTRr|zDJx;tB_S`#ShJ5T=ps4r z!{jFJuvkr?lC`cHGB}$}Z)6NB07rY#^?9VlIgyerGHJoKA-)5f4&lGCN?=<@luZ1v z=;%ie9oULJhZi$?|LCs6a?8tb`Z_0OM_y1PsFywt#h!!DvFtpv5 zD-l=M|3Q)^B}>&7U%7p2|8$t3vL=fW0$p~+}l?@{8j*mah_EAjxA%V9n>@rUwCQEELEc0*xawq-soX!__?R9fP}SKquyzOm64YcPQ zE%NL3;DHxJO&2#)#+P0gI6)bYHtwErZUG~p)e;3pS4j3 zT&Pb(Og20ut=*QtbRWOn?6=d}gIGmt-w9A%FIz!pH_bAcQw}O@c1n6Jo^d2GH&RNq zI{T4gj9gO+lY^{+_3^3&kNS*j>Xs;W|Cxp@Je2fU6I!zVPq(uu1^^cRo(tz|s7uaLP7gYg z@M{hDoS+HBLUzp(Y1MT&J4ZbB4ffGmz4@NCReLMxnD-DORteQ zGg*YwPTHAE3Wj~{pgd0$>4Jw~JlwJRv&$Z%HO~O0bQ9H5yQYN-5wLspXZb^r2agP8 zro^;5%O*4TE6`cK-zn;Lj6`$*RBISpT~E9OzsqBIyTzEBmeSU5KNLi;0*R_$XH@s) zhjw&8-yGBjn9fvg7u18*&gOfov-|F=N;>akqLbo6GHTkpw*c-w#c4>CiknP~ehnEmQQS zzbdY}k$=Le1^Id6)S-=ryo(+D0J<$Huvgg_IZxA;FY#kAWdD-GQq7dB#u<1W23wh% zd3D&)(f-ORlUnX9rr`8=Fhr@|4Ed}2>rnHa3~IsIXzSCV1xu3zLK$`FoTZ^|qvy?Z zn{OnRtCdO6&^8}zqIOzBxyEjSBgdMae?3z}1-dML`F<$jIS)&5IRGI*Ot?DiL+ol- z^hP(*G5Sknh5Wyej19~HXR=ZbpByaf&eH95Te`0=B8>Mn?f(Yh8A2`HzHI#LdWVGW z!4;Y3I@j$KZ&54(1J^t9_RQKi!Nsv$pmFkO-?e4FC*P||D_CbxBR6B^ifdwrA)*z3 z^L4rUKmE`J1SzoDSWid1XmBa&O0leC9)*kr{7n-(K^~2ImKmPf^q&niT`3H_Ptbw? z50xp<ZE9D#t{Ds_xo_47D4V!<%Lb+TVjs3F=2PP-kv>UGMAMqEiRTJLFryJkC zG&}ZBPSoSS>DrCAnNIIC`C;-)yuDHK@{8>N2~Znp$kPJRU;VA0J$s}dTc`WDljj84 zQMHp}>1m~Ub$D3^5&~4esNr*c{Kfse{J4nf(imX(&3bL}?#XDeo429ygTB&ji9Vo? z>LVQaMOF6fWa?>w?9&^k_d~Y{W2ceTty$qC!n6oLP6Hmt+>22IB}VJ=bq~J{h0!P! zmxXgw*CG{TX4`(`%PB!~tLZM9VxA(&M>fc5;K1USfyp`72he7e3Pj(Y6CSwpDwPxa zXiE?!IQyL{{vjXIg}Q@d$Aop+L3Z=veQO9Qf^{% zM*izWFubjoRBIDuNgNCcz|mS%c$N&!ps!*jz*a{}BoXSaq$Uv3W%1)JLn;Eq{*yTy zgq{fX@>q`W)r@k(QOy?5&)kxxNYOu3`^uyM9F`q=%STP z%R2va-$F)KdJq&>?A8*^|NO=t>>L?)Hv{BeRn$r+i-LLQBv!Y#o7yz!?Y4U?>Q_Y5 znar;SW!Q_&X|HXsKRfny{*mvV6x5J7b=SXqpe%M9eg^tMSj#(6dtWYQetf{|aUu3* z5ljyoly?Z~Di>Sy$>x*L#;^@O)lRTgN?UGTL4x*`aI+5OE-`Kl9JXZ6yP@Zu@P z2_F}M#j2!5wumh>%;2BOcXR;kS}pxX+K>Pi_xKP z6!X$pG{`|O-TFd(f;381_C9@dS-@(t@^Y`~ELI&4>^BJ9J$U^ zt=EyD!`*#&lEF|4kz5ec+BTo&%2*W85-|i=Ka28PH9s<8yT{iY(s**$Qsjrj+iz3W z$u@opOcsT6LW;>hz}~NGF-d_BorVJ)>Tbfh>`m!W? zJ%t`2BO3X`a`bEL2ZVu-?Tx%5WslupS$vyO-T)MZEOT@;ymG<}C-prUF&I03*HtVt zTZJl;)n>=aM261pwMZ3#(7u{!O<$&s-!T9Q5LQ5*?TSmQ>K$T?NW4p ztGu0aak~NFhM*m8B|P`$v_f)9z_>Wj?uqJfCoacML6+f(Kf6(5)BM8{Yyjul8=ZmZ zkf}xqZvQ*k~S3O?F?~gXc$0ff1i0XnI7(nI^a2aVJy{ zbte~+SBcuQIv(*1YPyntav92fYZ*!+$Gz^X)TLSxE#nl`y_><(KdZ*hsM*Ez-mD@? S8I(UFm7%VQPKlO1`u_mMRtA9p literal 0 HcmV?d00001 diff --git a/assets/icons/familybook-icon-maskable.svg b/assets/icons/familybook-icon-maskable.svg new file mode 100644 index 0000000..4bf8abc --- /dev/null +++ b/assets/icons/familybook-icon-maskable.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/familybook-icon.svg b/assets/icons/familybook-icon.svg new file mode 100644 index 0000000..c004b25 --- /dev/null +++ b/assets/icons/familybook-icon.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/icon-128.png b/assets/icons/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..573b498bc5ff5266da8a120fd8996ef470c7d551 GIT binary patch literal 2919 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 O21gy;9Uj>Q(*6foOGq35 literal 0 HcmV?d00001 diff --git a/assets/icons/icon-144.png b/assets/icons/icon-144.png new file mode 100644 index 0000000000000000000000000000000000000000..9e8d5408116cbd8d0b3db08edfa8e373cd006f71 GIT binary patch literal 3530 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 literal 0 HcmV?d00001 diff --git a/assets/icons/icon-16.png b/assets/icons/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..6884c36bb8daf054c6377656aa308d77dfeefec7 GIT binary patch literal 475 zcmV<10VMv3P)z>&jY&j7R5*>5lU+-~P#nh3r-?p8bQ?kMP}D^bSQiBq5qS}Pfuf>| zimvJ+ijXo0S}%}6H)<+HvzKils5#ROnwzAk5l@_1%jK4J@w+G2=!v!^2XeHle-ZGqg@Zy>C+6&Ws7s;mikkw&EWU)Qe493|FHNo0Q zxB#)bwwegT(jRbPH$;hE}%tEJu$1SXnryEtNb6Y{fs zHrb<>e+nq!g<+^qH`W3rdWF;RPNPh5_cy{n-E9ac?A#zS@oTd{q2;j-Q<=hU%_DZW zW)kRy5ob0bdUhd)&Z`Al#UK@5B|SvLm8g*$ zyuamiXvRE9pQ9}J7%V&5|HPy3sA805p|#cq+HR&Sw3IhemvDi9taIS2`~eOYM`KMn R^56gf002ovPDHLkV1h~i&-4HQ literal 0 HcmV?d00001 diff --git a/assets/icons/icon-180.png b/assets/icons/icon-180.png new file mode 100644 index 0000000000000000000000000000000000000000..7f21b08b8efb175312ba8242ad500fb7a9416a5d GIT binary patch literal 4649 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 literal 0 HcmV?d00001 diff --git a/assets/icons/icon-192-maskable.png b/assets/icons/icon-192-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..9be3e6e97a1219f123c9340b8de2b2071f5df20e GIT binary patch literal 3229 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 literal 0 HcmV?d00001 diff --git a/assets/icons/icon-256.png b/assets/icons/icon-256.png new file mode 100644 index 0000000000000000000000000000000000000000..2793bf8f6ab62b5a9971444ddd1906931e6d8aad GIT binary patch literal 6548 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 literal 0 HcmV?d00001 diff --git a/assets/icons/icon-32.png b/assets/icons/icon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..392d9847f1155f2180dab841dd9142700e7cc5ef GIT binary patch literal 789 zcmV+w1M2*VP)z>($4Nv%R9J=8ms?NMa2Uq>A%rjBjX@GTVd5d`ji+HC4(0`NWxPj- z;pB}9hM;$Z1QNY6F@kI`qJjhgL0s%OIMLB&Oa%vPyP>Y#5Dn4C{Ohu@t?SmVlGxoyJ>=%!q+q5et zKv$o{Y?B#5_Y2JzlG0M(cRh!_@~{j~7LX+x%?P|7(dNV-uvrc$!ZQiT z5_P2z=AP*j@V$Nln`M7mI7yeO5VlLl(h9^ShO`MRPxZrEzE2fSLbumr@j;#rx_Mz9jHzT~~+-?Z&34HN5;H){Fg@g$lJ)kbIG-*Sxc~3?-$;9=`u{x%! zE~7wP!mcdvakLw~WkvB7mK4BoyB4l{t%~{f=`A+IRXO1mHBv#yZZZQFt1%$Tv4a6|NK+5x($3Y+U+6$MDI^a8x{A8{o30h>QVIe&trMmLe@aDxZBBkMKhlFo&DDm6^h^;Dm>W3_COL&?LeeU` zL!OSvn6&+)*@8J?J|q(IxU?NBPlm@N{GL2AE=fE)t94*ehq7VPlbm^M+oR7Puvi5) TU{!7l00000NkvXXu0mjfLWXL? literal 0 HcmV?d00001 diff --git a/assets/icons/icon-384.png b/assets/icons/icon-384.png new file mode 100644 index 0000000000000000000000000000000000000000..95e2c48e99ca683e98d10e84013270605c9bc825 GIT binary patch literal 11205 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 literal 0 HcmV?d00001 diff --git a/assets/icons/icon-512.png b/assets/icons/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..c432c54d7f83a525eaf23d4059833caca6ab1ffe GIT binary patch literal 16926 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 literal 0 HcmV?d00001 diff --git a/assets/icons/icon-64.png b/assets/icons/icon-64.png new file mode 100644 index 0000000000000000000000000000000000000000..f01bfd693e320bb9cc0dc7f5a05b51f8d6189acb GIT binary patch literal 1388 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 '家书', + // 站点对外根地址,末尾不要带斜杠。示例值,请替换成你自己的 + 'base_url' => 'https://example.com', + + // ---------------- 数据库(MySQL)---------------- + 'db' => [ + 'host' => '127.0.0.1', + 'port' => 3306, + 'name' => 'familybook', + 'user' => 'familybook', + 'pass' => '', + 'charset' => 'utf8mb4', + ], + + // ---------------- 敏感字段加密密钥 ---------------- + // 用于身份证号、手机号的对称加密(openssl AES-256-CBC)。 + // ⚠️ 开始记录数据之后这个值就不能再改:换掉它,已有数据就解不开了。 + // ⚠️ 请单独备份它。密钥丢失 = 数据永久丢失,比数据库丢了还严重。 + // 生成方式:openssl rand -hex 16 + 'app_key' => '请填写32位随机十六进制串', + + // ---------------- 调试 ---------------- + // true 时引导页会打印数据库连接错误的详情。 + // ⚠️ 线上务必保持 false —— 错误详情里可能带数据库账号名。 + 'debug' => false, +]; diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..07d27cfbbf4c97dd2bdcbf70f970d8f148c226a3 GIT binary patch literal 8339 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 PHP_VERSION_ID >= 70400, + 'val' => PHP_VERSION . '(需 7.4 以上)', +]; + +// 2. 必需扩展 +$needExt = ['pdo_mysql' => '数据库', 'mbstring' => '中文处理', 'openssl' => '敏感字段加密', 'json' => '配置与接口', 'gd' => '图片裁剪']; +foreach ($needExt as $ext => $why) { + $ok = extension_loaded($ext); + $checks['扩展 ' . $ext] = ['ok' => $ok, 'val' => $ok ? '已加载 · ' . $why : '缺失 · ' . $why]; +} + +// 3. 配置文件 +$checks['配置文件 config.php'] = [ + 'ok' => $hasConfig, + 'val' => $hasConfig ? '已就位' : '未找到(请复制 config.example.php 后填写)', +]; + +// 4. 数据库连接(只有配置齐全才去连) +if (is_array($config) && !empty($config['db'])) { + $d = $config['db']; + try { + $dsn = sprintf( + 'mysql:host=%s;port=%d;dbname=%s;charset=%s', + $d['host'], $d['port'], $d['name'], $d['charset'] + ); + $pdo = new PDO($dsn, $d['user'], $d['pass'], [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_EMULATE_PREPARES => false, + ]); + $ver = $pdo->query('SELECT VERSION()')->fetchColumn(); + $checks['数据库连接'] = ['ok' => true, 'val' => 'MySQL ' . $ver . ' · 库 ' . $d['name']]; + } catch (Throwable $e) { + $checks['数据库连接'] = [ + 'ok' => false, + 'val' => $debug ? $e->getMessage() : '连接失败(把 config.php 的 debug 设为 true 可看详情)', + ]; + } +} + +$allOk = true; +foreach ($checks as $c) { + $allOk = $allOk && $c['ok']; +} +$siteName = is_array($config) && !empty($config['site_name']) ? $config['site_name'] : '家书'; +?> + + + + +<?= htmlspecialchars($siteName, ENT_QUOTES, 'UTF-8') ?> · 环境自检 + + + + + + +
+
+ +
+

· 环境自检

+
+
+

FamilyBook —— 一本用岁月写成的家谱

+ + + +
    + $c): ?> +
  • + + + +
  • + +
+
+ + diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 0000000..be2ab58 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,17 @@ +{ + "name": "家书 FamilyBook", + "short_name": "家书", + "description": "记录家庭的全部生活,一本用岁月写成的家谱。", + "start_url": "/", + "scope": "/", + "display": "standalone", + "lang": "zh-CN", + "background_color": "#F2E9D8", + "theme_color": "#A84A28", + "icons": [ + { "src": "/assets/icons/icon-192.png", "sizes": "192x192", "type": "image/png" }, + { "src": "/assets/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }, + { "src": "/assets/icons/icon-192-maskable.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, + { "src": "/assets/icons/icon-512-maskable.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } + ] +}