Same emoji-based inline SVG favicon as before, but the emoji is now
a per-page "favicon" field editable in the header form instead of
hardcoded in the template.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Favicon: emoji-based inline SVG (🍯), the old /images/favicon/favicon.ico
reference never resolved to an actual file.
- Profile picture (the circular image at the top) is now a per-page
"profile_image" field editable in /admin, instead of a hardcoded
URL in the template.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Production 500'd on every request because the ./data volume mount
was an empty host directory, shadowing the seed file baked into the
image. load_data() now creates a minimal default file on first run
if none exists, so an empty/fresh data volume no longer takes the
site down.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This compose file is only used on the production server to pull and
run the pre-built image, not to build it locally.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds image: alongside build: so `docker compose build && push` works
locally, while the server can just `docker compose pull && up -d`
without needing the Dockerfile/build context. .env.example now
documents each variable and adds HOST_PORT.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Links now live in data/links.json instead of hardcoded HTML, editable
via /admin (add/rename/reorder/delete sections and links, per-link
color and half-width side-by-side layout). New pages can be added
without code changes. Docker image only needs rebuilding on code
changes now, not on content changes (data/ is volume-mounted).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>