Home / Product / Consumer App
Affirmology Delivery App, spec v1 (the inner-orbit listening app)
Updated Jun 25, 2026 · Affirmology_DeliveryApp_Spec_v1.md
Summary. Status: PROPOSED. This is the consumer-facing app, distinct from Atlas (the team app) and the Studio (the creation workbench), but riding the SAME cloud system (Render + R2 + Cloudflare). It is the place we send the inner orbit to actually listen, react, and t
Affirmology Delivery App, spec v1 (the inner-orbit listening app)
Status: PROPOSED. This is the consumer-facing app, distinct from Atlas (the team app) and the Studio (the creation workbench), but riding the SAME cloud system (Render + R2 + Cloudflare). It is the place we send the inner orbit to actually listen, react, and talk to their blueprint.
TIMELINE (updated 2026-06-18, Jeff): we are NOT building v1 immediately. First we (a) get more starter audios ready for the launch, and (b) stand up a REAL backend and database designed to track all of this and much more as the user base expands and scales (see section 10, now a first-class pillar, not an afterthought). The 4-to-5-day estimate in section 11 holds for the consumer FRONT END once that backend exists; the backend is the part we invest in properly now so we are not rebuilding it at scale.
Working name for the cohort: The Founding Constellation (the free founding-beta tier from the product ladder). The app itself can just be "Affirmology" to them.
1. What this is, in one breath
A private, invite-only app where 20 to 40 trusted people open a beautiful library of their Affirmology audios, listen, rate and give rich feedback, see their own usage build over time, submit ideas, read their reports (and get them by email), and have a conversation with their own oracles (Sophia and the council) about their blueprint. Every tap they make teaches us what to build, what to charge for, and where the membership lines should fall.
It is NOT the public funnel and NOT the team back office. It is the felt, curated "what it is like to be a member" experience, one rung early, for the people closest to us.
2. Where it sits in the system (so we do not build a fourth silo)
- The DEMO (demo.affirmology.ai) is the locked, public first-taste. Untouched by this.
- The STUDIO (studio.affirmology.ai) is where WE create and render audios. Untouched, except that audios we approve there become the catalog this app reads.
- ATLAS is the team app (Hermes chat + full Studio), for Jeff, Sol, Colin, and builders.
- THE DELIVERY APP (this doc) is the consumer/member app, for the inner orbit. It reads the same R2 media and the same engine, but it shows a curated, polished, listen-and-react experience with no creation tools.
One backend, one media store, one auth layer, three faces. The delivery app is the consumer face.
Suggested address: app.affirmology.ai (keeps demo / studio / app cleanly separated on the same Cloudflare zone).
3. Distribution: skip the App Store for v1, ship a PWA
Recommendation: do NOT use the Apple App Store or Google Play for this version. Reasons that matter on a 4 to 5 day clock:
- App Store review takes days to weeks and can bounce us. It would blow the timeline and gives us nothing we need for 20 to 40 known people.
- We already ship PWAs. Atlas is specced as an installable PWA on the same cloud. The Studio is already mobile-first. We reuse all of it.
- A PWA installs to the iPhone, Android, and Mac home screen, feels native (full-screen, icon, splash), caches each person's audios for true offline playback (a core requirement, see section 5.5), and updates instantly with no review gate.
How we push it to 20 to 40 people: send each invitee a link. They open it on their phone, tap Share, then "Add to Home Screen," and it lives there like an app. We include a 20-second "how to install" card on first visit (with the iOS Share-sheet screenshot, since iOS hides install behind Share).
App Store is a real conversation for the PAID public launch later (trust, discovery, in-app purchase). For the inner orbit, a gated PWA is faster, fully controllable, and right.
4. Login and gating (invite-only, by email, no strangers)
Keep it simple and locked. Two options were on the table, both email-based:
- OPTION A (fastest, what Studio already uses): Cloudflare Access in front of app.affirmology.ai with an email allowlist plus one-time PIN. Zero account system to build, but the sign-in is Cloudflare's, not ours, and the profile lives at the edge rather than in our product.
- OPTION B (more app-like, slightly more build): a magic-link / one-time-code login built into the app itself, with our own users table. More control over the in-app profile and a smoother branded sign-in, more to build and secure.
DECISION (2026-06-18, Jeff): go with OPTION B. We build our own magic-link / one-time-code login on our own users table. This is the right call given the scale-ready backend in section 10: we are already standing up a real person and membership model that owns identity, tier, entitlements, and profile, so the auth should live in OUR system, not at the Cloudflare edge. It gives a branded sign-in, a real in-app profile, and a clean path straight into paid signup later (the same login becomes the paid-account login; no migration off Cloudflare Access). Invite-only is enforced by our own invite / allowlist table: only emails we have invited can request a login code, so it stays locked to the inner orbit.
How it works: a person enters their email, we check it against the allowlist, and if invited we email them a magic link (or a 6-digit code) via Resend (already our verified sender). Clicking it (or entering the code) creates a session token tied to their person record. No passwords. Standard, secure, well-trodden pattern; the security work is the usual care around token expiry, single-use codes, and rate-limiting, which we build into the window. Cloudflare Access can still sit in front during the closed beta as a belt-and-suspenders outer gate if we want, but our login is the system of record.
5. The core experience (what a member sees)
Brand language is locked: deep emerald, gold, cream; Cormorant Garamond headlines, Inter body, JetBrains Mono tags; no em dashes anywhere; calm, cinematic, "let it land" pacing. Reuse the Studio/site tokens.
5.1 Home
A warm, personal landing: "Welcome back, [first name]." Their oracle's one-line greeting. Quick continue-listening row (resume the last audio). The category grid below. A subtle nudge to whatever is new since they last came (a freshly added audio, a reply from their oracle).
5.2 The Library, organized by category
The heart of the app. Audios grouped into clear categories (the same category model the Studio already uses, so the catalog flows straight through). Starting categories, drawn from what we already make:
- Foundational / Know Thyself (the natal "this is who you are" pieces)
- Before Bed / Subconscious reprogramming
- Morning / Activation
- Astrological Moment (transit-aware, "the sky right now")
- Movement (walk, run, gym)
- Relationships / Synergy (later, once companion audios are in)
- Journeys (deeper, multi-part, later)
EVERY audio is personal. This is non-negotiable and it is our distinction: there is never a generic audio, never a piece that is not built from the listener's own chart. Everything is custom to the person.
So the right way to think about the catalog is SHARED STRUCTURE, PERSONAL CONTENT (the same rule the whole system runs on):
- The starter SUITE is a defined set of audio TYPES / structures that everyone in the cohort receives, for example a Foundational "Know Thyself" piece, a Before-Bed reprogramming piece, a Morning Activation piece, an Astrological-Moment piece. The SET is the same across the cohort.
- Each person's version of every audio in that set is rendered from THEIR OWN chart. Two people both have a "Before Bed" audio; the words, placements, gifts, and images in each are entirely their own.
That is what makes the feedback comparable without ever sharing content: everyone is reacting to the same STRUCTURE (so we can compare "how did the Before-Bed structure land across people"), while each person hears only their own chart-driven audio. Apples-to-apples on the structure, never on the file.
Each audio card: title, category tag, length, a one-line "what this is for," and the person's own state (new / in progress / listened, with their star rating once given). The whole library is "yours," because all of it is.
POSSIBLE LATER, NOT DECIDED (Jeff, 2026-06-18): audios a member shapes themselves through the oracle chatbot. This is NOT a confirmed v1 feature. The likely shape is a time-limited preview (a week or two) of the advanced membership tiers, offered AFTER a member has experienced and given feedback on the first suite, so they get a taste of self-directed custom creation as part of testing the upgrade path. Even then, every such audio is still 100 percent chart-driven. See sections 7 and 9.
5.3 The Player (make it a real experience, not a file)
- Big, calm player. Cover art / motif, title, the gentle ambient/audio-reactive visual we already prototyped for the listening moment (optional, dim toggle, respects reduced-motion).
- Tap-to-begin ritual opening (the audio-unlock plus a breath cue), consistent with the demo's ritual feel.
- Standard transport (play/pause, scrub, back 15s, speed), background audio so the screen can sleep, and a "lock screen / now playing" presence on the phone.
- Below the player: the short "why this is for you" note, the feedback panel (section 6), and a link to the full report (section 8).
- When it ends: one beat of afterglow, THEN a soft prompt to rate it and, where relevant, "talk to your oracle about this" (opens the chat seeded with that audio's theme).
5.4 Usage cataloging (passive, automatic)
Every play is logged: which audio, when, how far they listened (started / partial / completed), how many times, and listening streaks. The member sees a gentle personal view ("You have listened 14 times this month; your most-returned-to audio is [X]"), which itself is a retention hook. WE get the real signal: what gets replayed, what gets abandoned mid-way, what categories pull people back. This is some of the most valuable data in the whole exercise.
5.5 Offline listening (required)
Each person's audios must be available OFFLINE. This is a core requirement, not a nice-to-have, because the best listening moments (a flight, a walk with no signal, pre-sleep with the phone on airplane mode, the gym) are exactly when people lack connection, and a meditation app that buffers or fails offline breaks the spell.
How it works:
- Audios are PUSHED to the app and downloaded to the device. A person's own audios (and the shared suite available to them) cache locally so they play instantly with no network.
- Default behavior: auto-download a person's personal audios and the current starter suite on first login / when added, over Wi-Fi, so "it is just there." Offer a per-audio and per-category download toggle and a "downloaded only" view, plus a clear storage indicator and a way to remove downloads.
- When new audios are published to a person, the app fetches them in the background so they are ready offline before the person even opens that screen (the "pushed to the app" feel).
- Playback, including the ritual open and transport, works fully offline. Events recorded offline (plays, progress, ratings, feedback) are queued locally and SYNCED when the device reconnects, so the usage and feedback data is never lost (this matters for section 10's event spine).
- The report PDFs can cache for offline reading too; the oracle chat and email-push naturally require connection and degrade gracefully (queued or "available when online").
Technical path (consistent with the PWA in section 3): use the service worker plus the Cache Storage / IndexedDB APIs to store the audio files and metadata on-device. R2 stays the source; the device holds a synced copy. This is standard PWA offline-media territory and well within the stack. Native app stores are still NOT required for this; a PWA caches media offline fine.
This is also why the app is a genuinely great LISTENING place, not just a delivery mechanism: instant, reliable, offline-first playback of audios made just for you.
6. Feedback and ratings (detailed, low-friction, from everywhere)
We want rich reactions without making it a chore.
- QUICK: a 1-to-5 star rating and an optional one-tap "comfort vote" (how seen/soothed it made them feel), matching the Studio's 1-to-5 comfort model so the two systems speak the same language. A short NOTE field sits right next to every rating (Jeff: ratings PLUS notes on everything), so a star is always invitable into a specific "what to change" note we can act on per audio.
- DEEP: a free-text box ("What landed? What missed? What do you wish it said?") and a VOICE NOTE option (record a reaction, we transcribe it). Voice is the lowest-friction way to get rich feedback and people say more out loud.
- Structured prompts to make feedback comparable: did this feel like you? (yes / mostly / not quite), would you listen again?, would you share it?
- Feedback is reachable from EVERY screen (a persistent "give feedback" affordance), not buried, and it can accept a long pasted reaction too. (This mirrors a Studio lesson: feedback must be everywhere and accept long input.)
- Each feedback item is tied to the audio, the person, and their chart, so we can see patterns ("the before-bed pieces over-index on comfort for emotional-authority people," etc.).
PROACTIVELY SOLICIT THE MISSING FEEDBACK. People listen and forget to rate, and an unrated listen is a hole in exactly the data we are here to collect. The event spine makes this easy: any audio with a play_completed (or a substantial play_progress) but no rating_given is a pending-feedback item. The app then nudges, gently and without nagging:
- A quiet "you listened to [X], how did it land?" prompt on the next app open (one tap to rate, optional to say more), shown one beat after they arrive, never on top of a fresh listen.
- A small "needs your take" row on Home listing what they have heard but not yet rated, so it is easy to clear in a moment.
- An optional, low-frequency email or push nudge for audios still unrated after a while ("Two of your audios are waiting for your reaction"), capped so it stays warm, not pestering.
- Ask once meaningfully, then stop. If they skip, do not keep hounding the same audio; respect the "let it land" tone.
All ratings and feedback flow into the same store the Studio reads, so the team sees member reactions next to the build report for each audio.
6.5 Shape Affirmology (upcoming features, voting, and suggestions)
A dedicated surface where members help steer what we build. This both deepens their investment (their effort and energy goes into the product, which is exactly the viral, ownership feeling we want from a founding cohort) and gives us a clean, rankable signal of demand.
Two parts, one place:
- UPCOMING FEATURES (a public roadmap board): we post features and audios we are considering. Members upvote the ones they want most. We see, ranked by real votes, what to build next. Items can carry a status (considering / planned / building / shipped) so members watch their votes turn into reality, which is its own retention loop.
- SUGGEST SOMETHING NEW: members propose brand-new ideas (an audio they wish existed, a feature, a category). Other members can upvote those too, so the best community ideas rise on their own. This absorbs and replaces the simpler "submit ideas" box from section 6: an idea is just a suggestion that can collect votes.
Each item ties to the person and (where relevant) their chart, so "who wants what" is analyzable alongside the chat and usage data. Voice-note suggestions are welcome (transcribed). This is a lightweight build (a votes table plus a roadmap_item / suggestion table, see section 10) and pays for itself in roadmap clarity. For scale, this is the same pattern paid tools like Canny or Featurebase sell; we build it natively so the data lives in our system, not a third party's.
Jeff's lean is a WhatsApp channel over an in-app discussion forum, and I agree for this stage. The reasoning:
- A founding cohort of 20 to 40 is too small to keep an in-app forum feeling alive. Empty threads read as a dead product. WhatsApp gives instant community energy where these people already are, with zero build and the highest day-one engagement.
- WhatsApp also gets us closer to people for warm, founder-led, concierge-style contact, which fits how Jeff runs the Miami community.
- The one real cost of WhatsApp is that the conversation lives OUTSIDE our system, so it is not captured or analyzable the way in-app data is. We mitigate that by keeping the structured, valuable signal inside the app on purpose: the oracle chat, feedback, usage, and the Shape Affirmology voting/suggestions board. WhatsApp carries the social warmth; the app carries the data we need.
Two WhatsApp shapes to choose between: a CHANNEL (one-to-many broadcast, great for announcements and "new audio is live," low noise, little back-and-forth) or a GROUP (many-to-many, real community feel, but gets noisy and caps out as it grows). For a founding cohort, a GROUP is the better community feel now; switch to a CHANNEL for broadcast plus smaller groups as the base scales.
Build the in-app forum LATER, when (a) the base is large enough that threads stay warm on their own, or (b) we specifically want that discussion data inside our system for the membership product. Until then it is build cost and moderation we do not need. Decision flagged in section 12.
7. The Oracle chatbot (talk to Sophia and the council about your blueprint)
This is the viral, sticky, and most strategically revealing feature. A member can open a chat and talk to their oracles about their own blueprint.
7.1 What it is
A chart-grounded conversation. The member is talking to Sophia (the synthesist, the default voice) and can be handed to the right specialist oracle for depth: Hermes (Western astrology), Parashara (Vedic), Pythagoras (numerology), Prometheus (Human Design), Athena (Gene Keys), and the relationship lenses (Eros, Concordia, Hestia) when they ask about a relationship and provide the other person. Apollo conducts behind the scenes; the member mostly experiences Sophia plus whichever specialist is relevant.
It is grounded in THEIR computed chart and the tier-walled corpus (A/B sources only), so it speaks to who they actually are, never generic horoscope filler. It leads with recognition, then offers the organized information, the same order the whole product follows.
7.2 Hard guardrails (decide the line here, section 9 expands)
- Recognition and reflection, not prediction, fatalism, diagnosis, medical or financial advice, or therapy. Mythic framing is craft, not literal claim.
- STYLE IS SHARED, CONTENT IS NEVER SHARED: the chat may only use this person's own chart and corpus. No other person's chart data ever appears.
- The chatbot can TALK about the blueprint freely. It does NOT generate or hand over finished custom audios in v1 (that capability is the upsell we are deliberately metering, see section 9). It can, however, let a member REQUEST an audio or capture "I wish there were an audio for X," which feeds our queue.
- APP SUPPORT stays OUT of the oracle experience (Jeff, 2026-06-24). The main oracle chat stays fun and about astrology/blueprint. Support (bugs, "how do I," account questions) is handled separately, either by a dedicated "Support Oracle" or by context-routing (the system recognizes a support question and answers it or routes it, possibly behind an explicit "make a request"), so support never muddies the oracle character. Exact mechanism is a design choice made during the chatbot build.
- Tier-C copyrighted material stays benchmark-only, never surfaced.
7.3 Why we are doing it (the intelligence flywheel)
Every conversation is logged and analyzable (with the cohort's knowledge; this is a beta of trusted people). We learn, in their own words: what they keep asking about, what they want, what they desire, what revelations land, where they get emotional, what they would pay to go deeper on. That directly answers the membership-design questions Jeff raised:
- What belongs in the chatbot at each tier.
- Where custom-audio delivery should sit (and how metered).
- What new audios and categories to build next.
We should add a lightweight "insight digest" for the team (weekly): top themes, most-wanted audios, standout quotes, emotional hot-spots. (This pairs with Echo, the cultural-listener role, but pointed inward at our own people.)
8. Reports (in-app and pushed to email)
Members can see their reports inside the app and send them to themselves by email.
- IN-APP: each person's Cosmic Blueprint report (and any per-audio Sacred Audio report) is readable in the app, rendered on brand (we already have the premium report engine with the real embedded fonts). Audios that have a report show a "read your report" link from the player.
- EMAIL PUSH: a "send me this report" button emails the PDF (via Resend, the same sender we use; affirmology.ai is already verified). Also a natural place to (optionally) email "your audio is ready" links.
- Source of truth is R2: reports are already produced as PDFs and stored per job in R2, so the app links/sends the existing artifact rather than regenerating.
Jeff's strategic questions, framed so the beta produces the answers. The product ladder (draft) is: Starter Kit (~$50 to $88, 10 to 12 audios, steps 1 and 2), Base Membership "Inner Orbit" (~$15 to $22/mo, transit updates plus a chart-grounded chatbot plus a few journeys), Premium "The Constellation" (deeper journeys, a more robust chatbot, a couple of custom audios), and Affirmologists (pro creators).
The chatbot is the clearest lever, so define it as a tiered capability:
- STARTER KIT: a TASTE of the chatbot. Limited turns or a few guided "ask your blueprint" prompts. No custom audio. Enough to feel the magic and want more.
- BASE (Inner Orbit): the chart-grounded chatbot as an everyday companion (conversation, reflection, "what does my chart say about X"). Still no on-demand custom audio; maybe the ability to REQUEST one as an upsell.
- PREMIUM (The Constellation): a more robust chatbot (deeper, more memory of the person, the specialist oracles, relationship lenses) PLUS a metered number of custom audios the chatbot can help shape and deliver.
- AFFIRMOLOGISTS: lab access, create custom audios for their own people.
Where to draw the custom-audio line (the key decision the beta should settle): custom, chart-driven audio generation is our highest-cost, highest-value act. Lean recommendation, to validate: the chatbot freely TALKS at every tier; it only DELIVERS custom audio at Premium and above, and even there it is metered (a credit count), with single one-off custom audios sold as à la carte upsells from any tier. The beta's chat logs and "I wish there were an audio for X" captures tell us demand, willingness, and the right meter. The app instruments exactly this: it tracks every custom-audio wish and every place a member hits the "talk only, no audio yet" wall, so we can price the wall correctly.
TIME-LIMITED ADVANCED-TIER PREVIEW (Jeff, 2026-06-18, not yet decided): rather than a standing feature, we may give founding members a one-to-two-week TASTE of the advanced tiers (the robust chatbot plus self-shaped custom audio) AFTER they have listened to and given feedback on the first suite. This both rewards their feedback and lets us watch real upgrade behavior (do they use it, what do they make, would they pay) on a fixed clock. Entitlements and metering in section 10 already support a time-boxed grant, so this is a config, not a rebuild. Everything created in the preview is still fully chart-driven.
10. Backend and data architecture (built for scale, the real investment)
This is the part we build properly NOW, before the consumer front end, because it has to carry us from 40 founding members to a paying user base without a rebuild. The Studio's SQLite store is fine for the team workbench; it is NOT the system of record for a scaling consumer product.
10.1 Principles
- One system of record for people, entitlements, catalog, and every event, separate from the creation tooling. The Studio and this app both talk to it; neither owns the other's data.
- Design the schema for the FULL product ladder now (free founding tier through Starter, Inner Orbit, Constellation, Affirmologists), even though v1 only uses the free tier. Tiers, entitlements, and metering (custom-audio credits, chatbot limits) are first-class from day one so we never retrofit billing logic.
- Capture events, not just state. Every play, rating, chat turn, vote, and report open is an append-only event. State (current rating, play count) is derived. This is what lets the analytics and the membership-research flywheel actually work as we scale.
- Keep media in R2 (already true). The database stores references and metadata, never the audio bytes.
10.2 Recommended stack
- DATABASE: a managed Postgres as the system of record (Render Postgres sits right next to the existing
affirmology-studio-api service, so it is the least-friction choice; a Cloudflare-native path on D1 is the alternative if we want everything on Cloudflare). Postgres gives us real relational integrity, JSON columns for flexible event payloads, and a clean road to read-replicas and analytics later.
- API: extend the existing FastAPI service (or a sibling consumer API) on Render, behind the same Cloudflare edge and auth. Shared engine, shared media, separate consumer endpoints.
- EVENTS / ANALYTICS: start simple (an
event table in Postgres). When volume grows, fan those events to a proper analytics store. Do NOT block v1 on a warehouse; do make every meaningful action emit an event row now so the history exists when we want it.
10.3 Schema (the tables, designed for scale)
- person: id, email (identity), name, birth data, computed-chart reference, created-at, source (how they joined), status.
- membership / entitlement: person, tier, status, started/renewed/expires, and metered balances (custom-audio credits, chatbot allowance). Drives what each person can see and do.
- audio: id, OWNER (person, always; every audio is chart-driven and belongs to one person), structure / type id (the shared structure it was built from, e.g. before-bed), category, title, length, R2 media + report keys, tier-visibility, "what this is for," source (team-rendered suite vs member-shaped, if/when that exists), published-at. There is no "generic audio" row; the structure is the only thing shared across people.
- structure: id, name, category, description. The shared, named audio types (matches the Studio's structures). Lets us compare feedback "by structure" across people without sharing any content.
- category: id, name, order, description, tier-visibility.
- event (append-only, the spine): id, person, type (play_started / play_progress / play_completed / rating_given / feedback_left / chat_turn / vote_cast / suggestion_made / report_viewed / report_emailed / wall_hit_custom_audio / etc.), target (audio/feature/etc.), payload (JSON), timestamp. Everything below can be derived from this, but we also keep the convenience tables for fast reads.
- feedback: person, audio, star rating, comfort vote (1 to 5), structured answers, free text, voice-note transcript, timestamp.
- roadmap_item: id, title, description, status (considering / planned / building / shipped), created-by (team or member-promoted), created-at.
- suggestion: id, person, text or voice-note transcript, optional linked audio/category, status (can be promoted to a roadmap_item), created-at.
- vote: person, target (roadmap_item or suggestion), value, timestamp. (Unique per person+target so votes are clean and rankable.)
- chat_session and chat_message: person, oracle(s) involved, transcript, plus derived tags (themes, wants, desires, revelations, emotional markers) for the insight digest. Also flags every "custom-audio wish" and every metered-wall hit, since those are the pricing signals.
- report_access: person, report, viewed-at, emailed-at.
- invite / allowlist: email, status, invited-by, redeemed-at (the membership gate, see section 4; even with Cloudflare Access we keep our own record of who is in).
10.4 What the backend unlocks beyond v1
Because the schema carries tiers, entitlements, metering, and a full event history from the start, the same backend later powers: paid signup and billing, the Starter Kit and membership tiers, the Affirmologists' member lists (their people create accounts and give email, which is the growth-engine data capture), the team insight digest, and the analytics that tell us what to build and what to charge. We invest once here so the consumer app, the paid product, and the creator economy all read from one place.
Privacy posture for the cohort: these are trusted founding members; we are explicit and warm that the beta is observed so we can build. Keep it clean and respectful, keep the tier-walls and content-never-shared rules absolute, and keep the consumer data cleanly separated and access-controlled from the start (it will hold real customer PII as we scale).
11. Build plan for 4 to 5 days (reusing what exists)
PREREQUISITE (done first, not part of the 4 to 5 days): the scale-ready backend and database from section 10 (Postgres system of record, the schema, the event spine) and more starter audios approved in the Studio. The day-by-day below is the consumer FRONT END once that backend exists. Most hard parts already exist (cloud engine, R2 media, charts, reports, brand UI), so the front end is a curated consumer surface plus the chat and offline layers.
- DAY 1: Stand up app.affirmology.ai as a PWA shell on the cloud (manifest, service worker, icon, install card). Build our own magic-link / one-time-code auth (Option B) against the backend's
person + invite tables; log in, load the right person, pull their catalog.
- DAY 2: Library by category plus the real Player (ritual open, background audio, now-playing, the optional ambient visual) reading R2 media. Passive play events. OFFLINE caching (service worker + Cache/IndexedDB): auto-download personal audios + the starter suite, downloaded-only view, offline playback with queued event sync.
- DAY 3: Feedback and ratings everywhere (stars, comfort vote, structured prompts, free text, voice-note plus transcription). The Shape Affirmology board (upcoming features voting + new suggestions with upvotes). Personal usage view.
- DAY 4: Oracle chatbot wired to the council (Sophia plus specialists), grounded in the person's chart and the A/B corpus, with the guardrails and the "request an audio / wish" capture. Reports in-app plus email-to-self via Resend.
- DAY 5: Polish, the team insight digest (v1 can be a simple query/export), set up the WhatsApp group, seed the 20 to 40 people, install-and-onboard test on a real iPhone and Mac (offline included), then invite the first members.
Cut lines if time runs short, in this order to drop: the ambient listening visual (player works without it), voice-note feedback (keep text), and the automated insight digest (we can query the data by hand for the first week). The audio library WITH offline playback and the oracle chatbot are the things that must ship.
12. Open decisions for Jeff (so v1 does not stall)
- Login: DECIDED (2026-06-18) - Option B, our own magic-link / one-time-code auth on our own users table, invite-gated by our allowlist. See section 4.
- Cohort and catalog: who are the first 20 to 40 (the Founding Constellation list), and which exact audios make the starting suite (the test-suite keepers plus which new ones, per category)? Personal audios per person, or shared suite only at first? (Jeff is readying more starter audios before the build.)
- Community shape: confirm WhatsApp GROUP to start (recommended) vs CHANNEL, and confirm the in-app forum is deferred. See section 6.6.
- Offline default: auto-download a person's audios + the starter suite on first login over Wi-Fi (recommended), or download-on-demand only? See section 5.5.
- Chatbot line for the BETA specifically: talk-only for everyone in the beta (cleanest for learning demand), or let some members trigger a custom audio so we can watch that behavior too?
- Observation consent wording: how explicit do we want to be with the cohort that chats and usage are studied to build the product (recommend: clearly and warmly, since they are founders)?
- Naming: call the app simply "Affirmology" to members, with the cohort named "The Founding Constellation"? Confirm.
- Voice for the oracle chat replies: text-only in v1, or do we want spoken oracle replies (ElevenLabs / the Fish A-B) later? (Recommend text in v1, voice as a fast-follow.)
Bottom line: ship a gated PWA on the existing cloud, reuse the engine, charts, R2 media, reports, and brand, and spend the new build budget on the three things that make it an experience: a real listening library, feedback that is everywhere and rich, and a chart-grounded oracle chat that doubles as our membership-research instrument. No App Store needed for the inner orbit; that conversation belongs to the paid public launch.