Skip to content
Back to Portfolio

Blog

Thoughts on software engineering, Malaysian tech, and lessons from the field.

Telegram n8n Claude Code Automation

Wiring Telegram, n8n, and Claude Code Into a Single Pipeline

Send 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 More
AI Self-Hosting Docker DevOps

Building a Self-Hosted AI Stack on a $300 Home Server

Running 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 More
n8n Firecrawl Automation Web Scraping

Building a Universal Web Scraper with n8n and Firecrawl

POST 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 More
Laravel MyInvois LHDN e-Invoicing

10 Phases of MyInvois Integration: What LHDN Doesn't Tell You

A 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
Laravel Debugging Production Multi-Tenant

When ->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 More
Python FastAPI Architecture No Framework

Offline-First HTML Apps with a 30-Line FastAPI Sync Backend

Not 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 More
Laravel DevOps Deployment VPS

Zero-Downtime Laravel Deployments on a Budget VPS

Envoyer 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 More
Claude Code MCP AI Tooling Developer Productivity

Building a Persistent Memory System for Claude Code

Claude 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 More