Refactor the site container from a TLS-owning, port-binding proxy into an
internal plaintext static server that sits behind a dedicated edge reverse
proxy, and add an automated build/deploy pipeline.
- Caddyfile: single :80 listener (auto_https off), Host-matcher routing for
apex/blog/art/code with /_astro+/assets re-root and www->apex redirect
- Dockerfile: EXPOSE 80 only (TLS now handled by the edge proxy)
- compose.yml: pull registry image, join external 'edge' network, declare
routing via caddy-docker-proxy labels; drop build/ports/cert volumes
- compose.dev.yml: local container preview on :8080
- .forgejo/workflows/deploy.yml: push-to-main -> desktop runner builds, pushes
to the Forgejo registry, SSH-deploys to the VPS
- docs + .dockerignore updated for the new topology
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The featured article previously hid whenever a query was active,
regardless of whether it matched. Treat it as a normal [data-search]
row instead: visible iff it matches the query, and counted toward
visibleCount so a featured-only match no longer triggers the
"no entries match" message.
Closes the follow-up at
docs/superpowers/follow-ups/2026-06-02-blog-search-featured-match.md
and updates the design spec to match.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- @astrojs/check + typescript bump are needed to run `npx astro check`,
which is the type-verification command used throughout this branch.
- docs/superpowers/plans/ pairs with the existing spec under specs/.
- docs/superpowers/follow-ups/ records the featured-match behaviour
change surfaced during manual test; addresses in a later branch.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tiny client-side filter on /blog using data-search attributes on each
row. No new deps, no JSON index, no React island. Filters in place
within the year-grouped archive.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>