FitCraft · Squads · Brainstorm Results · Internal
Six focused brainstorms attacked the six problems with the Squad social design — then an adversarial vet tested every idea against FitCraft's real numbers and killed whatever broke. This page is the curated result: what to build, what to fix first, and what died (and why).
Every verdict was tested against the same reality: 171 monthly actives · ~9 counted workouts per day app-wide · 5–10 daily actives per squad · 74% of active weeks contain exactly one workout — plus the hard rules: no fake activity, no free-text UGC, no guilt mechanics, 1–2 engineers.
One idea isn't a feature — it changes the architecture. The skeptic called the original version "the most important idea in the set"; after founder review it sharpened into the principle below. Decide this before building anything else.
"Ty's Tribe" stays the brand, the screen, and the voice. The data pool underneath is shared — until there's enough population to split. Every social query passes an audienceId resolver; trainer choice decides who hosts the screen and how everything is flavored, while feeds and stats draw from the one real pool of ~9 daily workouts. (Internally nicknamed "One Gym, Two Voices.")
Why trainer love survives intact: Peloton — the canonical trainer-relationship success — has no instructor-partitioned social graph at all: the class leaderboard is everyone, milestones are read by whoever's teaching, and the Boo Crew formed on top of a fully shared platform. The parasocial bond is the trainer→user channel — voice, personality, hearing your name — and this design keeps all of it: Ty hosts your screen, Ty's broadcast style and rituals are his own, and each trainer only ever shouts out their own members.
Why tribes need a shared arena: Hogwarts houses work because both houses eat in the same great hall under one house-cup board — identity gets stronger when the rival is visible. Sports fandom, the most tribal force there is, lives entirely inside shared stadiums. The anti-pattern runs the other way: WoW hard-walled Horde from Alliance for 17 years, population imbalance slowly starved the smaller side's game, and Blizzard eventually tore the wall down. Xayla's room today is 2–3 daily actives — a hard wall is the worst possible experience for exactly her biggest fans.
What stays tribal from day one: the hosting (trainer's gym, voice, broadcast, signature rituals — Ty's roll-call format vs Xayla's); tribe crest and colors on plaques, avatar frames, and every feed event you generate (the shared feed reads like a stadium full of jerseys); tribe-first feed sorting — tribemates on top with crest emphasis, so you mostly see your people but never see an empty room; shout-outs, roll call, and the Gazette are per-trainer by design; and tribe-vs-tribe — the weekly per-capita friendly and the trainer rivalry banter — is only possible because both tribes share one world.
A dial, not a door: the resolver makes tribal scoping per-surface remote config. Launch shared, because 9 workouts/day can't be honestly split; the day Ty's tribe alone sustains the liveness bar (~25–30 daily actives), flip the config and fully tribe-scoped feeds turn on with zero rebuild. Per-surface from day one: shout-outs tribal, stats shared until density, feed tribe-first always. Fold a cohortId into the same resolver now (~1 week) for the crews/leagues future.
"Today so far: 4 workouts" reads as a dead app. The survivors all follow one principle: change what you count and how you frame it — never fake it.
The feed becomes "This week at the squad" — a rolling 7 days (15–25 real items at current volume) with day dividers. Above it, a permanently engraved metal plate: cumulative all-time stats ("11,482 workouts since 2024"), re-engraving with trainer VO fanfare every 500th workout. "Today" shrinks to a small chip — real, but never the headline.
Why it works: cumulative numbers only go up, so they can never read dead; the window choice alone fixes most of the morgue feeling. The skeptic called it the cheapest honest fix in the set.
Before any workout lands, the squad gym is dim — the trainer stretching under a single light: "The gym's quiet. First one in turns on the lights." The day's first finisher lights the gym squad-wide, heads the day's board, gets VO credit on everyone's next visit, and a small Sweat bonus — doubled on Saturday, the real trough day.
Why it works: "be first today" is winnable by anyone, rotates naturally, and turns the deadest screen state into the most charged moment of the day. Nothing is fabricated — the emptiness itself becomes the invitation.
Skeptic: one week of work; just define the day boundary before build — a global trainer squad has no local midnight.
Every morning, a 20–40 second trainer broadcast assembled server-side from hand-written template fragments filled with real data: a greeting, yesterday's real recap ("Three of us trained yesterday — Backender closed it out at 9pm"), one coaching tip, one call to action ("First one in today opens the gym"). Zero player events? The broadcast still runs on tip + the trainer's own session. Ships through the existing TTS + CDN pipeline.
Why it works: guaranteed daily life that is 100% honest — the trainer is a real character, not a fake user. At N=5, one warm voice recapping three real names feels like a ten-person gym.
Reaction UI never shows counts — it shows named avatar chips: "Xayla and Marcus cheered you." A JourneyEngine nudge asks exactly one rotating squadmate to respond to fresh milestones ("Backender just hit Gold — send a flex?") — a phone tree distributing the caring work.
Skeptic's fix: drop the "trainer reacts to everything within an hour" rule — a trainer that responds by rule to every event is a manufactured signal that decays into wallpaper. Keep named chips + the rotating nudge.
With 5–10 daily actives, daily top-3 podiums crown the same grinder forever. The survivors change the shape of recognition instead of fighting the math.
Kill daily podiums. Every Monday (the real peak day), an awards reveal with 4 categories drawn from an authored pool of ~12: Doubled Up (hit the 2nd workout — the north star), Comeback, Early Bird, Weekend Warrior, Most Improved vs your own 4-week average… Hard rule: one ribbon per player per week — top two categories and the runner-up inherits your second. Categories with zero real qualifiers simply don't appear.
Why it works: weekly cadence pools ~60 real workouts into signal, and the one-ribbon cascade mathematically guarantees distinct winners whenever 4+ members were active. Nearly everyone gets recognized most weeks — without a single fake result.
Skeptic: show winners only, never standings or qualifier counts; the Comeback category must honor the absence-disclosure opt-in (see "What everyone missed").
Six standing crowns, each held by whoever currently leads its trailing-30-day niche: Early Bird, Night Owl, Weekend Warrior, Iron Streak, Craftsman, Explorer. Holders wear a small crown badge; transfers fire feed events ("Ana took Early Bird from Backender"). One-title-per-player cap. Unclaimed titles display "Vacant — claim it."
Why it works: recognition becomes a state you keep, not a contest you lose weekly. Six niches across 5–10 actives means most members hold something; transfers are honest rivalry content for a thin feed; vacancies turn low N into visible opportunity.
Every Sunday evening, a templated one-page recap where every member active that week gets exactly one line: "Ana doubled up Tuesday · Backender hit Level 12 · Drew returned after 3 weeks." The trainer voices the top two headlines. Inactive members are simply unmentioned — never called out. Push deep-link primes Monday.
Why it works: the small-town-newspaper principle — at N=5–10 you can print every name every week, something no big network can offer. Recognition becomes universal and expected; weekly aggregation hides daily thinness.
The daily trainer shout-out graduated from a feature into a six-part stack. Parts 1–4 are the machine; parts 5–6 are the delight. Build in this order.
A decaying-weight lottery, not a leaderboard: 2nd workout of the week = 5 tickets, comeback after 14+ days = 5, streak milestone = 3, any workout = 1. Each player's tickets multiply by days-since-last-featured — so everyone's turn is mathematically guaranteed — and winners are suppressed to 0.25× for 14 days. Themed weekdays (Monday "Streak Savers," Saturday "Weekend Warriors") manufacture variety. Fully deterministic and auditable in fcadmin.
Lines are human-authored slot templates fillable only with verifiable facts: "{name} — {n} weeks straight. {weekday} you showed up again." Server-enforced rule: no fact, no line — pick another template. ~120 lines per trainer, tagged by tone and category; no repeats for the same player across their last three features.
Why it works: specificity is the entire difference between "the trainer noticed me" and AI slop. A receipt proves attention.
On username set/change: blocklist + LLM safety check, then both trainers' renders of the name are generated and the player hears them in settings — "Did Ty say that right?" Nothing unapproved is ever voiced; approval doubles as consent and QA. Unspeakable names fall back to an earned epithet ("the Early Riser").
Skeptic's fix: alternates must be pick-from-3 auto-generated pronunciations only — no free-form phonetic respelling (that's an audio UGC channel where the approver is the attacker).
Being featured is opt-in, framed as taking "the front row," and the invitation fires at a pride moment: right after your first two-workout week, trainer-voiced. Opting in requires completing name approval — consent, pronunciation, and safety in one flow. Opt-out anytime; past features retroactively anonymize.
Skeptic's fix: gate only voicing and share cards on the opt-in — don't hide display names behind initials by default, or you anonymize the whole feed at exactly the N where names are the product.
Winner drawn nightly; line renders overnight (text-card fallback — never silence). Morning push to the featured player only: "Xayla said something about you in today's huddle" → camera push-in playback on the squad screen → premium share card composed by the existing image pipeline → archived to a 30-day Wall of Heroes.
Skeptic's fix: "9pm squad-local time" doesn't exist for a global squad — define per-user or fixed-UTC draw windows before build.
Once a week, the trainer performs a roll call voicing every opted-in member who kept their streak: "Streak check. Backender, week nine. Maya, week three. Doors open. Let's go." Stitched overnight from pre-approved name renders, capped at 12 voiced names. Lost streaks are simply unmentioned.
Why it works: hearing every regular's name weekly is the group-fitness instructor who knows the whole class — small N becomes intimacy. Lands on Monday, launching the week's second workout.
After the shout-out plays, squadmates get one "Encore" tap per day; at three encores the trainer appends a pre-rendered tag ("The squad co-signs that. Respect.") and the hero's Wall card earns a gold stamp. Displayed as identities, never counts.
Skeptic's fix: drop the Sweat reward for reacting — paying users to react turns the co-sign into a farmed signal.
The economy law that makes all of this safe for a subscription app: Sweat buys style, never status. Anything that signals achievement is earn-only.
Player identity everywhere is a composited stack: (1) Emblem portrait — Sweat-bought; (2) Metal frame — earned only via lifetime streak-weeks (banked forever, never reset); (3) Title — earned; (4) up to three Pins — keepsakes from real moments. A "Locker" screen handles equipping; all layers ship as CDN PNGs.
Why it works: at 5–10 actives everyone sees everyone daily, so a four-layer kit is instantly readable social information — who's the veteran, who came back, who splurged. Depth comes from combinatorics, not player count.
80–120 crest-style emblems from the existing AI art pipeline, priced in effort: Common ~200 Sweat (a workout) up to Legendary ~6,000 (a committed month) — a Legendary emblem is a fitness receipt. Permanent basics + a 4-item shelf refreshing every Monday, with each item's return date printed ("back Aug 12") — honest scarcity, no FOMO timers, no discounts.
Skeptic: the first durable second Sweat sink with nothing pay-to-win — but audit real Sweat earn rates before setting a single price.
Epithets: ~100 server-authored titles triggered by behavior already tracked — "The Metronome" (8 straight streak-weeks), "Dawn Patrol," "Second Wind" (five 2nd-workouts). Equipping is always the player's choice; never purchasable. Stripes & Laurels: dated micro-keepsakes minted by real moments — a laurel per shout-out, a stripe per 10 streak-weeks, an ember per comeback. Permanent; never reset.
Why it works: zero-moderation identity from real behavior; the roster reads as a cast of characters, softening hero repetition. And at low N, honors accumulate fast — thin event volume becomes rich personal history.
A reserved cosmetic line — Phoenix emblem, ember frame accent, epithet — unlocked only by completing one workout after 14+ days away. Warm trainer VO welcome; absence length never mentioned; equipping is opt-in so lapse history is never disclosed involuntarily. Win-back pushes get an honest promise of what awaits.
Why it works: aims the identity economy at the app's actual biggest population — ~900 lapsed exercisers vs 171 active. Care-over-guilt made mechanical: return is celebrated, never audited.
A persistent brass-plaque row on the squad screen: every member's Kit engraved on a plaque, visible regardless of today's activity. A plaque glows soft gold the week its owner banks the 2nd workout; otherwise it rests in brushed metal — never red, never a punishment state. Tap a plaque → that member's Locker + one-tap cheer.
Why it works: cosmetics only have value if seen — the wall guarantees a daily audience for every purchase, and fills zero-event days with warm presence instead of activity counters.
Completing a themed card set (including crafting the missing card with Sweat) mints an enamel-pin Sigil for a Pin slot. Card screens show proximity ("2 cards from the Coastal Sigil").
Skeptic's fix: derive the sets from the Seasons album chapters rather than inventing a parallel taxonomy — otherwise the "zero rework" claim breaks the day Seasons ships.
Beyond the identity/data split above, membership gets meaning through one shared ritual and NPC-carried rivalry — never player-vs-player exposure at this scale.
One shared bar per week: "X of Y members hit 2 workouts" — where Y counts only members active in the trailing 14 days, so lapsed players never make the goal impossible and are never named as missing. Progress renders as portrait chips lighting up. Completion pays Sweat for all + (post-Seasons) a bonus card pull; a Thursday "squad is one short" push attacks the Saturday trough.
Why it works: it manufactures the north-star behavior as social content — every 2nd workout is simultaneously a personal streak save, a squad contribution, and a feed event. Legible at exactly N=5–10; meaningless at 5,000. Absorbs Barn-Raising's squad-exclusive decoration-card reward (drop its escalating-target ratchet). Never surface who fell short.
Ty-vs-Xayla rivalry performed by the trainers, not the players: weekly templated crosstalk over real per-capita stats ("Xayla's crew averaged 2.1 sessions each — Ty's Squad, let's answer that"). Only ever names players positively; scripted trainer relationship beats accumulate season over season.
Skeptic's fix: set a minimum-N floor before quoting per-capita stats — "averaged 2.1" with two actives is one person's data in disguise.
The "Liveness Governor" (auto-widening time windows to keep density) resolves, at current numbers, to This-Week/everyone and stays there for a year — so just ship the static week window now and keep the governor as remote-config intent. Likewise "Class Rosters": fold a timezone-aware cohortId into the One Gym resolver (~1 week of schema work) and defer the rebalancer and named-chapter UI until growth justifies them.
The squad screen consumes events; Seasons generates them. The vetted answer interleaves them on one shared ledger — every slice ships visible value.
One append-only MilestoneEvent schema, closed enum v1: workout_completed, second_workout_of_week (the north star as a first-class server event), level_up, streak_saved, card_crafted, tier_up. Seasons later appends its events as enum values + CDN display templates — no schema change, no app update. Backfill 7 days so launch day isn't empty. Also ship the Liveness SLO (3 days): every squad-screen visit must surface ≥1 real event under 24h and ≥5 under 7 days — via window sizing only, never fabrication — and instrument whether users who witness fresh activity convert better. Makes "alive drives conversion" falsifiable.
One screen: trainer hosting, the daily broadcast, "this week so far" tiles, a 5–7-item milestone list with reactions, the shout-out stack's core (Ledger + Receipts + Speakable Names + Front Row). No leaderboards yet. A 7-day window over 5–10 actives yields 15–25 real events — honestly full from day one.
The pass + album, writing tier-ups, set-completions, and trophies into the same ledger — the squad screen gets denser with zero extra squad work, and the premium track (the actual subscription lever) lands by week 9 with the squad screen as its showroom.
Ribbon Ceremony and Held Titles, now fed by two event sources. Tag events routine/notable/epic: epics (trophy earned, album page complete, Legendary craft) get a 24–48h gold marquee card with pooled reactions and a VO sting — rarity framed as prestige. One epic on the marquee reads "something big happened here," never "nothing happened."
Rejected honestly: social-first-complete (the full squad screen starves on ~9 workouts/day and reads dead, poisoning the premium brand) and seasons-first (8+ weeks of invisible solo progress, then you build eventing twice anyway).
Five cross-cutting gaps the skeptic caught — none belong to a single feature, all bite at launch if unowned.