Start here

The whole flow, and the three forks I need you to settle

This walks the entire path a person takes — from the first paint of /start through gratitude, the fork, free browsing, account creation, the sharing preference, and buying a tier. Every screen is clickable. Where a real decision exists, both options are mocked side by side rather than chosen for you.

1 · anonymous
/start, first paint
Gratitude already floating. Gate in the middle.
2 · anonymous
Submit gratitude
No account. Text lands in community_records.
3 · anonymous
Fork door
Learner open. Creator locked to Catalyst.
4 · anonymous
Browse the learning side
Free, no login. Nothing asked yet.
5 · becoming a member
Account created
Triggered by purchase or by the creator side.
6 · member
Onboarding beats
Welcome → sharing preference → first step.
7 · member
Purchase a tier
Three-step: listing → account → Stripe → receipt.
8 · returning
Daily gate + fork
Every page. Onboarding never re-runs.

What I checked before drawing anything

Sources: live curl against prod and the staging tunnel; functions/api/community-gratitude.js; the opt-in component and its spec; project memory on the gate, the fork, auth boundaries, and the three-step checkout.

Screen 1 · anonymous

/start, at first paint

Gratitude is on screen the instant the page renders — no hover, no scroll, no interaction. Use the switches to see the attribution treatments against the three data states that actually occur.

Attribution treatment
Data state
lab.joyos.global/start
J

What are you grateful for today?

One line is enough. This is the door.
I'm grateful for…
Recommended · A

First name only

"— Marcy" under the line. Warm, unmistakably a person, low exposure. Gratitude is written in a soft, reflective register; a surname on it reads like a directory entry, and it is the version a member will regret. First name is the smallest treatment that still satisfies "show who submitted it."

Alternate · B

Initial mark

A small gold-ringed monogram plus first name. Reads more designed and gives the floating layer a second visual rhythm, but it adds a graphic element to a background whose whole job is to stay quiet. Offered because it is the one that most looks like a product; A is the one that most looks like a community.

Blocker, not a style question

Attribution cannot be rendered today for any existing entry. The API returns { text } with no author, and anonymous gate rows carry the service identity rather than a person's. Shipping attribution means: add an author field to the record write, expose it on GET, decide what an anonymous entry displays, and accept that every row already in the table is permanently unattributable and will render as it does today. Whatever you pick below applies going forward only.

The sparse state is the real state

Prod is serving one entry against a twelve-card layer right now. "Visible from the start" is therefore a data problem before it is a design problem. Three ways to handle it, and this needs an answer too — flip the switch above to Sparse and Empty to see the difference:

Also worth naming: staging's feed is currently test strings. Whatever ships needs the junk cleared, or the wall will attribute e2e fixtures to real names.

Screen 2 · anonymous

They submit — with no account

This is the moment that breaks the tidy story. The person has just written something personal, and there is nobody to attach it to.

lab.joyos.global/start · after submit
J

Received.

Your gratitude joins the wall — signed only as a guest, because we don't know your name yet.
What an anonymous entry shows on the wall
Recommended · A

Sign it "— a guest"

Keeps every card structurally identical, so the wall doesn't look half-finished, and it quietly tells a visitor that named cards belong to members. No data is collected, nothing changes about the anonymous path, and it composes cleanly with the free-browsing rule.

Alternate · C

Ask for a first name at the gate

One optional field beside the gratitude box. Gets attribution on anonymous entries immediately and populates the wall fastest — but it adds friction to the single most important door in the product, and an unverified free-text name is a moderation surface. Offered because it is the only option that makes anonymous entries genuinely attributed.

Screen 3 · anonymous

The fork, still with no account

Gratitude and the fork travel together — the standing rule is that wherever gratitude is required, the lane choice is required too. Learner opens freely. Creator is visible but locked, per the Catalyst-only rule.

lab.joyos.global/start · fork
Water · Yin

Learning Lab

Browse everything. No account, no cost, nothing asked of you yet.
Fire · Yang

Creator Studio

Build and sell inside the Lab.
🔒 Joy Catalyst only

Unchanged from the locked fork-door design and the Catalyst hard rule: the Creator wedge is never hidden, it reveals an upgrade path instead of an enter button. Nothing here is new; it is drawn so the composition with onboarding is visible.

Screen 4 · anonymous

They browse the whole learning side, still anonymous

The hard rule is that learning-side browsing needs no login. So there is no account, and therefore nowhere to store a sharing preference. This is the structural fork you have to settle.

lab.joyos.global/learning-lab
Learning Lab
Browsing as a guest. Nothing has been asked of you.
EPIC: Ground
Twelve-month practice. Free preview of the first module.
Joy Discovery
Sixteen attributes, eight archetypes. Take it free.
Community Wall
Read what everyone is grateful for.
Recommended · A

Onboarding begins at account creation. Guests are never onboarded.

An anonymous visitor gets no onboarding step and no preference — their entries render under the anonymous treatment chosen on screen 2. The sharing question is asked once, at the first moment a real person exists to attach it to. This preserves free browsing exactly as specified and keeps the preference honest: it is a member setting, not a guest cookie.

Alternate · B

Store a guest preference locally, migrate it at signup

Ask at the gate, hold the answer in local storage, adopt it when an account appears. Gives guests real control — but the preference is device-bound, silently lost on another browser, and creates a second write path for the same flag, which is exactly the kind of parallel path that drifts. Offered because it is the only option where a guest's choice is respected before signup.

Option C, for completeness: require an account to submit gratitude at all. It resolves everything cleanly and directly violates the free-browsing rule, so it is listed and not recommended.

Screen 5 · becoming a member

An account appears — one of two ways

Both triggers land in the same place, so onboarding has one entrance rather than two.

Trigger 1

They buy something

The account is created inside checkout, step two of the three-step flow. A free Joy Seeker account is created alongside the purchase so the dashboard, profile and community are available the moment they return from Stripe.

Trigger 2

They want the Creator side

The locked wedge sends them to plans; buying Catalyst is the same checkout. Creator access is a tier consequence, not a separate signup.

In both cases the person lands back in the app authenticated for the first time, and the onboarding beats run — which is the next screen, and where the sharing question lives.

Screen 6 · member · the decision that matters

The sharing screen, both defaults, side by side

You said "unless they've opted out," which makes public attribution the default. What already ships is an opt-IN, default off, whose own comment reads "silence is not consent." Both are drawn below with the exact wording each would carry. I have deliberately not chosen.

Preview the member's experience
lab.joyos.global/app · onboarding step 2 of 3
Default: sharedwhat you asked for

The member who reads nothing gets published

Someone who clicks Continue without reading has their gratitude, and their first name, on a public wall that unauthenticated strangers see. Gratitude is written in a reflective, often vulnerable register. It also reverses a shipped default and a stated position that silence is not consent, so anyone who accepted the current OFF default would need their state preserved rather than flipped underneath them.

The wall fills fast. That is the real argument for it — the whole feature only works with volume.

Default: privatewhat ships today

The member who reads nothing stays private

Nothing is published without a deliberate act. Matches the existing component, the existing reducer, and the existing spec, so no migration and no reversal. The cost is real and immediate: a mostly-empty wall, which is the exact problem you are trying to solve, and it needs the seeding answer from screen 1 to compensate.

A third shape, if you want the volume without the exposure

Default the text to shared and the name to private. Everyone's gratitude joins the wall immediately; the attribution line is what requires a deliberate opt-in. The wall is full on day one, nobody is named without choosing it, and "visible from the start" is satisfied without a privacy reversal. This is the option I would take if you want one recommendation from me.

Whichever you pick, the wording above is the wording that would ship — the copy changes materially between the two, so approving the default is also approving the sentence.

Screen 7 · purchase

Buying a subscription

Three steps, per your standing preference: the listing, an account-creation modal, a handoff to Stripe's hosted page, and a receipt on return. Card details are never inline.

lab.joyos.global/app/settings · plans
Choose your plan
Annual plans. Cancel anytime.
Joy Seeker
$5.97 /month
Hidden at launch — shown here only so the mockup is complete.
Most popular
Joy Activator
$297 /year
The full EPIC year, Joy Discovery, community, dashboard.
VIP
Joy Catalyst
$597 /year
Everything in Activator, plus the Creator Studio and selling in the marketplace.

Open question worth naming: buying Catalyst is what unlocks the Creator side, so the upgrade path from the locked wedge and the plans page are the same purchase. If you want a distinct "become a creator" narrative around that purchase, say so — the mockup currently treats it as one flow.

Screen 8 · returning

Day two, and every day after

The gate is global — it fires on every page, and the fork travels with it. Onboarding does not.

lab.joyos.global/app/anything → /start
J

Welcome back, Marcy.

Today's gratitude, then straight where you were going.
I'm grateful for…

What repeats daily

  • The gratitude gate, on whatever page they were heading to.
  • The lane choice, satisfied from their stored preference and re-promptable, not re-asked from scratch.

What runs exactly once

  • The welcome beat.
  • The sharing preference.
  • The first-step coach.

Each beat is dismissed per member and persisted, matching how the existing onboarding components already gate themselves. A returning member sees the gate, not the onboarding.

One caveat to flag: today's beats self-gate partly on browser local storage. Clearing storage or switching devices can re-show a beat. If a member re-seeing the sharing question would be a problem — and with a privacy preference it might be — the dismissal needs to live on the user record, not the browser.

Approve

Eight decisions. Reply "1 A, 2 yes, …" and I'll build it.

Same list as the companion doc. Recommendations are marked.

1Which default for sharing gratitude publicly?contradiction
A — Shared by default, opt out. What you asked for; reverses the shipped opt-in and publishes anyone who doesn't read the screen.
B — Private by default, opt in. What ships today; keeps the wall thin.
C — Recommended. Text shared by default, name opt-in. Full wall on day one, nobody named without choosing.
2Attribution treatment on the floating cards?
A — Recommended. First name only, "— Marcy".
B — Initial monogram plus first name.
C — Full name.
3What does an anonymous guest's entry show?
A — Recommended. "— a guest".
B — No attribution line at all.
C — Ask for an optional first name at the gate.
4Where does onboarding happen, given the learning side needs no auth?structural
A — Recommended. At account creation. Guests are never onboarded and have no preference.
B — Guest preference in local storage, migrated at signup.
C — Require an account to submit gratitude. Violates free browsing.
5The wall is nearly empty on prod. How do we fill it?data, not design
A — Render only what exists; one card floats alone.
B — Seed with real gratitude from Kristin and early members. Needs her to write them.
C — Recommended. Card count follows real entry count, with a quiet line at the base until it fills. Compatible with B.
6Clear the test-fixture entries from the community feed before attribution ships?
Yes — Recommended. Staging's feed is full of "Wall UI check — e2e-…" strings. With names attached, that becomes attributed junk.
7Move the onboarding-beat dismissal from browser storage onto the user record?
Yes — Recommended. Otherwise clearing storage or switching devices re-asks a privacy question that was already answered.
8Is buying Catalyst the whole "become a creator" story, or does it need its own moment?
A — Recommended. One purchase, one flow, as mocked. Creator access is a tier consequence.
B — A distinct creator-onboarding beat after the Catalyst purchase.
Carried forward regardless of the answers

Attribution needs an author field written at record time and exposed on GET /api/community-gratitude, which returns { text } today. Every existing row is permanently unattributable — anonymous gate entries are stamped with the service identity, not a person. Attribution therefore applies to new entries only, and the wall will be a mix of named and unnamed cards for as long as the old rows are in it.