# Cipher & the Retention Loop

> Build log · Month 4 of 12

a daily code-breaking game as a distribution experiment. Habit design, shareable results, generating puzzles legally, and why retention is harder than acquisition.

Day 91–120 · 30 posts · Building in public as @caelum0x4

**Day 91** — Cipher gets the spotlight. It's a daily code-breaking game: one puzzle a day, everyone gets the *same* one, you share your result. I'm building it as a distribution experiment disguised as a game. The mechanic is the marketing. That's the whole bet.

**Day 92** — Why "one shared daily puzzle"? It manufactures conversation. If we all solved different puzzles there's nothing to talk about. Same puzzle + shareable score = a reason to post, and every post is a free ad I didn't buy. Steal the loop that works.

**Day 93** — The generation problem: I need a fresh, solvable, difficulty-tuned puzzle every day forever. Hand-author doesn't scale, so I went procedural — with a solver that verifies each generated puzzle has exactly one solution before it ships.

**Day 94** — Key rule for Cipher's content: everything is *computed*, never scraped. The puzzles are original compositions from my own generator, not lifted from a puzzle book. Procedural done legally means the algorithm is mine and the output is original. No landmines.

**Day 95** — Bug: my generator produced a puzzle with two valid solutions, so two players "solved" it differently and both were right — breaking the shared-answer loop. Fix: the generator runs the solver and rejects anything without a unique solution. Generate, then verify.

**Day 96** — Thread: designing a daily game for retention, not just downloads.
  - One puzzle a day. Scarcity creates a reason to return tomorrow, not binge and bounce.
  - Everyone gets the same puzzle. Shared experience = shareable result = free distribution.
  - Streaks. Loss aversion is the strongest retention force there is.
  - Shareable result must be spoiler-free (emoji grid, not the answer).
  - Verify every generated puzzle has ONE solution before it ships. A broken daily kills the streak.

**Day 97** — Streaks shipped. The psychology is almost unfair: on day 12 you don't play because it's fun, you play because you don't want to lose the 12. I felt slightly guilty exploiting loss aversion, so I made missing forgiving-ish: one freeze token a week.

**Day 98** — Shareable result design: a spoiler-free grid of colored squares, no answer leaked. Someone who hasn't played sees you did well without seeing how. That single constraint — brag without spoiling — is what makes a daily game spreadable, not annoying.

**Day 99** — Retention truth nobody likes: acquisition is a spike, retention is the slope. I can *get* a hundred people to try Cipher once. Getting ten to return on day 7 is the whole game. Downloads are vanity; day-7 return is the only number that predicts survival.

**Day 100** — Day 100. Real talk: strong tech across the fleet, a genuinely fun daily game, still a tiny user count. 100 days taught me building was never the hard part. The next 265 are about the part I'm bad at: getting the thing in front of humans.

**Day 101** — Difficulty tuning is its own rabbit hole. Too easy, no dopamine; too hard, people rage-quit the streak. I ramp across the week — gentle Monday, brutal Sunday — so there's an on-ramp and a flex. The curve is the product, not any single puzzle.

**Day 102** — Thread: Cipher's funnel, and where I was losing people.
  - Open → start puzzle → solve → share. Four steps, three drop-off points.
  - Biggest leak was solve → share. People won, then didn't brag.
  - Fix: move the share button to the emotional peak — the instant you solve.
  - The old flow buried it two taps later, after the high faded.
  - Lesson: the WHEN of a prompt beats the WHAT. Ask at the peak, not the cooldown.

**Day 103** — That timing change moved sharing meaningfully. Lesson: the *when* of a prompt beats the *what*. Ask for the share at the emotional peak, not after the user has cooled off and navigated away. Friction is measured in taps, in seconds, and in mood.

**Day 104** — Offline-first call: the daily puzzle downloads on open, so you can play on a plane with no signal, and your result syncs later. A daily habit game that needs a connection loses you the exact day you're on the subway. Habits hate friction.

**Day 105** — Anti-cheat is weirdly emotional in a shared daily. If people can trivially fake a perfect streak, the leaderboard is worthless and honest players feel like suckers. I validate solutions server-side and rate-limit attempts. Protect the honest player.

**Day 106** — Hard product lesson: I added a second game mode and it *hurt* engagement. Choice diluted the ritual — "which one do I play?" is friction. Pulled it. One puzzle, one time a day, zero decisions. Constraints are what make a habit a habit. Cut to add.

**Day 107** — Notifications for a daily game are a razor's edge. "Your puzzle is ready" once a day = helpful. More = uninstall. I send exactly one, at a time the user tends to play, never a guilt-trip. The fastest way to lose a daily user is to nag them daily.

**Day 108** — The generator is now a little content factory: it produces a year of puzzles ahead, each verified unique-solution, difficulty-tagged, queued. Content that generates itself is the only kind a solo dev can sustain daily forever. Build the machine.

**Day 109** — Opinion: gamification bolted onto a boring app is lipstick. But a genuinely game-shaped product using game mechanics is just good design. Cipher isn't a productivity app with points — it *is* the mechanic. Fit beats bolt-on.

**Day 110** — Watching real (few) players is humbling. I built a hint system I was proud of; nobody used it — they'd rather lose the streak than feel like they cheated. Ego is a retention mechanic I didn't design for. Users tell you what matters by what they ignore.

**Day 111** — Leaderboards: friends-only, not global. A global board means the top is unreachable strangers and you feel like a nobody. Beating your one friend by 4 seconds is the fun part. Small, relative, personal competition retains; giant absolute ranking demoralizes.

**Day 112** — Cipher's honest metrics: [N] daily players, [N]% day-7 retention, [N] shared results. All bracketed because they're not big enough to be real yet. The mechanic works in miniature. Now it needs the one thing I can't code: reach.

**Day 113** — What Cipher teaches the whole fleet: the product should contain its own distribution. A share button is not a growth strategy; a shareable *result* is. Bake the loop into the core mechanic or you'll buy every user forever. Design the megaphone in.

**Day 114** — The freeze-token economy needed balancing. Too generous and streaks are meaningless; too stingy and one bad week ends a 60-day streak and the user quits forever. Landed on one freeze per perfect week. Mercy, but not too much.

**Day 115** — Procedural legal note, since people ask: I own the generator, so I own the output. No scraped puzzle sets, no "inspired by" a specific copyrighted game's exact ruleset. Original composition by original algorithm. It's not hard to be legit.

**Day 116** — Month 4 lesson: retention is a design problem, not a marketing one. Streaks, one-a-day scarcity, spoiler-free shares, offline play — none of that is a growth hack, it's design that happens to distribute. Build the loop, the loop does the reaching.

**Day 117** — Cipher is the most "distribution-native" thing in the fleet and I still need way more top-of-funnel than I have. Even a perfect retention loop needs a first cohort to retain. The loop is built, the loop is empty. Next month, fill it.

**Day 118** — Next month I stop dodging the least fun, most necessary craft: shipping to the App Store. Privacy manifests, account deletion, Sign in with Apple, review rejections. The gauntlet between "works on my simulator" and "a stranger installed it."

**Day 119** — Before I leave games: Vertex, the hyper-casual timing game, is queued behind Cipher on the same generate-and-verify spine. One-tap, pure timing, instantly shareable score. If Cipher proves the daily loop, Vertex tests whether the machine ports to a second genre.

**Day 120** — Four months in. Build machine, trustworthy wallet, verification spine, real retention loop. The pattern is undeniable: my engineering is ahead of my distribution by a mile. Everything from here is about closing that gap. On to the App Store gauntlet.

← [Month 3: Verification Is the Product](https://ereboslab.com/blog/month-3-verification-is-the-product/) · [Month 5: The App Store Gauntlet](https://ereboslab.com/blog/month-5-the-app-store-gauntlet/) →

[← All build-log months](https://ereboslab.com/blog/)
