ship.log — 12entries
Ship Log
Engineering notes with one rule: every entry is something I shipped, or something I learned shipping it. No filler. Subscribe via RSS.
Learning Go by scratching a real itch: ci-status
A tiny Go CLI that checks GitHub Actions status across several repos at once — my first project in a new language, and the byte-vs-rune bug it taught me on day one.
Terraform without a cloud account: do-vm-terraform
A DigitalOcean droplet+firewall+DNS module, fully validated and tested against a mocked provider — and the Terraform `set` block bug that cost me an hour.
Building auth from scratch instead of installing it: auth-service
A standalone JWT auth microservice built against an explicit OWASP checklist — refresh-token rotation with reuse detection, argon2id, and timing-safe login failures, all decisions I can defend one by one.
Building a CI/CD + IaC pipeline from nothing: deploy-pipeline
A minimal link-shortener is the vehicle; the real project is the pipeline around it — GitHub Actions, Ansible-provisioned VPS, and nginx, wired end to end.
Real-time without a framework: live-room
A live poll room over WebSockets — vote counts and presence updating instantly for everyone in the room, with no page refresh and no polling.
Provisioning-as-code for monitoring: observability-stack
Prometheus and Grafana monitoring task-api-hardened, with the dashboard itself checked into git instead of clicked together — plus the honest story of adapting scope when a VPS wasn't there yet.
Extracting a library from my own repetition: strict-env
Every backend service this sprint hand-rolled the same env-var validation block. strict-env factors it out — zero dependencies, dual ESM/CJS, and reports every config problem at once instead of one restart at a time.
Hardening a toy CRUD API into something production-shaped
task-api-hardened takes a five-endpoint task list and wraps it in Redis-backed rate limiting, cache invalidation, and structured logging — the unglamorous layer that separates a demo from a service.
The fun slot: termdle
A Wordle clone that runs entirely in the terminal — this sprint's unserious project, and the one classic edge case (duplicate letters) it still had to get right.
Building something that acts without being asked: weather-pulse
A cron-scheduled service that snapshots real weather data into Postgres every 15 minutes, rendered through a dashboard with zero client-side JavaScript.
MCP servers in production: giving an AI agent hands, safely
OneBotAds' chatbot launches real ad campaigns through Model Context Protocol servers spawned per request. Here's the architecture, why we spawn instead of keeping processes alive, and what I'd tell anyone wiring an LLM to real APIs.
From mockup to production in three months: a PFE postmortem
My final-year internship brief was a React mockup with nothing behind it. Three months later it was a live SaaS with six ad-platform integrations. What went right, what bit me, and what I'd do differently.