Build log · Month 11 of 12
Infinite Content, Zero Theft
procedural and generative content done legally. The engine behind Cipher's puzzles and Vertex's levels — compute it or compose it originally, never scrape it. Ethics as a moat.
- Day 276
This month: how the games generate endless content without scraping anyone. Cipher needs a fresh verified puzzle daily, forever. Vertex needs endless levels. The rule is absolute: compute it or compose it originally, never lift it. Legal generation is also a moat.
- Day 277
"Legal" is a design constraint I enforce in code. Cipher's puzzles come from my own generator, seeded by an algorithm I wrote. No puzzle book scraped, no copyrighted set imported. I own the generator, so I own the output. Provenance is clean by construction.
- Day 278
Why scraping is a trap even when tempting: someone else's puzzle set is their copyright, their liability becomes yours, and their supply is finite. A generator is infinite, original, and mine. The "shortcut" is a mortgage on content you don't own. Build the engine.
- Day 279
Procedural generation's hard problem isn't making content, it's making good, fair, solvable content. Any RNG can vomit a random grid. A puzzle with one solution and fair difficulty is engineering. Generator and verifier are a pair — generate, then prove it valid.
- Day 280
🧵 Thread: generating infinite content that's original, legal, and actually good.
- Own the generator = own the output. No scraping, no "inspired by" a copyrighted set.
- Generate + verify as a pair. The solver proves each puzzle uniquely solvable before it ships.
- Difficulty is a designed curve, not an accident of RNG. Tag and tune it.
- Seed deterministically so "today's puzzle" is identical for every player.
- Reject aggressively. A broken daily costs you the streak AND the trust.
- Day 281
Determinism is the unsung hero of a daily game: the same seed must produce the same puzzle worldwide, or the "we all solved the same one" loop collapses. My generator is a pure function of the date-seed. Same input, same puzzle, everywhere, always.
- Day 282
Vertex's levels are composed from original building blocks I designed — timing patterns, obstacle rhythms — recombined by the engine. Generative, but every primitive is mine. Original composition from an original alphabet. The letters are mine, so every word is too.
- Day 283
The verifier caught the generator cheating: it started making "hard" puzzles that were tedious, not clever — big search space, no insight. Difficulty ≠ tedium. I added a metric for "requires a deduction" vs "brute force." Fair-hard, not annoying-hard.
- Day 284
Generative content needs a quality floor, not just a legality floor. Infinite mediocre puzzles are worse than a few great ones — they train players that your content is filler. I'd rather ship fewer, verified-excellent ones. Curate the machine's output.
- Day 285
On "AI-generated" content: where I use a model to help generate, the output still gets verified by deterministic code, and I only ship what I own and can stand behind. AI is a generation tool, not an excuse to skip verification. Model proposes, verifier disposes.
- Day 286
Reproducibility saved a support headache: a player claimed "today's puzzle was impossible." Because generation is deterministic, I regenerated it from the seed, ran the solver, confirmed it solvable, showed the path. Deterministic generation is deterministic debugging.
- Day 287
Opinion: "just scrape it" is the original sin of content apps, and it always comes due — a takedown, a lawsuit, a dependency that vanishes. Building the generator is more work upfront and zero risk forever. The honest path is slower at the start and compounds.
- Day 288
The generator is a compounding asset, not a one-off script. Every improvement — tuning, new types, tighter verification — makes every future puzzle better, forever. I invested in the machine that makes content, not the content. Same bet as the shared core.
- Day 289
Seasonal and special puzzles without breaking determinism: I layer curated constraints on top of the seed, still verified, still reproducible. A "themed" puzzle that's also provably fair. Structure gives room to be creative within the guarantees, not against them.
- Day 290
Anti-cheat meets generation: because I can regenerate and solve any puzzle server-side, I validate a claimed solution without trusting the client. The engine that makes the puzzle verifies the win. One source of truth for both keeps the leaderboard honest.
- Day 291
🧵 Thread: why constraints made my generator BETTER, not worse.
- Unique-solution: forces cleverness, kills ambiguous puzzles that break the shared answer.
- Fair-difficulty: bans "hard = tedious," rewards puzzles that need a real deduction.
- Deterministic seed: same puzzle worldwide, reproducible when debugging a complaint.
- Same-role swaps and category rules: no nonsense output shipped confidently.
- Unconstrained generation is chaos. Constrained generation is design.
- Day 292
The moat nobody sees: a competitor copies Cipher's UI in a weekend, but not years of a tuned, verified, original generation engine. The visible product is easy to clone; the invisible machine is the defensibility. Build the part they can't screenshot.
- Day 293
Content sustainability for a solo dev is existential: I cannot hand-author a puzzle a day forever, so the generator isn't a nice-to-have, it's the only way Cipher survives past my attention span. Automate the daily thing or it dies with your motivation.
- Day 294
Month 11 lesson: generative content is an engineering discipline — generate, verify, tune, own — not a shortcut. Done right it gives a solo dev infinite, original, legal, quality content and a moat. Done wrong (scraping) it's a lawsuit with a countdown.
- Day 295
Next month is the last: the honest year-in-review. What shipped, what died, the real numbers, what I'd do differently. No spin, just the actual ledger of a solo dev's year building twelve apps in public. The hardest post to write is the truest one.
- Day 296
Before the retro: the through-line of the fleet is obvious now. Shared core, generators, knowledge graphs, one pipeline — I kept building machines that make things, not the things. That leverage is the only reason one person got this far. Build the factory.
- Day 297
A quiet milestone: the content engine has shipped [N] consecutive daily puzzles with zero broken dailies and zero scraped content. Boring reliability, delivered daily, is its own achievement. The streak isn't just the players' — it's the machine's. Uptime is a feature.
- Day 298
Reflecting before the final month: I'm proud of the engineering and clear-eyed about the traction. Both are true at once. The year proved I can build almost anything solo. It also proved building was never the question. The retro is where I sit with that honestly.
- Day 299
The generator keeps running long after this series ends — that's the point of building machines instead of artifacts. Cipher's puzzle on day 700 comes from the same engine, tuned better. Content that outlives your attention is the only kind a solo dev can sustain.
- Day 300
Day 300. Eleven months in public. Twelve apps, a shared core, a wallet I trust, verification, real-time, knowledge graphs, generative engines, monetization, and a distribution engine that's finally turning. 65 days left. Time to add it all up honestly.