There isn’t much to grr.fyi feature-wise - it’s a url shortener with an interface unmistakably “designed” by a backend engineer. It’s value lies in what it allows me to do and what I use it for.
A url shortener is the smallest (scope-wise) webapp worth being called one. It needs to store some state, show some snappy performance regardless of the load, and be available with good reliability and decent UX.
That’s how it’s a perfect little testing ground for programming tools and workflows in a production-like environment. I use(d) it to get some real-life experience with libraries I was interested in, but also SRE processes I wanted to exercise as if I was working on a “real” project.
So in no specific order:
- echo web framework (although I have used it before)
- SQLite with litestream replication (that was a key thing for me)
- Scaleway Object Storage - after these tests I’m in the process of moving my s3-compatible stores from AWS and Storj to Scaleway
- a multi-platform build system (my k3s cluster is hybrid, running both x86 and arm architectures)
- my private self-hosted Docker registry for the packaged app images
- altcha captcha
- OpenCode, later pi LLM harnesses and the ever-changing ways I configure them
- The kuberenetes deployment workflow where ansible runs my home-cooked helm charts
- all the observability tools I’m trying out in my homelab that give me insights into how the whole thing is running in the end
I built the whole thing in about a week’s time and learned A LOT in the process, with time to spare to try some alternative approaches. And since my homelab is all set up and configured using infrastructure-as-code, all of the approaches I have tested in practice are easily reproducible in more complicated projects.
There’s a number of things I like about the final1 result
- the app’s footprint is tiny -
< 20MBof ram, while running pretty damn fast on< 0.5%of a single core of a Raspberry Pi - the litestream replication was painless, for the most part, including scenarios where the data needs to be rebuilt from backups on startup
- the url shortener is as no-nonsense as the early iterations of Google - no login required, a single form on an empty page, while still having some protections against abuse. The captcha definitely isn’t bulletproof, but bypassing it would probably be more trouble than it’s worth to any attackers
PS I’m self-hosting more and more of my personal tools, allowing me to get off of some cloud subscriptions and claw back some data sovereignty I have lost over the years - there’s probably a blogpost coming up about what my experience has been so far and what I see as some pitfalls.
PS2 There’s still some DevOps workflows I’d like to exercise on the project - a more in-depth integration with Prometheus, OpenTelemetry spans, centralised logging, maybe building a custom MCP server. And again, I can’t think of a simpler project that would give me a real-world experience with those
- Nothing’s ever final in software world, I know 😀
