When I started Hamlogs, I didn’t sit down with a whiteboard and architect the perfect tech stack. I started building — then slowly replaced the parts that annoyed me. The result? A stack that’s fast, maintainable, and easy to self-host. And more importantly: one I actually enjoy working with.
Here’s what’s under the hood of Hamlogs.com, and why I chose each piece.
🧱 The Core Stack
NestJS gave me structure without slowing me down. It’s built on Express under the hood but adds TypeScript-first patterns, decorators, and a rock-solid module system. With Hamlogs needing API endpoints for logbook CRUD, ADIF exports, WSJT-X integrations, and eventually LoTW syncing — NestJS makes it easy to scale features cleanly.
DTOs and validation with class-validator
Swagger auto-docs
Prisma integration for PostgreSQL
Guard-based auth
Nest feels like building with strong scaffolding and a thoughtful API-first mindset. When you’re working alone on a growing codebase, that’s gold. Next.js (Frontend)
I’ve used a lot of frontends. Next.js still wins for me.
It handles routing, SSR (which is great for SEO once Hamlogs starts showing callsigns publicly), and static optimizations out of the box. I pair it with Tailwind CSS for fast, responsive UI building.
Also:
Server actions for simple async operations
App directory structure for sanity
No client-side router headaches
Next.js lets me build dashboards, log tables, upload tools, and award visualizations quickly — and they’re fast. It just works.
🐳 The Infrastructure
Docker Everywhere
Every service in Hamlogs runs in a container: backend, frontend, Postgres, queue workers, and background jobs. That means the stack can run anywhere — local, cloud, or self-hosted.
No “it works on my machine” nonsense. Traefik (Reverse Proxy + SSL)
I use Traefik to handle:
HTTPS with Let’s Encrypt
Routing frontend and backend by domain/subdomain
Redirects and headers
Its Docker integration is magic. Just add a few labels, and your container gets routed with TLS. Simple and powerful. Coolify (PaaS for Self-Hosting)
I run all of this on a Coolify instance. It’s like Heroku for people who don’t mind rolling up their sleeves. With Coolify:
I deploy updates from GitHub with one click
I can monitor logs, environment vars, and backups
Everything’s containerized, restartable, and exportable
It’s not perfect (and I’ve ranted about its quirks before), but it’s the fastest way I’ve found to deploy real apps without paying Heroku’s prices.
🛠 Bonus: Tooling I Lean On
Prisma – Type-safe DB access with migrations
Zod – For schema validation on both sides
BullMQ + Redis – For background jobs (ADIF parsing, export processing)
Tailwind UI – Speeds up clean UI layouts
PostgreSQL – Because I like relational schemas that won’t betray me
Why This Stack Works (for Me)
I’m not chasing buzzwords. I’m chasing simplicity — and this stack gives me that. It lets me build quickly, test locally, and deploy confidently. I can jump between front and back end without changing mental models. And if someone wants to self-host this someday? They’ll be able to with minimal effort.
This stack doesn’t just power Hamlogs. It makes working on Hamlogs enjoyable.
If you’re building a side project — especially something solo — and looking for a stack that won’t burn you out at 2 a.m., this combo might just be it.
And if you’re curious how it all ties together behind the scenes, drop me a message or reach out via Facebook. Happy to share more.
