<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Kazi Shiplu - Blog</title><description>Production systems, infrastructure, and what actually breaks. One post a week.</description><link>https://kazishiplu.com/</link><item><title>A multi-tenant uptime monitor on one Cloudflare Worker (D1 + Cron)</title><link>https://kazishiplu.com/blog/case-study-blip-uptime-monitor/</link><guid isPermaLink="true">https://kazishiplu.com/blog/case-study-blip-uptime-monitor/</guid><description>Monitoring client sites, side projects and a homelab without running a server. Blip on Workers and D1, and a checking model that fits one cron execution budget.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>case study</category><category>cloudflare</category><category>serverless</category><category>blip</category></item><item><title>RAG is an authorization problem: filter before you retrieve</title><link>https://kazishiplu.com/blog/rag-is-an-authorization-problem/</link><guid isPermaLink="true">https://kazishiplu.com/blog/rag-is-an-authorization-problem/</guid><description>The standard pipeline retrieves by similarity and checks permissions afterwards. That ordering is a data leak with a ranking function in front of it.</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><category>ai</category><category>rag</category><category>security</category><category>architecture</category><category>design</category></item><item><title>When a fine-tuned classifier beats an LLM prompt for intent routing</title><link>https://kazishiplu.com/blog/when-a-classifier-beats-a-prompt/</link><guid isPermaLink="true">https://kazishiplu.com/blog/when-a-classifier-beats-a-prompt/</guid><description>Routing a user to the right handler is a classification problem with seven answers. A prompt costs latency, per-token spend, and the determinism you needed.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>ai</category><category>machine learning</category><category>architecture</category><category>research</category></item><item><title>Running a 27B local LLM on hardware I already owned: 2.89 tokens/sec</title><link>https://kazishiplu.com/blog/case-study-local-llm-stack/</link><guid isPermaLink="true">https://kazishiplu.com/blog/case-study-local-llm-stack/</guid><description>A 27B model on a mini PC at 2.89 tokens per second, an iGPU that never got used, and what a local stack is good for once it stops pretending to replace an API.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>case study</category><category>local llm</category><category>ollama</category><category>homelab</category><category>ai</category></item><item><title>Stitching video frames into one under-vehicle image with OpenCV</title><link>https://kazishiplu.com/blog/case-study-under-vehicle-scanning/</link><guid isPermaLink="true">https://kazishiplu.com/blog/case-study-under-vehicle-scanning/</guid><description>Cropping a strip from every frame and pasting them together gives a seamed, duplicated mess. The problem is geometric alignment, and blending will not fix it.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><category>case study</category><category>computer vision</category><category>opencv</category><category>ffmpeg</category></item><item><title>The upload succeeded, the processing didn&apos;t: async ingestion design</title><link>https://kazishiplu.com/blog/upload-succeeded-processing-did-not/</link><guid isPermaLink="true">https://kazishiplu.com/blog/upload-succeeded-processing-did-not/</guid><description>A 200 on a file upload means you took the bytes, not that you understood them. Designing ingestion where those are two visible events instead of one promise.</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><category>architecture</category><category>backend</category><category>queues</category><category>postgres</category><category>elasticsearch</category></item><item><title>Microsoft Graph /me returns nothing: delegated vs app-only tokens</title><link>https://kazishiplu.com/blog/two-kinds-of-oauth-token/</link><guid isPermaLink="true">https://kazishiplu.com/blog/two-kinds-of-oauth-token/</guid><description>A delegated token and an app-only token are not the same credential with different scopes. /me needs a me, which is why these errors look like permission bugs.</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><category>oauth</category><category>microsoft graph</category><category>security</category><category>integrations</category></item><item><title>ENOSPC with 107 GB free: thin provisioning lies to df</title><link>https://kazishiplu.com/blog/df-said-107gb-free/</link><guid isPermaLink="true">https://kazishiplu.com/blog/df-said-107gb-free/</guid><description>Two days of failed image pushes on a host every tool said had space. The filesystem was not full. The thin pool three layers underneath it was.</description><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate><category>storage</category><category>debugging</category><category>proxmox</category><category>docker</category></item><item><title>413 on upload: every layer in the request path has its own limit</title><link>https://kazishiplu.com/blog/every-layer-gets-a-veto/</link><guid isPermaLink="true">https://kazishiplu.com/blog/every-layer-gets-a-veto/</guid><description>You raised the upload limit in the application and the upload still fails. Ingress, NGINX and PHP each have their own ceiling, and the first one to object wins.</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><category>debugging</category><category>nginx</category><category>kubernetes</category><category>wordpress</category><category>nextjs</category></item><item><title>It built fine and still crashed: Docker file ownership vs runtime user</title><link>https://kazishiplu.com/blog/it-built-fine-and-still-crashed/</link><guid isPermaLink="true">https://kazishiplu.com/blog/it-built-fine-and-still-crashed/</guid><description>The build runs as root, your container does not. A green build proves the files exist, not that the process using them can write. Same bug, four different stacks.</description><pubDate>Tue, 02 Sep 2025 00:00:00 GMT</pubDate><category>docker</category><category>kubernetes</category><category>containers</category><category>debugging</category></item><item><title>Docker &quot;failed to resolve reference&quot;: read the error inside out</title><link>https://kazishiplu.com/blog/read-the-error-inside-out/</link><guid isPermaLink="true">https://kazishiplu.com/blog/read-the-error-inside-out/</guid><description>The first line names the component that gave up. The last clause names what broke. Two Docker failures where reading left to right cost hours, and DNS was the cause.</description><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><category>debugging</category><category>docker</category><category>dns</category><category>linux</category></item><item><title>Cloudflare Tunnel connected but not working: what the status hides</title><link>https://kazishiplu.com/blog/connected-is-not-working/</link><guid isPermaLink="true">https://kazishiplu.com/blog/connected-is-not-working/</guid><description>A tunnel reporting connected is answering one question: can it reach its own control plane. Two outages where every green light was correct and nothing worked.</description><pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate><category>networking</category><category>debugging</category><category>cloudflare</category><category>tailscale</category></item><item><title>Deploying behind NAT: CI/CD to a private server with no open SSH port</title><link>https://kazishiplu.com/blog/case-study-deploying-behind-nat/</link><guid isPermaLink="true">https://kazishiplu.com/blog/case-study-deploying-behind-nat/</guid><description>No port 22 open to the internet, no source code on the production box. How the pipeline gets in over Tailscale, and the six ways it broke on the way there.</description><pubDate>Tue, 14 Jan 2025 00:00:00 GMT</pubDate><category>case study</category><category>ci-cd</category><category>tailscale</category><category>docker</category><category>cloudflare</category></item><item><title>Three ISPs, four routers, one MikroTik: rebuilding a homelab network</title><link>https://kazishiplu.com/blog/case-study-multi-wan-homelab-network/</link><guid isPermaLink="true">https://kazishiplu.com/blog/case-study-multi-wan-homelab-network/</guid><description>The homelab grew one consumer router at a time until nothing could reach anything. Consolidating onto one MikroTik, and why overlapping subnets look like DNS bugs.</description><pubDate>Tue, 08 Oct 2024 00:00:00 GMT</pubDate><category>case study</category><category>networking</category><category>mikrotik</category><category>homelab</category></item><item><title>Why this site runs on a free tier, and why that&apos;s the whole point</title><link>https://kazishiplu.com/blog/why-this-site-costs-nothing/</link><guid isPermaLink="true">https://kazishiplu.com/blog/why-this-site-costs-nothing/</guid><description>This site is static HTML on Cloudflare Pages at $0/month. That is positioning, not frugality: it is the same constraint I design production systems under.</description><pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate><category>meta</category><category>cloudflare</category></item><item><title>A map of everything I run, so the rest of these posts make sense</title><link>https://kazishiplu.com/blog/a-map-of-everything-i-run/</link><guid isPermaLink="true">https://kazishiplu.com/blog/a-map-of-everything-i-run/</guid><description>Three ISPs, four routers nobody is in charge of, a Proxmox mini PC, and everything public sitting on a Cloudflare free tier. The map the later posts refer back to.</description><pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate><category>meta</category><category>homelab</category><category>cloudflare</category><category>proxmox</category></item><item><title>Why I write about what breaks, not what shipped</title><link>https://kazishiplu.com/blog/why-i-write-about-what-breaks/</link><guid isPermaLink="true">https://kazishiplu.com/blog/why-i-write-about-what-breaks/</guid><description>Six years of building backend systems and being the person who gets woken up when they fall over. What this blog is for, and the rules I hold it to.</description><pubDate>Tue, 11 Jun 2024 00:00:00 GMT</pubDate><category>meta</category></item></channel></rss>