Re-audited both apps (full codebase + docs) and rewrote both case studies to a
professional-SaaS structure: Solution and Feature Showcase are new sections
(schema + FeatureList component), Engineering Highlights/Challenges reframe the
existing architecture/decisions content around real, verified engineering work
(deterministic CV match, multi-provider email abstraction, SSRF-hardened
fetcher, hybrid RRF search, preview-then-confirm cleanup), and Status & roadmap
now separates Implemented from Planned explicitly. InboxIntel copy is careful
to state it's Gmail-only today with multi-provider fully designed but not built.
Astro was inlining the theme/nav/observer bundle as <script type="module">.
The deployed nginx CSP blocks inline scripts, so the reveal observer never
ran and every [data-reveal] section stayed at opacity:0 (space reserved,
nothing visible). Force JS external via assetsInlineLimit.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- site nginx listens on 1337; proxies /api/contact to the relay over the internal
network (single public port; TLS terminates upstream at Cloudflare)
- trailing-slash rewrite moved inside location / so /api/contact isn't redirected
- compose: publish ${SITE_PORT:-1337}, internal bridge network, no Traefik labels
(non-destructive — does not touch the WordPress apex router)
- .gitea/workflows/deploy.yml: on push to main, runner rebuilds + restarts the stack
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- fix: theme toggle did nothing on mobile — duplicate id=theme-toggle bound only the
desktop button; bind all [data-theme-toggle] instead (root cause)
- header: 2px gap top/bottom; TraceMotif svg 24->28 so the status dot isn't clipped
- remove private git.cesnimda.uk links (footer, contact, mobile nav, JSON-LD sameAs);
soften homelab diagram label
- both projects now 'in development'; about wording: Gmail analytics -> inbox cleanup
- JobTrack: refreshed to current app (Kanban pipeline, deterministic CV match, assistive
AI, EF Core) + new mockups; InboxIntel: .NET 10, pgvector + Ollama semantic search,
inbox-health analytics, split-view + new mockups; meta descriptions updated
- new ATS CV PDFs (from the new docx, via Word)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- CV split button: make the chevron <details> flex and the summary full-height so the
toggle matches the primary button height (verified 39.1px == 39.1px)
- nginx: /Linkedin now 301s to the real profile (linkedin.com/in/connor-babbington)
- prettier-ignore .pnpm-store; gitignore .claude/settings.local.json; e2e port 4321->4399;
dev preview autoPort
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- portrait: warm outdoor headshot, cropped 4:5 and optimised to WebP (800x1000, 116kB),
used in hero + about
- JobTrack case study: three real seed-data captures (applications, dashboard, reminders)
optimised to WebP (~40kB each) replacing the placeholder skeletons
- alts/captions updated to match the real screens
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- one 1200x630 PNG per page per locale, design-system styled
- hand-built SVG rasterised by resvg (handles variable fonts; satori cannot)
- vendored Space Grotesk / Inter / JetBrains Mono TTFs for deterministic offline builds
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>