This website is powered by headless CMS named Directus.
It is a super low code batteries included CMS that provides a ton of functionality similar to WordPress, and comes with great amount of extensibility with low effort. The frontend of this website is built on Nuxt3 and renders the content of the headless CMS.
It is pretty amazing having the backend and frontend decoupled.
The deployment of the entire stack is with Kustomize pushed to a 3-Node K8s cluster running on Digital Ocean. The structure and deployment it is very simple. The deploy script is an interactive prompt. Build, Tag, and Push to container registry. Update the Manifest with latest tag and apply. Is it as simple as the DO droplets? No, but it scales very well and cheaper, and it is a one time setup for as many other apps I want to run on my K8s cluster. Digital Ocean is great with keeping the infra up to date, so no manual maintenance pain.
The static files are hosted on the DO spaces, (similar to AWS S3), for CDN capability that comes out of the box with Directus minimal configuration.
The email provider is Resend, which is configured easily in the .env file SMTP section, and injected and copied to the docker file at the build time.
The Database is a hosted Postgres on DO, just to not deal with DB operations.
For the Directus container itself, follow the official guide: Deploy Directus to DigitalOcean. My image is exactly that recipe with two additions — the DO database certificate copied in at build time, and npx directus database migrate:latest before start so schema migrations ship with each deploy.
And that's basic setup to deploy Directus to Digital Ocean with the hosted DB with certificate connection.
Simplicity is the feature
Everything above follows one rule: every moving part has to pay rent. One repo, three small services, one manifest folder, one deploy script. No CI matrix with forty steps, no service mesh, no configuration language on top of a configuration language. When something breaks at 11pm, I want to read the whole system in one sitting — and I can. Elegance here is not decoration; it is being able to hold the entire stack in your head.
The same bias shows up in the front of the site. The theme is one stylesheet of design tokens, the demo pages are single self-contained HTML files, and the buttons are the same hard-corner square everywhere. Fewer ideas, applied consistently, read as more polish than many ideas applied once.
Claude runs the loop
The newer trick: Claude is wired into the whole loop with a token, so content, layout, and shipping are all one conversation.
- Content. A Directus admin token lets Claude read and patch posts through the same API the site uses — the section you are reading was written into the CMS that way, and the live preview iframe in the admin renders it with the real theme.
- Layout. The design lives in a Claude Design project (Refracted Descent), and design sync pulls each revision — hero variants, spec-card code blocks, the LIVE PREVIEW frames, the theme controls in the footer — straight into the codebase, verified in a real browser before it ships.
- Shipping. A deploy skill wraps the
deploy.jspipeline: it refuses a dirty tree, buildslinux/amd64images tagged with the git SHA, applies the manifests, waits for the rollout to go green, and commits the tag bump. Saying “deploy” is the whole release process.
The result is a site where the distance from idea to production is one sentence — and every step still lands in git, reviewable like any other change.
Steal the theme
This blog theme itself is open — the tokens, the hero variants, the spec-card code blocks and the live demo frames are all in the source. This is it running — the demo below is the Refracted Descent post itself, served self-contained from demos.norik.io/theme:
Updated Aug 2, 2026