Blog
Notes on building and running web apps
Practical write-ups on web development, DevOps and Linux administration, from real projects.
Latest articles

AI Invoice Processing: OCR, LLM Extraction, Human Approval
Reliable AI invoice processing is a pipeline: read the text or OCR it, let a model fill a fixed schema, check the numbers in code, then a person approves. I've fixed money bugs where one payment was counted twice, so I don't trust any system that moves money on a guess. AI is very good at reading a
Read article →
Private AI Chatbot for Company Documents, with Sources
A private AI chatbot for company documents searches your own files first, answers only from what it found, cites the source and admits when it doesn't know. That technique is called retrieval-augmented generation (RAG). I run local models on my own machines (setup in my Ollama on a VPS guide ), and
Read article →
Multi-Tenant SaaS with PostgreSQL RLS, NestJS and Prisma
To isolate tenants in a NestJS and Prisma SaaS, turn on PostgreSQL row-level security and set the tenant ID inside each request's transaction. On a 3PL warehouse system I built , one client seeing another client's stock is the worst bug the system can have. That app injects a clientId filter into
Read article →
European Accessibility Act: Website Checklist for 2026
The European Accessibility Act requires most online shops and digital services selling to EU consumers to be accessible, in practice to WCAG 2.1/2.2 level AA. The European Accessibility Act (EAA) has applied since June 28, 2025. It doesn't matter where your company is based: if you sell to consumers
Read article →
Docker Engine 25 End of Life: Upgrade to 29 Safely
Docker Engine 25 stops getting security fixes on December 4, 2026. Upgrade to Docker Engine 29, the only other supported line, after a backup and a test run. Docker Engine 25.0 came out in January 2024 and got an unusually long life: while 26, 27 and 28 have already reached end of life, 25 kept
Read article →
Next.js 16.4 Upgrade Guide: Cache Components and More
Next.js 16.4 makes Cache Components the recommended model, adds ensureStatic and smaller Turbopack builds. Upgrade with npm install next@latest, then migrate. Next.js 16.4 shipped on October 6, 2026. It is a minor release, so an app on 16.x upgrades without breaking changes, but it changes the
Read article →
Copy Fail (CVE-2026-31431): Check and Patch Linux
Copy Fail (CVE-2026-31431) lets any local user become root through the algif_aead kernel module. Install the patched kernel and reboot, or block the module now. Copy Fail went public at the end of April 2026, and CISA added it to its Known Exploited Vulnerabilities catalog on May 1. Months later I
Read article →
Docker Logs Filling Up the Disk? Rotate Them Properly
Docker's default json-file log driver never rotates, so container logs grow until the disk is full. Set max-size and max-file in daemon.json and recreate. "No space left on device" on a Docker host is very often not images or volumes. It's a single -json.log file under /var/lib/docker/containers
Read article →
ERPNext Customization Cost: What You Pay For (2026)
ERPNext customization cost depends on the layer you change: settings and fields are cheap, custom apps cost more, and app or hardware integrations cost most. ERPNext itself is free and open source. What you pay for is fitting it to your business: setting it up, changing it where it doesn't fit,
Read article →
3PL Warehouse Management System: Build or Buy (2026)
A 3PL warehouse management system must keep each client's stock apart, record billable work as it happens and keep handhelds working on patchy Wi-Fi. I built a self-hosted warehouse management system for a third-party logistics business : several warehouses, several client companies, from the
Read article →
Prevent Inventory Overselling in PostgreSQL (Tested)
To stop overselling in PostgreSQL, lock the stock rows with SELECT ... FOR UPDATE in a fixed order inside the allocation transaction. SKIP LOCKED is wrong here. I built the allocation engine for a third-party logistics warehouse system , where two orders taking the same units would mean a picker
Read article →
MySQL to PostgreSQL Migration Without Losing Data
To move MySQL to PostgreSQL without losing data, copy in one controlled run, reset every sequence, keep old password hashes working and compare row counts. In September 2026 I rebuilt MedicsBD , a live telemedicine platform, from Laravel and MySQL to Next.js, an Express API and PostgreSQL. All 64
Read article →