Fix two casing duplicates that silently fragmented the tag cloud (Typescript -> TypeScript, Html -> HTML), add src/data/tags.ts as the single source of truth for every tag's canonical label + description, validate post frontmatter against it in the zod schema (unknown tag/tech now fails the build), and rebuild /tags as a real grouped index (Topics / Technologies, sorted by usage) instead of the undescribed word-cloud list. Per-tag pages now show the canonical label and description instead of the raw slug.
Blog
My personal website / blog — live at blog.dev.gabvdl.xyz.
Built with Astro (based on the astro-ink theme): MDX posts, client-side search (Lunr), tags, RSS and a sitemap.
Develop
yarn
yarn dev # astro dev
yarn build # static build → dist/ (+ postbuild search index)
yarn preview
Posts live under src/content/blog/ (src/pages/blog/ holds the routes that
render them); drafts under src/drafts/. The public URL
and canonical/sitemap origin are set via site in astro.config.mjs.
Deploy
npm run deploy # build + rsync dist/ to zipgo on raspy2
scripts/deploy.sh uses the zipgo deploy CLI to mirror
dist/ into domains/gabvdl.xyz/dev./blog. on the remote, which serves
https://blog.dev.gabvdl.xyz over Let's Encrypt HTTPS. The host → folder map also
lives in package.json under zipgo.deploy.
There is no CI. The old GitHub Pages workflow was deleted — it triggered on a long-dead branch and had not been publishing this site for a long time.
Remotes
origin is the self-hosted Gitea at
git.gabvdl.xyz/gabrielvidal/blog —
that is the canonical repo. github remains as a secondary mirror of the old
GabrielVidal1/gabrielvidal1.github.io repository; push there too if you want it
kept in sync, but nothing depends on it.