Armin Ronacher published "The Coming Loop" on his blog (lucumr.pocoo.org) on June 23, 2026. It hit the Hacker News front page the same day, which tracks: as the creator of Flask and a long-time voice in the Python and Rust worlds, his take on AI coding tools carries weight. Reading it made me uncomfortable in a way I recognized. He describes a pattern that is now everywhere: work goes into a…
My pi setup had a problem. total-recall indexed my sessions and collected exactly 7 facts across the whole history. Seven. That is not memory, that is a sticky note someone forgot to throw away. I wanted what claude-mem actually delivers: facts and knowledge collected automatically, available across sessions, and ideally shared between pi and Claude Code so I stop re-explaining my own projects to…
import ResponsiveTable from "@/components/ResponsiveTable.astro"; AstroPaper v6.1.0 shipped on July 7, 2026. I shipped my own Astro 7 upgrade on July 10. We'd been working in parallel without knowing it: their PR #664 was already merged by the time I started digging into the framework's new defaults. The first thing I did after merging mine was check what they'd done differently. [!NOTE] This post…
import ResponsiveTable from "@/components/ResponsiveTable.astro"; Astro 7 shipped on June 22, 2026. I waited until 7.0.7 to avoid the early-patch churn, then upgraded this blog yesterday. Three files changed. Here's what happened. Table of contents Why bother when Astro 6 works Astro 6 was fine. The blog built, deployed, served. Nothing was on fire. I upgraded anyway because the parts of Astro 7…
I cancelled my Duolingo Family subscription about a month ago. The renewal email sat in my inbox for two weeks before I clicked kill. What I am doing today is the harder step: deleting the app so I stop falling back to the free tier. Not because I hated the app. Because I was paying for a habit, not a language, and a habit is what I am trying to drop. I learned English the old way and it worked.…
Astro 6 dropped a few weeks ago and I finally got around to upgrading this blog. The short version: it went smoother than I expected, but there were a few spots where I had to stop and think. This is a real-world migration report from an AstroPaper v5.5.1 blog running on Bun, deployed to Cloudflare Pages. Not a theoretical overview of the changelog. If you're running a similar setup, this should…
When manufacturers drop driver support for perfectly good hardware, the usual fix is setting up a dedicated Linux box as a print server. Printervention skips all of that and puts the entire print server inside a Chrome tab. You plug in an unsupported printer (like the Canon SELPHY photo printers), open the site, and print. No installs. Here's what's going on under the hood: The browser connects to…
AWS just launched S3 Files. You can now mount any S3 bucket or prefix as a filesystem on EC2, containers, or Lambda. From your app's perspective, it's a mounted directory. Under the covers, it's actual EFS (Elastic File System) integrated into S3. The S3 and EFS teams built this together, and Andy Warfield's blog post on the design process is worth reading in full. The sync model borrows from git:…
You've seen it. The demo that wows the execs. The dashboard that pulses with green. The AI agent that "automates 80% of workflows." The prompt chain that "reduces dev time by 60%." It looks like progress. It isn't. It's demoware. What demoware actually is Demoware is software built to impress in a presentation, not to run in production. Pixel-perfect UIs with zero error handling. APIs that return…
Addy Osmani puts a name to something I've been feeling for a while: Comprehension Debt. When we lean on AI tools (Copilot, Claude Code, Cursor) to generate code, velocity metrics look great. The PRs are clean, the tests pass. But we quietly stop understanding why our systems work the way they do. AI generates code far faster than humans can evaluate it. What used to be a quality gate is now a…
Have you ever set a goal, felt genuinely motivated for about three days, and then quietly stopped? I do this constantly. Gym routines, side projects, reading lists. I start strong, life gets in the way, and the goal just... dissolves. Maintaining consistency is hard, and relying on willpower alone usually doesn't cut it. That's where an accountability buddy comes in. What is an accountability…
If you've ever built a web application, you've dealt with JavaScript's Date object. Everyone has. Parsing a date string and getting a different result depending on which browser runs it. Adding two days to a variable and accidentally mutating the original. Trying to figure out what time it is in Tokyo when your server is in London. The Date object was born in 1995 during Brendan Eich's ten-day…
Sharif Shameem wrote about how the fear of looking stupid kills creative output, and I felt called out. I have drafts on this blog that will never see the light of day because I keep telling myself they're not good enough . The funny thing is, I already learned this lesson. During my 28 posts in 28 days challenge last month, the breakthrough was lowering my standards. Not every post needs to be a…
Caddy supports gzip and zstd compression natively, but Brotli? You need a custom build for that. I was checking my response headers one day and realized my sites were only serving gzip. Brotli has been supported by over 97% of browsers for a while now, and it compresses text content better than gzip. Time to fix that. Why Brotli Brotli was developed by Google and open-sourced in 2015. It uses the…
I star a lot of repos. Like, a lot. 5,899 at last count. GitHub's own stars page is fine for finding something you starred last week, but try finding that one CLI tool you starred in 2019. Good luck. So I built a /stars page for this site. A searchable, filterable list of every repo I've ever starred, synced daily from GitHub, styled to match the terminal look I've been using for the blogroll and…
I love opening a Pull Request where the lines deleted outnumber the lines added. There's something genuinely satisfying about it. But not everyone sees it that way. Most engineering cultures still celebrate addition. The more code you ship, the more "productive" you look. But every line you write is a liability. It has to be maintained, tested, and debugged for as long as it exists. Software…
Edsger Dijkstra once wrote: "Simplicity is a great virtue, but it requires hard work to achieve and education to appreciate. And to make matters worse, complexity sells better." That was in 1984. Forty-two years later, we still haven't figured it out. I've been thinking about this a lot because I keep seeing the same pattern at companies I've worked at and in conversations with friends at other…
Writing code has never been this easy. AI assistants will generate boilerplate, wire up API calls, scaffold tests. You describe what you want and it appears. I use these tools every day and they're genuinely useful. But I keep noticing something: the typing part of my job shrank, and everything around it got bigger. I wrote about how the compound engineering loop works recently, and about what…
Large Language Models (LLMs) are often treated as black boxes. We feed them prompts, and they spit out code, essays, or architectural advice. But underneath the billions of parameters and GPU clusters, what is actually happening? On February 12, 2026, Andrej Karpathy published MicroGPT -- a single Python file, about 200 lines, zero dependencies, that trains and runs a GPT from scratch. No PyTorch.…
Here's a system that a lot of tech companies use for promotions: take all the engineers on a team, rank them against each other, and force the results into a bell curve. A fixed percentage gets "exceeds expectations," most land in "meets expectations," and someone has to be the bottom. The quota is set before anyone looks at actual work. I have a problem with this. Several, actually. The math is…
import ResponsiveTable from "@/components/ResponsiveTable.astro"; There are two types of AI coding blog posts. The first kind is breathless hype: "I built a SaaS in 30 minutes with Claude!" The second kind is breathless doom: "AI is destroying the craft of programming!" Max Woolf's recent post is neither. It's the rare piece where someone who was publicly skeptical about AI agents changed their…
Ever locked yourself out of your own server just by copying files with scp ? That's exactly what happened to an engineer who wrote about it on sny.sh . Here's what went down. They wanted to transfer a local folder to the home directory on their server: scp -r . host: Looks harmless, right? The problem was that the local folder had permissions set to rwxrwxrwx , or 777 (probably left over from…
Most codebases get worse over time. You add a feature, and next month that feature makes the next one harder to build. After a few years, the team spends more time fighting the system than building on it. Everyone has lived through this. I've been thinking about a different approach lately. I'm calling it compound engineering: the idea that every unit of work should make the next unit easier. Bug…
I didn't plan this. On February 1st I published a post about reducing OpenClaw's heartbeat token usage because it was fresh in my head. Then I wrote another one the next day. By February 5th I realized I had a streak going and thought: okay, let's see if I can do the whole month. February has 28 days. That felt like a dare. What I actually wrote about Looking back, the posts cluster into a few…
Keith Randall just published Allocating on the Stack on the Go blog. If you've ever profiled a Go service and seen a pile of tiny allocations from append growing a slice from zero, this one is worth reading. The gist: the Go 1.25 and 1.26 compilers can now keep slice backing stores on the stack in more situations than before. What actually changed The improvements landed in two stages. Go 1.25…
I recently read a post called Fix Your Tools by Adolfo Ochagavía. It hit close to home because of a bad habit I think we all share as developers. The Tunnel Vision Trap The scenario is classic: You're hunting a gnarly bug. You're in "problem-solving mode." You try to set a breakpoint, but your debugger ignores it. What do you do? If you're like most of us in the heat of the moment, you ignore the…
We've all done it. You get some HTML string from an API (or worse, user input), and you need to render it on the screen. The quickest, dirtiest, and most common way? Good old innerHTML . // The classic footgun const userBio = getUserInput(); document.getElementById('profile').innerHTML = userBio; [!WARNING] innerHTML is the #1 source of XSS in production JavaScript. If the string contains <script>…
I recently started using Amp, and it feels different from any AI coding tool I've used before. It's a coding agent that lives in your terminal (and editor), and the way you work with it matters more than anything it can autocomplete. The real shift: planning vs. execution The biggest realization I had while using Amp (and reading about others' workflows, like Boris Tane's ) is this: Do not let the…
I used to start my day by doomscrolling Twitter (or X, whatever), then Hacker News, then Lobsters, then maybe checking a few subreddits. By 10 AM, I was exhausted, annoyed, and full of "noise" but very little "signal." The problem with the modern web isn't a lack of information. It's the volume. Algorithms are optimized for engagement, not for what I actually care about. I'd spend an hour…
The PythonID Telegram group has around 24,000 members. Indonesian developers chatting about Python, Django, FastAPI, job openings, and occasionally, cryptocurrency scams disguised as job offers. Moderation was manual. Admins would spot a spammer, ban them, delete the messages, and then do it again twenty minutes later. Bots existed but they were either too dumb (kick anyone without a profile…
Let's be honest. Most "productivity" apps today are just procrastination tools in disguise. We spend more time setting up dashboards, picking tag colors, and waiting for loading spinners than actually doing the work. Especially for household chores. Tracking AC maintenance, inventory, grocery lists. Do you really need to wait for a massive React component to render just to write down "buy…
I run a handful of self-hosted services on my server. Miniflux for RSS, Invidious for YouTube, a Django app, and Mastodon. They all use PostgreSQL, and they were all stuck on older versions -- 15 or 17, depending on when I last felt brave. PostgreSQL 18.2 came out and I figured it was time. Four databases, four upgrades, one evening. How hard could it be. It took two evenings. The general pattern…
Last week I burned most of a day chasing a single Airflow error that turned out to be four problems stacked on top of each other. Each fix revealed the next failure, like one of those Russian nesting dolls except each one is angrier than the last. The setup: Apache Airflow running on Kubernetes with the KubernetesExecutor. DAGs mounted via a shared volume. Worker pods spin up per task using a…
Last week I found out my blog was shipping a vulnerable dependency. Not one I installed directly, but one hiding two levels deep in the dependency tree: fast-xml-parser . The Vulnerability Versions 4.3.6 through 5.3.3 of fast-xml-parser throw a RangeError when they encounter out-of-range numeric character entities like or . That might sound obscure, but it means any application that processes…
I manage a few domains. Nothing crazy, but enough that logging into Porkbun's web UI every time I need to change a record got old fast. Add a TXT record, typo the value, wait for propagation, realize the typo, fix it, wait again. Fifteen minutes gone for a one-line change. The real problem is that web UIs don't have undo. They don't have diffs. They don't have commit messages. I changed a DNS…
I track movies and TV shows on my blog's Almanac page. It's a timeline of everything I've watched, sorted by date. I liked it. Then I thought: what about games? I have 367 games on my PSN account. 108 Platinums. Over 3,500 trophies. That data is sitting on PSNProfiles, publicly visible. How hard could it be to pull it into my blog? Pretty hard, actually. The scraper PSNProfiles doesn't have an…
The redesign is done. For now. It's never really done, because personal sites are the software equivalent of a car that's always in the garage with the hood up. But the major work is finished, the series is wrapping up, and I want to look back at what actually worked and what didn't. This isn't a postmortem. It's a blog post. I'll keep it honest. Phased implementation beats big-bang rewrites The…
After the big layout changes from part 3, I had a blog that looked different but still felt half-done. The nav was overcrowded. My content directory was a mess. Scheduled posts required me to manually trigger deploys. None of this was visible to readers, but it bugged me every time I opened the project. This post is about all those little things. The nav problem My old navigation had every page…
This blog was running stock AstroPaper. If you've seen one AstroPaper blog, you've seen them all: same layout, same colors, same Fira Code headings. I wanted something that looked like it belonged to me. I spent a Saturday morning looking at personal sites that had actual personality. gwern.net with its heavy typography and footnotes. chriscoyier.net with its playful layout shifts. cassidoo.co…
Blogrolls used to be everywhere. Back in the early web, people would keep a sidebar full of links to other blogs they liked. It was how you discovered things. Then social media happened, algorithms took over discovery, and blogrolls mostly disappeared. The IndieWeb crowd has been pushing to bring them back, and I think they're right. If you read someone's blog and like it, why not tell your…
This blog runs on AstroPaper v5 with Astro 5 and Tailwind v4. It looked fine. It worked. But it also looked like every other AstroPaper blog on the internet, and that bugged me. I wanted to redesign it. New layout, new typography, new everything. But before touching any CSS, I figured I should audit the codebase first. No point making something pretty if the foundation has cracks. So I spent a…
A little over a year ago, I wrote about migrating from Hugo to Zola . My reasoning back then was solid: I was tired of Go Templates' idiosyncrasies, and Zola's Tera engine felt like home (hello, Django background!). Plus, Zola is written in Rust, builds fast, and ships as a single binary. What's not to love? I thought Zola was the endgame. Simple, fast, opinionated. But here I am, writing this…
In engineering, there's a term for when a simple task spirals into ten unrelated ones: yak shaving . Here's what happened last Tuesday. I opened my laptop to change the font on my blog. I told myself it'd be 5 minutes. But the typography package was deprecated. So I updated it. The build broke because my Node.js version was too old. So I upgraded Node. That clashed with the server's OS config.…
It's wild how easy it is to live without owning anything digitally. Music, movies, photos, work files, everything lives on someone else's server, and we just pay for access. Convenient. Until your account gets locked, or the service decides to double the price overnight. I've had both happen. So yeah, I'm basically a digital hoarder. I run a mini PC at home as a server. My music is in FLAC on a…
In the previous post , I built a clap button for this blog using Cloudflare Workers and KV. It worked. Mostly. The problem was concurrency. KV is an eventually consistent key-value store. When two people clap at the same time, both reads return the same value, both increment by one, and one clap disappears. Read-modify-write on KV is not atomic. For a blog that gets three readers on a good day,…
My blog has had "scheduled posts" for a while now. I set a pubDatetime in the future, and Astro's build process filters it out until that date passes. Simple enough. The problem: nothing actually triggers a rebuild when that date arrives. The post just sits there, technically publishable, until I push something to master. Which means I'm either pushing a dummy commit at noon or just forgetting…
Manually running docker compose pull and docker compose up -d every time an update drops is exhausting. We have better things to do. But ignoring updates isn't an option either. Security patches matter. New features are nice. So I built a lazy stack: Watchtower + Telegram notifications. My homelab updates itself at 4 AM and tells me what happened when I wake up. The tool: Watchtower Watchtower…
I'm comfortable in a terminal. I debug race conditions. I have strong opinions about system architecture, probably wrong ones. In tech, I'm a "Senior." Then I walked into a gym last week. Wasn't a Senior anymore. I stood there staring at a machine, trying to figure out which way to sit on it, hoping no one noticed. Shaking under an empty bar. Total noob. Best refresher course on software…
For the last year, my AI assistant (Cici, running on OpenClaw) lived in the cloud. She was hosted on a decent VPS in Singapore. It worked fine. I paid my monthly bill, I SSH'd in when I needed to, and she was always there. But last weekend, I killed the server. I migrated everything to a physical box sitting in my home rack. Why on earth would I move from a reliable datacenter to a DIY box at…
I love my Astro blog. It's fast, cheap to host, and I don't have to worry about security patches. But it's also lonely. When I publish something, I have no idea if anyone actually read it, let alone liked it. I didn't want to install a heavy comment system like Disqus or utteranc.es just yet. I wanted something low-friction. The "Clap" button on Medium is perfect for this—it's anonymous,…