Time machine
Archives
All the articles I've archived, by year and month.
202652
Jul 17, 2026 · 5 min readai
I Refuse to Let the Loop Ship My Code
Armin Ronacher's 'The Coming Loop' describes a future where harnesses decide when code is done. I'm keeping the human at the approval gate, using plannotator.ai to review agent output before it ships.
Continue reading →Jul 13, 2026 · 6 min readpi
Giving pi a Memory: Wiring claude-mem Into the Coding Agent
How I replaced pi's total-recall extension with claude-mem, backfilled 262 sessions, and made the shared worker self-healing. Real journey, real gotchas.
Continue reading →Jul 12, 2026 · 5 min readastro
When Your Template Ships the Upgrade You Just Wrote
AstroPaper v6.1.0 shipped their own Astro 7 upgrade three days before I shipped mine. Here's how I sync a forked template: take the patches, skip the rewrites, steal the features one at a time.
Continue reading →Jul 11, 2026 · 5 min readastro
Upgrading to Astro 7: A Real-World Migration From a Blog That Already Worked
Notes from upgrading this AstroPaper blog to Astro 7.0.7: Rust pipeline, Vite 8, the markdown-remark shim, and one dep dropped along the way.
Continue reading →
Jun 18, 2026 · 6 min readpersonal
Why I Am Leaving Duolingo
The subscription was cancelled last month. Today the app gets uninstalled. Here's why the streak habit stopped being worth my time.
Continue reading →
Apr 24, 2026 · 7 min readastro
Upgrading to Astro 6: What Changed and Why It Matters
A practical walkthrough of upgrading an AstroPaper blog from Astro 5 to Astro 6, covering Vite 7, Zod 4, the stable fonts API, and every breaking change I ran into along the way.
Continue reading →Apr 02, 2026 · 6 min readai
Demoware Is Killing Your AI Strategy
AI tools make it easy to build impressive demos. What happens when demoware becomes production code?
Continue reading →
Mar 19, 2026 · 5 min readproductivity
The Power of an Accountability Buddy
Why going solo isn't always the best path to achieving your goals, and how an accountability buddy can double your success rate.
Continue reading →Mar 14, 2026 · 6 min readjavascript
Goodbye Date, Hello Temporal API
JavaScript's Date object was a copy of Java's broken java.util.Date, and we've been stuck with it for 30 years. The Temporal API is here to replace it.
Continue reading →Mar 12, 2026 · 5 min readcaddy
Adding Brotli Compression to Caddy
Caddy doesn't ship with Brotli support out of the box. Here's how I added it with xcaddy and a custom Docker build.
Continue reading →Mar 11, 2026 · 11 min readastro
Taming 6,000 GitHub Stars with Astro and a JSON File
I turned my GitHub starred repos into a searchable page on my blog. Here's what worked, what didn't, and why I gave up on SSR.
Continue reading →Mar 09, 2026 · 5 min readEngineering
The Art of Deleting Code: Why the Best PRs Have Negative Lines
On the 'less is more' mindset in software engineering, and why deleting old code is some of the most satisfying work you can do.
Continue reading →Mar 08, 2026 · 6 min readEngineering
Nobody Gets Promoted for Simplicity
Promotion systems in tech reward complexity, not good judgment. Here's why that keeps happening and what you can do about it.
Continue reading →Mar 07, 2026 · 3 min readai
The AI Paradox: Coding is Easier, Engineering is Harder
Writing code got easy. Knowing what to build didn't.
Continue reading →Mar 06, 2026 · 6 min readAI
Demystifying AI: Learning LLMs Through 200 Lines of MicroGPT
Large Language Models seem like magic, but they are just math. Let's break down Andrej Karpathy's MicroGPT to understand the core mechanics.
Continue reading →Mar 05, 2026 · 7 min readcareer
Bell Curve Promotions Are Broken
Forced ranking systems pit teammates against each other and reward politics over performance. The math doesn't even work.
Continue reading →Mar 04, 2026 · 11 min readai-agents
The Skeptic Who Got Benchmaxxed: What Actually Changed About AI Coding Agents
I used to dismiss AI coding agents as expensive autocomplete. Then Opus 4.5 dropped, and a data scientist started shipping Rust crates that beat numpy. A breakdown of Max Woolf's journey and why the AGENTS.md file might be the most underrated tool in the stack.
Continue reading →Mar 03, 2026 · 2 min readlinux
How to lock yourself out of SSH with a single scp command
One scp command to copy some files, and suddenly you can't SSH into your own server anymore.
Continue reading →Mar 02, 2026 · 6 min readengineering
Compound Engineering
Most codebases rot over time. Compound engineering is the idea that every unit of work should make the next one easier, not harder.
Continue reading →Mar 01, 2026 · 4 min readwriting
28 Posts in 28 Days: What Happened When I Wrote Every Day in February
I published a blog post every day in February. Some were good, some were filler, and I learned more about my own writing habits than I expected.
Continue reading →
Feb 28, 2026 · 3 min readgo
Go 1.26: Stack vs Heap Allocation — Faster Code Without Changing a Line
Go 1.26 ships with compiler optimizations that move more slice allocations from the heap to the stack. Your existing code gets faster without a refactor.
Continue reading →Feb 27, 2026 · 2 min readproductivity
Sharpen the Saw: Don't Debug in the Dark
Sometimes the fastest way to fix a bug is to stop fixing it and fix your tools instead. A lesson on sharpening the saw.
Continue reading →Feb 26, 2026 · 6 min readwebdev
Stop Using innerHTML: The New Firefox Feature That Kills XSS
Firefox 148 just shipped the new Sanitizer API with setHTML(). Here's why you should stop using innerHTML today.
Continue reading →Feb 25, 2026 · 6 min readai
Next Level Coding with Amp: Planning Before Prompting
My experience using Amp, the frontier coding agent. It rewards structured planning and works best as a 'second brain' in your terminal.
Continue reading →Feb 24, 2026 · 4 min readautomation
How I Built My Own AI News Anchor (Tech Watch)
I stopped doomscrolling and let an AI agent curate my tech news. Here's how I automated my information diet with OpenClaw and Node.js.
Continue reading →Feb 23, 2026 · 6 min readpython
Building a Telegram bot to babysit 24,000 developers
How I built PythonID-bot to manage the Indonesian Python community on Telegram.
Continue reading →Feb 22, 2026 · 4 min readTUI
Forget Notion. I Manage My House in the Terminal Now.
Why I switched to Micasa, a TUI tool for home management, and why local-first software is the future.
Continue reading →Feb 21, 2026 · 6 min readpostgresql
Upgrading four PostgreSQL instances to 18.2 in Docker
I upgraded Miniflux, Invidious, a Django app, and Mastodon from PostgreSQL 15/17 to 18.2. Every single one broke in a different way.
Continue reading →Feb 20, 2026 · 6 min readairflow
4 Root Causes Hiding Behind One Airflow Error
A debugging session that started with one Airflow error and uncovered four cascading failures across Docker images, Kubernetes caching, namespace boundaries, and Python string iteration.
Continue reading →Feb 19, 2026 · 4 min readsecurity
Chasing a Transitive Dependency Vulnerability
How a vulnerability in fast-xml-parser affected my blog through @astrojs/rss, and why transitive dependencies are quietly terrifying.
Continue reading →Feb 19, 2026 · 9 min readdns
Managing DNS as Code with DNSControl
How I stopped editing DNS records in web UIs and started versioning them in Git. Includes fixing Porkbun provider quirks and handling ACME challenges.
Continue reading →Feb 18, 2026 · 4 min readdev
Building Almanac Games: Scraping PSN with Duct Tape and Playwright
I wanted to show my PlayStation trophies on my blog. It took a Python scraper, Cloudflare cookie theft, and way too many regex fixes.
Continue reading →Feb 17, 2026 · 5 min readastro
Redesigning my blog, part 5: what I learned
The last post in this series. What worked, what got immediately deleted, and what I'd do differently.
Continue reading →Feb 16, 2026 · 6 min readastro
Redesigning my blog, part 4: the small stuff
Dropdown navigation, a categorized tech stack, file organization, and auto-publishing. The polishing work nobody notices but everyone feels.
Continue reading →Feb 15, 2026 · 6 min readastro
Redesigning my blog, part 3: from stock theme to terminal blueprint
The big visual overhaul. New fonts, new colors, terminal hero, data pipeline cards, two-rail layout, and all the bugs that came with it.
Continue reading →Feb 14, 2026 · 5 min readastro
Redesigning my blog, part 2: the blogroll
I built a terminal-styled blogroll with ASCII art, pulsing RSS indicators, and OPML export. Blogrolls are back.
Continue reading →Feb 13, 2026 · 4 min readastro
Redesigning my blog, part 1: the audit
Before changing anything visual, I spent time auditing my AstroPaper blog for security, SEO, accessibility, and performance issues. Here's what I found.
Continue reading →Feb 12, 2026 · 4 min readastro
Why I Left Zola's Simplicity for Astro's Power
I moved from Hugo to Zola for simplicity. Then I moved to Astro for flexibility. Here's why I traded a Rust binary for a Node_modules folder.
Continue reading →Feb 11, 2026 · 1 min readhomelab
The Art of Yak Shaving
I tried to change a font. Three hours later I was reading Linux kernel docs.
Continue reading →Feb 10, 2026 · 1 min readhomelab
Own Nothing and Be Happy? I'll Pass.
Why I run a homelab and hoard my own data instead of trusting the cloud.
Continue reading →Feb 09, 2026 · 4 min readastro
Over-Engineering a Clap Button, Again
The clap button worked, but KV had a race condition. I migrated the backend to Cloudflare D1 for atomic writes and hashed IPs.
Continue reading →Feb 08, 2026 · 8 min readastro
Auto-Publishing Scheduled Posts with GitHub Actions
My Astro blog already supports scheduled posts, but I still had to push to master to actually publish them. Here's how I fixed that with a cron job and a tiny Node script.
Continue reading →Feb 07, 2026 · 2 min readdocker
The Lazy Sysadmin's Guide to Docker Maintenance
How I sleep soundly while my server updates itself. A guide to Watchtower and Telegram notifications.
Continue reading →Feb 06, 2026 · 3 min readlifestyle
You Can't Stack Overflow a Deadlift
I recently started going to the gym. Being a beginner again after years of being a 'Senior' Engineer was a humbling reality check.
Continue reading →Feb 05, 2026 · 4 min readhomelab
Why I Moved My AI Brain to a Homelab
From a monthly VPS bill to a powerful local server. Why I migrated my AI assistant (OpenClaw) to my homelab.
Continue reading →Feb 04, 2026 · 4 min readastro
Bringing Interactivity to a Static Blog: The Clap Button
Static sites are fast but lonely. I added a Medium-style Clap button using Astro, Preact, and Cloudflare Workers to fix that.
Continue reading →Feb 03, 2026 · 5 min readai-agents
Why "Dumb" Agents Are Winning: The Case for Shell-First AI
Smart agents are great, but simple ones actually ship code. Why tools like Pi and OpenClaw beat complex LSP-based assistants.
Continue reading →Feb 02, 2026 · 2 min readai-agents
The Reality of AI Pair Programming: It's Not Magic, It's Management
Vibe coding is dangerous. AI isn't a senior engineer replacement, it's a junior that needs a manager. Here's what I learned migrating my home server with an AI agent.
Continue reading →Feb 01, 2026 · 4 min readopenclaw
Reducing OpenClaw Heartbeat Token Usage
Running an AI agent 24/7 sounds cool until you see the token bill. Here's how to cut your heartbeat costs.
Continue reading →
Jan 25, 2026 · 3 min readAstro
Adding a Links Section to My Blog
I built a links section to share interesting things I find around the web, with my own commentary.
Continue reading →Jan 23, 2026 · 3 min readai
Pair Programming with a Lobster: My Week with Clawdbot
It’s weird, it lives in my server, and it runs 100 laps when it makes a mistake. Here is what it's like to code with an autonomous agent.
Continue reading →Jan 23, 2026 · 7 min readbun
Automating My Blog Workflow with Bun
How I killed the friction of writing by building a custom CLI generator for Astro using Bun.
Continue reading →
20252
Dec 25, 2025 · 8 min readAMP
Unlocking Frontier Power: How to Run Amp Using CLIProxyAPI Without Spending Credits
The landscape of AI coding agents is shifting faster than most developers can keep up with.
Continue reading →
Jan 11, 2025 · 4 min readHugo
Migrating from Hugo to Zola
Yet another migration post, this time from Hugo to Zola.
Continue reading →
20241
Feb 13, 2024 · 3 min readPython
Several Cool Things You Can Do with F-Strings in Python
F-strings are a powerful and easy-to-use way to format strings in Python.
Continue reading →
20232
Jan 03, 2023 · 3 min readPostgreSQL
Upgrade Major PostgreSQL version on Docker
Easily upgrade PostgreSQL in docker, without losing data
Continue reading →Jan 02, 2023 · 1 min readNew Year
2023
Hello, 2023!
Continue reading →
20221
Dec 04, 2022 · 2 min readLife
Hey there
Hey there... Long time no see.
Continue reading →
20191
May 19, 2019 · 2 min readRant
What happened to self-hosted blogs?
Platforms such as Medium have made the majority of original self-hosted blogs a matter of the past. Personally, for the whole blogging community, I believe that is terrible.
Continue reading →
20188
Jul 23, 2018 · 1 min readPython
Your Own Python Calendar
The Python calendar module defines the Calendar class. This is used for various date calculations as well as TextCalendar and HTMLCalendar classes with their local subclasses, used for rendering pre-formatted output.
Continue reading →Jul 22, 2018 · 1 min readPython
Get the Most of Floats
Floats also have several additional methods useful in various scenarios
Continue reading →Jul 21, 2018 · 1 min readPython
Format text paragraphs with textwrap
Python's textwrap module is useful for rearranging text, e.g. wrapping and filling lines.
Continue reading →Jul 20, 2018 · 1 min readPython
Unicode Character Database at Your Hand
Python's self-explanatory module called unicodedata provides the user with access to the Unicode Character Database and implicitly every character's properties.
Continue reading →Jul 19, 2018 · 3 min readPython
Functional Particularities of Python
Paradigms of functional programming as applied to Python
Continue reading →Jul 17, 2018 · 2 min readGit
Debug Bad Commit with Binary Search
The git bisect tool helps to identify the commit that introduced a bug.
Continue reading →Jul 17, 2018 · 2 min readJavascript
Number Extensions in Javascript
Number benefits from several changes in ES6, providing several new methods, saving us from writing our own potentially error-prone implementations.
Continue reading →Jul 16, 2018 · 1 min readrant
New Blog, New Domain
Continue reading →
201740
May 30, 2017 · 2 min readCSS
CSS Grid on Production
CSS Grid which allows far greater control than we've ever had before
Continue reading →May 25, 2017 · 5 min readPython
New interesting data structures in Python 3
take a look at some data structures that Python 3 offers, but that are not available in Python 2
Continue reading →May 22, 2017 · 3 min readPython
Keyword argument demystify
There’s a lot of baffling among Python programmers on what exactly 'keyword arguments' are
Continue reading →May 04, 2017 · 1 min readPython
Looping techniques in Python
Python has multiple techniques for looping over data structures
Continue reading →May 03, 2017 · 1 min readPython
Enhance your tuples
Standard Python `tuple`s are lightweight sequences of immutable objects, yet their implementation may prove inconvenient in some scenarios
Continue reading →May 02, 2017 · 1 min readPython
Get more with collections!
In addition to Python's built-in data structures (such as `tuple`s, `dict`s, and `list`s), a library module called `collections` provides data structures with additional features, some of which are specializations of the built-in ones
Continue reading →May 01, 2017 · 1 min readPython
There is more to copying
An assignment only creates a binding (an association) between a name and a target (object of some type). A copy is sometimes necessary so you can change the value of one object without changing the other (when two names are pointing to the same object)
Continue reading →
Apr 30, 2017 · 1 min readPython
Implementing weak references in Python
Normal Python references to objects increment the object's reference count thus preventing it from being garbage collected
Continue reading →Apr 29, 2017 · 1 min readJava
Translating Scanner tokens into primitive types
Translating Scanner tokens into primitive types
Continue reading →Apr 28, 2017 · 1 min readJava
Listing a file system's root directories
Listing a file system's root directories
Continue reading →Apr 27, 2017 · 1 min readJava
The Console class
The Console class
Continue reading →Apr 25, 2017 · 1 min readPython
Next, Function or Method ?
Next, Function or Method ?
Continue reading →Apr 24, 2017 · 2 min readPython
Generator Expressions
Generator Expressions
Continue reading →Apr 23, 2017 · 1 min readPython
Yield Keyword
Yield Keyword
Continue reading →Apr 22, 2017 · 4 min readNginx
How to Build Nginx with Google Pagespeed Support
How to Build Nginx with Google Pagespeed Support
Continue reading →Apr 21, 2017 · 1 min readPython
What are Generators?
What are Generators?
Continue reading →Apr 20, 2017 · 1 min readJava
Using an interface as a parameter
Using an interface as a parameter
Continue reading →Apr 18, 2017 · 1 min readJava
Using bounded type parameters in generic methods
Using bounded type parameters in generic methods
Continue reading →Apr 18, 2017 · 1 min readJava
Using the Deprecated annotation
Using the Deprecated annotation
Continue reading →Apr 17, 2017 · 1 min readJava
Diamond Operator in Java
Diamond Operator in Java
Continue reading →Apr 16, 2017 · 5 min readPython
Lambda Functions in Python
Lambda Functions in Python
Continue reading →Apr 15, 2017 · 1 min readJava
Altering format string output by changing a format specifier's argument_index
Altering format string output by changing a format specifier's argument_index
Continue reading →Apr 14, 2017 · 1 min readGit
Add Autocorrect to Git
Add Autocorrect to Git
Continue reading →Apr 13, 2017 · 4 min readJava
Future of Interface in Java 9
Interface in Java 9
Continue reading →Apr 11, 2017 · 4 min readJava
More about Interface in Java 8
Interface in Java 8
Continue reading →Apr 10, 2017 · 5 min readJava
Spring Boot in a Single File
Spring Boot in a Single File
Continue reading →Apr 09, 2017 · 3 min readJava
Manage Your JVM Environment with SDKMAN
SDKMAN or SDK Manager for JVM
Continue reading →Apr 09, 2017 · 1 min readJava
Updating interfaces by using default methods
Updating interfaces by using default methods
Continue reading →Apr 08, 2017 · 1 min readJava
Converting Stacktrace to String
Converting Stacktrace to String
Continue reading →Apr 07, 2017 · 1 min readJava
Synchronized Statement in Java
Using synchronized statements
Continue reading →Apr 06, 2017 · 9 min readPython
Function in Python are First-Class Object
Python’s functions are first-class objects
Continue reading →Apr 05, 2017 · 1 min readDjango
Django 1.11 Release Note a Reading
Django 1.11 Release Note a Reading
Continue reading →Apr 03, 2017 · 1 min readYaourt
Skip Yaourt Prompts on Arch Linux
Skipping Pain in The Ass Yaourt Prompts
Continue reading →Apr 03, 2017 · 1 min readJSON
One Hell Named JSON
Json with a single quote
Continue reading →
Mar 18, 2017 · 5 min readURL
Using Google URL Shortener with Your Domain! For Free!!
Using Google URL Shortener with Your Domain! For Free!!
Continue reading →
Jan 22, 2017 · 14 min readGo
Lightning Intro To Go
Lightning Intro To Go
Continue reading →Jan 15, 2017 · 5 min readSchemaless
Do Schemaless Databases Really Exist?
There’s no such thing as a schemaless database
Continue reading →Jan 12, 2017 · 2 min readJavascript
JS & Dom - Tips & Tricks #3
Continue reading →Jan 09, 2017 · 2 min readJavascript
JS & Dom - Tips & Tricks #2
Continue reading →Jan 06, 2017 · 2 min readJavascript
JS & Dom - Tips & Tricks #1
Continue reading →
20167
Dec 26, 2016 · 1 min readPython
Queue in Python - Part 3
Queue in Python
Continue reading →
Nov 02, 2016 · 1 min readPython
Queue in Python - Part 2
Queue in Python
Continue reading →Nov 02, 2016 · 1 min readPython
Queue in Python - Part 1
Queue in Python
Continue reading →
Jul 12, 2016 · 2 min readJava
Fix Java Unsupported major.minor version 52.0 on Ubuntu
Fix Java Unsupported major.minor version 52.0 on Ubuntu
Continue reading →
Jun 25, 2016 · 1 min readSpark
Enable Spark Context on Your Ipython Notebook
Enable Spark Context on Your Ipython Notebook
Continue reading →
Feb 10, 2016 · 1 min readService
Fix GDM Service Can't be Enabled on Arch Linux
Continue reading →Feb 03, 2016 · 1 min readLinux
Remove Entry from Known Host
Continue reading →
201510
Aug 20, 2015 · 1 min readLinux
Installing or Upgrading PostgreSQL 9.4 on Ubuntu 14.04
Continue reading →
Jul 29, 2015 · 1 min readLinux
Fix Locale Settings Error On Ubuntu Server 14.04
Continue reading →
Apr 27, 2015 · 1 min readPython
EAFP Coding Style in Python
Continue reading →Apr 26, 2015 · 3 min readLinux
Installing Varnish with nginx on Ubuntu 14.04
Continue reading →Apr 25, 2015 · 2 min readLinux
Disabling Apport Error Reporting on Ubuntu
Continue reading →
Mar 31, 2015 · 1 min readGit
Do Git Pull When Git Push Failed
Continue reading →
Feb 25, 2015 · 1 min readJavascript
Essentials Javascripts Link
Continue reading →Feb 07, 2015 · 1 min readLinux
PostgreSQL 9.4 failed to start on Manjaro
Continue reading →
Jan 25, 2015 · 2 min readLinux
MariaDB error failed to start, errno 12
Continue reading →Jan 14, 2015 · 1 min readVagrant
Vagrant's hosted Django can't be accessed
Continue reading →
201411
Oct 23, 2014 · 2 min readJavascript
Minifying Your JavaScript with Uglify
Continue reading →Oct 15, 2014 · 3 min readWeb
HTTPS Everywhere!
Continue reading →
Jul 24, 2014 · 3 min readGit
Using Git Like A Boss
Continue reading →Jul 24, 2014 · 2 min readPHP
Terbaru di Wordpress 3.8
Continue reading →Jul 24, 2014 · 4 min readPHP
Fitur baru di PHP 5.6
Continue reading →Jul 24, 2014 · 3 min readDatabase
Hal yang tidak kamu ketahui tentang mongodb
Continue reading →Jul 24, 2014 · 1 min readPHP
Push Notifications untuk Setiap Error di Laravel
Continue reading →Jul 24, 2014 · 3 min readPHP
Terbaru di Wordpress 3.7
Continue reading →Jul 24, 2014 · 2 min readCSS
Kompresi CSS menggunakan Python
Continue reading →Jul 24, 2014 · 2 min readPHP
Bundled Javascript di Yii Framework
Continue reading →Jul 24, 2014 · 4 min readothers
Menggunakan Hashing API untuk Hash Password di PHP 5.5
Continue reading →