nihilok@home:~$

  • The Discovery Tax

    Every Claude Code session starts the same way. You say “run the tests.” The agent says “I’ll look for how to run tests in this project.”

  • Your Agent Doesn't Need a README

    Your AI agent is reading your README right now. It’s on paragraph three of the “Getting Started” section, trying to figure out whether npm run dev or make dev is the current way to start the project. It will get there eventually. That’s the problem.

  • How I Gave Claude Code a Deterministic Toolbox (and Stopped It Guessing How to Run My Project)

    If you’ve spent any real time pairing with Claude Code, you’ve seen the dance.

  • Integration Test Isolation in a Next.js App with Drizzle ORM

    1. Introduction: The Complexity of Modern Integration Testing The evolution of web application architecture has precipitously increased the complexity of ensuring software quality. In the era of the monolithic, server-rendered application—typified by frameworks such as Ruby on Rails or early ASP.NET—testing strategies were relatively straightforward. The application ran in a single process, connected to a single relational database, and served HTML directly. Integration testing in such an environment was a solved problem: wrap the test in a database transaction, execute the logic, and roll back the transaction at the end of the test. This approach, often referred to as the “transactional rollback” strategy, provided a clean slate for every test case, ensuring isolation and determinism with minimal overhead.

  • Why I Built Another Task Runner

    Yes, I know. Another task runner. In 2026. Let me explain why.

  • Offline Encryption Using WebAuthn

    I’ve been diving deep into browser-based cryptography lately, and implementing truly secure offline encryption is frustratingly complex. The core problem? Getting consistent key material across sessions without storing anything sensitive.