Skip to content
Site note

August 9, 2026 · 2 min read

This week: the site grew a brain, and the arcade game grew a face

Most of the week went into damienkedwardstech, which stopped being a static portfolio and started acting like a small platform.

From site to platform

The foundation was already there — public site, gated Projects area, admin content management — but this week added the layer on top: scheduled publishing, draft previews, case study stats, testimonials, a newsletter archive, and a table of contents/post series system for longer writing. Most of the site copy (nav, footer, contact, services, site name, chat widget header, even the "Uncharted" status line) is now admin-editable instead of hardcoded, which matters more than it sounds like — it means content changes don't need a deploy.

The bigger piece is the agent stack: a RAG chat widget with semantic search and related content, a research agent, a dev-log agent, Telegram-based admin, and a tool-using chat that can actually take actions rather than just answer questions. Getting that last part working properly meant giving the chat widget real conversation history so tool confirmations don't get lost between turns, and being careful about what context leaks into the model — URL slugs and gated project URLs are explicitly kept out of the prompt, even while gated project teasers are indexed for search. Also renamed the homepage activity feed away from "Hermes" branding, added a content audit log, a machine-readable API spec, CI, and rate limiting, plus API reference docs to keep the whole thing maintainable as it grows.

Smaller but real: fixed low-contrast text on every teal button and colored link site-wide, added password login and multi-repo GitHub links for gated projects, mobile nav, resume links on About/Contact, and OG/SEO metadata across case studies.

Class arcade project

On the side, the classroom arcade game got closer to feeling like an actual cabinet. Added team mode and a one-click "missed questions" review round, plus a default course setting and last-played-week memory so teachers don't re-configure it every session. Visually: swapped photo-based life icons for a CSS-built dog face sprite, wrapped the mascot photos in a beveled bezel frame, and layered a CRT scanline/vignette overlay over the whole thing. Under the hood, import logic got extracted into a reusable processImportedJson, and native Electron menu actions now wire into the same Export/Import buttons the web UI uses, with a progressive-enhancement hook so downloadBlob still works outside Electron.