RSSAmplifier

Blog

Rezha Julio

Abusing computers for Fun and Profit

rezhajul.ioRSS feed ↗414 posts

Latest posts

I Refuse to Let the Loop Ship My Code

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…

Giving pi a Memory: Wiring claude-mem Into the Coding Agent

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…

When Your Template Ships the Upgrade You Just Wrote

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…

Upgrading to Astro 7: A Real-World Migration From a Blog That Already Worked

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…

Why I Am Leaving Duolingo

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.…

Upgrading to Astro 6: What Changed and Why It Matters

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…

Printervention: Resurrecting Old Printers via the Browser

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 S3 Files: Finally Mounting S3 Directly as a File System

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:…

Demoware Is Killing Your AI Strategy

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…

Comprehension Debt - the hidden cost of AI generated code

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…

The Power of an Accountability Buddy

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…

Goodbye Date, Hello Temporal API

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…

Willingness to look stupid is a genuine moat in creative work

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…

Adding Brotli Compression to Caddy

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…

Taming 6,000 GitHub Stars with Astro and a JSON File

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…

The Art of Deleting Code: Why the Best PRs Have Negative Lines

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…

Nobody Gets Promoted for Simplicity

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…

The AI Paradox: Coding is Easier, Engineering is Harder

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…

Demystifying AI: Learning LLMs Through 200 Lines of MicroGPT

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.…

Bell Curve Promotions Are Broken

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…

The Skeptic Who Got Benchmaxxed: What Actually Changed About AI Coding Agents

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…

How to lock yourself out of SSH with a single scp command

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…

Compound Engineering

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…

28 Posts in 28 Days: What Happened When I Wrote Every Day in February

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…

Go 1.26: Stack vs Heap Allocation — Faster Code Without Changing a Line

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…

Sharpen the Saw: Don't Debug in the Dark

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…

Stop Using innerHTML: The New Firefox Feature That Kills XSS

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>…

Next Level Coding with Amp: Planning Before Prompting

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…

How I Built My Own AI News Anchor (Tech Watch)

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…

Building a Telegram bot to babysit 24,000 developers

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…

Forget Notion. I Manage My House in the Terminal Now.

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…

Upgrading four PostgreSQL instances to 18.2 in Docker

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…

4 Root Causes Hiding Behind One Airflow Error

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…

Chasing a Transitive Dependency Vulnerability

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…

Managing DNS as Code with DNSControl

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…

Building Almanac Games: Scraping PSN with Duct Tape and Playwright

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…

Redesigning my blog, part 5: what I learned

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…

Redesigning my blog, part 4: the small stuff

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…

Redesigning my blog, part 3: from stock theme to terminal blueprint

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…

Redesigning my blog, part 2: the blogroll

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…

Redesigning my blog, part 1: the audit

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…

Why I Left Zola's Simplicity for Astro's Power

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…

The Art of Yak Shaving

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.…

Own Nothing and Be Happy? I'll Pass.

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…

Over-Engineering a Clap Button, Again

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,…

Auto-Publishing Scheduled Posts with GitHub Actions

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…

The Lazy Sysadmin's Guide to Docker Maintenance

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…

You Can't Stack Overflow a Deadlift

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…

Why I Moved My AI Brain to a Homelab

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…

Bringing Interactivity to a Static Blog: The Clap Button

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,…