Colophon: how this site is made
Why
I started tinkering with web dev in the early 2000s. The golden age of Java applets, blogrolls, and hand-curated RSS feeds. Then MySpace exploded, Facebook followed, and the open web gave way to walled gardens. By 2010, I had traded my RSS collection for podcasts (The B&B Podcast, ATP, The Prompt, The Talk Show…) and Twitter, consumed through apps like Twitterrific, Tweetbot, and later Spring. These third-party clients pulled Twitter’s whole ecosystem upward. They invented patterns like sidebar navigation and pull-to-refresh (introduced by Tweetie), which Apple itself eventually adopted.
The decline was slow, then sudden. API restrictions gradually crippled third-party clients, and features like polls stayed exclusive to the official app. Then the acquisition happened, and the shit show began: walking into HQ carrying a sink (“let that sink in”), the glowing 𝕏 sign on the roof keeping neighbors awake, blue checkmarks force-gifted to people like Stephen King and LeBron James who had publicly announced they wanted nothing to do with them. Then API pricing went through the roof, which killed third-party clients for good and forced everyone onto the dreadful official app. What had been my primary tech discovery tool turned into a swamp of OnlyFans bots, clickbait trends and engagement farming, and unabashed fascist rhetoric.
Everyone scattered: some to Mastodon, others to Threads, others to Bluesky. Some influencers, regrettably, stayed on Twitter, while the rest split between Fediverse advocates and AT Protocol converts. Many of us drew the same lesson from the wreckage. However much you love a platform, you’re better off owning your data and controlling how it gets distributed. Personal websites started making a comeback.
The best time to buy a domain was 20 years ago. The second best time is today.
I had always dreamed of having a personal site, but I never felt legitimate enough to publish. Then the daydream became a necessity. I needed to write, and to do it properly, I needed a medium that my perpetually unsatisfied temperament could be proud of.
Technology
This site is built with Next.js (App Router) and TypeScript. I write the content in MDX, which is Markdown with embedded React components.
MDX lets every page mix prose with custom React components. Here are a few, rendered live with their props:
The Markdown pipeline runs on unified, with remark (parsing, GFM, math) and rehype (KaTeX rendering, slug generation, autolinked headings, smart quotes, em dash handling). next-mdx-remote-client renders the MDX, and Sugar High highlights the code.
Oxlint and Oxfmt lint and format the code. Both are written in Rust and run in milliseconds, in a Husky pre-commit hook.
Typography
Three typefaces, each with a role:
- Roobert for headings. A geometric sans-serif.
- PP Neue Montreal for body text. A neo-grotesque. I’ve always been drawn to grotesques, and this one is clean and legible without being anonymous.
- Geist Mono for code. Designed for terminals and editors.
Design
Dark theme, always. The layout is built on a CSS Grid breakout pattern inspired by Ryan Mulligan and SmolCSS. Instead of wrapping content in a constrained container and then fighting to let certain elements escape it, every child sits on a grid with named columns (content, popout, feature, full) and picks the width it needs. Code blocks pop out to popout, hero visuals stretch to full, and prose stays in content. No max-width hacks, no negative margins. Styled with Tailwind CSS and shadcn/ui.
Every visual on this site is pure code: CSS, Three.js, Canvas. No AI-generated images, no stock photography. Motion handles the animations, with a custom stagger system.
Content
I write every piece by hand, in both English and French. I use AI for proofreading, never for drafting or actual writing. The reasoning is on the /ai page.
The site is bilingual, with locale-based routing, a language switcher, and alternate hreflang tags. Each language has its Atom feed (English and French).
Every page also responds to the Accept header. Request text/markdown or text/plain and you get Markdown instead of HTML. A dedicated remark plugin converts the custom components to plain-text equivalents.
Hosting and privacy
Vercel hosts the site. Analytics come from Vercel Web Analytics and Speed Insights. Both are anonymous, set no cookies, and collect no personal data. Details are on the /privacy page.
This is a /colophon page. See all slash pages.