Why this blog is a folder of Markdown files
How a one-person studio keeps three websites running for the price of the domains — and why the posts live in Git, not a database.
AVOID SYSTEM is built a few hours a week. Anything that needs babysitting — a server to patch, a database to back up, a SaaS plan that grows with every seat — eventually wins against the work that matters. So the websites follow one rule: static first, dynamic only when there is a reason.
The setup
- Three sites — avoid-system.com, nhathuynh.com, nhathuynh77.com — live in one Astro monorepo and share one set of brand tokens.
- Every page is built to plain HTML and served from Cloudflare. Requests for static files are free and unlimited, so traffic never shows up on a bill.
- The few things that are truly dynamic — the email list, the tester list — go into a small SQLite database (D1).
Why posts are files, not rows
Posts change rarely and are read often. That is exactly what a build step is for.
- Versioned. Every edit is a commit. Nothing is lost when a CMS changes its plans.
- Portable. Markdown renders anywhere. If the host ever changes its pricing, the repo moves in an afternoon.
- Free to scale. A thousand posts cost the same as ten: nothing.
Search is built at the same time as the site, so even finding a post doesn’t need a server.
What it costs
Today: the three domains, about thirty dollars a year. The first real line item appears only if the dynamic parts outgrow the free tier — and that is a good problem to have.
Good architecture is knowing what not to build. That applies to the website too.