vic@home:~/blog$ cat why-i-built-this.md
____ / ___| ___ | | _ / _ \ | |_| || (_) | \____| \___/
A short note on why a hand-rolled Go + SQLite blog made sense for me.
Why Go
I'd been working through Go on Boot.Dev and wanted a real project to use it on — something that wasn't just contrived exercises. Picking up a new backend language felt overdue, and a personal blog is a nice scope: enough surface area to touch routing, storage, templates, and deployment without needing a framework or a team.
The nudge to actually pick Go came from my friend Diyor. Watching him ship real things in it made "I should try this" turn into "I'm building the thing this weekend."
The constraints
I wanted something I could:
- Understand end-to-end
- Deploy as a single binary + a file
- Extend without fighting a framework
What I picked
net/httpfor routing — the 1.22+ServeMuxis finally good enough that a third-party router is unnecessary at this size.database/sqlwithmodernc.org/sqlitefor storage — pure-Go SQLite driver, no CGO, so cross-compiling to the EC2 box is dependency-free.html/templatefor rendering,goldmarkfor the Markdown → HTML pipeline,chromafor syntax highlighting.embed.FSto bake templates, static assets, and SQL migrations into the binary — one file ships everything.- Caddy in front for auto-HTTPS, GitHub Actions for CI/CD, systemd for lifecycle. All standard-issue.
That's the whole stack. Under 1MB of Go source and one SQLite file for state.
What's next
A few things on the list before I call this done:
- A small admin login so I can create/edit posts from the browser instead of running the
postCLI over SSH. - Tags + filtering on the index page.
- An RSS feed at
/blog/feed.xml. - Eventually a React frontend rebuild against a JSON API — the server-rendered pages stay live in the meantime.