fix(webui): make SSH Access page full-width like config/admin pages

The SSH Access page was boxed to max-width 860px and centered, unlike the
Overview and System admin pages (.admin-page) which span the full content
width. Drop the cap and match .admin-page padding so /admin/tools/ssh-access
looks like the rest of the Admin area.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Signed-off-by: librelad <librelad@digitalangels.vip>
This commit is contained in:
librelad 2026-05-25 22:12:50 +01:00
parent f2acb36a35
commit 16eda07b3d
40 changed files with 3530 additions and 3 deletions

View File

@ -2,9 +2,7 @@
backup.css for the cards; this file only adds page chrome + the key list. */
.ssh-page {
max-width: 860px;
margin: 0 auto;
padding: 8px 4px 40px;
padding: 4px 2px 40px;
}
/* "Tools" group heading in the Admin (config) sidebar, above SSH Access. */

1
site/dist/assets/apps/adguard.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M505.8 58.8C428.2 18.4 334.1 0 256 0h-.3v511.8c-21.5-12.7-41.1-26-59.1-39.6 18 13.7 37.8 27 59.4 39.8C506.8 363.4 505.8 146 505.8 58.8" style="fill-rule:evenodd;clip-rule:evenodd;fill:#68bc71"/><path d="M255.7 511.8C5.2 363.3 6.2 146 6.2 58.8 83.7 18.4 177.7 0 255.7 0z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#67b279"/><path d="m246.9 341.6 151-203.6c-11.1-8.9-20.8-2.6-26.1 2.2h-.2l-125.9 131-47.4-57.1c-22.6-26.2-53.4-6.2-60.6-.9z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"/></svg>

After

Width:  |  Height:  |  Size: 598 B

1
site/dist/assets/apps/authelia.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><linearGradient id="authelia_svg__a" x1="-7.464" x2="485.846" y1="532.755" y2="535.394" gradientTransform="translate(0 -278)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#3f51b4"/><stop offset="1" style="stop-color:#123156"/></linearGradient><path d="M256.7 128c67.4-1.9 128.3 52.3 128.6 127.9.3 72.7-58.1 128.6-129.3 128.5-70.2-.1-128.5-58.2-128-128.5.4-74.2 61.9-130.2 128.7-127.9m33.3 77.4c0-16.3-9.6-29.3-24.7-33.2-14.8-3.8-30.2 2.8-37.7 16-7.8 13.9-5.6 29.4 6.8 40.6 5.7 5.1 6.7 9.9 4.8 16.9-5.7 21.9-10.9 43.9-16.2 65.9-2 8.4.3 15.4 7.1 20.6 13.3 10.3 34.4 11.4 48.9 2.8 10.7-6.4 13.9-12.9 11.1-25-5.2-22.6-10.7-45.1-16.3-67.5-1.3-5.1-.7-8.4 3.8-11.9 7.9-6.3 13-14.5 12.4-25.2" style="fill:url(#authelia_svg__a)"/><linearGradient id="authelia_svg__b" x1="-7.511" x2="485.799" y1="541.56" y2="544.198" gradientTransform="translate(0 -278)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#3f51b4"/><stop offset="1" style="stop-color:#123156"/></linearGradient><path d="M254.9 447.7C163.1 450.2 76.7 380.2 65 279.1c-7.6-65.8 12.4-122.5 62-167.3 11.8-10.7 26.3-18.7 40.1-27 9.8-5.9 18.6-3 23.9 5.9 5.4 9.3 3.1 17.8-6.7 24.5-9.7 6.7-20.1 12.6-29.1 20.2-32.7 27.4-50.9 62.7-54.9 105.1-3.6 38.7 5 74.9 28.2 106.3C158.8 387.9 200 410 251.3 412c45.7 1.7 85.1-14.5 116.6-46.9 12.8-13.2 21.7-30.3 31.8-46.1 5.4-8.5 12.7-13 20.8-10.9 11.2 3 17.2 12.7 11.9 23.9-7.2 15.2-15.2 30.6-25.6 43.7-33.4 42.1-78 65-131.1 71.7-.8.1-1.5.2-2.3.2-6.2.1-12.4.1-18.5.1" style="fill:url(#authelia_svg__b)"/><linearGradient id="authelia_svg__c" x1="-7.285" x2="486.025" y1="499.335" y2="501.973" gradientTransform="translate(0 -278)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#3f51b4"/><stop offset="1" style="stop-color:#123156"/></linearGradient><path d="M226.6 4.5c4.1 0 8.2.1 12.3 0 7.4-.1 13.2 2 15 10.2 1.7 7.7-1.7 16.9-8.5 19.7-5.3 2.2-11.3 3.2-17.1 4-41.8 5.5-79.6 20.8-112 47.8C71 124 43.4 172 36.9 231.2c-6.4 58.4 8.9 111 43.5 158.1 5.6 7.6 12.4 14.4 18.2 22 6.8 8.8 5.7 17-2.6 24.5-6.9 6.3-16.4 6.1-23.5-1.2-42-43.2-66.3-94.5-71.4-154.9-2.2-26.1-1.2-51.8 4.1-77.4 8.1-39 25.1-73.9 49.8-104.9 39-48.8 89.4-79.6 150.9-91.7 6.7-1.3 13.8-1.1 20.7-1.6z" style="fill:url(#authelia_svg__c)"/><linearGradient id="authelia_svg__d" x1="-7.857" x2="485.453" y1="606.3" y2="608.938" gradientTransform="translate(0 -278)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#3f51b4"/><stop offset="1" style="stop-color:#123156"/></linearGradient><path d="M282.8 507.8c-2.8 0-5.7.2-8.5 0-9.2-.8-15.5-6.5-16.4-14.6-1-8.7 4.4-16.6 13.7-18.8 7.2-1.7 14.7-2.4 22-3.7 68.3-12.6 120-48.6 154.5-109.2C466 330 475.4 295.9 476.3 260c.7-27.3-3.7-54.3-13.8-80.1-1.6-4-2.5-9.2-1.4-13.2 2.1-7.5 7.2-13.1 15.8-13.8 8-.6 14.9 3 17.9 11.8 4.9 14.3 9.7 28.8 12.5 43.7 10 53.6 4.1 105.5-19.3 155-19.1 40.2-46.7 73.6-83.1 99.5-32.4 23-68.1 38.1-107.5 44.1-1.8.3-3.5.8-5.3.9-3.1 0-6.2-.1-9.3-.1" style="fill:url(#authelia_svg__d)"/><linearGradient id="authelia_svg__e" x1="-6.927" x2="486.383" y1="432.424" y2="435.062" gradientTransform="translate(0 -278)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#3f51b4"/><stop offset="1" style="stop-color:#123156"/></linearGradient><path d="M444.5 215.5c0 11.9-5.2 18.6-14.3 20.3-8.8 1.6-16.2-2.9-19.6-12.3-4.5-12.3-8.1-25-13.6-36.8-14.9-32.2-39.1-55.6-70.8-71.3-2.8-1.4-5.6-2.6-8.2-4.2-8.4-5.2-11.6-14.9-7.8-23.4 4-9 12.9-13.8 22.3-9.2 14.5 7 29 14.6 41.8 24.3 34.8 26.3 57.1 61.4 68.5 103.4.9 3.7 1.4 7.5 1.7 9.2" style="fill:url(#authelia_svg__e)"/></svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

1
site/dist/assets/apps/bookstack.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="m218.5 367 288.3-166.5v-63.4L403.9 77.7l-9.4-5.4-93.7-54.1L12.5 184.7c-13.6 24 0 63.4 0 63.4-16.8 25.5 0 63.4 0 63.4l206 118.9 182.8-105.5-182.8 105.6-206-118.9c-16.8 25.5 0 63.4 0 63.4l206 118.9 288.3-166.5V264l.1-.1v-63.4z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"/><path d="M218.5 496.3q-.6 0-1.2-.3l-206-119c-.4-.3-.8-.6-1-1.1-.7-1.6-17.1-39.4.2-65.7.7-1.1 2.1-1.4 3.2-.8l204.8 118.2 287.1-165.8c.7-.4 1.7-.4 2.4 0s1.2 1.2 1.2 2.1v63.4c0 .9-.5 1.6-1.2 2.1L219.7 495.9c-.3.3-.8.4-1.2.4m-204.1-123 204.1 117.8L504.4 326v-57.9L219.7 432.5c-.7.4-1.7.4-2.4 0l-204-117.7c-12.7 22.2-.9 53.4 1.1 58.5M218.5 306q-.6 0-1.2-.3l-206-118.9c-.7-.4-1.2-1.2-1.2-2.1s.5-1.6 1.2-2.1L299.6 16.1c.7-.4 1.7-.4 2.4 0L508 135c.7.4 1.2 1.2 1.2 2.1s-.5 1.6-1.2 2.1L219.7 305.6c-.3.3-.8.4-1.2.4M17.3 184.7l201.2 116.1L502 137.1 300.8 20.9zm201.2 184.7q-.6 0-1.2-.3l-206-118.9c-.5-.3-.9-.7-1.1-1.3-.6-1.7-13.8-40.7.2-65.4.3-.6.8-1 1.5-1.1.6-.2 1.3-.1 1.8.2l204.8 118.2L505.6 135c.7-.4 1.7-.4 2.4 0s1.2 1.2 1.2 2.1v63.4c0 .9-.5 1.6-1.2 2.1L219.7 369c-.3.3-.8.4-1.2.4m-204-123 204 117.7L504.4 199v-57.9L219.7 305.6c-.7.4-1.7.4-2.4 0L13.5 188c-10.1 21-.7 52.9 1 58.4m204 186.4q-.6 0-1.2-.3l-206-118.9c-.4-.3-.8-.6-1-1.1-.7-1.6-17.1-39.4.2-65.7.7-1.1 2.1-1.4 3.2-.8l204.8 118.2 287.2-165.7c.7-.4 1.7-.4 2.4 0s1.2 1.2 1.2 2.1V264c0 .9-.5 1.7-1.2 2.1L219.7 432.4c-.3.3-.8.4-1.2.4m-204.1-123 204.1 117.8 286-165v-57.9L219.7 369c-.7.4-1.7.4-2.4 0l-204-117.7c-12.7 22.2-.9 53.4 1.1 58.5m265.9-158.4c-.3 0-.6-.1-.9-.2-.7-.3-1.2-.9-1.4-1.6l-6.5-26-46.4-3.9c-1-.1-1.9-.8-2.1-1.9-.2-1 .2-2.1 1.1-2.6l123.6-71.3c.7-.4 1.7-.4 2.4 0l55 31.7a2.438 2.438 0 0 1 0 4.2L281.5 151c-.3.3-.8.4-1.2.4m-47.1-35.9 40.5 3.4c1 .1 1.9.8 2.1 1.8l6.1 24.6 117.2-67.6-50.2-28.9z" style="fill:#0288d1"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

32
site/dist/assets/apps/crowdsec.svg vendored Normal file
View File

@ -0,0 +1,32 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" fill="none">
<!-- Shield silhouette -->
<path d="M64 8 L112 24 V60 C112 86 92 110 64 120 C36 110 16 86 16 60 V24 Z"
fill="url(#cs-grad)" stroke="#5dd3ff" stroke-width="2.5" stroke-linejoin="round"/>
<defs>
<linearGradient id="cs-grad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#1a2b3d"/>
<stop offset="1" stop-color="#0a1420"/>
</linearGradient>
<radialGradient id="cs-eye" cx="0.5" cy="0.5" r="0.5">
<stop offset="0" stop-color="#5dd3ff"/>
<stop offset="0.5" stop-color="#2b8fc7"/>
<stop offset="1" stop-color="#0a3554"/>
</radialGradient>
</defs>
<!-- Eye (almond) -->
<path d="M30 64 Q64 38 98 64 Q64 90 30 64 Z"
fill="#0a1420" stroke="#5dd3ff" stroke-width="2.2" stroke-linejoin="round"/>
<!-- Iris -->
<circle cx="64" cy="64" r="14" fill="url(#cs-eye)"/>
<!-- Pupil -->
<circle cx="64" cy="64" r="6" fill="#06121b"/>
<!-- Highlight -->
<circle cx="60" cy="60" r="2.4" fill="#dffaff" opacity="0.9"/>
<!-- Crosshair ticks signalling watcher/detector -->
<g stroke="#5dd3ff" stroke-width="2" stroke-linecap="round">
<line x1="64" y1="42" x2="64" y2="48"/>
<line x1="64" y1="80" x2="64" y2="86"/>
<line x1="42" y1="64" x2="48" y2="64"/>
<line x1="80" y1="64" x2="86" y2="64"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

161
site/dist/assets/apps/dashy.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 90 KiB

1
site/dist/assets/apps/default.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><rect width="512" height="512" rx="96" fill="#3a4a5a"/><path d="M256 116 416 200v112L256 396 96 312V200z" fill="none" stroke="#cdd6df" stroke-width="28" stroke-linejoin="round"/><path d="M96 200l160 84 160-84M256 284v112" fill="none" stroke="#cdd6df" stroke-width="28" stroke-linejoin="round" stroke-linecap="round"/></svg>

After

Width:  |  Height:  |  Size: 386 B

1
site/dist/assets/apps/focalboard.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="m346 92-5.7-25.8L374.6 0l21 35.4 41.1-1.4-37.1 64.6-26.4 9.8-74 135.4c8.4 9.7 12.4 23.1 7.7 36.9-6.9 20.3-29.5 30.9-50.5 23.8s-32.5-29.3-25.7-49.6c4.6-13.6 16.3-22.9 29.9-25.4 3.4-.7 6.9-.8 10.3-.5zm37.9 41.6-3.7 39.1c37.2 39.3 53.9 95.9 34.7 152.5-27 79.8-116 121.7-198.9 93.7-82.8-28-128.1-115.4-101.1-195.2 23.9-70.6 96.4-110.2 166.6-101.4L310.4 97C208.7 69.2 93.1 123.5 56 233.1 18.6 343.6 77.8 463.4 188.3 500.8 298.7 538.2 418.6 479 456 368.5c30.5-90.2-3.8-182.3-72.1-234.9m-225.6 98.3c-10 29.4-6.6 60.2 6.8 86.2 13.4 25.8 36.7 46.9 66.9 57.1s61.5 7.7 87.8-4.7c26.5-12.5 47.8-34.9 57.8-64.3 6.3-18.7 7.2-37.2 3.9-54.5-4-20.8-14.1-39.8-28.2-55.2-1.4-1.6-2.9-3.1-4.4-4.6l-8.2 41c4.5 7.7 7.7 16 9.4 24.8 2.3 12.1 1.7 25.1-2.8 38.2-7.1 20.9-22.3 36.8-41.2 45.7-19.1 9-41.9 10.8-63.9 3.3s-39.1-22.8-48.8-41.5c-9.6-18.5-12-40.4-5-61.3 4.7-13.8 12.8-25.4 23.3-34.2 10.9-9.3 24.3-15.5 38.6-18.1h.2c2.4-.5 4.7-.8 7.1-1l28.8-30.2c-13.6-2.6-27.7-2.9-41.9-.1-19.9 3.6-38.4 12.3-53.5 25.1-14.5 12.4-26.1 28.8-32.7 48.3" style="fill:#1c58d9"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

4
site/dist/assets/apps/gitea.svg vendored Normal file
View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512">
<path d="M414.4 376.5 200 379.6l-1.4-256.7 103.5-15.2 108.8-1.5z" style="fill:#fff"/>
<path d="M502.6 103.7c-3.3-3.3-7.8-3.3-7.8-3.3s-95.5 5.4-144.9 6.5c-10.8.2-21.6.5-32.3.6V203c-4.5-2.1-9-4.3-13.5-6.4 0-29.6-.1-88.9-.1-88.9-23.6.3-72.7-1.8-72.7-1.8s-115.2-5.8-127.7-6.9c-8-.5-18.3-1.7-31.8 1.2-7.1 1.5-27.3 6-43.8 21.9C-8.7 154.8.7 206.7 1.9 214.5c1.4 9.5 5.6 36 25.8 59 37.3 45.7 117.6 44.6 117.6 44.6s9.9 23.5 24.9 45.2c20.4 27 41.3 48 61.7 50.5 51.3 0 153.9-.1 153.9-.1s9.8.1 23-8.4c11.4-6.9 21.6-19.1 21.6-19.1s10.5-11.2 25.2-36.9c4.5-7.9 8.2-15.6 11.5-22.8 0 0 45-95.4 45-188.2-1-28-7.9-33-9.5-34.6M97.7 269.9c-21.1-6.9-30.1-15.2-30.1-15.2S52 243.8 44.2 222.3c-13.4-36-1.1-58-1.1-58s6.8-18.3 31.4-24.4c11.2-3 25.2-2.5 25.2-2.5s5.8 48.4 12.8 76.7c5.9 23.8 20.2 63.3 20.2 63.3s-21.3-2.6-35-7.5m289.4-4.5c-5.2 12.6-44.8 92.1-44.8 92.1s-5 11.8-16 12.5c-4.7.3-8.4-1-8.4-1s-.2-.1-4.3-1.7l-92-44.8s-8.9-4.6-10.4-12.7c-1.8-6.6 2.2-14.7 2.2-14.7l44.2-91.1s3.9-7.9 9.9-10.6c.5-.2 1.9-.8 3.7-1.2 6.6-1.7 14.7 2.3 14.7 2.3l18.4 8.9c-3.7 7.6-7.5 15.2-11.2 22.9-5.5-.1-10.5 2.9-13.1 7.7-2.8 5.1-2.2 11.5 1.5 16.1-6.6 13.8-13.3 27.5-19.9 41.1-6.7.1-12.5 4.7-14.1 11.2-1.5 6.5 1.6 13.3 7.4 16.3 6.3 3.3 14.3 1.5 18.5-4.4 4.2-5.8 3.5-13.8-1.5-18.8l19.5-40c1.2.1 3 .2 5-.4 3.3-.7 5.8-2.9 5.8-2.9 3.4 1.5 7 3.1 10.8 5 3.9 2 7.6 4 10.9 5.9.7.4 1.5.9 2.3 1.5 1.3 1.1 2.8 2.5 3.8 4.5 1.5 4.5-1.5 12.1-1.5 12.1-1.9 6.2-15 33.1-15 33.1-6.6-.2-12.5 4.1-14.4 10.2-2.1 6.6.9 14.1 7.2 17.3 6.4 3.3 14.2 1.4 18.3-4.3 4.1-5.5 3.7-13.3-.9-18.4l4.6-9.2c4.1-8.5 11-24.8 11-24.8.7-1.4 4.6-8.4 2.2-17.3-2-9.3-10.3-13.6-10.3-13.6-9.9-6.4-23.8-12.4-23.8-12.4s0-3.3-.9-5.8-2.3-4.2-3.2-5.1c3.6-7.6 7.4-15.1 11-22.6l61.8 29.9s10.3 4.6 12.5 13.2c1.5 6-.4 11.4-1.5 14" style="fill:#609926"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

13
site/dist/assets/apps/gluetun.svg vendored Normal file
View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="64" y2="64" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#22d3ee"/>
<stop offset="1" stop-color="#6366f1"/>
</linearGradient>
</defs>
<path d="M32 4 L56 13 V32 C56 46 45 56 32 60 C19 56 8 46 8 32 V13 Z"
fill="url(#g)" stroke="#0ea5e9" stroke-width="2" stroke-linejoin="round"/>
<path d="M22 30 C26 24 38 24 42 30 M25 35 C28 31 36 31 39 35 M29 40 C30 38 34 38 35 40"
stroke="#ffffff" stroke-width="2.5" stroke-linecap="round" fill="none"/>
<circle cx="32" cy="44" r="2.2" fill="#ffffff"/>
</svg>

After

Width:  |  Height:  |  Size: 678 B

70
site/dist/assets/apps/grafana.svg vendored Normal file
View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 142.5 145.6" style="enable-background:new 0 0 142.5 145.6;" xml:space="preserve">
<style type="text/css">
.st0{fill:#565656;}
.st1{fill:url(#SVGID_1_);}
</style>
<g>
<path class="st0" d="M28.7,131.5c-0.3,7.9-6.6,14.1-14.4,14.1C6.1,145.6,0,139,0,130.9s6.6-14.7,14.7-14.7c3.6,0,7.2,1.6,10.2,4.4
l-2.3,2.9c-2.3-2-5.1-3.4-7.9-3.4c-5.9,0-10.8,4.8-10.8,10.8c0,6.1,4.6,10.8,10.4,10.8c5.2,0,9.3-3.8,10.2-8.8H12.6v-3.5h16.1
V131.5z"/>
<path class="st0" d="M42.3,129.5h-2.2c-2.4,0-4.4,2-4.4,4.4v11.4h-3.9v-19.6H35v1.6c1.1-1.1,2.7-1.6,4.6-1.6h4.2L42.3,129.5z"/>
<path class="st0" d="M63.7,145.3h-3.4v-2.5c-2.6,2.5-6.6,3.7-10.7,1.9c-3-1.3-5.3-4.1-5.9-7.4c-1.2-6.3,3.7-11.9,9.9-11.9
c2.6,0,5,1.1,6.7,2.8v-2.5h3.4V145.3z M59.7,137c0.9-4-2.1-7.6-6-7.6c-3.4,0-6.1,2.8-6.1,6.1c0,3.8,3.3,6.7,7.2,6.1
C57.1,141.2,59.1,139.3,59.7,137z"/>
<path class="st0" d="M71.5,124.7v1.1h6.2v3.4h-6.2v16.1h-3.8v-20.5c0-4.3,3.1-6.8,7-6.8h4.7l-1.6,3.7h-3.1
C72.9,121.6,71.5,123,71.5,124.7z"/>
<path class="st0" d="M98.5,145.3h-3.3v-2.5c-2.6,2.5-6.6,3.7-10.7,1.9c-3-1.3-5.3-4.1-5.9-7.4c-1.2-6.3,3.7-11.9,9.9-11.9
c2.6,0,5,1.1,6.7,2.8v-2.5h3.4v19.6H98.5z M94.5,137c0.9-4-2.1-7.6-6-7.6c-3.4,0-6.1,2.8-6.1,6.1c0,3.8,3.3,6.7,7.2,6.1
C92,141.2,93.9,139.3,94.5,137z"/>
<path class="st0" d="M119.4,133.8v11.5h-3.9v-11.6c0-2.4-2-4.4-4.4-4.4c-2.5,0-4.4,2-4.4,4.4v11.6h-3.9v-19.6h3.2v1.7
c1.4-1.3,3.3-2,5.2-2C115.8,125.5,119.4,129.2,119.4,133.8z"/>
<path class="st0" d="M142.4,145.3h-3.3v-2.5c-2.6,2.5-6.6,3.7-10.7,1.9c-3-1.3-5.3-4.1-5.9-7.4c-1.2-6.3,3.7-11.9,9.9-11.9
c2.6,0,5,1.1,6.7,2.8v-2.5h3.4v19.6H142.4z M138.4,137c0.9-4-2.1-7.6-6-7.6c-3.4,0-6.1,2.8-6.1,6.1c0,3.8,3.3,6.7,7.2,6.1
C135.9,141.2,137.8,139.3,138.4,137z"/>
</g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="71.25" y1="10.4893" x2="71.25" y2="113.3415" gradientTransform="matrix(1 0 0 -1 0 148.6)">
<stop offset="0" style="stop-color:#FCEE1F"/>
<stop offset="1" style="stop-color:#F15B2A"/>
</linearGradient>
<path class="st1" d="M122.9,49.9c-0.2-1.9-0.5-4.1-1.1-6.5c-0.6-2.4-1.6-5-2.9-7.8c-1.4-2.7-3.1-5.6-5.4-8.3
c-0.9-1.1-1.9-2.1-2.9-3.2c1.6-6.3-1.9-11.8-1.9-11.8c-6.1-0.4-9.9,1.9-11.3,2.9c-0.2-0.1-0.5-0.2-0.7-0.3c-1-0.4-2.1-0.8-3.2-1.2
c-1.1-0.3-2.2-0.7-3.3-0.9c-1.1-0.3-2.3-0.5-3.5-0.7c-0.2,0-0.4-0.1-0.6-0.1C83.5,3.6,75.9,0,75.9,0c-8.7,5.6-10.4,13.1-10.4,13.1
s0,0.2-0.1,0.4c-0.5,0.1-0.9,0.3-1.4,0.4c-0.6,0.2-1.3,0.4-1.9,0.7c-0.6,0.3-1.3,0.5-1.9,0.8c-1.3,0.6-2.5,1.2-3.8,1.9
c-1.2,0.7-2.4,1.4-3.5,2.2c-0.2-0.1-0.3-0.2-0.3-0.2c-11.7-4.5-22.1,0.9-22.1,0.9c-0.9,12.5,4.7,20.3,5.8,21.7
c-0.3,0.8-0.5,1.5-0.8,2.3c-0.9,2.8-1.5,5.7-1.9,8.7c-0.1,0.4-0.1,0.9-0.2,1.3c-10.8,5.3-14,16.3-14,16.3c9,10.4,19.6,11,19.6,11
l0,0c1.3,2.4,2.9,4.7,4.6,6.8c0.7,0.9,1.5,1.7,2.3,2.6c-3.3,9.4,0.5,17.3,0.5,17.3c10.1,0.4,16.7-4.4,18.1-5.5c1,0.3,2,0.6,3,0.9
c3.1,0.8,6.3,1.3,9.4,1.4c0.8,0,1.6,0,2.4,0h0.4H80h0.5H81l0,0c4.7,6.8,13.1,7.7,13.1,7.7c5.9-6.3,6.3-12.4,6.3-13.8l0,0
c0,0,0,0,0-0.1s0-0.2,0-0.2l0,0c0-0.1,0-0.2,0-0.3c1.2-0.9,2.4-1.8,3.6-2.8c2.4-2.1,4.4-4.6,6.2-7.2c0.2-0.2,0.3-0.5,0.5-0.7
c6.7,0.4,11.4-4.2,11.4-4.2c-1.1-7-5.1-10.4-5.9-11l0,0c0,0,0,0-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1c0-0.4,0.1-0.8,0.1-1.3
c0.1-0.8,0.1-1.5,0.1-2.3v-0.6v-0.3v-0.1c0-0.2,0-0.1,0-0.2v-0.5v-0.6c0-0.2,0-0.4,0-0.6s0-0.4-0.1-0.6l-0.1-0.6l-0.1-0.6
c-0.1-0.8-0.3-1.5-0.4-2.3c-0.7-3-1.9-5.9-3.4-8.4c-1.6-2.6-3.5-4.8-5.7-6.8c-2.2-1.9-4.6-3.5-7.2-4.6c-2.6-1.2-5.2-1.9-7.9-2.2
c-1.3-0.2-2.7-0.2-4-0.2h-0.5h-0.1h-0.2h-0.2h-0.5c-0.2,0-0.4,0-0.5,0c-0.7,0.1-1.4,0.2-2,0.3c-2.7,0.5-5.2,1.5-7.4,2.8
c-2.2,1.3-4.1,3-5.7,4.9s-2.8,3.9-3.6,6.1c-0.8,2.1-1.3,4.4-1.4,6.5c0,0.5,0,1.1,0,1.6c0,0.1,0,0.3,0,0.4v0.4c0,0.3,0,0.5,0.1,0.8
c0.1,1.1,0.3,2.1,0.6,3.1c0.6,2,1.5,3.8,2.7,5.4s2.5,2.8,4,3.8s3,1.7,4.6,2.2c1.6,0.5,3.1,0.7,4.5,0.6c0.2,0,0.4,0,0.5,0
c0.1,0,0.2,0,0.3,0s0.2,0,0.3,0c0.2,0,0.3,0,0.5,0h0.1h0.1c0.1,0,0.2,0,0.3,0c0.2,0,0.4-0.1,0.5-0.1c0.2,0,0.3-0.1,0.5-0.1
c0.3-0.1,0.7-0.2,1-0.3c0.6-0.2,1.2-0.5,1.8-0.7c0.6-0.3,1.1-0.6,1.5-0.9c0.1-0.1,0.3-0.2,0.4-0.3c0.5-0.4,0.6-1.1,0.2-1.6
c-0.4-0.4-1-0.5-1.5-0.3C88,74,87.9,74,87.7,74.1c-0.4,0.2-0.9,0.4-1.3,0.5c-0.5,0.1-1,0.3-1.5,0.4c-0.3,0-0.5,0.1-0.8,0.1
c-0.1,0-0.3,0-0.4,0c-0.1,0-0.3,0-0.4,0s-0.3,0-0.4,0c-0.2,0-0.3,0-0.5,0c0,0-0.1,0,0,0h-0.1h-0.1c-0.1,0-0.1,0-0.2,0
s-0.3,0-0.4-0.1c-1.1-0.2-2.3-0.5-3.4-1c-1.1-0.5-2.2-1.2-3.1-2.1c-1-0.9-1.8-1.9-2.5-3.1c-0.7-1.2-1.1-2.5-1.3-3.8
c-0.1-0.7-0.2-1.4-0.1-2.1c0-0.2,0-0.4,0-0.6c0,0.1,0,0,0,0v-0.1v-0.1c0-0.1,0-0.2,0-0.3c0-0.4,0.1-0.7,0.2-1.1c0.5-3,2-5.9,4.3-8.1
c0.6-0.6,1.2-1.1,1.9-1.5c0.7-0.5,1.4-0.9,2.1-1.2c0.7-0.3,1.5-0.6,2.3-0.8s1.6-0.4,2.4-0.4c0.4,0,0.8-0.1,1.2-0.1
c0.1,0,0.2,0,0.3,0h0.3h0.2c0.1,0,0,0,0,0h0.1h0.3c0.9,0.1,1.8,0.2,2.6,0.4c1.7,0.4,3.4,1,5,1.9c3.2,1.8,5.9,4.5,7.5,7.8
c0.8,1.6,1.4,3.4,1.7,5.3c0.1,0.5,0.1,0.9,0.2,1.4v0.3V66c0,0.1,0,0.2,0,0.3c0,0.1,0,0.2,0,0.3v0.3v0.3c0,0.2,0,0.6,0,0.8
c0,0.5-0.1,1-0.1,1.5c-0.1,0.5-0.1,1-0.2,1.5s-0.2,1-0.3,1.5c-0.2,1-0.6,1.9-0.9,2.9c-0.7,1.9-1.7,3.7-2.9,5.3
c-2.4,3.3-5.7,6-9.4,7.7c-1.9,0.8-3.8,1.5-5.8,1.8c-1,0.2-2,0.3-3,0.3H81h-0.2h-0.3H80h-0.3c0.1,0,0,0,0,0h-0.1
c-0.5,0-1.1,0-1.6-0.1c-2.2-0.2-4.3-0.6-6.4-1.2c-2.1-0.6-4.1-1.4-6-2.4c-3.8-2-7.2-4.9-9.9-8.2c-1.3-1.7-2.5-3.5-3.5-5.4
s-1.7-3.9-2.3-5.9c-0.6-2-0.9-4.1-1-6.2v-0.4v-0.1v-0.1v-0.2V60v-0.1v-0.1v-0.2v-0.5V59l0,0v-0.2c0-0.3,0-0.5,0-0.8
c0-1,0.1-2.1,0.3-3.2c0.1-1.1,0.3-2.1,0.5-3.2c0.2-1.1,0.5-2.1,0.8-3.2c0.6-2.1,1.3-4.1,2.2-6c1.8-3.8,4.1-7.2,6.8-9.9
c0.7-0.7,1.4-1.3,2.2-1.9c0.3-0.3,1-0.9,1.8-1.4c0.8-0.5,1.6-1,2.5-1.4c0.4-0.2,0.8-0.4,1.3-0.6c0.2-0.1,0.4-0.2,0.7-0.3
c0.2-0.1,0.4-0.2,0.7-0.3c0.9-0.4,1.8-0.7,2.7-1c0.2-0.1,0.5-0.1,0.7-0.2c0.2-0.1,0.5-0.1,0.7-0.2c0.5-0.1,0.9-0.2,1.4-0.4
c0.2-0.1,0.5-0.1,0.7-0.2c0.2,0,0.5-0.1,0.7-0.1c0.2,0,0.5-0.1,0.7-0.1l0.4-0.1l0.4-0.1c0.2,0,0.5-0.1,0.7-0.1
c0.3,0,0.5-0.1,0.8-0.1c0.2,0,0.6-0.1,0.8-0.1c0.2,0,0.3,0,0.5-0.1h0.3h0.2h0.2c0.3,0,0.5,0,0.8-0.1h0.4c0,0,0.1,0,0,0h0.1h0.2
c0.2,0,0.5,0,0.7,0c0.9,0,1.8,0,2.7,0c1.8,0.1,3.6,0.3,5.3,0.6c3.4,0.6,6.7,1.7,9.6,3.2c2.9,1.4,5.6,3.2,7.8,5.1
c0.1,0.1,0.3,0.2,0.4,0.4c0.1,0.1,0.3,0.2,0.4,0.4c0.3,0.2,0.5,0.5,0.8,0.7c0.3,0.2,0.5,0.5,0.8,0.7c0.2,0.3,0.5,0.5,0.7,0.8
c1,1,1.9,2.1,2.7,3.1c1.6,2.1,2.9,4.2,3.9,6.2c0.1,0.1,0.1,0.2,0.2,0.4c0.1,0.1,0.1,0.2,0.2,0.4s0.2,0.5,0.4,0.7
c0.1,0.2,0.2,0.5,0.3,0.7c0.1,0.2,0.2,0.5,0.3,0.7c0.4,0.9,0.7,1.8,1,2.7c0.5,1.4,0.8,2.6,1.1,3.6c0.1,0.4,0.5,0.7,0.9,0.7
c0.5,0,0.8-0.4,0.8-0.9C123,52.7,123,51.4,122.9,49.9z"/>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

1
site/dist/assets/apps/headscale.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><ellipse cx="49.5" cy="258.3" rx="49.5" ry="49.9" style="fill-rule:evenodd;clip-rule:evenodd;fill:#f8b5cb"/><path d="M135.9 220.2c7.8 0 14.2 6.3 14.2 14s-6.4 14-14.2 14-14.2-6.3-14.2-14 6.4-14 14.2-14m0 49c7.8 0 14.2 6.3 14.2 14s-6.4 14-14.2 14-14.2-6.3-14.2-14 6.4-14 14.2-14m64 0c7.8 0 14.2 6.3 14.2 14s-6.4 14-14.2 14-14.2-6.3-14.2-14 6.4-14 14.2-14m.2-49c7.8 0 14.2 6.3 14.2 14s-6.4 14-14.2 14-14.2-6.3-14.2-14 6.4-14 14.2-14" style="fill-rule:evenodd;clip-rule:evenodd;fill:#a2a2a2"/><path d="M325 208.8c27.4 0 49.6 22.4 49.6 50s-22.2 50-49.6 50-49.6-22.4-49.6-50 22.2-50 49.6-50m106.6 0c27.4 0 49.6 22.4 49.6 50s-22.2 50-49.6 50-49.6-22.4-49.6-50 22.2-50 49.6-50" style="fill-rule:evenodd;clip-rule:evenodd;fill:#8d8d8d"/><path d="M273.3 173.5h-28.8v165h28.8v-11.9h-17v-141h17zm209.9 0H512v165h-28.8v-11.9h17v-141h-17z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#303030"/></svg>

After

Width:  |  Height:  |  Size: 974 B

2
site/dist/assets/apps/invidious.svg vendored Normal file
View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M244.2 502.3c-25.1-1-49.2-5.4-72.6-13.3-77.4-26.1-138-87.1-161.3-162.4C.2 294.1-2.5 258 2.3 222.3c4.7-34.9 17.3-68 37.3-98.2 15.3-23.2 37-46.1 60-63.3 46.9-35.1 109.2-54 168.2-51 32.9 1.7 63.4 8.6 92.9 21.1 10.4 4.4 25.4 12.3 35.2 18.5 18 11.3 28.4 19.7 43.8 35 16.8 16.8 28.1 30.8 38.6 48.1 9.2 15.1 17.9 34.5 23.2 51.3 2 6.5 5.6 20.9 7.2 28.8 3 15.1 3.4 20 3.4 42.3 0 23.5-.6 31-3.7 46.7-11.8 59.6-45.2 112-95.1 149.4-29 21.7-63.5 37.5-99.8 45.5-21.3 4.8-45.1 6.7-69.3 5.8m-44.6-100.1c0-.7-.1-2.6-.2-4.3l-.2-3.1-6-.3c-5.1-.3-6.1-.4-6.8-1-2.6-1.9-1.9-7.7 2.9-23.4 1.1-3.7 4.2-14.4 7-23.8 2.7-9.5 6.6-22.7 8.6-29.3 2-6.7 5.3-18.1 7.4-25.5 2.1-7.3 4.6-15.8 5.5-18.8s4.1-14 7.2-24.5c6.3-21.6 10.4-35.2 11.4-37.9.7-1.8.7-1.8 1.3-1.2.3.3 4.9 9.4 10.1 20.1 5.3 10.7 16.6 33.8 25.3 51.2 21.8 44.1 48.1 97.3 55 111.3l5.8 11.8 14.4-.1c7.9-.1 14.8-.2 15.2-.4.7-.3.7-.4-1.7-5.5-1.4-2.9-10.3-21.1-20-40.5-62.1-125-78-157.4-86.5-176-6-13.1-8.8-18.8-9.8-20-1.1-1.2-2.1-1.4-3-.3-1.5 1.7-5.2 12.8-11.9 35.9-2.6 9-8.3 28.5-12.6 43.3-8.4 28.7-10.8 36.9-18.2 62.1-2.6 8.8-6.1 20.8-7.8 26.6s-5.1 17.5-7.6 26.1c-5.5 18.9-7.8 26.5-9.4 30.8-2.7 7.3-3.3 8-6.3 8.6-1.1.2-3.1.4-4.3.4-2.8 0-4.5.5-5.2 1.4-.5.8-.7 6.2-.2 7 .3.4 3.1.5 29.6.7l10.9.1zm46.7-261.1c5.5-1.2 10.7-6.3 12-11.7.5-2 .4-6.3-.1-8.2-1.1-4-4.2-8-7.7-9.9-4.8-2.6-12-2.6-16.9 0-7.6 4.1-10.4 14.1-6.1 22.1 3.5 6.4 10.7 9.4 18.8 7.7" style="fill:#f0f0f0"/><path d="M2712.8 5196.2c-157.5-82.6-156.2-323.9 3.8-405.2 109.2-55.9 249-20.3 313.7 78.8 73.7 110.5 33 268-85.1 327.7-64.7 33-167.6 33-232.4-1.3z" style="fill:#00b6f0;stroke:#00b6f0;stroke-width:.297;stroke-miterlimit:10" transform="matrix(.0699 0 0 -.0699 44.236 474.48)"/><path d="M2833.5 4483.6c-15.2-20.3-80-210.9-129.6-384.9-38.1-132.1-128.3-444.6-209.6-717.7-25.4-87.6-73.7-252.8-108-368.4-33-115.6-81.3-280.7-108-368.4-25.4-87.6-73.7-252.8-108-368.4-33-115.6-81.3-280.7-108-368.4-25.4-87.6-72.4-247.7-102.9-355.7-74.9-262.9-118.1-379.8-146.1-393.8-12.7-7.6-44.5-12.7-71.1-12.7-92.7 0-106.7-10.2-102.9-68.6l3.8-52.1 289.6-3.8 289.6-2.5-3.8 59.7-3.8 61-92.7 3.8c-83.8 3.8-94 6.4-106.7 34.3-16.5 35.6 0 132.1 47 285.8 16.5 52.1 59.7 198.2 95.3 323.9 35.6 125.8 83.8 292.2 108 368.4 22.9 77.5 71.1 242.6 108 368.4 35.6 125.8 83.8 292.2 108 368.4 22.9 77.5 71.1 242.6 108 368.4 108 377.3 156.2 532.2 166.4 544.9 6.4 6.4 21.6-14 35.6-44.5 12.7-30.5 243.9-499.2 511.9-1040.3s567.8-1145.7 664.3-1343.9l176.6-358.2h213.4c116.9 0 213.4 5.1 213.4 10.2s-95.3 200.7-210.9 434.4C3613.4 2965.6 3129.4 3950 3048.2 4130.4c-36.8 80-87.6 191.8-113.1 247.7-55.9 120.8-73.7 139.8-101.6 105.5" style="fill:#575757" transform="matrix(.0699 0 0 -.0699 44.236 474.48)"/></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

1
site/dist/assets/apps/ipinfo.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M471.8 319.8c-17.3 0-32 10.9-37.7 26.2H189.7c-4.1-11-12.8-19.6-23.7-23.7V77.9c15.3-5.7 26.2-20.4 26.2-37.7C192.2 18 174.2 0 152 0s-40.2 18-40.2 40.2c0 17.3 10.9 32 26.2 37.7v244.4c-15.3 5.7-26.2 20.4-26.2 37.7 0 6 1.3 11.7 3.7 16.8L57 435.3c-5.1-2.4-10.8-3.7-16.8-3.7-22.2 0-40.2 18-40.2 40.2S18 512 40.2 512s40.2-18 40.2-40.2c0-6-1.3-11.7-3.7-16.8l58.5-58.5c5.1 2.4 10.8 3.7 16.8 3.7 17.3 0 32-10.9 37.7-26.2h244.4c5.7 15.3 20.4 26.2 37.7 26.2 22.2 0 40.2-18 40.2-40.2s-18-40.2-40.2-40.2" style="fill:#001423"/><path d="M512 40.2c0 22.2-18 40.2-40.2 40.2-6 0-11.7-1.3-16.8-3.7l-58.5 58.5c2.4 5.1 3.7 10.8 3.7 16.8 0 17.3-10.9 32-26.2 37.7v244.4c15.3 5.7 26.2 20.4 26.2 37.7 0 22.2-18 40.2-40.2 40.2s-40.2-18-40.2-40.2c0-17.3 10.9-32 26.2-37.7V189.7c-11-4.1-19.6-12.8-23.7-23.7H77.9c-5.7 15.3-20.4 26.2-37.7 26.2C18 192.2 0 174.2 0 152s18-40.2 40.2-40.2c17.3 0 32 10.9 37.7 26.2h244.4c5.7-15.3 20.4-26.2 37.7-26.2 6 0 11.7 1.3 16.8 3.7L435.3 57c-2.4-5.1-3.7-10.8-3.7-16.8 0-22.2 18-40.2 40.2-40.2S512 18 512 40.2" style="fill:#00857d"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

1
site/dist/assets/apps/jellyfin.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><linearGradient id="jellyfin_svg__a" x1="97.487" x2="522.047" y1="483.902" y2="729.018" gradientTransform="translate(0 -278)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#aa5cc3"/><stop offset="1" style="stop-color:#00a4dc"/></linearGradient><path d="M256 196.2c-22.4 0-94.8 131.3-83.8 153.4s156.8 21.9 167.7 0-61.3-153.4-83.9-153.4" style="fill:url(#jellyfin_svg__a)"/><linearGradient id="jellyfin_svg__b" x1="94.186" x2="518.747" y1="489.619" y2="734.735" gradientTransform="translate(0 -278)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#aa5cc3"/><stop offset="1" style="stop-color:#00a4dc"/></linearGradient><path d="M256 0C188.3 0-29.8 395.4 3.4 462.2s472.3 66 505.2 0S323.8 0 256 0m165.6 404.3c-21.6 43.2-309.3 43.8-331.1 0S211.7 101.4 256 101.4 443.2 361 421.6 404.3" style="fill:url(#jellyfin_svg__b)"/></svg>

After

Width:  |  Height:  |  Size: 945 B

650
site/dist/assets/apps/jitsimeet.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 35 KiB

605
site/dist/assets/apps/libreportal.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 240 KiB

1
site/dist/assets/apps/linkding.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><circle cx="256" cy="256" r="256" style="fill-rule:evenodd;clip-rule:evenodd;fill:#5856e0"/><path d="m277.2 432.7-22.2-22 160.2-161.3.1-.1c.1-.1 11.5-11.7 16.3-29.1 6-22-1.3-43.8-21.8-64.6-15.6-15.9-31.9-24-48.3-24-25.6 0-44.9 19.3-45.1 19.5l-.1.1-160.1 161.3-22.2-22 160.1-161.3c2.3-2.4 29-28.7 67-28.9h.4c25.2 0 49 11.2 70.6 33.3 36.5 37.2 36 72.9 29.1 96.3-7.1 24.1-21.9 39.4-24 41.5zm-124.3-19.9c-25.3 0-49.1-11.3-70.8-33.6-36.3-37.4-35.7-73.1-28.7-96.4 7.2-24.1 22.1-39.3 24.1-41.4L238.3 80.7l22.1 22.1L99.5 263.5l-.1.1c-.1.1-11.5 11.7-16.4 29-6.1 22 1.1 43.8 21.5 64.7 15.5 15.9 31.8 24.1 48.3 24.1h.2c25.5 0 44.8-19.2 45-19.4l.1-.1 160.8-160.8 22.1 22.1-160.8 160.9c-2.3 2.4-29.1 28.6-67.1 28.7z" style="fill:#fff"/></svg>

After

Width:  |  Height:  |  Size: 813 B

1
site/dist/assets/apps/mastodon.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><linearGradient id="mastodon_svg__a" x1="253.986" x2="253.986" y1="279" y2="791.028" gradientTransform="translate(2 -279)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#6364ff"/><stop offset="1" style="stop-color:#563acc"/></linearGradient><path d="M494.3 113.4C486.9 58.3 439 15 382.1 6.6 372.5 5.2 336.2 0 252 0h-.6c-84.2 0-102.2 5.2-111.8 6.6-55.3 8.2-105.7 47.1-118 102.8-5.9 27.4-6.5 57.8-5.4 85.7 1.6 40 1.9 79.9 5.5 119.7 2.5 26.4 6.9 52.7 13.1 78.5 11.6 47.7 58.7 87.4 104.9 103.6 49.4 16.9 102.6 19.7 153.5 8.1 5.6-1.3 11.1-2.8 16.6-4.5 12.4-3.9 26.9-8.3 37.5-16.1.1-.1.3-.2.4-.4s.1-.3.1-.5v-38.6c0-.2 0-.3-.1-.5s-.2-.3-.3-.4-.3-.2-.5-.2h-.5c-32.6 7.8-66.1 11.7-99.6 11.6-57.7 0-73.2-27.4-77.7-38.8-3.6-9.9-5.8-20.1-6.7-30.6 0-.2 0-.4.1-.5.1-.2.2-.3.3-.4s.3-.2.5-.2h.5c32.1 7.7 65 11.6 98 11.6 7.9 0 15.8 0 23.8-.2 33.2-.9 68.2-2.6 100.8-9 .8-.2 1.6-.3 2.3-.5 51.5-9.9 100.5-40.9 105.5-119.5.2-3.1.7-32.4.7-35.6-.1-11 3.4-77.5-.6-118.3" style="fill:url(#mastodon_svg__a)"/><path d="M412.7 175.2v136.7h-54.2V179.2c0-27.9-11.6-42.2-35.3-42.2-26 0-39.1 16.8-39.1 50.1v72.6h-53.8v-72.6c0-33.3-13.1-50.1-39.1-50.1-23.5 0-35.3 14.2-35.3 42.2v132.6h-54.1V175.2c0-27.9 7.1-50.1 21.4-66.6 14.7-16.4 34-24.8 58-24.8 27.7 0 48.7 10.7 62.6 32l13.5 22.6 13.5-22.6c14-21.3 34.9-32 62.6-32 23.9 0 43.2 8.4 58 24.8q21.3 24.6 21.3 66.6" style="fill:#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
site/dist/assets/apps/nextcloud.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M512 80v352c0 44.2-35.8 80-80 80H80c-44.2 0-80-35.8-80-80V80C0 35.8 35.8 0 80 0h352c44.2 0 80 35.8 80 80" style="fill-rule:evenodd;clip-rule:evenodd;fill:#0082c9"/><path d="M256 167.2c-40.3 0-74.5 27.2-85.3 64.2-9.3-19.4-29-33-51.8-33-31.6-.1-57.6 25.9-57.6 57.6s26 57.6 57.6 57.6c22.8 0 42.5-13.6 51.8-33 10.8 36.9 45 64.2 85.3 64.2s74.5-27.2 85.3-64.2c9.3 19.4 29 33 51.8 33 31.6 0 57.6-26 57.6-57.6s-25.8-57.7-57.5-57.7c-22.8 0-42.5 13.6-51.8 33-10.9-36.9-45.1-64.1-85.4-64.1m0 34.2c30.3 0 54.5 24.2 54.5 54.5s-24.2 54.5-54.5 54.5-54.5-24.2-54.5-54.5 24.2-54.5 54.5-54.5m-137 31.2c13.1 0 23.3 10.2 23.3 23.3s-10.2 23.3-23.3 23.3S95.5 269 95.5 256s10.3-23.4 23.5-23.4m274.1 0c13.1 0 23.3 10.2 23.3 23.3s-10.2 23.3-23.3 23.3-23.3-10.2-23.3-23.2 10.2-23.4 23.3-23.4" style="fill:#fff"/></svg>

After

Width:  |  Height:  |  Size: 884 B

1
site/dist/assets/apps/ollama.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" viewBox="0 0 512 512"><circle cx="256" cy="256" r="256" style="fill:#fff"/><defs><circle id="ollama_svg__a" cx="256" cy="256" r="256"/></defs><clipPath id="ollama_svg__b"><use xlink:href="#ollama_svg__a" style="overflow:visible"/></clipPath><g style="clip-path:url(#ollama_svg__b)"><path d="M157.3 35.9c-4.3.7-9.5 3-13.1 5.7-11 8.4-19.6 26.2-23.2 48.4-1.4 8.4-2.3 20-2.3 28.9 0 10.5 1.2 23.9 3 33.1.4 2.1.6 3.9.4 4-.1.1-1.8 1.5-3.6 2.9-6.2 5-13.4 12.6-18.3 19.6-9.4 13.4-15.5 28.6-18.1 45-1 6.5-1.3 19.6-.5 26.1 1.8 15 6.3 27.7 14 39.3l2.5 3.7-.7 1.2c-5.2 8.7-9.6 21.3-11.6 33.3-1.6 9.6-1.8 12.1-1.8 24.9 0 12.9.2 15.5 1.7 24.4 1.8 10.7 5.5 22 9.7 29.5 1.4 2.5 4.7 7.6 5.1 7.8.1.1-.3 1.3-.9 2.7-4.8 10.5-8.9 24.4-10.6 36.1-1.2 8-1.4 10.6-1.4 19.1 0 10.8.6 16 2.9 24.6l.3 1.3h28.4l-.9-1.8c-5.7-10.6-6.3-30.3-1.3-50 2.3-9.1 4.8-15.8 9.6-24.9l2.9-5.6v-3.4c0-3.2-.1-3.5-1.1-5.6-.8-1.6-1.9-3-3.7-4.8-3.2-3.1-5.5-6.4-7.4-10.5-8.2-17.7-9.8-44-4-66.5 2.4-9.4 6.3-17.7 10.5-22.2 2.8-3.1 4.3-6.6 4.3-10.2 0-3.7-1.3-6.8-4.3-10.1-8.6-9.2-13.8-20.3-15.7-33.3-2.7-18.5 2.2-38.6 13.3-54.6 10.8-15.7 26.1-25.7 43.1-28.4 3.8-.6 10.9-.5 14.9.2 4.3.8 7.1.5 9.9-.8 3.5-1.6 5.2-3.6 7.2-8.3 1.8-4.1 3.2-6.4 6.9-11.1 4.5-5.6 8.9-9.4 15.8-14 8-5.2 17-9 26-10.8 3.3-.7 4.8-.8 10.9-.8s7.7.1 10.9.8c13.2 2.7 26.4 9.5 36.9 19.2 2.3 2.1 7.7 8.8 9.4 11.6.7 1.1 1.8 3.4 2.6 5.1 2 4.6 3.7 6.7 7.2 8.3 2.7 1.3 5.5 1.6 9.7.9 6.6-1.1 11.7-1 18.1.3 22 4.4 41.2 22.6 49.7 46.9 7.4 21.3 5.3 43.7-5.7 60.7-1.9 2.9-3.7 5.2-6.4 8.1-5.8 6.2-5.8 13.9 0 20.3 9.5 10.4 15.4 35.9 13.6 58.5-1.2 14.9-5 28.2-10.3 35.7-.9 1.3-2.9 3.6-4.3 5-1.9 1.9-3 3.2-3.7 4.8-1 2.1-1.1 2.5-1.1 5.6v3.4l2.9 5.6c4.8 9.2 7.3 15.9 9.6 24.9 4.9 19.4 4.4 38.7-1.1 49.7-.5.9-.9 1.8-.9 1.9s6.3.2 14.1.2h14.1l.4-1.4c.2-.8.5-1.9.7-2.6.4-1.5 1.1-5.8 1.7-9.9.6-4.2.6-19.6 0-24.2-2.1-16.9-5.7-30.2-11.5-42.9-.6-1.4-1-2.7-.9-2.7.2-.1 1.1-1.4 2.1-2.9 7.2-10.9 11.7-24.7 13.9-42.9.6-5 .6-26.5 0-31.4-1.6-12.4-3.5-20.8-6.7-29.4-1.3-3.5-4.8-11-6.3-13.5l-.7-1.2 2.5-3.7c7.7-11.6 12.2-24.3 14-39.3.8-6.5.5-19.6-.5-26.1-2.6-16.5-8.7-31.6-18.1-45-4.9-7-12-14.7-18.3-19.6-1.8-1.5-3.5-2.8-3.6-2.9-.2-.1 0-2 .4-4 4-20.9 3.9-47-.3-67.4-3.6-17.8-10.3-31.9-18.8-40.1-6.8-6.5-13.8-9.3-22.2-8.8-19.2 1.1-34.6 23.2-40.7 58-1 5.6-1.9 12.2-1.9 14 0 .7-.1 1.3-.3 1.3s-1.5-.7-2.9-1.5C288.5 98.8 272 94.1 256 94.1s-32.5 4.7-47.3 13.4c-1.4.8-2.7 1.5-2.9 1.5s-.3-.6-.3-1.3c0-1.9-.9-8.6-1.9-14-5.5-31.2-18.2-51.9-35.1-57.1-2.2-.6-8.8-1.1-11.2-.7m5.6 27c4.8 3.8 10.1 14.6 13.1 26.7.6 2.2 1.2 4.7 1.3 5.6s.5 2.9.8 4.5c1.3 7 1.9 14.6 2 23.9v9.1l-2.3 3.4-2.3 3.4h-5.3c-6.2 0-12.4.8-18.4 2.4-2.1.5-4.2 1.1-4.6 1.2-.6.1-.7-.1-1.1-2.8-2-14.8-1.9-31.1.3-44.7 2.4-15.2 8-28.9 13.4-32.9 1.4-1 1.6-1 3.1.2m189.2-.2c3.3 2.4 6.9 8.9 9.6 17.1 5.4 16.5 6.9 39 4.1 60.5-.4 2.7-.5 2.9-1.1 2.8-.4-.1-2.5-.6-4.6-1.2-5.9-1.6-12.1-2.4-18.4-2.4h-5.3l-2.3-3.4-2.3-3.4v-9.1c.1-12.9 1.3-22.9 4.1-34.1 3-12 8.4-22.8 13.1-26.6 1.6-1.2 1.8-1.2 3.1-.2"/><path d="M250.9 229.6c-7.2.7-9.2 1-12.6 1.7-5.6 1.2-13.1 3.7-18.3 6.3-18.1 8.9-30.6 23.6-34.4 40.7-.8 3.4-.9 4.5-.9 10.2 0 5.6.1 6.9.8 10.1 5.1 22.3 25.6 38.8 52.3 41.8 5.8.6 30.7.6 36.5 0 21.4-2.4 39.7-14 48-30.3 2.2-4.3 3.3-7.2 4.2-11.6.7-3.2.8-4.4.8-10.1s-.1-6.8-.9-10.2c-5.5-24.8-29.6-44.4-59.2-48.1-3.7-.3-13.8-.7-16.3-.5m12.4 18.1c9.9 1.1 19.8 4.6 27.7 9.9 4.3 2.9 10.3 8.8 12.9 12.7 3.2 4.8 5 9.8 5.8 15.8.4 2.8.2 4.8-.8 9.3-1.6 6.6-6.4 13.6-12.9 18.4-3.1 2.2-9.4 5.4-13.3 6.7-7.4 2.4-12.2 2.8-29.4 2.7-11.2-.1-13.2-.2-16.4-.8-11-2.1-19.7-6.4-26-13.1-5.1-5.4-7.4-10.3-8.7-18.2-.6-3.7.5-9.8 2.7-14.9 2.6-6.3 9.4-14.1 16.1-18.5 7.8-5.2 18-8.9 27.4-9.9 3.6-.5 11.2-.5 14.9-.1"/><path d="M243.3 271.9c-2.5 1.4-4.3 4.8-3.7 7.4.6 2.8 3 5.5 6.8 7.8 2 1.2 2.2 1.4 2.3 2.6.1.7-.2 2.8-.6 4.7-.4 1.8-.7 3.7-.7 4.3 0 1.4 1.4 3.7 2.8 4.9 1.2 1 1.5 1 4.9 1.1 3.2.1 3.8 0 5.1-.6 3.3-1.6 4.1-4.5 2.9-10.1-1-4.7-.8-5.4 1.7-6.8 2.6-1.5 5.4-4.2 6.2-6 1.6-3.5.1-7.4-3.4-9.3-.9-.4-1.9-.6-3.5-.6-2.4 0-4 .6-6.8 2.4l-1.6 1-1-.6c-4.2-2.5-5-2.8-7.5-2.8-2 0-3 .1-3.9.6m-80.5-38.5c-5.9 1.9-10.3 6.2-12.5 12.3-1.1 2.9-1.6 7.5-1.2 10 1.1 5.9 6 11.3 11.5 12.8 7 1.8 12.2.6 16.8-3.9 2.7-2.6 4.1-4.9 5.6-8.6 1.1-2.6 1.1-3.1 1.1-6.8v-4l-1.4-2.9c-2.2-4.5-6.2-7.9-10.9-9.1-2.5-.6-6.7-.6-9 .2m177.2-.1c-4.5 1.2-8.6 4.6-10.7 9.1l-1.4 2.9v4c0 3.7.1 4.2 1.1 6.8 1.5 3.7 2.9 6 5.6 8.6 4.6 4.6 9.8 5.8 16.8 3.9 4-1.1 8-4.4 10-8.4 1.7-3.4 2.1-5.8 1.5-9.6-1.2-8.7-6.3-15.1-13.9-17.3-2.3-.7-6.6-.7-9 0"/></g></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

1
site/dist/assets/apps/onlyoffice.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M224 486.5 13.5 389.2c-17.9-8.5-17.9-21.6 0-29.4l73.3-34 136.5 63.3c17.9 8.5 46.8 8.5 64 0l136.5-63.3 73.3 34c17.9 8.5 17.9 21.6 0 29.4l-210.6 97.3c-16.5 7.7-45.3 7.7-62.5 0" style="fill-rule:evenodd;clip-rule:evenodd;fill:#ff6f3d"/><path d="M224 366.8 13.5 269.4c-17.9-8.5-17.9-21.6 0-29.4l71.7-33.2L224 271c17.9 8.5 46.8 8.5 64 0l138.8-64.1 71.8 33.2c17.9 8.5 17.9 21.6 0 29.4L288 366.8c-18 8.5-46.8 8.5-64 0" style="fill-rule:evenodd;clip-rule:evenodd;fill:#95c038"/><path d="M224 250.1 13.5 152.8c-17.9-8.5-17.9-21.6 0-29.4L224 26.1c17.9-8.5 46.8-8.5 64 0l210.6 97.3c17.9 8.5 17.9 21.6 0 29.4L288 250.1c-18 7.7-46.8 7.7-64 0" style="fill-rule:evenodd;clip-rule:evenodd;fill:#5dc0e8"/></svg>

After

Width:  |  Height:  |  Size: 787 B

1
site/dist/assets/apps/owncloud.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M231.4 117.8c-37.9 0-68.6 30.7-68.6 68.6 0 15.4 5.1 29.7 14.3 42 19.5-22.5 47.1-35.8 78.8-35.8 15.4 0 29.7 3.1 43 9.2 1-5.1 2-10.2 2-15.4.2-37.9-30.6-68.6-69.5-68.6m-89.1 31.7c-19.5 0-35.8 16.4-35.8 35.8 0 6.1 2 12.3 4.1 17.4 12.3-7.2 25.6-10.2 41-10.2h4.1v-6.1c0-11.3 2-21.5 6.1-30.7-6.2-4.1-12.3-6.2-19.5-6.2m169 24.6h-4.1c1 4.1 1 8.2 1 12.3 0 6.1-1 12.3-2 18.4 17.4 9.2 31.7 23.6 41 42 10.2-5.1 20.5-8.2 32.8-9.2-3.2-35.9-31.8-63.5-68.7-63.5M256 199.7c-53.2 0-96.3 43-96.3 96.3s43 96.3 96.3 96.3 96.3-43 96.3-96.3-43.1-96.3-96.3-96.3m-104.4 1c-41 0-74.8 33.8-74.8 74.8 0 24.6 11.3 46.1 29.7 59.4 7.2-14.3 22.5-24.6 39.9-24.6 2 0 4.1 0 6.1 1-1-5.1-1-9.2-1-14.3 0-23.6 7.2-45.1 20.5-62.5-8.2-9.2-13.3-21.5-15.4-33.8zm234.4 44c-12.3 0-24.6 3.1-34.8 8.2 6.1 13.3 9.2 27.6 9.2 43 0 28.7-11.3 54.3-29.7 73.7 13.3 15.4 33.8 24.6 55.3 24.6 41 0 74.8-33.8 74.8-74.8 0-40.9-33.8-74.7-74.8-74.7M68.6 255C30.7 255 0 285.7 0 323.6s30.7 68.6 68.6 68.6c14.3 0 27.6-4.1 38.9-12.3-4.1-7.2-7.2-15.4-7.2-24.6 0-5.1 1-9.2 2-13.3-20.5-15.4-34.8-39.9-34.8-66.6 0-7.2 1-13.3 3.1-20.5.1.1-1 .1-2 .1m405.5 59.4c-2 0-4.1 0-6.1 1v5.1c0 21.5-8.2 42-22.5 56.3 7.2 8.2 17.4 13.3 28.7 13.3 20.5 0 37.9-16.4 37.9-37.9s-17.5-37.8-38-37.8m-327.7 3c-20.5 0-37.9 16.4-37.9 37.9s16.4 37.9 37.9 37.9c16.4 0 29.7-10.2 34.8-23.6-13.3-13.3-23.6-30.7-27.6-50.2-2-.9-5.1-2-7.2-2" style="fill:#0b1e41"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
site/dist/assets/apps/pihole.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><linearGradient id="pi-hole_svg__a" x1="1124.653" x2="1839.97" y1="-669.315" y2="-669.315" gradientTransform="matrix(.3694 0 0 -.3694 -322.747 -168.195)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#12b212"/><stop offset="1" style="stop-color:#0f0"/></linearGradient><path d="M226.1 157.3C162.1 150.5 97.7 102.2 92.7 0 191.8 0 244.9 58.7 250 151.8c18.8-111.6 106.7-98.5 106.7-98.5 4.2 63.2-47.8 101.6-106.7 104.8-16.5-35-115.7-120.5-115.7-120.5-.1-.1-.3-.1-.4 0q-.15.15 0 .3s95.7 83.4 92.2 119.4" style="fill:url(#pi-hole_svg__a)"/><path d="M256 512c-6.2-.4-63.9-2.6-67.4-67.4-2.8-39.4 28.3-68.5 28.3-106.7-7.1-95.4-134.9-83.6-134.9 0-.1 20.9 8.2 40.9 23 55.7l95.2 95.3c14.8 14.8 34.8 23 55.8 23.1m0-348.1c6.2.4 63.9 2.6 67.4 67.4 2.8 39.4-28.3 68.5-28.3 106.7 7.1 95.4 134.8 83.6 134.8 0 .1-20.9-8.2-40.9-23-55.7L311.7 187c-14.8-14.8-34.8-23-55.7-23" style="fill:#91180c"/><path d="M430 337.9c-.4 6.2-2.6 63.9-67.4 67.4-39.4 2.8-68.5-28.3-106.7-28.3-95.4 7.1-83.6 134.8 0 134.8 20.9.1 40.9-8.2 55.7-23l95.3-95.2c14.8-14.8 23-34.8 23.1-55.7m-347.7 0c.4-6.2 2.6-63.9 67.4-67.4 39.4-2.8 68.5 28.3 106.7 28.3 95.4-7.2 83.6-134.8 0-134.8-20.9-.1-40.9 8.2-55.7 23l-95.3 95.3c-14.8 14.8-23 34.8-23 55.7" style="fill:#f42e1c"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
site/dist/assets/apps/portainer.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M412 96.8 282.7 22V0h-16v21.8l-.2-.3-130.2 75.3H73.1v16h114.2v77.5h41.4v-77.5h38V335c.6 0 11.6-.2 16 1.9V112.8h11.4v226.3c6.2 3.1 11.7 6.6 16 11.5V112.8h128.8v-16zm-191.1 51.9h-25.8v-35.9h25.8zm-52.6-51.9 98.4-56.9v56.9zm114.4-56.3L380 96.8h-97.3zM82.6 304.7c0 26.2 12.9 49.2 32.4 63.7 5.1-1.4 10.2-2.2 15.4-2.4 2.2 0 3.5.2 5.7.4 6-25.4 29.5-42.4 56.8-42.4 15.4 0 30.7 4.3 41 14.3 4.8-10.2 6.4-21.5 6.4-33.6 0-13.9-3.5-27.6-10.5-39.5H93.1c-6.8 11.9-10.5 25.6-10.5 39.5m11.5-87.4h41.4v41.6H94.1zm46.7-46.3h41.4v41.6h-41.4zm-46.7 0h41.4v41.6H94.1zm46.7 46.3h41.4v41.6h-41.4zm46.5 0h41.4v41.6h-41.4zm135.6 179.4c0-30.1-24.4-54.5-54.5-54.5-11.5 0-22 3.5-30.8 9.6-10.2-11.8-25-19.2-41.6-19.2-25.8 0-47.4 18-53.1 42-1.9-.4-3.9-.4-5.9-.1-30.3 0-54.7 24.4-54.7 54.5s24.6 54.5 54.7 54.5c3.9 0 7.6-.4 11.3-1.2 9.2 17.6 27.5 29.7 48.6 29.7 18.3 0 34.5-9.2 44.5-23.1 9.4 7.8 21.5 12.5 34.8 12.5 30.1 0 54.5-24.4 54.5-54.5 0-12.1-4.1-23.4-10.7-32.4 1.9-5.7 2.9-11.5 2.9-17.8" style="fill-rule:evenodd;clip-rule:evenodd;fill:#13bef9"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

1
site/dist/assets/apps/prometheus.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256 256-114.6 256-256S397.4 0 256 0m0 479.1c-40.2 0-72.8-26.9-72.8-60h145.7c-.1 33.1-32.7 60-72.9 60m120.3-79.9H135.7v-43.6h240.6zm-.9-66h-239c-.8-.9-1.6-1.8-2.4-2.8-24.6-29.9-30.4-45.5-36.1-61.4-.1-.5 29.9 6.1 51.1 10.9 0 0 10.9 2.5 26.9 5.4-15.3-18-24.5-40.9-24.5-64.2 0-51.3 39.4-96.2 25.2-132.4 13.8 1.1 28.6 29.2 29.6 73 14.7-20.3 20.8-57.4 20.8-80.1 0-23.5 15.5-50.9 31-51.8-13.8 22.8 3.6 42.3 19.1 90.8 5.8 18.2 5.1 48.8 9.5 68.3 1.5-40.4 8.4-99.2 34-119.6-11.3 25.6 1.7 57.6 10.5 73 14.3 24.8 23 43.7 23 79.3 0 23.9-8.8 46.3-23.7 63.9 16.9-3.2 28.6-6 28.6-6l54.9-10.7c.2 0-7.8 32.8-38.5 64.4" style="fill:#e6522c"/></svg>

After

Width:  |  Height:  |  Size: 765 B

1
site/dist/assets/apps/searxng.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="m295.9 252.1-24.7-13c17.7-33.6 11.7-74.3-15.1-101.2s-67.5-33.4-101.3-15.9l-12.7-25c44.7-23 98.5-14.5 133.9 21.1 35.3 35.7 43.4 89.5 19.9 134M512 432.6 366.2 293.1c15.5-28 24.4-60.2 24.4-94.4C390.6 91 303 3.3 195.3 3.3S0 91 0 198.7 87.6 394 195.3 394c35.3 0 68.4-9.4 97-25.8l146.8 140.5zM55.8 198.7c0-76.9 62.6-139.5 139.5-139.5s139.5 62.6 139.5 139.5-62.6 139.5-139.5 139.5S55.8 275.6 55.8 198.7" style="fill:#3050ff"/></svg>

After

Width:  |  Height:  |  Size: 518 B

1
site/dist/assets/apps/speedtest.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M436.6 474.3c45.6-45.6 75.4-109.1 75.4-180.6 0-140.9-115.1-256-256-256S0 152.8 0 293.7c0 71.4 27.8 134.9 75.4 180.6l35.7-35.7c-37.7-37.7-59.5-87.3-59.5-144.9 0-113.1 91.3-204.4 204.4-204.4s204.4 91.3 204.4 204.4c0 55.6-23.8 107.2-59.5 144.9zm-188.5-129-43.7-45.6 144.9-127 25.8 27.8z" style="fill:#151526"/></svg>

After

Width:  |  Height:  |  Size: 406 B

1
site/dist/assets/apps/traefik.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M116.8 428.5c-38.3-3.3-67.5-14.9-88.8-35.2-21.6-20.6-30.9-47.5-27.3-79 4.2-36.2 21.3-61.7 51.4-76.6 23.1-11.5 46.2-15.9 83.8-15.9 26.7 0 49.1 2.2 83.2 8.1 8.4 1.5 15.8 2.7 16.2 2.7.7 0 1.3-2.7 2.8-13.5 2.8-19.5 3.3-26.2 2.5-34.1-.9-9.1-2-13.4-5.5-20.5-8.9-18.2-29.9-29.3-63.7-33.7-9.7-1.2-31.9-1.4-41.6-.3-16.2 1.8-25.3 4.2-45.4 11.8-11.8 4.4-11.9 4.5-16.6 4.2-8.1-.5-13.6-4.2-17.2-11.4-1.5-3-1.7-4.2-1.7-8.3 0-6.1 1.6-9.3 7-14.4C68.5 101 89.2 91.2 110 87c13.3-2.7 19.9-3.3 37.5-3.2 18.2 0 29.8 1.1 46 4.1 26.9 5 47.3 13.9 62.7 27.2 4.6 3.9 11.5 11.7 14.4 16.2.9 1.4 1.8 2.5 2.1 2.5.2 0 1.7-1.7 3.3-3.7 23.3-29.8 62.6-46.7 108.6-46.7 32.5 0 62.8 8.3 85.3 23.3 17.9 11.9 32.4 30.3 38.3 48.4 3.4 10.4 3.9 14.2 3.9 29.3 0 9.4-.2 15.7-.8 18.7-5.3 29.7-17.8 50.2-39.6 64.9-17.5 11.8-39.6 18.7-68.4 21.4-14.5 1.4-41 1.2-58.2-.3-14.6-1.3-32.5-3.6-40.1-5.1-6.4-1.3-28.3-5-28.5-4.8-.1.1-1.1 6.7-2.3 14.6-1.9 12.7-2.2 15.9-2.2 26 0 10.3.1 12.1 1.3 16.9 4 15.3 12.8 25.6 28.7 33.5 15.7 7.8 32.1 11.2 57 11.7 11 .2 16.6.1 23.5-.7 16.7-1.8 24.3-3.7 46.4-11.9 5.5-2 11.2-3.9 12.5-4.1 2.9-.5 8.4.5 11.6 2.1 5.7 2.9 10.6 10.7 10.5 17 0 7.4-2.5 11.8-9.8 17.7-17.4 13.9-39.6 22.4-66.1 25.4-9.5 1.1-31 1.2-41.5.3-29.4-2.6-49.7-7.6-68.4-16.9-14.5-7.3-25.6-16.3-33.9-27.5-2-2.8-3.8-5.1-3.8-5.2-.1-.1-1.4 1.5-3 3.6-7 9-17.6 18.7-28 25.5-15 9.8-36.6 17.3-58.4 20.3-6.7.7-28.3 1.5-33.8 1m37.5-42.2c17.8-4 33.7-12.9 45.2-25.5 10.5-11.4 19.1-28.6 23.9-47.5 2.7-10.7 7.1-40.3 6.1-40.9-.4-.2-2.7-.6-5.2-.8s-9.6-1.1-15.7-1.9c-36.6-4.8-59.1-6.6-71.7-5.9-24 1.3-33.7 3.4-48.1 10.3-7.4 3.5-12.5 7.4-16.5 12.4-5.8 7.3-9.3 14.5-11.7 24.2-1.8 7.1-1.9 25.6-.3 31.5 2.8 10 6 15.7 13.4 23.3 10.1 10.3 23.4 17.2 39.9 20.6 8.4 1.8 8.2 1.7 22.3 1.5 10.3-.1 14.2-.4 18.4-1.3m233.5-139.1c14.9-1.3 24.1-3.6 35.3-9 9.4-4.4 14.8-8.9 20-16.6 7.6-11.2 10.5-21.8 10.5-37.6-.1-11.2-1-15.9-4.9-24-8.6-18-28.9-31-55.6-35.4-6.6-1.1-24.5-.9-31.3.3-13.1 2.4-24.2 6.8-33.9 13.4-18 12.3-30.5 30.7-37.4 55.5-2.7 9.7-3.5 13.5-5.9 30.3l-2.2 15.5 3 .3c9.1 1 29.5 3.5 41.4 5 7.5 1 16.6 2 20.4 2.3 10.6 1 30 1 40.6 0" style="fill:#24a1c1"/></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

1
site/dist/assets/apps/trilium.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M407.9 213.9c-45.6 32.6-110.4 25.9-151.7 12.8l30-23.9 28.6-22.9 99.4-79.6L310.5 173l-29 20.3-30.2 21.3c1.4-42.9 14.2-101.1 57.9-132.5 3.6-2.6 7.9-5.3 12.4-7.7 5.5-3 11.5-5.9 17.8-8.3C394.3 43.5 478.2 35 512 46.8c.2 32.8-32.2 91.9-68.7 133.5-4.9 5.7-9.9 10.9-15 15.8-6.8 7-13.7 12.9-20.4 17.8" style="fill:#95c980"/><path d="M428.6 196.3c-45 25.5-104.1 18.8-142.4 6.5l28.6-22.9 99.4-79.6L310.5 173l-29 20.3c1-36.7 9.9-85.3 39.9-118.7 5.5-3 11.5-5.9 17.8-8.3C394.1 43.8 478 35.2 511.8 47c.2 32.8-32.2 91.9-68.7 133.5-4.6 5.6-9.7 10.9-14.5 15.8" style="fill:#72b755"/><path d="M443.5 180.5c-42.7 17.4-94.4 10.7-129-.4l99.6-79.8L310.5 173c.6-32 7.1-74.1 29-106.9C394.3 43.5 478.2 35 512 46.8c.2 32.8-32.2 91.9-68.5 133.7" style="fill:#4fa52b"/><path d="M213.1 348.2c-11.7-42.5 10.5-88.7 31.4-115.8l9.7 28.8 9.1 27.1 32.2 95.2-25.9-96.5-7.3-26.7-7.5-28.2c31.4 12.6 71.1 37.7 82.4 78.6 1 3.4 1.8 7.3 2.4 11.1.8 4.9 1.2 10.1 1.4 15.6 1.8 46.8-14.4 111.2-32.2 133.1-24.3-8.7-59.3-48.6-80.4-86.7-2.8-5.3-5.5-10.3-7.7-15.4-3.2-7.1-5.8-13.8-7.6-20.2" style="fill:#ee8c89"/><path d="M220.6 368.2c-6.9-40.1 14-82 33.6-107.1l9.1 27.1 32.2 95.2-25.9-96.4-7.3-26.7c26.9 10.5 60.6 30.4 77.2 61.6.8 4.9 1.2 10.1 1.4 15.6 1.8 46.8-14.4 111.2-32.2 133.1-24.3-8.7-59.3-48.6-80.4-86.7-2.9-5.4-5.5-10.6-7.7-15.7" style="fill:#e96562"/><path d="M228.3 383.6c-1.4-36.5 17.4-72.7 35-95.4l32.2 95.2-25.9-96.4c23.5 8.9 52.9 25.1 71.3 50.2 1.8 46.8-14.4 111.2-32.2 133.1-24.3-8.7-59.4-48.6-80.4-86.7" style="fill:#e33f3b"/><path d="M171.7 105.3c43.9 22.1 65.6 74.1 72.5 111.2l-30.8-13.4-29.4-12.8-102.4-44.5 98.8 50.4 27.5 14 29 14.8c-33.6 16-83.6 29.4-125.8 8.3-3.6-1.8-7.3-3.8-10.9-6.5-4.7-3-9.1-6.5-13.8-10.3C46.2 183.3 4.9 122.5 0 92c25.1-13.2 84.1-11.7 131.2-.6 6.5 1.6 12.6 3.2 18.4 5.1 8.2 2.5 15.5 5.6 22.1 8.8" style="fill:#efb075"/><path d="M149.7 96.6c38.3 24.3 57.5 72.1 64 106.5l-29.4-12.8-102.5-44.5 98.6 50.4 27.5 14C179.3 224 138 236.5 100 226.8c-4.7-3-9.1-6.5-13.8-10.3C46.2 183.3 4.9 122.5 0 92c25.1-13.2 84.1-11.7 131.2-.6 6.3 1.6 12.6 3.2 18.5 5.2" style="fill:#e99547"/><path d="M131.2 91.3c31 25.9 47.2 68.1 52.9 99L81.6 145.8l98.8 50.4c-24.7 12.2-59.9 23.9-94.2 20.3C46.2 183.3 4.9 122.5 0 92c25.1-13.2 84.1-11.8 131.2-.7" style="fill:#e47b19"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

1
site/dist/assets/apps/unbound.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M65 385.4c.1 13.6 7 26.2 18.7 33.1L236.9 507c11.8 6.7 26.4 6.7 38.2 0l153.2-88.5c11.8-6.9 19.1-19.5 19.1-33.1 0-13.7-7.3-26.4-19.1-33.2l-70.4-40.8v.2l-98.9 57c-2 1-4.3 1-6.4 0L154 311.7l-69.9 40.5C72.3 359 65 371.7 65 385.4" style="fill:#2d2e83"/><path d="M447.4 95.7c-.1-13.6-7.4-26.3-19.1-33.2l-101.9-59c-7.9-4.6-17.7-4.6-25.5 0-7.9 4.5-12.7 13-12.7 22.1v223.2c.1 13.6 7.4 26.3 19.1 33.2l121 70.1c11.8 6.9 19.1 19.5 19.1 33.2zm-382.8 0c.1-13.6 7.4-26.3 19.1-33.2l102.2-59c7.9-4.6 17.7-4.6 25.5 0 7.9 4.5 12.7 13 12.7 22.1v223.2c-.1 13.6-7.4 26.3-19.1 33.2L84.1 352.2C72.3 359 65 371.7 65 385.4c-.1-.1-.4-289.7-.4-289.7" style="fill:#1fc2d7"/></svg>

After

Width:  |  Height:  |  Size: 743 B

1
site/dist/assets/apps/vaultwarden.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="m508.4 249.7-21.6-13c-.2-2.3-.4-4.6-.7-6.9l18.7-17c1.9-1.7 2.8-4.3 2.3-6.8s-2.3-4.6-4.7-5.5l-23.7-8.5c-.6-2.2-1.3-4.4-2-6.6l15-20.3c1.5-2.1 1.9-4.8.9-7.2s-3.1-4.1-5.7-4.4l-25-3.7c-1.1-2-2.1-4-3.3-6l10.8-22.9c1.1-2.3.9-5.1-.5-7.2s-3.9-3.4-6.4-3.2l-25.3 1.2c-1.4-1.8-2.8-3.5-4.3-5.2l6.2-24.6c.6-2.5-.1-5.1-1.9-6.9s-4.5-2.6-6.9-1.9l-24.6 6.2c-1.7-1.5-3.5-2.9-5.2-4.3l1.2-25.3c.1-2.6-1.1-5-3.2-6.4s-4.9-1.6-7.2-.5l-22.9 10.8-6-3.3-3.7-25c-.4-2.5-2.1-4.7-4.4-5.7-2.4-1-5.1-.7-7.2.9l-20.3 15c-2.2-.7-4.4-1.4-6.6-2l-8.5-23.7c-.9-2.4-2.9-4.2-5.5-4.7-2.5-.5-5.1.4-6.8 2.3l-17 18.7c-2.3-.3-4.6-.5-6.9-.7l-13-21.6C260.9 1.3 258.6 0 256 0s-5 1.3-6.3 3.6l-13 21.6c-2.3.2-4.6.4-6.9.7l-17-18.7c-1.7-1.9-4.3-2.8-6.8-2.3s-4.6 2.3-5.5 4.7L192 33.3c-2.2.6-4.4 1.3-6.6 2l-20.3-15c-2.1-1.5-4.8-1.9-7.2-.9s-4.1 3.1-4.4 5.7l-3.7 25c-2 1.1-4 2.1-6 3.3L121 42.6c-2.3-1.1-5.1-.9-7.2.5s-3.4 3.9-3.2 6.4l1.2 25.3c-1.8 1.4-3.5 2.8-5.2 4.3L82 72.9c-2.5-.6-5.1.1-6.9 1.9s-2.5 4.5-1.9 6.9l6.2 24.6c-1.5 1.7-2.9 3.5-4.3 5.2l-25.3-1.2c-2.6-.1-5 1.1-6.4 3.2s-1.6 4.9-.5 7.2l10.8 22.9-3.3 6-25 3.7c-2.5.4-4.7 2.1-5.7 4.4-1 2.4-.6 5.1.9 7.2l15 20.3c-.7 2.2-1.4 4.4-2 6.6l-23.7 8.5c-2.4.9-4.2 2.9-4.7 5.5-.5 2.5.4 5.1 2.3 6.8l18.7 17c-.3 2.3-.5 4.6-.7 6.9l-21.6 13C1.3 251.1 0 253.4 0 256s1.3 4.9 3.6 6.3l21.6 13c.2 2.3.4 4.6.7 6.9l-18.7 17c-1.9 1.7-2.8 4.3-2.3 6.8s2.3 4.6 4.7 5.5l23.7 8.5c.6 2.2 1.3 4.4 2 6.6l-15 20.3c-1.5 2.1-1.9 4.8-.9 7.2s3.1 4.1 5.7 4.4l25 3.7c1.1 2 2.1 4 3.3 6L42.6 391c-1.1 2.3-.9 5.1.5 7.2 1.4 2 3.6 3.3 6.1 3.3h.4l25.3-1.2c1.4 1.8 2.8 3.5 4.3 5.2L73 430.1c-.6 2.5.1 5.1 1.9 6.9 1.4 1.4 3.3 2.1 5.2 2.1.6 0 1.2-.1 1.8-.2l24.6-6.2c1.7 1.5 3.5 2.9 5.2 4.3l-1.2 25.3c-.1 2.6 1.1 5 3.2 6.4 1.2.8 2.6 1.2 4.1 1.2 1.1 0 2.1-.2 3.1-.7l22.9-10.8 6 3.3 3.7 25c.4 2.5 2.1 4.7 4.4 5.7.9.4 1.9.6 2.8.6 1.5 0 3.1-.5 4.4-1.4l20.3-15c2.2.7 4.4 1.4 6.6 2l8.5 23.7c.9 2.4 2.9 4.2 5.5 4.7.5.1 1 .1 1.4.1 2 0 4-.9 5.4-2.4l17-18.7c2.3.3 4.6.5 6.9.7l13 21.6c1.3 2.2 3.7 3.6 6.3 3.6s4.9-1.3 6.3-3.6l13-21.6c2.3-.2 4.6-.4 6.9-.7l17 18.7c1.4 1.5 3.4 2.4 5.4 2.4.5 0 1 0 1.4-.1 2.5-.5 4.6-2.3 5.5-4.7l8.5-23.7c2.2-.6 4.4-1.3 6.6-2l20.3 15c1.3.9 2.8 1.4 4.4 1.4.9 0 1.9-.2 2.8-.6 2.4-1 4.1-3.1 4.4-5.7l3.7-25c2-1.1 4-2.1 6-3.3l22.9 10.8c1 .5 2.1.7 3.1.7 1.4 0 2.8-.4 4.1-1.2 2.1-1.4 3.4-3.9 3.2-6.4l-1.2-25.3c1.8-1.4 3.5-2.8 5.2-4.3l24.6 6.2c.6.1 1.2.2 1.8.2 1.9 0 3.8-.8 5.2-2.1 1.8-1.8 2.5-4.5 1.9-6.9l-6.2-24.6c1.5-1.7 2.9-3.5 4.3-5.2l25.3 1.2h.4c2.4 0 4.7-1.2 6.1-3.3s1.6-4.9.5-7.2l-10.8-22.9 3.3-6 25-3.7c2.5-.4 4.7-2.1 5.7-4.4 1-2.4.6-5.1-.9-7.2l-15-20.3c.7-2.2 1.4-4.4 2-6.6l23.7-8.5c2.4-.9 4.2-2.9 4.7-5.5.5-2.5-.4-5.1-2.3-6.8l-18.7-17c.3-2.3.5-4.6.7-6.9l21.6-13c2.2-1.3 3.6-3.7 3.6-6.3 0-2.5-1.3-4.8-3.6-6.2m-64.7 6.3c0 49.9-19.6 95.3-51.4 129l-33.7-5.3c-8-1.3-15.5 4.2-16.7 12.2l-5.4 33.8c-13 6.2-26.8 10.9-41.3 14L402.6 139c6.8 8.5 12.9 17.6 18.2 27.3l-15.5 30.5c-3.7 7.2-.8 16 6.4 19.7l30.5 15.5q1.5 11.7 1.5 24M175.5 425.6l-5.4-33.8c-1.3-8-8.8-13.4-16.7-12.2l-33.7 5.3c-31.9-33.7-51.4-79.1-51.4-129 0-8.2.5-16.2 1.6-24.2l30.5-15.5c7.2-3.7 10.1-12.5 6.4-19.7L91.3 166c5.3-9.6 11.4-18.7 18.2-27.3l107.4 300.7c-14.6-2.9-28.4-7.6-41.4-13.8m45.9-354.1 24.2 24.2c2.7 2.7 6.5 4.3 10.3 4.3 3.9 0 7.6-1.5 10.3-4.3l24.2-24.2c20.6 3.8 40 11.1 57.7 21.1l-79.8 226.9c-4.8 13.1-8.9 25.7-12.4 37.5-3.5-12-7.7-24.9-12.5-38.4L164.2 92.3c17.5-9.9 36.8-17 57.2-20.8"/></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

1
site/dist/assets/apps/wireguard.svg vendored Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><ellipse cx="255" cy="256.4" rx="250" ry="252.4" style="fill:#fff"/><path d="M511.6 248.4S523.4 0 250.4 0C8.9 0 1.4 238.3 1.4 238.3S-34.1 512 255.9 512c278.3 0 255.7-263.6 255.7-263.6M174 161.6c51.2-31.3 116.7-12.2 141.2 34.9 4.6 8.9 5.2 22.7 2.3 32-10.2 32.4-34.2 50.5-67.1 58.2 9.7-8.3 17.4-17.7 19.9-30.8 2.6-12.5-.2-25.5-7.8-35.8-12-16.5-33.4-23-52.6-16-20.3 7.7-31.4 26.2-29.4 49 1.9 21.1 17.9 34.8 47.9 40-4.5 2.4-7.9 4.1-11.3 6-13.7 7.5-25.7 17.9-35.1 30.5-3 4.1-5.1 4.4-9.8 1.6-60.2-36.7-64.1-129.3 1.8-169.6m-45.2 227.9c-9.7 2.5-19.1 6.1-29 9.3 4.8-32.7 43.1-62.8 75.5-59.4-9.4 12.9-14.8 28.3-15.8 44.2-10.7 2.1-20.8 3.4-30.7 5.9M335 70.4c9.6.4 19.2.2 28.8.4 2.4.2 4.8.5 7.1 1-2.1 3.3-4.6 6.4-7.2 9.3-3.4 3.2-7.3 6.3-12.2 1.5-1.2-1.2-4-.9-6.1-.9-9.5-.1-19.1-.4-28.6-.1-8.3.3-16.5 1.1-24.6 2.5-1.5.3-3.8 5.3-3.1 7.2 1.6 4.4 4.1 9.3 7.6 12.1 13.2 10.4 27.3 19.8 40.5 30.1 12.9 10.1 24.9 21.1 32.2 36.3 9.5 19.8 9.8 40.5 5.7 61.4-6.9 34.8-24.5 63.6-53 84.5-11.5 8.4-25.7 13.2-38.8 19.3-11.6 5.3-23.5 9.9-35.1 15.2-20.9 9.5-32.7 32.2-29.2 55.8 3.2 21.6 22.2 39.7 43.9 43.4 26.1 4.5 53-12.5 59.4-39 7.2-29.8-9-56.5-39.4-64.5-1.3-.4-2.7-.7-5.5-1.4 8.1-3.6 15.1-6.2 21.6-9.8 11.3-6.2 22.4-12.8 33.2-19.7 3.2-2 4.9-2 7.7.3 20.9 18 33.3 40.5 36.8 68 5.8 45.5-15.8 87.4-56.4 108.8-62.9 33.2-139.9-4.6-153.8-74.3-11.9-59.7 30.3-113.9 81-124.4 21.8-4.5 41.8-13.6 57.3-30.4 10-10.8 14.9-20.1 16.5-24.4 3.1-7.9 4.7-16.2 4.6-24.7-.3-7.3-2-14.5-5.1-21.2-5.3-12.1-25.6-31.3-30.6-35.3L242.6 120c-1.7-1.4-3.6-1.3-7.7-1-4.9.3-17.4 1-22.8-.4 4.4-3.3 16.2-8.1 21.3-12-15.5-10.5-33.2-6.7-49.4-9.8 3.7-7 22.3-17.7 32.9-18.9-.6-5.9-1.6-11.8-2.9-17.6-.6-2.4-3.3-4.7-5.6-6-5.6-3.3-11.6-6-18-9.3 5.8-3.7 12.5-5.8 19.3-6 6.5-.2 13 .4 19.4 1.9 11.5 2.6 20.7.9 29.8-6.9-7.2-2.9-14.4-5.6-21.4-8.7q-10.35-4.65-20.1-10.5c18.1 2.5 35.7 9.3 54.2 6.8l.5-2.5-42.9-10c25.7-2.4 49.6-2.7 72.2 8.3 6.4 3.1 13 5.7 19.1 9.2 3 1.7 5 5.1 7.4 7.8 1.9 2.1 3.5 4.9 5.9 6.2 9 4.8 19 5 29.2 4.8l.2-3.4c10.2 3.2 21.7 15 21.7 23.6-16.5 0-33.1-.1-49.6.1-1.8 0-3.5 1.3-5.3 2 1.6.9 3.3 2.6 5 2.7m-21.3-24.5c-1.2.7-1.5 2.3-.8 3.5.1.2.3.4.5.6 1 1.8 3.4 2.5 5.2 1.4 1.6-.8 3.2-1.7 5.1-2.7-1.6-1.3-2.8-2.4-4.1-3.5-2.3-1.8-4.1-.7-5.9.7" style="fill:#82201e"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
site/dist/assets/favicon.ico vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

605
site/dist/assets/libreportal.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 240 KiB

66
site/dist/assets/main.js vendored Normal file
View File

@ -0,0 +1,66 @@
// LibrePortal site — interactions (mobile drawer, copy, scrollspy, reveal, app filter)
(() => {
// mobile drawer (same behaviour as the dashboard)
const menuToggle = document.getElementById('mobile-menu-toggle');
const drawer = document.getElementById('mobile-drawer');
if (menuToggle && drawer) {
menuToggle.addEventListener('click', () => {
const open = drawer.classList.toggle('mobile-open');
document.body.style.overflow = open ? 'hidden' : '';
});
drawer.querySelectorAll('a').forEach((a) =>
a.addEventListener('click', () => { drawer.classList.remove('mobile-open'); document.body.style.overflow = ''; }));
}
// copy the install command
const cmdEl = document.querySelector('[data-install-cmd]');
const CMD = cmdEl ? cmdEl.getAttribute('data-install-cmd') : '';
document.querySelectorAll('.copy').forEach((btn) => {
btn.addEventListener('click', async () => {
try { await navigator.clipboard.writeText(CMD); }
catch { const t = document.createElement('textarea'); t.value = CMD; document.body.appendChild(t); t.select(); document.execCommand('copy'); t.remove(); }
btn.classList.add('done');
const span = btn.querySelector('span'); const prev = span.textContent; span.textContent = 'Copied ✓';
setTimeout(() => { btn.classList.remove('done'); span.textContent = prev; }, 1700);
});
});
// scrollspy → light up the active topbar pill
const spies = [...document.querySelectorAll('.nav-item[data-spy]')];
if (spies.length) {
const spyIO = new IntersectionObserver((entries) => {
entries.forEach((e) => {
if (e.isIntersecting) spies.forEach((s) => s.classList.toggle('nav-active', s.dataset.spy === e.target.id));
});
}, { rootMargin: '-45% 0px -50% 0px', threshold: 0 });
spies.map((s) => document.getElementById(s.dataset.spy)).filter(Boolean).forEach((s) => spyIO.observe(s));
}
// reveal on scroll
const io = new IntersectionObserver((entries) => {
entries.forEach((e) => { if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); } });
}, { threshold: 0.16, rootMargin: '0px 0px -8% 0px' });
document.querySelectorAll('.reveal, .stagger').forEach((el) => io.observe(el));
// app category filter
const filters = document.querySelector('.app-filters');
if (filters) {
const cards = [...document.querySelectorAll('.app-card')];
const countEl = document.querySelector('.app-count');
const update = (cat) => {
let shown = 0;
cards.forEach((c) => {
const match = cat === 'all' || (c.dataset.cats || '').split(' ').includes(cat);
c.classList.toggle('hidden', !match);
if (match) shown++;
});
if (countEl) countEl.textContent = `${shown} app${shown === 1 ? '' : 's'}`;
};
filters.addEventListener('click', (e) => {
const chip = e.target.closest('.chip');
if (!chip) return;
filters.querySelectorAll('.chip').forEach((c) => c.classList.toggle('active', c === chip));
update(chip.dataset.cat);
});
}
})();

276
site/dist/assets/style.css vendored Normal file
View File

@ -0,0 +1,276 @@
/* ============ NEBULA THEME (lifted from the dashboard) ============ */
:root{
--gradient-from:#1a1442; /* indigo */
--gradient-mid:#1b2a5e; /* violet-blue */
--gradient-to:#0f3b6e; /* ocean */
--surface-solid:#0f1729;
--accent:#00d4ff;
--accent-hover:#0099cc;
--accent-rgb:0,212,255;
--accent-soft:rgba(0,212,255,.15);
--text-primary:#ffffff;
--text-secondary:rgba(255,255,255,.82);
--text-muted:rgba(255,255,255,.65);
--text-faint:rgba(255,255,255,.45);
--text-on-accent:#0a1426;
--text-rgb:255,255,255;
--border:rgba(255,255,255,.16);
--border-strong:rgba(255,255,255,.26);
--border-subtle:rgba(255,255,255,.08);
--card-bg:linear-gradient(155deg, rgba(255,255,255,.09) 0%, rgba(0,212,255,.05) 100%);
--card-border:rgba(255,255,255,.16);
--card-shadow:0 4px 18px rgba(0,0,0,.30), inset 0 1px 0 rgba(255,255,255,.06);
--card-shadow-hover:0 10px 32px rgba(0,212,255,.18), 0 4px 18px rgba(0,0,0,.40), inset 0 1px 0 rgba(255,255,255,.10);
--topbar-bg:rgba(15,25,50,.40);
--console-bg:rgba(0,0,0,.40);
--surface-bg-solid:#0f1729;
--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
--font-mono:"SF Mono", "Monaco", "Menlo", "Ubuntu Mono", "Courier New", monospace;
--maxw:1180px;
--ease:cubic-bezier(.22,.61,.36,1);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:var(--font-sans);background:var(--surface-solid);color:var(--text-primary);
line-height:1.6;overflow-x:hidden;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
/* ============ AURORA BACKDROP (from aurora-background.css) ============ */
.cosmos{position:fixed;inset:0;z-index:-2;pointer-events:none;overflow:hidden;
background:
radial-gradient(ellipse at 20% 22%, var(--gradient-mid) 0%, transparent 55%),
radial-gradient(ellipse at 82% 74%, var(--gradient-to) 0%, transparent 55%),
linear-gradient(135deg, var(--gradient-from) 0%, var(--gradient-from) 40%, var(--gradient-mid) 100%);}
.cosmos::before{content:'';position:absolute;inset:-25%;
background:conic-gradient(from 0deg at 50% 50%,
rgba(var(--accent-rgb),0) 0deg, rgba(var(--accent-rgb),.18) 60deg,
rgba(var(--accent-rgb),.22) 130deg, rgba(var(--accent-rgb),.20) 200deg,
rgba(var(--accent-rgb),.18) 280deg, rgba(var(--accent-rgb),0) 360deg);
filter:blur(70px);animation:auroraSpin 38s linear infinite;}
.cosmos::after{content:'';position:absolute;inset:-10%;
background:
radial-gradient(circle at 18% 22%, rgba(var(--accent-rgb),.38) 0%, transparent 35%),
radial-gradient(circle at 78% 18%, rgba(var(--accent-rgb),.32) 0%, transparent 32%),
radial-gradient(circle at 30% 80%, rgba(var(--accent-rgb),.30) 0%, transparent 38%),
radial-gradient(circle at 84% 82%, rgba(var(--accent-rgb),.34) 0%, transparent 36%),
radial-gradient(circle at 50% 50%, rgba(var(--accent-rgb),.14) 0%, transparent 50%);
filter:blur(50px);animation:auroraDrift 22s ease-in-out infinite alternate;}
.stars{position:fixed;inset:0;z-index:-1;pointer-events:none}
.stars::before,.stars::after{content:'';position:absolute;inset:0;background-repeat:repeat}
.stars::before{background-image:
radial-gradient(1.5px 1.5px at 12px 18px, rgba(var(--text-rgb),.9), transparent 60%),
radial-gradient(1px 1px at 47px 92px, rgba(var(--accent-rgb),.85), transparent 60%),
radial-gradient(1.2px 1.2px at 110px 40px, rgba(var(--text-rgb),.75), transparent 60%),
radial-gradient(1px 1px at 165px 130px, rgba(var(--accent-rgb),.7), transparent 60%);
background-size:200px 200px;animation:auroraTwinkleA 4.5s ease-in-out infinite;}
.stars::after{background-image:
radial-gradient(1px 1px at 30px 60px, rgba(var(--accent-rgb),.8), transparent 60%),
radial-gradient(1.4px 1.4px at 88px 22px, rgba(var(--text-rgb),.7), transparent 60%),
radial-gradient(1px 1px at 140px 100px, rgba(var(--accent-rgb),.85), transparent 60%),
radial-gradient(1.2px 1.2px at 195px 70px, rgba(var(--text-rgb),.6), transparent 60%);
background-size:240px 240px;background-position:80px 50px;animation:auroraTwinkleB 6.5s ease-in-out infinite;}
@keyframes auroraSpin{to{transform:rotate(360deg)}}
@keyframes auroraDrift{0%{transform:translate(0,0) scale(1);opacity:.85}50%{transform:translate(-3%,4%) scale(1.08);opacity:1}100%{transform:translate(2%,-3%) scale(.95);opacity:.9}}
@keyframes auroraTwinkleA{0%,100%{opacity:.55}50%{opacity:1}}
@keyframes auroraTwinkleB{0%,100%{opacity:1}50%{opacity:.45}}
/* ============ shared ============ */
.grad{background:linear-gradient(100deg,#7ae9ff,#00d4ff 55%,#0aa6d6);
-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 clamp(18px,5vw,48px)}
section{position:relative;z-index:1}
.eyebrow{font-family:var(--font-mono);font-size:.74rem;letter-spacing:.22em;text-transform:uppercase;color:var(--accent);margin-bottom:16px;display:block}
h2{font-size:clamp(2rem,4.6vw,3.2rem);line-height:1.08;letter-spacing:-.02em;font-weight:800}
.lead{color:var(--text-secondary);font-size:1.08rem;max-width:54ch;margin-top:18px;font-weight:400}
.pad{padding:clamp(80px,12vh,140px) 0}
.glass{background:var(--card-bg);border:1px solid var(--card-border);box-shadow:var(--card-shadow);
backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}
/* ============ TOPBAR — grafted from the dashboard (topbar.css) ============ */
.topbar{display:flex;justify-content:space-between;align-items:center;padding:0 24px;height:60px;
position:fixed;top:0;left:0;right:0;z-index:1000;background:var(--topbar-bg);
border-bottom:1px solid var(--border);backdrop-filter:blur(12px) saturate(140%);-webkit-backdrop-filter:blur(12px) saturate(140%)}
.mobile-menu-toggle{display:none;background:none;border:none;color:var(--text-primary);cursor:pointer;padding:6px;margin-right:4px}
.topbar-left{display:flex;align-items:center;flex:0 0 auto}
.libreportal-logo{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--text-primary);font-weight:700;font-size:1.05rem}
.libreportal-logo img{width:32px;height:32px}
.libreportal-logo b{color:var(--accent);font-weight:700}
.mobile-drawer{display:flex;align-items:center;flex:1;justify-content:space-between;gap:12px;min-width:0;margin-left:24px}
.topbar-nav{display:flex;gap:8px;align-items:center}
.topbar-nav .nav-item{background:rgba(var(--text-rgb),.10);border:1px solid rgba(var(--text-rgb),.20);border-radius:8px;
padding:10px 16px;font-size:14px;font-weight:500;color:var(--text-muted);text-decoration:none;display:flex;align-items:center;gap:8px;
transition:all .2s ease;cursor:pointer;min-height:42px;white-space:nowrap}
.topbar-nav .nav-item:hover{background:rgba(var(--text-rgb),.20);transform:translateY(-1px);color:var(--text-primary)}
.topbar-nav .nav-item.nav-active{background:var(--accent);color:var(--text-primary);border-color:var(--accent)}
.topbar-nav .nav-item.nav-active:hover{background:var(--accent-hover);border-color:var(--accent-hover)}
.topbar-nav .nav-item svg{width:16px;height:16px}
.topbar-controls{display:flex;align-items:center;gap:12px}
.tb-ghost{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border:1px solid var(--border);border-radius:8px;
background:rgba(var(--text-rgb),.05);color:var(--text-secondary);text-decoration:none;font-size:.85rem;font-weight:600;transition:all .2s}
.tb-ghost:hover{background:rgba(var(--text-rgb),.12);color:var(--text-primary)}
.tb-cta{display:inline-flex;align-items:center;gap:6px;padding:8px 18px;border-radius:8px;background:var(--accent);
color:var(--text-on-accent);text-decoration:none;font-size:.85rem;font-weight:700;transition:all .2s}
.tb-cta:hover{background:#22dbff;transform:translateY(-1px);box-shadow:0 8px 22px -8px rgba(var(--accent-rgb),.6)}
@media(max-width:768px){
.topbar{padding:0 12px;gap:8px;justify-content:flex-start}
.mobile-menu-toggle{display:flex;align-items:center}
.mobile-drawer{position:fixed;top:60px;left:0;width:100vw;height:calc(100vh - 60px);flex-direction:column;align-items:stretch;
justify-content:flex-start;gap:0;padding:16px;margin-left:0;background:var(--surface-bg-solid);border-right:1px solid var(--border);
box-shadow:6px 0 24px rgba(0,0,0,.35);overflow-y:auto;transform:translateX(-100%);transition:transform .3s ease;z-index:101}
.mobile-drawer.mobile-open{transform:translateX(0)}
.mobile-drawer .topbar-nav{flex-direction:column;align-items:stretch;gap:6px;width:100%}
.mobile-drawer .topbar-nav .nav-item{width:100%;justify-content:flex-start}
.mobile-drawer .topbar-controls{flex-direction:column;align-items:stretch;gap:8px;width:100%;margin-top:auto;padding-top:16px;
border-top:1px solid rgba(var(--text-rgb),.12)}
.mobile-drawer .topbar-controls a{width:100%;justify-content:center}
}
/* ============ hero ============ */
header.hero{min-height:100vh;display:flex;flex-direction:column;justify-content:center;align-items:center;
text-align:center;padding:140px clamp(18px,5vw,48px) 90px;position:relative}
.badge{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:.72rem;
letter-spacing:.14em;text-transform:uppercase;color:var(--accent);padding:7px 15px;border-radius:999px;
border:1px solid rgba(var(--accent-rgb),.35);background:var(--accent-soft);margin-bottom:30px}
.badge .dot{width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px var(--accent);animation:pulse 2.4s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:.4}50%{opacity:1}}
.hero-logo{width:64px;height:64px;margin-bottom:22px;filter:drop-shadow(0 6px 24px rgba(var(--accent-rgb),.45))}
h1{font-size:clamp(2.6rem,7vw,5.2rem);line-height:1.03;letter-spacing:-.03em;font-weight:800;max-width:15ch}
.sub{margin:26px auto 0;max-width:50ch;font-size:clamp(1.02rem,2vw,1.2rem);color:var(--text-secondary);font-weight:400}
/* install portal */
.portal{margin:46px auto 0;width:min(660px,100%);position:relative}
.portal::before{content:"";position:absolute;inset:-26px;border-radius:28px;z-index:-1;
background:radial-gradient(60% 80% at 50% 50%, rgba(var(--accent-rgb),.5), transparent 70%);filter:blur(22px);animation:breathe 6s ease-in-out infinite}
@keyframes breathe{0%,100%{opacity:.45;transform:scale(.98)}50%{opacity:.8;transform:scale(1.03)}}
.term{border:1px solid var(--card-border);border-radius:16px;overflow:hidden;
background:linear-gradient(155deg, rgba(255,255,255,.10) 0%, rgba(0,212,255,.06) 100%);
backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:var(--card-shadow-hover)}
.term-bar{display:flex;align-items:center;gap:7px;padding:12px 16px;border-bottom:1px solid var(--border-subtle);background:var(--console-bg)}
.term-bar i{width:11px;height:11px;border-radius:50%;display:block}
.term-bar i:nth-child(1){background:#ff6b5e}.term-bar i:nth-child(2){background:#ffc107}.term-bar i:nth-child(3){background:var(--accent)}
.term-bar em{margin-left:auto;font-family:var(--font-mono);font-size:.72rem;color:var(--text-faint);font-style:normal}
.term-body{display:flex;align-items:center;gap:14px;padding:22px 20px}
.term-body code{font-family:var(--font-mono);font-size:clamp(.82rem,2.3vw,1.02rem);color:var(--text-primary);
white-space:nowrap;overflow-x:auto;flex:1;text-align:left;scrollbar-width:none}
.term-body code::-webkit-scrollbar{display:none}
.term-body code .p{color:var(--accent)}
.term-body code .u{color:#e6f3ff}
.copy{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;font-family:var(--font-sans);font-weight:700;
font-size:.84rem;color:var(--text-on-accent);background:var(--accent);border:none;border-radius:9px;padding:9px 15px;cursor:pointer;
transition:transform .15s,background .25s,box-shadow .25s}
.copy:hover{transform:translateY(-1px);background:#22dbff;box-shadow:0 8px 22px -8px rgba(var(--accent-rgb),.7)}
.copy.done{background:#28a745;color:#fff}
.portal-foot{display:flex;align-items:center;justify-content:center;gap:16px;margin-top:16px;flex-wrap:wrap;font-size:.86rem;color:var(--text-faint)}
.portal-foot a{color:var(--text-secondary);text-decoration:none;border-bottom:1px dashed rgba(255,255,255,.3);transition:color .2s,border-color .2s}
.portal-foot a:hover{color:var(--accent);border-color:var(--accent)}
.hint{font-family:var(--font-mono);font-size:.78rem}
.scroll-cue{position:absolute;bottom:28px;left:50%;transform:translateX(-50%);color:var(--text-faint);
font-family:var(--font-mono);font-size:.66rem;letter-spacing:.2em;text-transform:uppercase;
display:flex;flex-direction:column;align-items:center;gap:8px;animation:bob 2.6s ease-in-out infinite}
.scroll-cue::after{content:"";width:1px;height:34px;background:linear-gradient(var(--text-faint),transparent)}
@keyframes bob{0%,100%{transform:translateX(-50%) translateY(0)}50%{transform:translateX(-50%) translateY(8px)}}
/* ============ features ============ */
.feat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:54px}
.card{border-radius:16px;padding:28px 26px;position:relative;overflow:hidden;transition:transform .4s var(--ease),border-color .4s,box-shadow .4s}
.card:hover{transform:translateY(-6px);border-color:rgba(var(--accent-rgb),.45);box-shadow:var(--card-shadow-hover)}
.card .ico{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;margin-bottom:18px;
background:var(--accent-soft);border:1px solid rgba(var(--accent-rgb),.30)}
.card .ico svg{width:22px;height:22px;stroke:var(--accent);fill:none;stroke-width:1.6}
.card h3{font-size:1.24rem;margin-bottom:8px;font-weight:700;letter-spacing:-.01em}
.card p{color:var(--text-secondary);font-size:.96rem}
/* ============ apps (data-driven) ============ */
.apps-section{text-align:center}
.app-filters{display:flex;flex-wrap:wrap;justify-content:center;gap:10px;margin-top:40px}
.chip{font-family:var(--font-mono);font-size:.76rem;letter-spacing:.04em;padding:8px 15px;border-radius:999px;
border:1px solid var(--border);background:rgba(255,255,255,.05);color:var(--text-secondary);cursor:pointer;transition:all .2s}
.chip:hover{color:var(--text-primary);border-color:rgba(var(--accent-rgb),.45)}
.chip.active{background:var(--accent);color:var(--text-on-accent);border-color:var(--accent);font-weight:600}
.chip .n{opacity:.55;margin-left:6px}
.app-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:16px;margin-top:34px;text-align:left}
.app-card{border-radius:14px;padding:20px;display:flex;flex-direction:column;gap:11px;transition:transform .3s var(--ease),border-color .3s,box-shadow .3s}
.app-card.hidden{display:none}
.app-card:hover{transform:translateY(-4px);border-color:rgba(var(--accent-rgb),.4);box-shadow:var(--card-shadow-hover)}
.app-card-head{display:flex;align-items:center;gap:12px}
.app-ico{width:42px;height:42px;border-radius:10px;background:rgba(255,255,255,.06);padding:6px;object-fit:contain;border:1px solid var(--border-subtle);flex:0 0 auto}
.app-card h3{font-size:1.06rem;font-weight:700;line-height:1.2}
.app-cat{font-family:var(--font-mono);font-size:.64rem;letter-spacing:.1em;text-transform:uppercase;color:var(--accent)}
.app-card p{font-size:.9rem;color:var(--text-secondary);margin:0}
.app-count{margin-top:26px;color:var(--text-faint);font-size:.85rem;font-family:var(--font-mono)}
/* ============ connect / courier ============ */
.connect{display:grid;grid-template-columns:1.05fr .95fr;gap:60px;align-items:center}
.pill{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:.72rem;
letter-spacing:.1em;text-transform:uppercase;color:var(--text-secondary);padding:7px 14px;border-radius:999px;
border:1px solid var(--border);background:rgba(255,255,255,.04);margin-top:24px}
.connect ul{list-style:none;margin-top:26px;display:flex;flex-direction:column;gap:15px}
.connect li{display:flex;gap:13px;color:var(--text-secondary);font-size:1rem}
.connect li svg{flex:0 0 auto;width:21px;height:21px;stroke:var(--accent);fill:none;stroke-width:1.6;margin-top:3px}
.connect li b{color:var(--text-primary);font-weight:700}
.vault{position:relative;aspect-ratio:1;display:grid;place-items:center}
.vault svg{width:min(360px,82%);height:auto;overflow:visible}
.orbit{transform-origin:center;animation:spin 26s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
/* ============ promise ============ */
.promise{text-align:center}
.pledges{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:52px}
.pledge{border-radius:14px;padding:28px 18px}
.pledge .big{font-size:2.4rem;font-weight:800;margin-bottom:8px;line-height:1}
.pledge p{font-size:.92rem;color:var(--text-secondary)}
.promise .link{display:inline-block;margin-top:40px;color:var(--accent);text-decoration:none;font-weight:700;
border-bottom:1px solid rgba(var(--accent-rgb),.45);padding-bottom:2px;transition:color .2s,border-color .2s}
.promise .link:hover{color:#fff;border-color:#fff}
/* ============ final ============ */
.final{text-align:center;padding:clamp(90px,14vh,160px) 0}
.final h2{max-width:18ch;margin-inline:auto}
.final .portal{margin-top:42px}
/* ============ footer ============ */
footer{border-top:1px solid var(--border-subtle);padding:54px 0 70px;margin-top:40px;background:rgba(10,16,32,.55);backdrop-filter:blur(8px)}
.foot-grid{display:flex;justify-content:space-between;gap:40px;flex-wrap:wrap;align-items:flex-start}
.foot-grid .libreportal-logo{margin-bottom:14px}
.foot-col h4{font-size:.74rem;letter-spacing:.16em;text-transform:uppercase;color:var(--text-faint);margin-bottom:14px;font-family:var(--font-mono)}
.foot-col a{display:block;color:var(--text-secondary);text-decoration:none;font-size:.95rem;margin-bottom:9px;transition:color .2s}
.foot-col a:hover{color:var(--accent)}
.colophon{margin-top:46px;padding-top:26px;border-top:1px solid var(--border-subtle);
display:flex;justify-content:space-between;gap:18px;flex-wrap:wrap;color:var(--text-faint);font-size:.86rem}
.colophon a{color:var(--text-secondary);text-decoration:none}
.colophon a:hover{color:var(--accent)}
/* ============ reveal ============ */
.reveal{opacity:0;transform:translateY(28px);transition:opacity .9s var(--ease),transform .9s var(--ease)}
.reveal.in{opacity:1;transform:none}
.stagger>*{opacity:0;transform:translateY(20px);transition:opacity .7s var(--ease),transform .7s var(--ease)}
.stagger.in>*{opacity:1;transform:none}
.stagger.in>*:nth-child(2){transition-delay:.07s}.stagger.in>*:nth-child(3){transition-delay:.14s}
.stagger.in>*:nth-child(4){transition-delay:.21s}.stagger.in>*:nth-child(5){transition-delay:.28s}.stagger.in>*:nth-child(6){transition-delay:.35s}
.h-anim{opacity:0;transform:translateY(24px);animation:rise .95s var(--ease) forwards}
.d1{animation-delay:.05s}.d2{animation-delay:.16s}.d3{animation-delay:.28s}.d4{animation-delay:.4s}.d5{animation-delay:.52s}
@keyframes rise{to{opacity:1;transform:none}}
/* ============ responsive ============ */
@media(max-width:860px){
.feat-grid{grid-template-columns:1fr 1fr}
.connect{grid-template-columns:1fr;gap:36px}
.vault{order:-1;max-width:320px;margin-inline:auto}
.pledges{grid-template-columns:1fr 1fr}
}
@media(max-width:540px){
.feat-grid{grid-template-columns:1fr}
.term-body{flex-direction:column;align-items:stretch}
.copy{justify-content:center}
}
@media(prefers-reduced-motion:reduce){
*{animation:none!important;transition:none!important}
.reveal,.stagger>*,.h-anim{opacity:1;transform:none}
}

586
site/dist/index.html vendored Normal file
View File

@ -0,0 +1,586 @@
<!DOCTYPE html>
<html lang="en" data-theme="nebula">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LibrePortal — your own private corner of the universe</title>
<meta name="description" content="LibrePortal is a free, open, self-hosted app platform. One command brings up the apps you rely on — on your own server, with your data staying yours.">
<link rel="icon" type="image/svg+xml" href="assets/libreportal.svg">
<link rel="icon" href="assets/favicon.ico" sizes="any">
<link rel="stylesheet" href="assets/style.css">
</head>
<body>
<div class="cosmos"></div>
<div class="stars"></div>
<div class="topbar">
<button class="mobile-menu-toggle" id="mobile-menu-toggle" aria-label="Toggle navigation menu">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>
</button>
<div class="topbar-left">
<a class="libreportal-logo" href="#top"><img src="assets/libreportal.svg" alt="LibrePortal" width="32" height="32">Libre<b>Portal</b></a>
</div>
<div class="mobile-drawer" id="mobile-drawer">
<nav class="topbar-nav">
<a href="#top" class="nav-item nav-active" data-spy="top">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 11l9-8 9 8"/><path d="M5 10v10h14V10"/></svg>Home
</a>
<a href="#features" class="nav-item" data-spy="features">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>Features
</a>
<a href="#apps" class="nav-item" data-spy="apps">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3M5 5l2 2M17 17l2 2M19 5l-2 2M7 17l-2 2"/></svg>Apps
</a>
<a href="#connect" class="nav-item" data-spy="connect">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z"/></svg>Privacy
</a>
<a href="#promise" class="nav-item" data-spy="promise">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z"/><path d="M9 11l2 2 4-4"/></svg>Promise
</a>
</nav>
<div class="topbar-controls">
<a class="tb-ghost" href="https://gitea.scottwebstar.co.uk/Webstar/LibrePortal" target="_blank" rel="noopener">Source ↗</a>
<a class="tb-cta" href="#install">Install</a>
</div>
</div>
</div>
<!-- ===== HERO ===== -->
<header class="hero" id="top">
<span class="badge h-anim d1"><span class="dot"></span>v0.1.0 · early days, no telemetry ever</span>
<img class="hero-logo h-anim d2" src="assets/libreportal.svg" alt="">
<h1 class="h-anim d2">Your own private corner<br>of the <span class="grad">universe</span></h1>
<p class="sub h-anim d3">Self-host the apps you actually rely on — on your own server.
One command brings up a whole platform, and your data never leaves your orbit.</p>
<div class="portal h-anim d4" id="install">
<div class="term">
<div class="term-bar"><i></i><i></i><i></i><em>~ one command, your whole server</em></div>
<div class="term-body">
<code data-install-cmd="bash &lt;(curl -fsSL https://get.libreportal.org) init"><span class="p">bash</span> &lt;(<span class="p">curl</span> -fsSL <span class="u">https://get.libreportal.org</span>) init</code>
<button class="copy" aria-label="Copy install command">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15V5a2 2 0 0 1 2-2h10"/></svg>
<span>Copy</span>
</button>
</div>
</div>
<div class="portal-foot">
<span class="hint">curl·to·shell, on a privacy tool? <a href="https://gitea.scottwebstar.co.uk/Webstar/LibrePortal/raw/branch/main/init.sh" target="_blank" rel="noopener">read it first →</a></span>
<span>·</span>
<a href="https://gitea.scottwebstar.co.uk/Webstar/LibrePortal" target="_blank" rel="noopener">or clone the repo</a>
</div>
</div>
<div class="scroll-cue">explore</div>
</header>
<!-- ===== FEATURES ===== -->
<section class="pad wrap" id="features">
<span class="eyebrow reveal">What comes online</span>
<h2 class="reveal">A whole platform, <span class="grad">handled for you</span></h2>
<p class="lead reveal">No yak-shaving. LibrePortal wires up the boring, fiddly infrastructure so you can run the good stuff.</p>
<div class="feat-grid stagger">
<div class="card glass">
<div class="ico"><svg viewBox="0 0 24 24"><path d="M21 8 12 3 3 8l9 5 9-5Z"/><path d="m3 8 9 5v8M21 8l-9 5"/></svg></div>
<h3>One-click apps</h3>
<p>Nextcloud, Vaultwarden, Jellyfin, Gitea and dozens more — picked from a menu, deployed clean.</p>
</div>
<div class="card glass">
<div class="ico"><svg viewBox="0 0 24 24"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z"/><path d="m9 12 2 2 4-4"/></svg></div>
<h3>Traefik + auto-SSL</h3>
<p>A reverse proxy with automatic Let's Encrypt certificates. HTTPS everywhere, configured for you.</p>
</div>
<div class="card glass">
<div class="ico"><svg viewBox="0 0 24 24"><path d="M3 7l9-4 9 4-9 4-9-4Z"/><path d="m3 12 9 4 9-4M3 17l9 4 9-4"/></svg></div>
<h3>Rootless Docker</h3>
<p>Containers run without root and with sane security defaults — CrowdSec on guard out of the box.</p>
</div>
<div class="card glass">
<div class="ico"><svg viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="14" rx="2"/><path d="M3 9h18M8 21h8"/></svg></div>
<h3>A real dashboard</h3>
<p>Install, configure, back up and monitor everything from a clean web UI. No SSH archaeology.</p>
</div>
<div class="card glass">
<div class="ico"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3a15 15 0 0 1 0 18M12 3a15 15 0 0 0 0 18"/></svg></div>
<h3>Optional VPN routing</h3>
<p>Send any app's traffic through gluetun. Keep the things that should be private, private.</p>
</div>
<div class="card glass">
<div class="ico"><svg viewBox="0 0 24 24"><path d="M2 12s4-7 10-7 10 7 10 7-4 7-10 7S2 12 2 12Z"/><path d="m4 4 16 16"/></svg></div>
<h3>No telemetry</h3>
<p>Nothing phones home. No accounts required to self-host. The software is yours, entirely.</p>
</div>
</div>
</section>
<!-- ===== APPS (generated from the repo) ===== -->
<section class="pad wrap apps-section" id="apps">
<span class="eyebrow reveal">The constellation</span>
<h2 class="reveal">Dozens of apps, <span class="grad">one sky</span></h2>
<p class="lead reveal" style="margin-inline:auto">Pulled straight from the repo — 31 apps you can light up from the dashboard, and switch off just as easily.</p>
<div class="app-filters reveal">
<button class="chip active" data-cat="all">All <span class="n">31</span></button>
<button class="chip" data-cat="networking">Networking <span class="n">9</span></button>
<button class="chip" data-cat="recommended">Recommended <span class="n">4</span></button>
<button class="chip" data-cat="security">Security <span class="n">4</span></button>
<button class="chip" data-cat="knowledge">Knowledge <span class="n">3</span></button>
<button class="chip" data-cat="productivity">Productivity <span class="n">3</span></button>
<button class="chip" data-cat="storage">Storage <span class="n">3</span></button>
<button class="chip" data-cat="communication">Communication <span class="n">2</span></button>
<button class="chip" data-cat="development">Development <span class="n">2</span></button>
<button class="chip" data-cat="media">Media <span class="n">2</span></button>
<button class="chip" data-cat="monitoring">Monitoring <span class="n">2</span></button>
<button class="chip" data-cat="system">System <span class="n">1</span></button>
</div>
<div class="app-grid reveal">
<article class="app-card glass" data-cats="networking">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/adguard.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>AdGuard</h3>
<span class="app-cat">networking</span>
</div>
</div>
<p>DNS based Ad Blocking</p>
</article>
<article class="app-card glass" data-cats="security">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/authelia.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Authelia</h3>
<span class="app-cat">security</span>
</div>
</div>
<p>Authentication &amp; SSO</p>
</article>
<article class="app-card glass" data-cats="knowledge">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/bookstack.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Bookstack</h3>
<span class="app-cat">knowledge</span>
</div>
</div>
<p>Wiki/Knowledge Base</p>
</article>
<article class="app-card glass" data-cats="security recommended">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/crowdsec.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>CrowdSec</h3>
<span class="app-cat">security</span>
</div>
</div>
<p>Intrusion Prevention</p>
</article>
<article class="app-card glass" data-cats="productivity">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/dashy.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Dashy</h3>
<span class="app-cat">productivity</span>
</div>
</div>
<p>Dashboard Tool</p>
</article>
<article class="app-card glass" data-cats="productivity">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/focalboard.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Focalboard</h3>
<span class="app-cat">productivity</span>
</div>
</div>
<p>Project Management</p>
</article>
<article class="app-card glass" data-cats="development">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/gitea.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Gitea</h3>
<span class="app-cat">development</span>
</div>
</div>
<p>Git Repository Management</p>
</article>
<article class="app-card glass" data-cats="networking recommended">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/gluetun.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Gluetun</h3>
<span class="app-cat">networking</span>
</div>
</div>
<p>VPN Container Router</p>
</article>
<article class="app-card glass" data-cats="monitoring">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/grafana.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Grafana</h3>
<span class="app-cat">monitoring</span>
</div>
</div>
<p>Metrics Visualizer</p>
</article>
<article class="app-card glass" data-cats="networking">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/headscale.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Headscale</h3>
<span class="app-cat">networking</span>
</div>
</div>
<p>WireGuard VPN Controller</p>
</article>
<article class="app-card glass" data-cats="media">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/invidious.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Invidious</h3>
<span class="app-cat">media</span>
</div>
</div>
<p>YouTube Frontend</p>
</article>
<article class="app-card glass" data-cats="networking">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/ipinfo.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>IPinfo</h3>
<span class="app-cat">networking</span>
</div>
</div>
<p>IP Information</p>
</article>
<article class="app-card glass" data-cats="media">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/jellyfin.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Jellyfin</h3>
<span class="app-cat">media</span>
</div>
</div>
<p>Media Server</p>
</article>
<article class="app-card glass" data-cats="communication">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/jitsimeet.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Jitsi Meet</h3>
<span class="app-cat">communication</span>
</div>
</div>
<p>Video Conferencing</p>
</article>
<article class="app-card glass" data-cats="system">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/libreportal.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>LibrePortal</h3>
<span class="app-cat">system</span>
</div>
</div>
<p>WebUI Dashboard</p>
</article>
<article class="app-card glass" data-cats="knowledge">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/linkding.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Linkding</h3>
<span class="app-cat">knowledge</span>
</div>
</div>
<p>Bookmark Manager</p>
</article>
<article class="app-card glass" data-cats="communication">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/mastodon.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Mastodon</h3>
<span class="app-cat">communication</span>
</div>
</div>
<p>Social Network</p>
</article>
<article class="app-card glass" data-cats="productivity">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/default.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>MoneyApp</h3>
<span class="app-cat">productivity</span>
</div>
</div>
<p>Household Money Management</p>
</article>
<article class="app-card glass" data-cats="storage">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/nextcloud.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Nextcloud</h3>
<span class="app-cat">storage</span>
</div>
</div>
<p>Self-hosted Cloud Storage</p>
</article>
<article class="app-card glass" data-cats="development">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/ollama.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Ollama</h3>
<span class="app-cat">development</span>
</div>
</div>
<p>Local AI Model Hosting</p>
</article>
<article class="app-card glass" data-cats="storage">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/onlyoffice.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>OnlyOffice</h3>
<span class="app-cat">storage</span>
</div>
</div>
<p>Collaborative Office Suite</p>
</article>
<article class="app-card glass" data-cats="storage">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/owncloud.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>OwnCloud</h3>
<span class="app-cat">storage</span>
</div>
</div>
<p>Cloud Storage</p>
</article>
<article class="app-card glass" data-cats="networking">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/pihole.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>PiHole</h3>
<span class="app-cat">networking</span>
</div>
</div>
<p>DNS-based Ad Blocking</p>
</article>
<article class="app-card glass" data-cats="monitoring">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/prometheus.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Prometheus</h3>
<span class="app-cat">monitoring</span>
</div>
</div>
<p>Monitoring and Alerting</p>
</article>
<article class="app-card glass" data-cats="security">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/searxng.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>SearxNG</h3>
<span class="app-cat">security</span>
</div>
</div>
<p>Search Engine</p>
</article>
<article class="app-card glass" data-cats="networking">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/speedtest.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Speedtest</h3>
<span class="app-cat">networking</span>
</div>
</div>
<p>Network Performance Monitoring</p>
</article>
<article class="app-card glass" data-cats="networking recommended">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/traefik.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Traefik</h3>
<span class="app-cat">networking</span>
</div>
</div>
<p>Reverse Proxy</p>
</article>
<article class="app-card glass" data-cats="knowledge">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/trilium.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Trilium</h3>
<span class="app-cat">knowledge</span>
</div>
</div>
<p>Notes &amp; Knowledge Management</p>
</article>
<article class="app-card glass" data-cats="networking">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/unbound.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Unbound</h3>
<span class="app-cat">networking</span>
</div>
</div>
<p>DNS Resolver</p>
</article>
<article class="app-card glass" data-cats="security">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/vaultwarden.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Vaultwarden</h3>
<span class="app-cat">security</span>
</div>
</div>
<p>Password Manager</p>
</article>
<article class="app-card glass" data-cats="networking recommended">
<div class="app-card-head">
<img class="app-ico" src="assets/apps/wireguard.svg" alt="" loading="lazy" width="42" height="42">
<div>
<h3>Wireguard Easy</h3>
<span class="app-cat">networking</span>
</div>
</div>
<p>VPN Server</p>
</article>
</div>
<p class="app-count">31 apps</p>
</section>
<!-- ===== CONNECT / COURIER ===== -->
<section class="pad wrap" id="connect">
<div class="connect">
<div class="reveal">
<span class="eyebrow">LibrePortal Connect · optional</span>
<h2>We're the courier.<br><span class="grad">You hold the key.</span></h2>
<p class="lead">Reaching your server from your phone and keeping off-site backups are the fiddly bits.
Connect handles them — but works like a courier carrying a <b>sealed box</b>.</p>
<ul>
<li><svg viewBox="0 0 24 24"><path d="M5 12h14M13 6l6 6-6 6"/></svg><span><b>Reach it anywhere.</b> No port-forwarding, no exposing your box to the internet.</span></li>
<li><svg viewBox="0 0 24 24"><rect x="4" y="10" width="16" height="11" rx="2"/><path d="M8 10V7a4 4 0 0 1 8 0v3"/></svg><span><b>Encrypted off-site backups.</b> We only ever hold a locked box — you keep the only key.</span></li>
<li><svg viewBox="0 0 24 24"><path d="m2 12 5-5 5 5-5 5-5-5Z" opacity=".5"/><path d="M12 12h10"/></svg><span><b>We never run your apps.</b> Your data and keys never leave your machine.</span></li>
</ul>
<span class="pill">every part is free to self-host, too — you pay only for convenience</span>
</div>
<div class="vault reveal">
<svg viewBox="0 0 200 200" aria-hidden="true">
<g class="orbit" opacity=".55">
<ellipse cx="100" cy="100" rx="92" ry="40" stroke="var(--accent)" stroke-width="1" fill="none" opacity=".5"/>
<circle cx="192" cy="100" r="3.2" fill="var(--accent)"/>
</g>
<g class="orbit" style="animation-duration:18s;animation-direction:reverse" opacity=".55">
<ellipse cx="100" cy="100" rx="40" ry="92" stroke="#7ae9ff" stroke-width="1" fill="none" opacity=".45"/>
<circle cx="100" cy="8" r="2.6" fill="#7ae9ff"/>
</g>
<g transform="translate(100 100)">
<rect x="-38" y="-30" width="76" height="62" rx="9" fill="rgba(10,16,32,.92)" stroke="url(#bg)" stroke-width="1.6"/>
<path d="M-38 -10 H38" stroke="url(#bg)" stroke-width="1.2" opacity=".5"/>
<rect x="-12" y="-4" width="24" height="20" rx="4" fill="none" stroke="var(--accent)" stroke-width="2"/>
<path d="M-6 -4 V-12 a6 6 0 0 1 12 0 V-4" fill="none" stroke="var(--accent)" stroke-width="2"/>
<circle cx="0" cy="6" r="2.4" fill="var(--accent)"/>
</g>
<defs><linearGradient id="bg" x1="-40" y1="-40" x2="40" y2="40" gradientUnits="userSpaceOnUse"><stop stop-color="#7ae9ff"/><stop offset="1" stop-color="#00d4ff"/></linearGradient></defs>
</svg>
</div>
</div>
</section>
<!-- ===== PROMISE ===== -->
<section class="pad wrap promise" id="promise">
<span class="eyebrow reveal">The promise</span>
<h2 class="reveal">Free software, <span class="grad">and it stays that way</span></h2>
<p class="lead reveal" style="margin-inline:auto">In plain language, so you can hold us to it.</p>
<div class="pledges stagger">
<div class="pledge glass"><div class="big grad">100%</div><p>Every feature, free to self-host. Forever. No crippled edition.</p></div>
<div class="pledge glass"><div class="big grad">0</div><p>Trackers. No telemetry, no phoning home, no accounts to run it.</p></div>
<div class="pledge glass"><div class="big grad">&empty;</div><p>Feature paywalls. You never pay to <em>unlock</em> — only for convenience.</p></div>
<div class="pledge glass"><div class="big grad">&infin;</div><p>What's open stays open. No rug-pulls, ever. AGPLv3.</p></div>
</div>
<a class="link reveal" href="https://gitea.scottwebstar.co.uk/Webstar/LibrePortal/raw/branch/main/PROMISE.md" target="_blank" rel="noopener">Read the full Promise →</a>
</section>
<!-- ===== FINAL CTA ===== -->
<section class="final wrap">
<span class="eyebrow reveal">Ready when you are</span>
<h2 class="reveal">Light up your corner<br>of the <span class="grad">universe.</span></h2>
<div class="portal reveal">
<div class="term">
<div class="term-bar"><i></i><i></i><i></i><em>~</em></div>
<div class="term-body">
<code data-install-cmd="bash &lt;(curl -fsSL https://get.libreportal.org) init"><span class="p">bash</span> &lt;(<span class="p">curl</span> -fsSL <span class="u">https://get.libreportal.org</span>) init</code>
<button class="copy" aria-label="Copy install command">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15V5a2 2 0 0 1 2-2h10"/></svg>
<span>Copy</span>
</button>
</div>
</div>
</div>
</section>
<footer>
<div class="wrap">
<div class="foot-grid">
<div style="max-width:300px">
<a class="libreportal-logo" href="#top"><img src="assets/libreportal.svg" alt="" width="32" height="32">Libre<b>Portal</b></a>
<p style="color:var(--text-faint);font-size:.92rem">Your own private corner of the internet — free, open, and yours.</p>
</div>
<div class="foot-col">
<h4>Project</h4>
<a href="https://gitea.scottwebstar.co.uk/Webstar/LibrePortal" target="_blank" rel="noopener">Source code</a>
<a href="https://gitea.scottwebstar.co.uk/Webstar/LibrePortal/raw/branch/main/PROMISE.md" target="_blank" rel="noopener">The Promise</a>
<a href="https://gitea.scottwebstar.co.uk/Webstar/LibrePortal/raw/branch/main/CONTRIBUTING.md" target="_blank" rel="noopener">Contributing</a>
</div>
<div class="foot-col">
<h4>Get started</h4>
<a href="#install">Install</a>
<a href="#apps">Browse apps</a>
<a href="#connect">LibrePortal Connect</a>
</div>
</div>
<div class="colophon">
<span>Built from scratch since 2023 · inspired by <a href="https://gitlab.com/bmcgonag/docker_installs" target="_blank" rel="noopener">bmcgonag/docker_installs</a></span>
<span>GNU AGPLv3 · what's open stays open 🕊️</span>
</div>
</div>
</footer>
<script src="assets/main.js" defer></script>
</body>
</html>

378
site/src/_data/apps.json Normal file
View File

@ -0,0 +1,378 @@
[
{
"slug": "adguard",
"title": "AdGuard",
"category": "networking",
"categories": [
"networking"
],
"description": "DNS based Ad Blocking",
"longDescription": "AdGuard Home is a network-wide software for advertisements and tracking blocking that operates as a DNS server and returns the IP address of a local, blackhole DNS server for domains that should be blocked",
"url": "https://github.com/AdguardTeam/AdGuardHome",
"icon": "assets/apps/adguard.svg"
},
{
"slug": "authelia",
"title": "Authelia",
"category": "security",
"categories": [
"security"
],
"description": "Authentication & SSO",
"longDescription": "Authelia is an open-source authentication and authorization server providing 2-factor authentication and single sign-on for your applications",
"url": "https://github.com/authelia/authelia",
"icon": "assets/apps/authelia.svg"
},
{
"slug": "bookstack",
"title": "Bookstack",
"category": "knowledge",
"categories": [
"knowledge"
],
"description": "Wiki/Knowledge Base",
"longDescription": "BookStack is a simple, self-hosted wiki and documentation platform that provides a pleasant and simple way to organize and store information",
"url": "https://github.com/BookStackApp/BookStack",
"icon": "assets/apps/bookstack.svg"
},
{
"slug": "crowdsec",
"title": "CrowdSec",
"category": "security",
"categories": [
"security",
"recommended"
],
"description": "Intrusion Prevention",
"longDescription": "CrowdSec is an open-source intrusion prevention system. It detects attacks from log patterns — brute-force, scans, web exploits — and blocks offending IPs at the firewall. Includes community-shared threat intelligence.",
"url": "https://www.crowdsec.net",
"icon": "assets/apps/crowdsec.svg"
},
{
"slug": "dashy",
"title": "Dashy",
"category": "productivity",
"categories": [
"productivity"
],
"description": "Dashboard Tool",
"longDescription": "Dashy is a self-hostable personal dashboard for monitoring your self-hosted services and applications with a beautiful, intuitive interface",
"url": "https://github.com/Lissy93/dashy",
"icon": "assets/apps/dashy.svg"
},
{
"slug": "focalboard",
"title": "Focalboard",
"category": "productivity",
"categories": [
"productivity"
],
"description": "Project Management",
"longDescription": "Focalboard is an open source, self-hosted alternative to Trello, Notion, and Asana that helps organize projects and tasks",
"url": "https://github.com/mattermost/focalboard",
"icon": "assets/apps/focalboard.svg"
},
{
"slug": "gitea",
"title": "Gitea",
"category": "development",
"categories": [
"development"
],
"description": "Git Repository Management",
"longDescription": "Gitea is a lightweight, self-hosted Git service written in Go that provides a painless self-hosted Git service with a minimal setup",
"url": "https://github.com/go-gitea/gitea",
"icon": "assets/apps/gitea.svg"
},
{
"slug": "gluetun",
"title": "Gluetun",
"category": "networking",
"categories": [
"networking",
"recommended"
],
"description": "VPN Container Router",
"longDescription": "Run all of your containers through a VPN provider. Supports 30+ providers over WireGuard and OpenVPN with a built-in kill-switch, DNS-over-TLS, port forwarding, and an HTTP control server.",
"url": "https://github.com/qdm12/gluetun",
"icon": "assets/apps/gluetun.svg"
},
{
"slug": "grafana",
"title": "Grafana",
"category": "monitoring",
"categories": [
"monitoring"
],
"description": "Metrics Visualizer",
"longDescription": "The open source analytics and monitoring solution for every database with beautiful dashboards and alerting capabilities",
"url": "https://github.com/grafana/grafana",
"icon": "assets/apps/grafana.svg"
},
{
"slug": "headscale",
"title": "Headscale",
"category": "networking",
"categories": [
"networking"
],
"description": "WireGuard VPN Controller",
"longDescription": "Headscale is an open source, self-hosted implementation of the Tailscale control server that works with the Tailscale client",
"url": "https://github.com/juanfont/headscale",
"icon": "assets/apps/headscale.svg"
},
{
"slug": "invidious",
"title": "Invidious",
"category": "media",
"categories": [
"media"
],
"description": "YouTube Frontend",
"longDescription": "Invidious is an alternative front-end to YouTube that focuses on privacy and providing a distraction-free viewing experience",
"url": "https://github.com/iv-org/invidious",
"icon": "assets/apps/invidious.svg"
},
{
"slug": "ipinfo",
"title": "IPinfo",
"category": "networking",
"categories": [
"networking"
],
"description": "IP Information",
"longDescription": "IPinfo is a simple IP address lookup service that provides detailed information about IP addresses including geolocation and ISP data",
"url": "https://github.com/ipinfo/cli",
"icon": "assets/apps/ipinfo.svg"
},
{
"slug": "jellyfin",
"title": "Jellyfin",
"category": "media",
"categories": [
"media"
],
"description": "Media Server",
"longDescription": "Jellyfin is a free software media system that puts you in control of managing and streaming your media without any locked subscriptions",
"url": "https://github.com/jellyfin/jellyfin",
"icon": "assets/apps/jellyfin.svg"
},
{
"slug": "jitsimeet",
"title": "Jitsi Meet",
"category": "communication",
"categories": [
"communication"
],
"description": "Video Conferencing",
"longDescription": "Jitsi Meet is an open-source video conferencing solution that provides secure, easy, and high-quality video meetings for everyone",
"url": "https://github.com/jitsi/jitsi-meet",
"icon": "assets/apps/jitsimeet.svg"
},
{
"slug": "libreportal",
"title": "LibrePortal",
"category": "system",
"categories": [
"system"
],
"description": "WebUI Dashboard",
"longDescription": "LibrePortal is a comprehensive Docker management platform that simplifies container deployment and management with an intuitive web interface",
"url": "",
"icon": "assets/apps/libreportal.svg"
},
{
"slug": "linkding",
"title": "Linkding",
"category": "knowledge",
"categories": [
"knowledge"
],
"description": "Bookmark Manager",
"longDescription": "Linkding is a simple, self-hosted bookmark manager designed to be fast, lightweight, and easy to use with a clean interface",
"url": "https://github.com/sissbruecker/linkding",
"icon": "assets/apps/linkding.svg"
},
{
"slug": "mastodon",
"title": "Mastodon",
"category": "communication",
"categories": [
"communication"
],
"description": "Social Network",
"longDescription": "Your self-hosted, globally interconnected microblogging community that gives you control over your social media experience",
"url": "https://github.com/mastodon/mastodon",
"icon": "assets/apps/mastodon.svg"
},
{
"slug": "moneyapp",
"title": "MoneyApp",
"category": "productivity",
"categories": [
"productivity"
],
"description": "Household Money Management",
"longDescription": "Personal budget tracker with recurring rules, projected ledger, savings goals, compound-interest calculator and 12-month what-if forecast.",
"url": "",
"icon": "assets/apps/default.svg"
},
{
"slug": "nextcloud",
"title": "Nextcloud",
"category": "storage",
"categories": [
"storage"
],
"description": "Self-hosted Cloud Storage",
"longDescription": "Nextcloud is a suite of client-server software for creating and using file hosting services that puts you in control of your data",
"url": "https://github.com/nextcloud/server",
"icon": "assets/apps/nextcloud.svg"
},
{
"slug": "ollama",
"title": "Ollama",
"category": "development",
"categories": [
"development"
],
"description": "Local AI Model Hosting",
"longDescription": "Ollama is a lightweight, extensible framework for building and running large language models locally with ease",
"url": "https://github.com/ollama/ollama",
"icon": "assets/apps/ollama.svg"
},
{
"slug": "onlyoffice",
"title": "OnlyOffice",
"category": "storage",
"categories": [
"storage"
],
"description": "Collaborative Office Suite",
"longDescription": "OnlyOffice is a comprehensive office suite that provides document editing, spreadsheet, and presentation capabilities",
"url": "https://github.com/ONLYOFFICE/DocumentServer",
"icon": "assets/apps/onlyoffice.svg"
},
{
"slug": "owncloud",
"title": "OwnCloud",
"category": "storage",
"categories": [
"storage"
],
"description": "Cloud Storage",
"longDescription": "ownCloud is a self-hosted file sync and share server that provides secure access to your files from any device",
"url": "https://github.com/owncloud/core",
"icon": "assets/apps/owncloud.svg"
},
{
"slug": "pihole",
"title": "PiHole",
"category": "networking",
"categories": [
"networking"
],
"description": "DNS-based Ad Blocking",
"longDescription": "Pi-hole is a DNS sinkhole that protects your devices from unwanted content without installing any client-side software",
"url": "https://github.com/pi-hole/pi-hole",
"icon": "assets/apps/pihole.svg"
},
{
"slug": "prometheus",
"title": "Prometheus",
"category": "monitoring",
"categories": [
"monitoring"
],
"description": "Monitoring and Alerting",
"longDescription": "The Prometheus monitoring system and time series database that provides powerful querying and alerting capabilities",
"url": "https://github.com/prometheus/prometheus",
"icon": "assets/apps/prometheus.svg"
},
{
"slug": "searxng",
"title": "SearxNG",
"category": "security",
"categories": [
"security"
],
"description": "Search Engine",
"longDescription": "SearXNG is a privacy-respecting metasearch engine that aggregates results from multiple search engines while protecting your privacy",
"url": "https://github.com/searxng/searxng",
"icon": "assets/apps/searxng.svg"
},
{
"slug": "speedtest",
"title": "Speedtest",
"category": "networking",
"categories": [
"networking"
],
"description": "Network Performance Monitoring",
"longDescription": "Lightweight speedtest implemented in Javascript that provides accurate network speed measurements",
"url": "https://github.com/librespeed/speedtest",
"icon": "assets/apps/speedtest.svg"
},
{
"slug": "traefik",
"title": "Traefik",
"category": "networking",
"categories": [
"networking",
"recommended"
],
"description": "Reverse Proxy",
"longDescription": "Traefik is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy and efficient",
"url": "https://github.com/traefik/traefik",
"icon": "assets/apps/traefik.svg"
},
{
"slug": "trilium",
"title": "Trilium",
"category": "knowledge",
"categories": [
"knowledge"
],
"description": "Notes & Knowledge Management",
"longDescription": "Trilium Notes is a hierarchical note-taking application with focus on building a personal knowledge base and productivity",
"url": "https://github.com/zadam/trilium",
"icon": "assets/apps/trilium.svg"
},
{
"slug": "unbound",
"title": "Unbound",
"category": "networking",
"categories": [
"networking"
],
"description": "DNS Resolver",
"longDescription": "Unbound is a validating, recursive, and caching DNS resolver that provides secure and fast DNS resolution",
"url": "https://github.com/NLnetLabs/unbound",
"icon": "assets/apps/unbound.svg"
},
{
"slug": "vaultwarden",
"title": "Vaultwarden",
"category": "security",
"categories": [
"security"
],
"description": "Password Manager",
"longDescription": "Vaultwarden is an alternative implementation of the Bitwarden server API written in Rust and compatible with Bitwarden clients",
"url": "https://github.com/dani-garcia/vaultwarden",
"icon": "assets/apps/vaultwarden.svg"
},
{
"slug": "wireguard",
"title": "Wireguard Easy",
"category": "networking",
"categories": [
"networking",
"recommended"
],
"description": "VPN Server",
"longDescription": "WireGuard is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography",
"url": "https://github.com/WireGuard/wireguard-tools",
"icon": "assets/apps/wireguard.svg"
}
]

View File

@ -0,0 +1,57 @@
[
{
"id": "networking",
"name": "Networking",
"count": 9
},
{
"id": "recommended",
"name": "Recommended",
"count": 4
},
{
"id": "security",
"name": "Security",
"count": 4
},
{
"id": "knowledge",
"name": "Knowledge",
"count": 3
},
{
"id": "productivity",
"name": "Productivity",
"count": 3
},
{
"id": "storage",
"name": "Storage",
"count": 3
},
{
"id": "communication",
"name": "Communication",
"count": 2
},
{
"id": "development",
"name": "Development",
"count": 2
},
{
"id": "media",
"name": "Media",
"count": 2
},
{
"id": "monitoring",
"name": "Monitoring",
"count": 2
},
{
"id": "system",
"name": "System",
"count": 1
}
]