Walks every post's <img>/<a> (markdown + raw HTML, .md/.mdx, plus the frontmatter cover field) across both content collections, flags missing local assets and internal links that don't match any real route, and can optionally probe external refs for dead hosts (HEAD-then-GET, cached, concurrency-capped, off by default). Wired into `npm run build`'s postbuild step in warn mode — it can never fail the build, only crash-guards + logs a warning. External checks are a separate on-demand npm run audit:links:full since they touch the network and would make every build network-dependent otherwise. Report artefacts land in .ai/link-audit/ (gitignored). First real run: 0 missing local assets, 4 broken internal links (dead pre-Astro /Projects/... style paths from the old site structure), 18 dead external refs with --external (6 confirmed, 12 low-confidence itch.io-style 403s that are more likely bot-blocking than actually dead — flagged as such in the report rather than reported at face value). Ticks the "Link & image audit" wishlist item in GOAL.md; "Fix what the audit finds" is next and deliberately untouched here.
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.