A colophon is where a book explains how it was made: the type, the paper, the press, and the people behind it. This page does the same for johnie.eu.
The service and infrastructure choices behind the site are covered elsewhere on johnie.eu. This page stays on the implementation side: how the site is structured in code, how content moves through it, and which libraries shape the experience.
Application stack
The site itself is built with a deliberately plain stack:
- React 19
- TanStack Start and TanStack Router for the app shell, routing, server routes, and SSR.
- Tailwind CSS for styling.
- Content Collections to turn markdown content into typed application data.
- react-markdown for rendering page and post content.
- Shiki for syntax highlighting in posts.
- Nitro and srvx in the server runtime that ships inside the container.
The goal is portability: content in the repository, routes in code, server behavior kept close to the application, and as little provider-specific glue as possible.
Rendering pipeline
- Page and post bodies render through react-markdown with shared custom components.
- Post pages add Shiki syntax highlighting through a small rehype pipeline instead of shipping a separate client-side highlighter.
- Internal and external links go through a shared tracked-link layer so routing, outbound-link behavior, and analytics tagging stay consistent.
- Typography, colors, spacing, and prose styles are all driven from the local Tailwind theme and app stylesheet.
Stack Desk
The site now includes Stack Desk, a small on-site assistant focused only on johnie.eu.
- The UI streams answers with TanStack AI and Streamdown.
- The server route at
/api/chatbuilds a prompt from the published site content and sends the conversation to Mistral AI. - The same generated knowledge base is also exposed at
/api/site-contentas markdown. - The assistant is intentionally narrow: it only answers questions about this site and its published content.
- Most visits never touch a model. Mistral is only called if you open Stack Desk and send a message.
Interaction and analytics
- CTA clicks, post opens, stack-card clicks, outbound-link clicks, and read-depth milestones are tracked as small, explicit events.
- Outbound-link tracking is centralized so the same link policy controls
target,rel, host labeling, and analytics payloads. - Analytics URLs are sanitized down to standard UTM parameters before they are sent.
- The privacy page documents the user-facing side of that behavior.
Authoring workflow
Most code changes are written through OpenCode pointed at Mistral AI. That pairing matters here because both sides keep an exit available: OpenCode is provider-neutral, and Mistral ships open-weights models alongside the hosted API.
The mechanics stay intentionally boring: files in a repository, markdown for content, typed collections for structure, and a single web app that owns both the UI and the server routes.
Typography and assets
- DM Sans for body copy.
- Playfair Display for headings.
- Bunny Fonts serves both font families from a GDPR-friendly CDN.
Brand marks
Third-party brand marks used across the site, including logos in stack cards and logos referenced in posts, are sourced from OpenBrand, an open collection of company logos maintained by Ethan Yang and contributors.