The page you're reading. Every project gets a README in this repo, and the site renders them.
Three layers
| Layer | Page | Who sees it |
|---|---|---|
| Public | / | Anyone |
| Access code | /shared | Someone I've sent a code to, usually after a first interview |
| Private | /admin | Just me, alongside the tools that manage the other two |
Each layer is its own page, so the public page always looks the same no matter who's signed in.
- Codes are made for one person, expire, and can be revoked. Anyone can request one with a form, and the request reaches me by email. I make the code from an admin panel, and I can see which pages each code opened.
- Gated pages are never static files. Each page is rendered per request after the server checks who's asking. A project you can't see returns the same 404 as one that doesn't exist, so the public site never confirms what's behind the code.
- Sessions are signed cookies. A code session is checked against the code list on every request, so revoking a code cuts off whoever is holding it right away.
- One admin login for every site. Signing in here also sets a second signed cookie for the whole domain. Each of my other sites checks its signature and expiry itself, which is how home is public to read and mine to change. Signing out clears it.
- No dependencies: Python's standard library and a small Markdown renderer written for the subset these READMEs use.
- One look across my sites. The pages are styled by Darkroom, a design system I made for every carldmitchell.com site: terminal-style panes, a ridge landscape, black and white with one accent colour, and Night and Day themes. It's a single stylesheet with no build step, copied in by an install script, so this site was the first to use it.
Kept current automatically
A weekly Claude Code job looks at each project's source folder. If a project changed, it rereads it and updates the README.