Colophon
How this site is made.
This site is a small, deliberately ordinary system — the kind I would recommend to a client with the same problem.
How a page gets to you
Edge
Nginx
TLS, routing, static media
Experience
Next.js
Server-rendered, cached pages
CMS
Same app, /admin
Services
NestJS API
Validation, auth, search
Data
PostgreSQL
Content + full-text search
Media storage
Disk or S3-compatible
- NginxNext.js
- Next.jsNestJS API
- NestJS APIPostgreSQL
Stack
- Next.js (App Router) and React, TypeScript throughout
- NestJS API with Zod validation and OpenAPI docs
- PostgreSQL with Drizzle ORM; full-text search built in
- Docker Compose and Nginx
Type & colour
- Schibsted Grotesk, Newsreader and IBM Plex Mono
- IBM Plex Sans Arabic and Noto Naskh Arabic
- Paper and ink by day, graphite by night, one signal colour
No trackers, no cookies for visitors, no third-party scripts unless I choose an analytics provider in the CMS. If you are curious about the details, there is a longer write-up in the notes.