Skip to content

Writing

Things I wrote

And what the fix actually was. Mostly Laravel, TypeScript and the tooling around them.

A Node script file being resolved as an ES module or CommonJS depending on its extension and the nearest package.json

Featured

Should a small Node script be .js or .mjs?

The rule for picking .js or .mjs when you write a quick Node script, what actually decides the module system, and why require(esm) landing in every supported Node changed the answer in 2026.

9 Sep 2026 · Javascript · 8 min read

Should a small Node script be .js or .mjs?

The rule for picking .js or .mjs when you write a quick Node script, what actually decides the module system, and why require(esm) landing in every supported Node changed the answer in 2026.

9 Sep 2026 · Javascript · 8 min read

Flatmark: query your markdown files like a database

Flatmark is a Node library that indexes a folder of markdown files and gives you a chainable query API over the frontmatter. Here's what it does, where it beats Velite and Astro content collections, and the four things I'd want fixed before shipping it.

3 Sep 2026 · Tools · 7 min read

Moving from Vercel to Hetzner with Coolify: the guides are quoting dead prices

Almost every "move from Vercel to Hetzner with Coolify" guide was written in 2025. Hetzner raised cloud prices twice in 2026, and the exact server those guides name now costs 144% more. Here are the real numbers and the plan to pick instead.

6 Aug 2026 · hosting · 10 min read

AI made writing code cheap. Review is still expensive

Teams merged 98% more PRs this year and review time went up 91%. The bottleneck moved from writing code to approving it, and most teams haven't noticed.

2 Aug 2026 · AI · 7 min read

I replaced Spotlight with Raycast, then replaced Raycast with look

I moved from Spotlight to Raycast to fix app launching, then moved to look because Raycast's file search kept getting in my way. Here is the honest trade.

31 Jul 2026 · Tools · 9 min read

Homebrew 6.0 tap trust: what breaks and how to fix it

Homebrew 6.0 stops running third-party tap code until you trust it. Here is what actually fails, the commands that fix it, and the two changes nobody is talking about.

29 Jul 2026 · Tools · 6 min read

Dataview vs Datacore vs Bases: what I actually use in 2026

A year after the hype, here's how Dataview, Datacore, and Obsidian Bases actually compare, and how I use Bases to run my whole vault.

19 Jul 2026 · obsidian · 7 min read

The jscrambler npm hack drops a stealer that hunts your AI tool keys

jscrambler 8.14.0 shipped a preinstall hook that runs a Rust infostealer during npm install. It goes after AWS, wallets, and your Claude/Cursor/MCP config. What to do.

12 Jul 2026 · Javascript · 8 min read

C# REPL: an interactive shell for .NET, like Node and Python

C# REPL gives you a real interactive shell for C# with autocomplete, NuGet support, and instant results. Test snippets without spinning up a project.

12 Jul 2026 · C# · 5 min read

Claude Code permission modes: approval, auto-accept, and plan mode

The three ways Claude Code handles permission (approval, auto-accept, plan mode), how to cycle them with Shift+Tab, and when to use each.

11 Jul 2026 · Claude Code · 4 min read

Dia is my main browser on Mac. Now I just want Windows

I use Dia as my daily browser on my MacBook. Here's what the new Reports feature actually does, and why I'm stuck waiting for the Windows version.

10 Jul 2026 · AI · 5 min read

MinIO is archived: the self-hosted S3 alternatives worth using

MinIO's community repo is read-only as of April 2026. Here's an honest look at RustFS, SeaweedFS, and Garage, and which one fits your setup.

6 Jul 2026 · hosting · 4 min read

One email when the next one lands

No sequence, no course, no webinar. Leave from any email.