New year, new post!
All checks were successful
Docker Deploy / build-and-push (push) Successful in 5m59s

This commit is contained in:
2026-02-03 10:29:03 -07:00
parent 3eac226630
commit 63282cf34d
3 changed files with 109 additions and 79 deletions

View File

@@ -33,6 +33,6 @@
"@iconify-json/mdi": "^1.2.3",
"@iconify-json/simple-icons": "^1.2.69",
"@types/react": "^19.2.10",
"daisyui": "^5.5.14"
"daisyui": "^5.5.17"
}
}

156
pnpm-lock.yaml generated
View File

@@ -10,16 +10,16 @@ importers:
dependencies:
'@astrojs/mdx':
specifier: 5.0.0-beta.3
version: 5.0.0-beta.3(astro@6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))
version: 5.0.0-beta.3(astro@6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))
'@astrojs/node':
specifier: 10.0.0-beta.0
version: 10.0.0-beta.0(astro@6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))
version: 10.0.0-beta.0(astro@6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))
'@astrojs/rss':
specifier: 4.0.15
version: 4.0.15
'@astrojs/vue':
specifier: 6.0.0-beta.0
version: 6.0.0-beta.0(@types/node@25.1.0)(astro@6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(vue@3.5.27(typescript@5.8.3))(yaml@2.8.2)
version: 6.0.0-beta.0(@types/node@25.2.0)(astro@6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(vue@3.5.27(typescript@5.8.3))(yaml@2.8.2)
'@iarna/toml':
specifier: ^2.2.5
version: 2.2.5
@@ -34,10 +34,10 @@ importers:
version: 0.5.19(tailwindcss@4.1.18)
'@tailwindcss/vite':
specifier: ^4.1.18
version: 4.1.18(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
version: 4.1.18(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
astro:
specifier: 6.0.0-beta.6
version: 6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2)
version: 6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2)
astro-icon:
specifier: ^1.1.5
version: 1.1.5
@@ -73,8 +73,8 @@ importers:
specifier: ^19.2.10
version: 19.2.10
daisyui:
specifier: ^5.5.14
version: 5.5.14
specifier: ^5.5.17
version: 5.5.17
packages:
@@ -1117,8 +1117,8 @@ packages:
'@types/nlcst@2.0.3':
resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
'@types/node@25.1.0':
resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==}
'@types/node@25.2.0':
resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==}
'@types/react@19.2.10':
resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==}
@@ -1315,8 +1315,8 @@ packages:
resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
engines: {node: '>=16'}
caniuse-lite@1.0.30001766:
resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==}
caniuse-lite@1.0.30001767:
resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==}
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@@ -1453,8 +1453,8 @@ packages:
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
daisyui@5.5.14:
resolution: {integrity: sha512-L47rvw7I7hK68TA97VB8Ee0woHew+/ohR6Lx6Ah/krfISOqcG4My7poNpX5Mo5/ytMxiR40fEaz6njzDi7cuSg==}
daisyui@5.5.17:
resolution: {integrity: sha512-Y8QWps/990Epp0Gn+7ReeALSXgwrd3W36waokJvHgqUdYx6t2sj0e1krW3+YqviBa57XTJqHJNTt8HMvcODL2Q==}
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
@@ -1472,8 +1472,8 @@ packages:
resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==}
engines: {node: '>=18'}
default-browser@5.4.0:
resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==}
default-browser@5.5.0:
resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==}
engines: {node: '>=18'}
define-lazy-prop@3.0.0:
@@ -1538,8 +1538,8 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
electron-to-chromium@1.5.283:
resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==}
electron-to-chromium@1.5.286:
resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==}
emoji-regex-xs@1.0.0:
resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==}
@@ -1560,8 +1560,8 @@ packages:
end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
enhanced-resolve@5.18.4:
resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==}
enhanced-resolve@5.19.0:
resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==}
engines: {node: '>=10.13.0'}
entities@4.5.0:
@@ -1686,8 +1686,8 @@ packages:
resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
engines: {node: '>=8'}
fontace@0.4.0:
resolution: {integrity: sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg==}
fontace@0.4.1:
resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==}
fontkit@2.0.4:
resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==}
@@ -2281,8 +2281,8 @@ packages:
resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==}
engines: {node: '>=18'}
p-limit@7.2.0:
resolution: {integrity: sha512-ATHLtwoTNDloHRFFxFJdHnG6n2WUeFjaR8XQMFdKIv0xkXjrER8/iG9iu265jOM95zXHAfv9oTkqhrfbIzosrQ==}
p-limit@7.3.0:
resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==}
engines: {node: '>=20'}
p-queue@9.1.0:
@@ -2715,8 +2715,8 @@ packages:
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
undici@7.19.2:
resolution: {integrity: sha512-4VQSpGEGsWzk0VYxyB/wVX/Q7qf9t5znLRgs0dzszr9w9Fej/8RVNQ+S20vdXSAyra/bJ7ZQfGv6ZMj7UEbzSg==}
undici@7.20.0:
resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==}
engines: {node: '>=20.18.1'}
unicode-properties@1.4.1:
@@ -3054,12 +3054,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@astrojs/mdx@5.0.0-beta.3(astro@6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))':
'@astrojs/mdx@5.0.0-beta.3(astro@6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))':
dependencies:
'@astrojs/markdown-remark': 7.0.0-beta.3
'@mdx-js/mdx': 3.1.1
acorn: 8.15.0
astro: 6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2)
astro: 6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2)
es-module-lexer: 2.0.0
estree-util-visit: 2.0.0
hast-util-to-html: 9.0.5
@@ -3073,10 +3073,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@astrojs/node@10.0.0-beta.0(astro@6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))':
'@astrojs/node@10.0.0-beta.0(astro@6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))':
dependencies:
'@astrojs/internal-helpers': 0.7.5
astro: 6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2)
astro: 6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2)
send: 1.2.1
server-destroy: 1.0.1
transitivePeerDependencies:
@@ -3103,14 +3103,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@astrojs/vue@6.0.0-beta.0(@types/node@25.1.0)(astro@6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(vue@3.5.27(typescript@5.8.3))(yaml@2.8.2)':
'@astrojs/vue@6.0.0-beta.0(@types/node@25.2.0)(astro@6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(vue@3.5.27(typescript@5.8.3))(yaml@2.8.2)':
dependencies:
'@vitejs/plugin-vue': 5.2.4(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))
'@vitejs/plugin-vue-jsx': 4.2.0(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))
'@vitejs/plugin-vue': 5.2.4(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))
'@vitejs/plugin-vue-jsx': 4.2.0(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))
'@vue/compiler-sfc': 3.5.27
astro: 6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite-plugin-vue-devtools: 7.7.9(rollup@4.57.1)(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))
astro: 6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite-plugin-vue-devtools: 7.7.9(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))
vue: 3.5.27(typescript@5.8.3)
transitivePeerDependencies:
- '@nuxt/kit'
@@ -3917,7 +3917,7 @@ snapshots:
'@tailwindcss/node@4.1.18':
dependencies:
'@jridgewell/remapping': 2.3.5
enhanced-resolve: 5.18.4
enhanced-resolve: 5.19.0
jiti: 2.6.1
lightningcss: 1.30.2
magic-string: 0.30.21
@@ -3980,12 +3980,12 @@ snapshots:
postcss-selector-parser: 6.0.10
tailwindcss: 4.1.18
'@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))':
'@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))':
dependencies:
'@tailwindcss/node': 4.1.18
'@tailwindcss/oxide': 4.1.18
tailwindcss: 4.1.18
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
'@trysound/sax@0.2.0': {}
@@ -4015,7 +4015,7 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
'@types/node@25.1.0':
'@types/node@25.2.0':
dependencies:
undici-types: 7.16.0
optional: true
@@ -4030,25 +4030,25 @@ snapshots:
'@types/yauzl@2.10.3':
dependencies:
'@types/node': 25.1.0
'@types/node': 25.2.0
optional: true
'@ungap/structured-clone@1.3.0': {}
'@vitejs/plugin-vue-jsx@4.2.0(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))':
'@vitejs/plugin-vue-jsx@4.2.0(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0)
'@rolldown/pluginutils': 1.0.0-rc.2
'@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0)
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vue: 3.5.27(typescript@5.8.3)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue@5.2.4(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))':
'@vitejs/plugin-vue@5.2.4(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))':
dependencies:
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vue: 3.5.27(typescript@5.8.3)
'@vue/babel-helper-vue-transform-on@1.5.0': {}
@@ -4110,14 +4110,14 @@ snapshots:
'@vue/compiler-dom': 3.5.27
'@vue/shared': 3.5.27
'@vue/devtools-core@7.7.9(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))':
'@vue/devtools-core@7.7.9(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))':
dependencies:
'@vue/devtools-kit': 7.7.9
'@vue/devtools-shared': 7.7.9
mitt: 3.0.1
nanoid: 5.1.6
pathe: 2.0.3
vite-hot-client: 2.1.0(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
vite-hot-client: 2.1.0(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
vue: 3.5.27(typescript@5.8.3)
transitivePeerDependencies:
- vite
@@ -4199,7 +4199,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
astro@6.0.0-beta.6(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2):
astro@6.0.0-beta.6(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.8.3)(yaml@2.8.2):
dependencies:
'@astrojs/compiler': 0.0.0-render-script-20251003120459
'@astrojs/internal-helpers': 0.7.5
@@ -4225,7 +4225,7 @@ snapshots:
es-module-lexer: 2.0.0
esbuild: 0.25.12
flattie: 1.1.1
fontace: 0.4.0
fontace: 0.4.1
github-slugger: 2.0.0
html-escaper: 3.0.3
http-cache-semantics: 4.2.0
@@ -4234,7 +4234,7 @@ snapshots:
magicast: 0.5.1
mrmime: 2.0.1
neotraverse: 0.6.18
p-limit: 7.2.0
p-limit: 7.3.0
p-queue: 9.1.0
package-manager-detector: 1.6.0
piccolore: 0.1.3
@@ -4253,8 +4253,8 @@ snapshots:
unist-util-visit: 5.1.0
unstorage: 1.17.4
vfile: 6.0.3
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vitefu: 1.1.1(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vitefu: 1.1.1(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
xxhash-wasm: 1.1.0
yargs-parser: 22.0.0
yocto-spinner: 1.0.0
@@ -4338,8 +4338,8 @@ snapshots:
browserslist@4.28.1:
dependencies:
baseline-browser-mapping: 2.9.19
caniuse-lite: 1.0.30001766
electron-to-chromium: 1.5.283
caniuse-lite: 1.0.30001767
electron-to-chromium: 1.5.286
node-releases: 2.0.27
update-browserslist-db: 1.2.3(browserslist@4.28.1)
@@ -4351,7 +4351,7 @@ snapshots:
camelcase@8.0.0: {}
caniuse-lite@1.0.30001766: {}
caniuse-lite@1.0.30001767: {}
ccount@2.0.1: {}
@@ -4385,7 +4385,7 @@ snapshots:
parse5: 7.3.0
parse5-htmlparser2-tree-adapter: 7.1.0
parse5-parser-stream: 7.1.2
undici: 7.19.2
undici: 7.20.0
whatwg-mimetype: 4.0.0
chokidar@5.0.0:
@@ -4478,7 +4478,7 @@ snapshots:
csstype@3.2.3: {}
daisyui@5.5.14: {}
daisyui@5.5.17: {}
debug@4.4.3:
dependencies:
@@ -4490,7 +4490,7 @@ snapshots:
default-browser-id@5.0.1: {}
default-browser@5.4.0:
default-browser@5.5.0:
dependencies:
bundle-name: 4.1.0
default-browser-id: 5.0.1
@@ -4545,7 +4545,7 @@ snapshots:
ee-first@1.1.1: {}
electron-to-chromium@1.5.283: {}
electron-to-chromium@1.5.286: {}
emoji-regex-xs@1.0.0: {}
@@ -4564,7 +4564,7 @@ snapshots:
dependencies:
once: 1.4.0
enhanced-resolve@5.18.4:
enhanced-resolve@5.19.0:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.0
@@ -4747,7 +4747,7 @@ snapshots:
flattie@1.1.1: {}
fontace@0.4.0:
fontace@0.4.1:
dependencies:
fontkitten: 1.0.2
@@ -5658,12 +5658,12 @@ snapshots:
open@10.2.0:
dependencies:
default-browser: 5.4.0
default-browser: 5.5.0
define-lazy-prop: 3.0.0
is-inside-container: 1.0.0
wsl-utils: 0.1.0
p-limit@7.2.0:
p-limit@7.3.0:
dependencies:
yocto-queue: 1.2.2
@@ -6207,7 +6207,7 @@ snapshots:
undici-types@7.16.0:
optional: true
undici@7.19.2: {}
undici@7.20.0: {}
unicode-properties@1.4.1:
dependencies:
@@ -6325,11 +6325,11 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
vite-hot-client@2.1.0(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)):
vite-hot-client@2.1.0(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)):
dependencies:
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite-plugin-inspect@0.8.9(rollup@4.57.1)(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)):
vite-plugin-inspect@0.8.9(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)):
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.3.0(rollup@4.57.1)
@@ -6340,28 +6340,28 @@ snapshots:
perfect-debounce: 1.0.0
picocolors: 1.1.1
sirv: 3.0.2
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
transitivePeerDependencies:
- rollup
- supports-color
vite-plugin-vue-devtools@7.7.9(rollup@4.57.1)(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3)):
vite-plugin-vue-devtools@7.7.9(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3)):
dependencies:
'@vue/devtools-core': 7.7.9(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))
'@vue/devtools-core': 7.7.9(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))(vue@3.5.27(typescript@5.8.3))
'@vue/devtools-kit': 7.7.9
'@vue/devtools-shared': 7.7.9
execa: 9.6.1
sirv: 3.0.2
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite-plugin-inspect: 0.8.9(rollup@4.57.1)(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
vite-plugin-vue-inspector: 5.3.2(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite-plugin-inspect: 0.8.9(rollup@4.57.1)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
vite-plugin-vue-inspector: 5.3.2(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))
transitivePeerDependencies:
- '@nuxt/kit'
- rollup
- supports-color
- vue
vite-plugin-vue-inspector@5.3.2(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)):
vite-plugin-vue-inspector@5.3.2(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)):
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0)
@@ -6372,11 +6372,11 @@ snapshots:
'@vue/compiler-dom': 3.5.27
kolorist: 1.8.0
magic-string: 0.30.21
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
transitivePeerDependencies:
- supports-color
vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2):
vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2):
dependencies:
esbuild: 0.27.2
fdir: 6.5.0(picomatch@4.0.3)
@@ -6385,15 +6385,15 @@ snapshots:
rollup: 4.57.1
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 25.1.0
'@types/node': 25.2.0
fsevents: 2.3.3
jiti: 2.6.1
lightningcss: 1.30.2
yaml: 2.8.2
vitefu@1.1.1(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)):
vitefu@1.1.1(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)):
optionalDependencies:
vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)
vue@3.5.27(typescript@5.8.3):
dependencies:

View File

@@ -0,0 +1,30 @@
---
title: "My 2026 Infrastructure"
description: "Building a Homelab that scales."
pubDate: "2026-02-03"
tags: ["devops", "infra", "nas"]
---
In the year of our lord, 2026, I figured I'd go over how I have set up this website, along with the other services I host for myself and for my business. Hopefully this proves useful to perspective self-hosters out there!
## The Network
One word: Tailscale.
Tailscale is a wireguard based mesh network where your devices connect to eachother on a "tailnet". Each device can access eachother directly via a name and a tailnet domain you are assigned. For instance, if your device is called ```megatron```, you might connect to it through another machine on the network using ```megatron.stinky-panda.ts.net```. It's that easy! This is the glue of the network, which allows me to expose services from my home without exposing my home IP.
## Lloyd
Lloyd is the main machine here. It runs TrueNAS as its hypervisor, and runs a combination of applications built in to the software and docker containers I deploy manually. It, along with everything else on my network, is named after characters from the 1999 PS1 game ```The Legend of Dragoon```. Lloyd is not ever directly exposed from my network, but is instead connected to Tailscale where it connects to the next piece of the puzzle.
## Haschel
Following with my theme, my proxy server hosted on OVHCloud is called Haschel. Haschel is responsible for one thing and one thing only: running NGINX proxy manager. Now, typically you would use this to point to local services. This is why Tailscale is so useful, however. Say I need to point to a web server on port ```6969``` on Lloyd. All I would do is point to port ```6969``` and hostname ```lloyd.stinky-panda.ts.net```. Tailscale routes the request to Lloyd, and the only IP address ever exposed in the process belongs to Haschel hosted on OVHCloud.
## Putting it all together
This is fairly basic, but I realize that not everyone is familiar with multi-cloud setups or mesh networking, so I made a diagram which I hope will make it clear:
![Diagram of Endinet](https://msrc.atri.dad/img/pako:eNqFVF1v2jAU_SuWeWmlgEw-gORhUtVNo1NhaDA0LfTBTW7AqrGRbQYM-O9zQvkO3c3LtX3uufbxidc4kSngCGdcLpIJVQY9_xgJZEPPX8eKziboUQpDmQCF4i8itYl52SHySJmCxDApDnV5HLOfGtTd3ZMwoGzh_X0Z5tBpQBm3KBTniU4oB9QFs5Dq7aTj7a55tKlOJsDj89mTleuF78M2Gvb61wvdr0_dX6in5HKFOlTQMahz0MWunrlcpSWdi_nr6YGaQ_eh_yFl6eFQtfpps9tWj2q9uWwAwg7Or6AoaQ8Gvf7mKETJDTzMZhrFfVB_WAIa5QLn3GUHtZRV1K_HPVBaCspRnxm4DXRj6yM954aJ8X-gXvwNOF9lTNzG-PGQWrIFVSl8AAvijjVsomhmUH4qUC8XOl0Ips3Kuu5o-YxxHlWyIhxtlHyDqOJ53nteXbDUTCJ3tnQSyaWKKoSQHdMp397Y72xh_pWxpVTbf1DRVYQCFJwy7K9-xwD1LMjgwEDcZvM1PYXvJDhs3gNyAEPWSAjBDh4rluLIWBc6eApqSvMhXuc0I2wmMIURjmyaQpZLPcIjsbVlMyp-SzndVyo5H09wlFGu7Wg-S6mBz4xaOx0hVl9Qj3IuDI78sKDA0RovceS6taZP6g2vRbw6IUGr4eCVBXlBLSQk9MLQr_uk4QZbB_8tupJa4LpBvdHyQxJ4Td9rORhSZqTq7F6y4kHb_gPvu2Kz?type=png)
Feel free to reach out if you have any questions about how I got everything working. I can be reached by email at [me@atri.dad](mailto:me@atri.dad).