Writing
Notes from production.
What broke, why it broke, and what I changed so it doesn't break again.

Autovõti: the jump from WooCommerce to Laravel
A tour of the Laravel 13 and React storefront replacing my WooCommerce shop for car key covers: a finder for brand and key shape, search by photo, a checkout that locks and reserves, webhooks that aren't trusted, refunds that can say "I don't know", and conventions enforced by tests.

Serving a portfolio over SSH
Giving this portfolio a second front end over SSH — Go, Wish and Bubble Tea in front of the same Laravel app — turned out to hinge on three unglamorous decisions: never rotate the host key, treat the visitor's key fingerprint as their identity, and be willing to give up port 22.

The Eloquent scope that never ran
A local scope named latest() is silently shadowed by Eloquent's own builder method, so it never runs — and the unit test covering it passed, because it called the scope by the one route that bypasses the collision.

The deploy that ate the database
Atomic symlink deploys share .env and storage, but this app's SQLite database lived inside the release directory — so every deploy quietly stranded whatever visitors had written, with no error anywhere.