Inspiration

The Devvit brief pointed out that collaborative-storytelling games are already over-represented. We wanted something just as social but built on a different substrate: shared genetics. Reddit is already a place where a community slowly accumulates something together over time, so we made that thing a gene pool.

The hook crystallized as a feed card: "Can you beat my Bloomline?" Your flex is a lineage other players can take up and try to beat, not a high score. The look came from the Victorian florilegium, the great illustrated flower-books where each specimen is a hand-tinted plate, named in Latin, framed by fine hairlines. The whole product became a living botanical plate book you tend with other people.

What it does

Bloomline turns a subreddit into one shared Victorian glasshouse.

  • You plant a seed, water it, and watch it grow seed → sprout → bud → bloom.
  • Flowers carry inherited traits. Cross two peak blooms (only at peak, so act in time or you miss the window) to mix their genetics into a new seed.
  • You release prized lines into a community commons, where they drift to other gardens "on the wind"; you cross in lines other people released.
  • The rarest traits (lustre, variegation, picotee edges) are recessive, so the showpiece blooms are effectively impossible to reach alone. They only appear by blending genetics across the community.
  • A Commons Hall ranks breeders by legacy (releases, and having your lines crossed), not raw score. Any rare bloom can also be turned into a challenge post ("can you breed a rarer one?") that hands every taker your seed to try.

How we built it

One codebase, two homes. The whole game runs standalone in a browser (localStorage) and on Reddit, behind a single persistence contract (Backend + StateBundle + a handful of /api/* routes). Reddit is just one adapter; a working GET /api/state is the only signal we're on a server. That let us develop and verify locally at full speed, then ship the identical client to Devvit.

The genetics is the actual core. Every plant is a diploid genotype, where each trait is a pair of alleles:

$$ G = {(a_i, b_i)}_{i=1}^{n} $$

Continuous traits (hue, height, growth speed) blend; categorical traits (petal shape) and the prized specials are recessive, expressed only when both alleles carry the variant. Breeding is Mendelian segregation plus mutation: each parent contributes one of its two alleles, and each inherited allele mutates with small probability $\mu$:

$$ c_i = \mathrm{mutate}_\mu\big(\mathrm{pick}(a_i, b_i)\big) $$

Phenotype rarity rewards improbable combinations: roughly, the product of how uncommon each expressed trait is.

$$ R(G) \;\propto\; 1 - \prod_i f\big(\mathrm{trait}_i\big) $$

A lone breeder's allele pool is narrow, so $P(\text{rare bloom})$ stays low however long they tend. Crossing in lines other people released injects fresh recessives and raises it. That dependence is the whole reason the community exists. The genotype→phenotype map is deterministic, so the same genome always grows the same flower and a seed packet can preview exactly what it will become.

Procedural everything. No external art (Devvit's CSP forbids it anyway). Flowers, pots, and the glasshouse are drawn straight from the genotype: inline SVG in the DOM chrome, and Phaser WebGL on the live stage, baked to RenderTextures and lit with Light2D so hundreds of specimens stay cheap.

The subreddit is the database. Per-subreddit Redis is the shared gene pool; a post is just a viewport onto it. Releasing a seed appends to a commons pool; claiming mints a garden post; a challenge mints a card carrying a donor seed anyone can cross.

Challenges we ran into

  • No Reddit-wide store. Redis is isolated per subreddit, so the entire game had to live inside one community's single Redis instance. We leaned into it: that constraint is exactly what makes the gene pool communal.
  • Two webview shells drifting. A standalone entry and the Devvit "game" entry duplicate the HUD markup; a fix made to one silently never reached Reddit (the deployed build kept showing an old layout). We now keep them in lockstep and diff them on every chrome change.
  • Identity is ephemeral. Reddit usernames only resolve for the current session user, and our cache shared a short TTL with moderator status, so players inactive for a few minutes went nameless and silently lost their gene-pool credit. Usernames are immutable, so we now cache them permanently.
  • Bugs only the live data revealed. Inspecting the real subreddit state surfaced things local tests never would: gardens grown while unclaimed with no way to claim, and a reset that couldn't reach unclaimed players. We built a moderator-only debug endpoint to join live Reddit posts with our Redis records, which is how we found and fixed them.
  • Unit tests can't prove pixels. The genetics engine has real acceptance tests, but nothing proves a bloom actually renders. We drive the live client headlessly with Playwright and read the resulting screenshots before calling any visual change done.

Accomplishments that we're proud of

  • A real genetics engine (diploid inheritance, recessive specials, mutation, deterministic genotype→phenotype) with a passing acceptance-test suite, living in a dependency-free shared core that ports unchanged from browser to server.
  • Zero external art. Every flower, pot, and glasshouse pane is generated from data, rendered twice (SVG and WebGL) from one source of truth, all within Devvit's strict CSP.
  • A single codebase that runs standalone and on Reddit through one port/adapter contract: no build flags, no isReddit() checks.
  • The "Can you beat my Bloomline?" challenge card: a florilegium translation of the genre's "beat my score" post. Their hand-tinted specimen sits next to your uncoloured engraving of the same plate, the one you haven't grown yet.

What we learned

Devvit's mental model (a post is a window onto shared per-subreddit state, not a data silo) reshaped the entire design. The platform's constraints (per-sub Redis, a strict CSP, session-only identity) didn't get in the way so much as push us toward the things that actually make this a Reddit game rather than a game that merely runs on Reddit: a communal gene pool, procedural art, and a social loop where the most beautiful outcomes are unreachable alone.

What's next for Bloomline

  • Challenge leaderboard and win detection. The challenge card states the bar and hands over the seed; next is closing the loop: detecting when a taker beats it and crowning a winner.
  • The Hall seed exchange. An earned-credit stall for deliberately acquiring specific community lines, as a counterweight to the ambient "wind."
  • Vessel reward unlocks. Tie the cosmetic pots to lineage and heritage milestones (and an optional premium pack) so dressing your glasshouse becomes a goal.
  • Live events and seasons. Scheduled community beats (a daily wind, seasonal rare alleles entering the pool) to give the shared garden a heartbeat.
  • Balance pass. Tune lifecycle durations and special-allele frequencies once there's real multiplayer data on how fast the gene pool enriches.

Built With

Share this project:

Updates

Submission history