Platform and Services
Reusable primitives, product-aware services, live registry and operational context inside each surface.
Articles
-
Ultimate Porra stopped treating a knockout prediction like a scoreline with hidden extras. Once advancement depends on penalties, scorer identity, and visible scoring breakdown, the vote has to model the full path of the match.
-
Ultimate Porra stopped treating official tournament changes like a reimport that simply lands on top of the product. Once votes and leaderboards exist, sync needs scope, memory, and reversibility.
-
Ultimate Porra stopped reconstructing official truth inside the client. Standings, canonical team names, and correction history had to become explicit shared contracts.
-
Correcting a pool can no longer mean resetting it. The system had to learn to separate official results, saved votes, and support actions without destroying what the user meant.
-
Acquisition can no longer start at sign-in 2026-06-24
Between June 23 and June 24, Ultimate Porra stopped treating public entry as a direct jump into sign-in and started writing a dedicated landing page with clear value, access rules, and a time promise that respects each visitor's local clock.
-
Between June 21 and June 22, Nima Project stopped assuming that users, admins and readers would remember the right context outside the surface itself and started writing that context into each surface.
-
On June 9 and 10 two different frontends, `Reveal It` and `Loop It Synth`, taught the same lesson: once an experiment starts looking like a product, moving the UI is no longer enough. Data, tests and deployment have to realign too.
-
Moving a shared piece is not a path change 2026-06-09
On June 8 I moved `nima-agent` into `packages`. It looked like a small path change, but it actually forced consumers, docs, workspace bootstrap and repo-sync discipline to realign around shared ownership.
-
From config file to live registry 2026-06-01
Adding the second product exposed a coordination problem in static config files. The product catalog was the answer — not because it is elegant, but because editing three files in sync stops working around the third product.
-
One thin gateway in front of moving backends 2026-06-01
Canonical public API hostnames should not be wired directly to whatever backend happens to serve them today. A small, replaceable routing layer keeps the public contract stable while the backends underneath stay free to move.
-
The logo that closes the chain 2026-06-01
After making auth product-aware and building the catalog, one visible gap remained — the user still saw the wrong brand in their inbox and on the password setup page. The logo closed it.
-
The moment a shared service stopped treating every product as one and started knowing which product each action belonged to — and why a second real consumer is what forced it.
-
Build platform, not product · how shared primitives let one person launch several SaaS products 2026-05-19
Why the same Markdown engine can power a desktop editor, a publishing SaaS, a customer portal and an export API, and how to avoid turning that into a disguised monolith.
-
Two-level dogfooding · how a portfolio and a product site validate the same publishing engine 2026-05-19
One internal use case does not validate a product. Two use cases with very different constraints can.