Sitemap
A quick, human-readable map of the public pages on this site.
Main pages
The main sections of the site.
Projects
Product case studies and engineering decisions.
Expertise
Engineering topics and areas of practice.
Articles
Long-form engineering guides and project notes.
- Stock balances belong in application code, not a database trigger
- Row-level security is not your only tenant boundary
- What changes when the internet is optional: notes from building OrderRestro
- Calculating GST from an inclusive MRP in a retail POS
- A PostgreSQL backup is only useful after a restore drill
- Open-source GST billing and accounting software with a double-entry ledger: how Rechvix works
- Self-hosted restaurant POS with a kitchen display that keeps working offline: OrderRestro
- Offline retail POS software for India: GST-inclusive MRP billing, udhaar and barcode checkout
- Pharmacy management software with batch and expiry tracking, billing and OPD: KinetiRx
- Self-hosted employee attendance, work assignment and CRM software: how Zulivio models workflow
- A self-hosted form backend API with PostgreSQL, presigned uploads and Telegram alerts: Submify
- Construction ERP for material procurement: from site requisition to daily consumption
- What is an MCP server? A plain explanation with a real example
- How to build an MCP server in TypeScript, step by step
- MCP security: how prompt injection turns a helpful tool into a leak
- What is prompt injection? Examples, why it works, and what helps
- Why AI agents fail in production, and what to build around them
- AI code review vs human code review: what each one is good at
- What is LLM observability, and what should you log?
- How to monitor and cut LLM costs in production
- Vibe coding vs vibe engineering: where the line is
- Is vibe coding safe? The security problems that show up
- Claude Code vs Cursor vs GitHub Copilot: how to choose
- Spec-driven development with coding agents: write the spec first
- Will AI replace developers? A grounded answer from someone who ships software
- How to self-host an LLM with Ollama, and when it makes sense
- How to self-host n8n with Docker Compose and PostgreSQL
- n8n vs Zapier vs Make: which automation tool fits which job
- PostgreSQL row-level security: a practical guide with policies and pitfalls
- How to build a multi-tenant SaaS on PostgreSQL: three models compared
- Why is my PostgreSQL query slow? A checklist that starts with EXPLAIN
- PostgreSQL connection pooling: why you need it and how PgBouncer works
- What is event sourcing? A clear explanation with a bank account example
- Modular monolith vs microservices: what to build first
- JWT vs session cookies: which should you use for authentication?
- OAuth vs OpenID Connect vs SAML: what each one is for
- PostgreSQL 18 vs 17: what changed and whether to upgrade
- How to prevent SQL injection: parameterised queries and what else to check
- AI coding agents and supply chain attacks: fake packages and what to check
- Is Docker safe for production? Settings that matter
- Self-hosting security: a hardening checklist for a home server or VPS
- Reverse proxy security: TLS, headers, rate limits and what not to expose
- Is web scraping legal? What the law and site terms usually say
- The self-hosting checklist: what to set up before you run anything important
- Is self-hosting worth it? An honest look at time, money and risk
- Self-hosted vs SaaS: a cost comparison you can reproduce
- How to set up a CI/CD pipeline with GitHub Actions, step by step
- Docker Compose in practice: a guide to the parts you use every day
- Kubernetes for beginners: what it is, and whether you need it
- Ansible vs Terraform vs Argo CD: three tools for three different jobs
- Argo CD vs Flux: choosing a GitOps tool for Kubernetes
- Recovering from self-hosted data loss: what to do in the first hour
- SSL/TLS certificate renewal for self-hosted sites: how to stop expiry outages
- What is a reverse proxy? Nginx, Caddy and Traefik compared
- DNS records explained for self-hosters: A, AAAA, CNAME, MX, TXT and more
- Cloudflare Tunnel vs port forwarding: how to expose a home server
- What is offline-first software? How it works and when to build it
- Go concurrency patterns: goroutines, channels, worker pools and context
- Go for backend beginners: a practical path from zero to a working API
- Deploying a Go app with Docker: a small, safe image and a Compose file
- How to choose a POS system for a small business: a buyer's checklist
- Toast vs Square vs Clover: how to compare restaurant and retail POS systems
- Cloud POS vs on-premise POS: which is better for a shop or restaurant?
- GST billing software for small businesses: what to look for in India
- GST invoice requirements: a field-by-field checklist for India
- Tally vs Vyapar vs Zoho Books: choosing accounting and billing software in India
- Billing software with inventory: what to check so stock and accounts agree
- Best CRM for a small business: how to choose, and HubSpot and Salesforce alternatives
- ERP vs CRM: what each one does and which you need first
- Construction ERP: what it costs, what it should do, and how to choose
- ERP software for small business: do you need one, and how to pick
- Pharmacy management software: a checklist for batch, expiry and billing
- Formspree alternatives and self-hosted form backends: how to handle contact forms
- Next.js vs WordPress: which to use for a business website
- How much does a small business website cost? What drives the price
- SEO vs AEO vs GEO: the difference, and what to do about each
- How to get cited by ChatGPT, Perplexity and Google's AI answers
- Why nobody uses your product: distribution before features
- What is forward deployed engineering? The job, the skills and how it differs from support
- Attendance and workforce management software: what a small company needs
- A timed-out invoice request should not create a second invoice
- A business day is not always a calendar date in the server's time zone
- An audit trail and an application log answer different questions
- WebSockets or server-sent events? Start with the direction of the conversation
- Model approvals as state transitions, not a chain of buttons
- Deno Is Joining Cloudflare: What Developers Should Do About the Runtime and Deploy Sunset
Short notes
Brief lessons from production work.
Books
Book pages and online reading.
For search engines and automated tools: XML sitemap · AI content index.