Archives
All the articles I've archived.
Why ipconfig /flushdns didn't fix it: stale DNS after moving a domain
After pointing a domain at a new server, one machine kept loading the old site even after flushing DNS. The stale record was in the ISP's resolver, not on the machine. Here is how to prove that in three commands.
Subdomains returned NXDOMAIN after I moved DNS to Cloudflare
After switching nameservers to Cloudflare, 16 of my self-hosted subdomains stopped resolving. The apps were fine. The A records had not been carried over.
Moving a domain apex from Vercel to a VPS with nginx and certbot
How I moved my apex domain from Vercel to a self-hosted Next.js container: rebuild as indexable, add an nginx vhost, change one A record, run certbot, keep a noindex mirror.
Building a Next.js Docker image on a low-memory VPS with temporary swap
My VPS had about 2.4 GB of free RAM and no swap. I added a 4 GB swapfile for the Next.js build, removed it afterwards, and later moved the build off the server.
Deploy a Docker site to a VPS with GitHub Actions, GHCR and SSH
The workflow I use to build an image on GitHub, push it to GHCR and restart the container on my VPS over SSH, with the two things that made the first runs fail.
Running a GPU-first Gradio app CPU-only on a 2 vCPU VPS
An open-source Gradio app defaulted to CUDA and NVENC. I packaged it for a VPS with no GPU: CPU torch wheels, a baked-in model, a login and a memory cap.
A single-user notes app on FastAPI with files in an S3 bucket
How I built a private notes app: FastAPI, SQLite for text, a self-hosted S3 bucket for files, and a storage key that can only touch that one bucket.
RustFS console behind nginx: broken login and 429 errors, fixed
A root redirect in nginx broke sign-in to the RustFS console, and a blanket rate limit returned 429s right after login. Two nginx map blocks fixed both.
Replacing MinIO with RustFS for self-hosted S3 on a small VPS
I needed S3-compatible storage next to n8n on one VPS and did not want to install MinIO. RustFS in one container, behind nginx, uses about 60–90 MB of RAM.
One n8n error workflow that emails me when any workflow fails
A four-node n8n error workflow that sends failure emails through the Gmail API, plus the patterns I use so failures clean up after themselves and carry a useful message.
n8n form submitted by script: values are null, use field-0 keys
I posted to an n8n hosted form from a script and every value arrived as null. The form expects multipart keys field-0, field-1, not the labels. The reply is also not the final result.
n8n 2.x "Unrecognized node type" for Execute Command: use a sidecar
n8n 2.x excludes the Execute Command node by default, so my workflow would not activate. I left it disabled and moved the shell work into a small HTTP sidecar on a private Docker network.
Generate n8n workflows from a Python script and deploy by API
I build seven n8n workflows from one Python file and push them with the n8n public API. Here are the helpers, the deploy calls, and the expression bug that cost me the most time.
Watch Playwright tests run live on a VPS with noVNC and nginx
How I run headed Playwright tests on a headless server and watch the real browser in a web page: Xvfb, x11vnc and noVNC in one container, locked behind nginx auth_request.
Sandboxing an AI agent web app in Docker behind nginx basic auth
The Docker flags, mounts and resource caps I use to run an AI agent app with shell access on a shared 2 vCPU VPS, plus the localhost-bind problem that needed a one-line patch.
Android emulator with KVM on GitHub Actions: workflow and a caching trap
A working GitHub Actions workflow that boots a hardware-accelerated Android emulator and runs instrumented tests in about three minutes, and why AVD snapshot caching made it worse.
Self-host a Search Console MCP server behind an nginx bearer token
I put the open-source mcp-gsc server on a VPS in a locked-down container, gated it with an nginx bearer token, and hit a map hash error that broke nginx for every site.