How to Fix a Migration That Already Ran in Production
Never edit a migration that already ran. Write a guarded catch-up migration that checks the database first, then guard the code that reads the result.
Read MoreThoughts on software engineering, Malaysian tech, and lessons from the field.
Never edit a migration that already ran. Write a guarded catch-up migration that checks the database first, then guard the code that reads the result.
Read MoreFile sync tools corrupt a git working tree. Here is the design that held: a private Forgejo over Tailscale, a bare mirror repo per machine, and a 45 second snapshot job.
Read MoreWe published hundreds of generated pages on a fresh subdomain and Google indexed a handful. The pages were fine. The domain was the problem.
Read MoreTwelve scheduled jobs moved out of the provider's peak price windows. Same model, same prompts, same output, lower bill. Here is the audit that finds them.
Read MoreTwo environment variables gave our first paying tenant their own config and database on a shared server. Here is the patch, the incident it caused, and when to stop.
Read MoreHow we shipped VibeGuard — an LLM-driven automated QA platform — to production on a home server. Six containers, shared artifact volume, Celery solo pool for Playwright, no public ports, plus a dedicated log watchdog that caught its first real production bug within minutes of going live.
Read MoreA solo founder's account of building a self-hosted AI assistant from scratch — Telegram interface, persistent memory across sessions, model routing between Haiku/Sonnet/Opus, real-time streaming, auto GitHub issue fixer, and a daily news briefing. From February 25 to March 31, 2026.
Read MoreSend a Telegram message, get real engineering work done. How I connected a Telegram bot, a self-hosted n8n instance, and Claude Code CLI into a pipeline where a chat message can read files, edit code, push commits, and fix bugs — all from my phone. Includes the autonomous GitHub issue-fixing pipeline that detects, diagnoses, and patches bugs automatically.
Read MoreRunning your own ChatGPT, photo backup, cloud storage, and monitoring — all on a repurposed desktop with a GTX 1070. Here's the full stack: Ollama, Open WebUI, Immich, Nextcloud, Grafana, AdGuard Home, n8n, and more. 15+ Docker services, $0/month.
Read MorePOST any URL, get clean LLM-ready markdown back. Built with self-hosted n8n for orchestration and Firecrawl for JS-rendered scraping via Playwright. Handles SPAs, batch crawls, and even cracks heavily JavaScript-dependent sites.
Read MoreA deep dive into building full LHDN MyInvois compliance — from basic UBL submission to consolidated B2C invoices, the 72-hour cancellation window, exponential backoff polling, and the bugs that slipped through. 10 phases, 460 tests, and every gotcha documented.
Read More->first() Lies: Debugging a Silent Data Isolation Bug in Production
We had a bug that only appeared in production, only under specific multi-tenant conditions, and only weeks after it was introduced. The fix didn't touch our 100-million-row invoices table — but it required rethinking how we resolve ambiguous database lookups and adding conflict guards at three separate layers.
Read MoreI ran a full security audit on my personal server — the one running a dozen self-hosted apps behind Cloudflare tunnels and Docker. UFW was set up, SSH was restricted, containers were bound to localhost. Still found four fixable gaps. Here's the checklist and the reasoning behind each item.
Read MoreNot everything needs a React app, a database, and a deployment pipeline. Sometimes you want a tool that works offline, syncs when it can, and lives in a single HTML file. Here's the pattern I use: vanilla HTML with localStorage as the primary store, and a tiny FastAPI endpoint for cross-device sync.
Read MoreEnvoyer and Forge are great tools — but when you're running your own LAMP stack and don't want to pay for managed deployment, you can get surprisingly close to zero-downtime releases with a well-structured GitHub Actions workflow, atomic symlinks, and a disciplined migration strategy.
Read MoreClaude Code forgets everything when the session ends. Here's how we built a two-layer memory system — a flat-file MEMORY.md for stable conventions, and an MCP brain server backed by SQLite for episodic session recall. The meta part: Claude helped design the system it now runs on.
Read MoreA practical guide to connecting your application to Malaysia's national e-invoicing system. Covers OAuth2 authentication, UBL document structure, submission flow, and the gotchas you'll only find out in production.
Read More