Writing
Notes from 10+ years of production work: what I built, what it cost, and what changed. 38 posts. Also on RSS.
Featured case studies
- About a third of the Zendesk billPathao Tickets: replacing Zendesk with a patched open source helpdeskPathao support ran on Zendesk. We patched an open source helpdesk for ticketing, live chat and automations at roughly a third of the Zendesk bill.
- ~$10K/month savedPathaoTalk: how we moved a whole company off Workplace Chat in a monthWorkplace Chat had no markdown, snippets or integrations and cost thousands a month. Self-hosted Mattermost replaced it in about a month and saved around $10K a month.
Engineering notes
Projects
My auto dark mode lasted 60 seconds, then saved itself as darkMy theme switch picks light or dark by the clock. It shared a localStorage key with next-themes, so auto mode quietly turned into a fixed theme a minute after the first visit.
Browser automation
Four OpenTabs plugins for Facebook, Greenhouse, Toptal and UpworkFour open-source OpenTabs plugins give a terminal agent 22 tools in my logged-in Chrome to triage friend requests, fill job forms and update freelance profiles.
7 min readmcpbrowser-automationAI tooling
AI coding agent setup: start here10 min readai-agentsself-hosting6 deep dives
- 9Router: one local endpoint in front of every AI coding account I have
- Herdr: how my MacBook Pro connects to Ubuntu terminals on a Windows PC
- 9agent: run Claude Code, Pi or Hermes on any model with one command
- Hermes Agent: nightly cron jobs and skills learned from corrections
- Tailscale and Cloudflare Tunnel: my home PC with zero open ports
- A deterministic prompt injection filter for agents that read my email
Backend and infrastructure
My Hermes backup said DONE, but a tar exclude dropped every databaseMy agent backup script printed DONE and uploaded 346 MB. The first restore showed the databases were never in the archive. One tar exclude did it.
Backend and infrastructure
210ms to 15ms per edit
Faster code gates: a Rust hook, oxlint, and runner-bound CIA per-edit hook went from 210ms to 15ms and lint from 21s to 0.7s. The bottleneck was process startup, not code checks, and CI was bound by runners.
AI tooling
25 edits across 13 of 31 posts
Linting my blog for AI-sounding prose: what worked, what I skippedI ran a free prose linter over 31 posts, made 25 edits in 13 of them and added a pre-commit check. I skipped AI detectors and humanizers.
4 min readwritingdeveloper-toolsBrowser automation
Claiming free game rewards with a Hermes cron job and PlaywrightA cron job runs a small Playwright script every 6 hours to claim the free offers in a game web store. 50 saved runs show what it claims and how it fails.
4 min readautomationhermesBackend and infrastructure
Scraping: fail loudly when the page layout changesA scraper that parses nothing and exits 0 looks healthy while it fills your database with gaps. A count check and a saved fixture catch it.
2 min readscrapingweb-scrapingBackend and infrastructure
How I track my money with Hermes: the flow, not the numbersBank SMS and email alerts flow through one parser, a dedupe hash and a Google Sheet. A morning cron job drafts the summary. Only the flow, no figures.
5 min readautomationhermesBackend and infrastructure
Scraping: back off, honour Retry-After, and never retry a 404A retry helper that backs off with jitter, reads Retry-After, and gives up fast on a 404. Run against a local server that fails on purpose.
2 min readscrapingweb-scraping
Show 20 more
Backend and infrastructure
Scraping: look for the page's JSON before you write a CSS selectorMany pages ship their data as JSON inside the HTML. Reading that survives a redesign that breaks every class-name selector.
2 min readscrapingweb-scrapingBackend and infrastructure
Self-hosting CodiMD with company sign-in so engineers kept using itPathao engineers already liked a hosted markdown editor. I self-hosted the open-source CodiMD behind company sign-in, and the whole company moved to it.
2 min readcodimdself-hostingAI tooling
Build an n8n workflow that summarizes Hacker News with an LLMA 7-node n8n workflow that pulls the top Hacker News stories, sends them to an LLM and returns a short digest. Runs locally in Docker with no paid API.
4 min readn8nautomationBackend and infrastructure
Shopify apps that survive GraphQL cost limits and duplicate webhooksShopify gives a store 1,000 GraphQL cost points refilling at 50 a second. Read extensions.cost, verify HMAC on the raw body, dedupe webhooks by ID and queue in BullMQ.
AI tooling
Gemini image generation in Claude Code with a four-layer fallbackClaude Code gets images through four layers: the official Gemini API, a Chrome cookie daemon, a Playwright profile, then Pollinations.ai when the rest hit limits.
4 min readaiclaude-codeAI tooling
ytranscript: YouTube transcripts into Obsidian, n8n and ClaudeI lost a video in 400+ Watch Later items. ytranscript fetches transcripts with no API key, feeds my n8n to Obsidian flow and runs as an MCP server for Claude.
Projects
How ytranscript works: reverse-engineering YouTube captionsHow ytranscript pulls YouTube captions using the internal Innertube API: no browser, no API keys, just curl and a simple JSON parser.
5 min readyoutubereverse-engineeringBackend and infrastructure
30-45 min manual to 3 min automated
My CI/CD pipeline: Husky hooks, GitHub Actions, Trivy and VercelGit push to production in about 11 minutes: Husky checks, tests on Node 18, 20 and 22, Trivy blocking CRITICAL and HIGH, Claude PR review, then a Vercel deploy.
AI tooling
MCP and code execution are moving software from menus to intentAnthropic reports a 98.7% token cut when agents call MCP tools through code. What that means for menu-driven GUIs, and where MCP agents still fall short.
AI tooling
AI is industrializing code, so in 2026 I'm betting on fundamentalsWhat I hand to AI coding agents, what I still do by hand, and the fundamentals I'm studying in 2026: PostgreSQL internals, Rust and observability.
7 min readsoftware-developmentaiBrowser automation
Puppeteer in production: fallback selectors, real waits, clean exitsA Facebook class rename stopped 100+ accounts from posting. The fix: ARIA selectors, real waits, finally cleanup, a lock per account and screenshots on error.
16 min readpuppeteerbrowser-automationAI tooling
Factory Droid on GLM-4.7 and MiniMax M2.1 for cheaper AI codingGLM-4.7 at $3 a month became my daily coding model in Factory Droid, with Claude Pro kept for architecture work. Setup, config and my ~$25 monthly total.
Browser automation
LangGraph browser agents on Puppeteer: prune the DOM, then actA LangGraph agent that drives Puppeteer over CDP: prune the DOM before the model sees it, fill forms in one batched action, and fall back when a selector breaks.
Projects
BanglaABC123: a number matching game I built for my kidsMy kids had exams on numbers in English and Bengali, so I built a small matching game: tap a card, hear the number, find its pair in the other script. No ads, no accounts.
Projects
Memory Booster: a 2016 MobX game I built to avoid WebRTCIn November 2016 I skipped a WebRTC task and built a grid memory game with React 15, MobX decorators and Jest snapshots. Reading it ten years later, here is what held up.
Browser automation
Driving Multilogin browser profiles with Puppeteer and a LangGraph agentConnect Puppeteer to Multilogin profiles over CDP and drive them with a LangGraph agent at about $0.02 a task on GPT-4o-mini, with fingerprint checks and clean teardown.
17 min readmultiloginpuppeteerBackend and infrastructure
Replacing OpenLens: why I kept K9s, Headlamp, and KubenavOpenLens is no longer maintained. I tested 13 Kubernetes dashboards and kept three: K9s, Headlamp, and Kubenav.
7 min readkubernetesdevopsBackend and infrastructure
Hardening high-traffic WordPress at Nginx: rate limits, microcachingScrapers on XML-RPC and login brute force drain php-fpm workers. Nginx rules for WordPress multisite: edge filters, tiered rate limits, microcaching and buffer tuning.
Projects
A WordPress plugin that throttles Facebook's link-preview crawlerFacebook's crawler had a friend's shared host threatening suspension. The plugin throttles each URL, answers 429 with Retry-After and lets images through.
Projects
Building a Bangladesh tax calculator after a costly 2020 tax billIn 2020 I paid far more tax than expected because I didn't know the rebate rules. So I built an open-source Bangladesh calculator with year-wise slabs and rebate math.
Not about software: personal writing.