Blog

Thoughts, logs, and writings.

Welcome to the Beniverse

I finally built myself a proper home on the internet. Here's what's here.

Why I Picked Starlette Over FastAPI for This Site

FastAPI is great, but sometimes simpler is better.

Idle Games Are Weirdly Hard to Build

What I learned building Idle Rampage. Spoiler: spreadsheets.

You Might Not Need React

For a lot of projects, vanilla JavaScript is fine. Better, even.

uv Changed How I Python

A Rust-powered Python package manager that's absurdly fast.

Pydantic v2 Broke Everything (And It Was Worth It)

The migration was painful. The performance gains are real.

Ruff Is All You Need

One linter to rule them all. And it's absurdly fast.

File-Based Storage Is Fine, Actually

Not every project needs PostgreSQL.

Async Python: The Stuff Nobody Tells You

The gotchas I learned the hard way.

Jinja2 Is Better Than You Think

It's not just 'that template language Flask uses.'

The Trick to Testing Starlette Apps

Test your ASGI app without running a server.

I Only Use Docker for Databases

Docker for databases, native Python for everything else.

My 10-Line GitHub Actions Workflow

CI doesn't have to be complicated.

orjson Is Stupid Fast

10x faster JSON serialization. What's not to like?

React Native Was Slow Until I Fixed This

Most React Native performance problems have the same fix.

Just Use httpx

If you're doing async Python, stop using requests.

Type Hints Changed How I Code Python

I resisted type hints for years. I was wrong.

CSS Variables Are All You Need for Theming

Dark mode with plain CSS. No library needed.

Pre-commit Is Worth the 5 Minutes to Set Up

Catch linting errors before they hit CI.

Making CLI Tools in Python

argparse + rich = nice CLI tools.

Environment Variables: Doing It Right

pydantic-settings makes config easy.

Git for Solo Devs

Keep it simple when you're working alone.

Print Debugging Is Fine

Sometimes the simplest solution is the right one.

Boring Code Is Good Code

The cleverest code is often the worst code.

Stop Using os.path

pathlib is better. Just use it.

Dataclasses vs Pydantic: When to Use Which

Both are useful. Know when to use each.

The Walrus Operator Is Actually Useful

It's not just a meme. It's actually useful.

structlog > logging

Log data, not messages.

Context Managers Are Underrated

with statements aren't just for files.

What Those Underscores Mean in Python

A quick reference for Python's underscore conventions.

Python's Match Statement Is Actually Good

Pattern matching is more than a fancy switch statement.

Generators Save Memory

yield instead of return when you're processing lots of data.

Speed Up Slow Functions with lru_cache

One decorator to make slow functions fast.

itertools Tricks I Actually Use

The itertools functions worth knowing.

Web Dev in 2025 Is Weird

Some thoughts on the current state of web development.

Send a Message