Notes on development, design, and the things I build.
Six property developers each wanted their own sales site. Building six projects would have meant six codebases drifting apart. Here is the config-driven alternative, and where it stops being a good idea.
A save that fails loudly gets fixed on Tuesday. A save that fails and returns 200 gets found in a quarterly audit. Two real examples, and what they have in common.
Module-level state is fine until two requests share a process. Here is why the translation dictionary went into a per-request context instead, and the performance pass that came with it.
Three static files, PostgREST, and Row Level Security doing the authorization. When the boring stack is the correct one — and the one place it bit back.
Placing 87 navigation hotspots by hand in a JSON file is miserable work. The fix was not discipline. It was two days building an in-app authoring mode.
The lock icon on a paid lesson protects nothing. Designing content protection for a training platform meant being precise about where the real boundary is — and saying so in the README.