Media
Official Instagram import via Meta OAuth
Replace the committed Instagram snapshot with an official API import, scheduled refreshes, R2 copies, and manual curation controls.
A live tracker for what is shipped, what is active, and what is queued next across the Fanful creator platform, agent surfaces, and mobile apps.
GitHub issue labels ยท updated 3:54 AM
Workstream
The fanful.net marketing site, creator admin tools, fan-facing pages, commerce flows, agent-readable routes, and shared APIs that native apps consume.
Roadmap stage
Useful sparks that might become real once a dependency or user need gets sharper.
Media
Replace the committed Instagram snapshot with an official API import, scheduled refreshes, R2 copies, and manual curation controls.
Commerce
Onboard each musician as a connected account, route money directly to artists, and collect a platform fee if Fanful becomes a business.
Roadmap stage
Committed roadmap work that exists, but is not the next thing to pull.
Qa
Parent: 1499 Shared contract: 1500 Web: 1501 iOS: 1502 Android: 1503 Goal Prove feature parity for the Discord/Slackgrade live chat bundle across web, iOS, and Android. Scope Cr...
Live
Goal Bring Fanful text live chat up to Discord/Slackgrade parity across web, iOS, and Android for creator communities. In this issue, "community" means the Fanful community scop...
Commerce
Parents: 925, 926, 534 Native dependents: iOS 925 and Android 926. Define and implement the shared backend contract for creator/admin Stripe Product, Price, tier, and entitlemen...
Media
Mark observed that changing track on one phone was slow to update on another while logged in as the same listener on iPhone and Android. Determine whether Durable Object/realtim...
Admin
Context Mark asked Goal Runner to keep periodically testing the real Fanful multiplayer experience across all available surfaces at the same time: web in Brave iOS through iPhon...
Admin
Motivation Creators need to define membership/support/product tiers once and have those tiers drive access across the website, native apps, realtime rooms, live chat, paid webin...
Admin
Motivation 504 mixes the first lessonbooking slice with later commercial policy work. Keep the first slice focused on fixing the current booking path and basic artist availabili...
Media
Captured from Mark's crossplatform listening feedback in the Codex iOS app session on 20260511. Problem Mark wants two distinct crossdevice behaviors: For one user logged in on ...
Roadmap stage
Committed follow-ups that are queued behind the active work.
No next items right now.
Roadmap stage
Current branches and PRs. These should move as GitHub issue labels change.
No active items right now.
Roadmap stage
Shipped work, newest first, with screenshots where the change is visual.
Qa
Context Android has 1261 as a durable featurepromise parity audit against the public Fanful feature set. The web app has shipped many individual slices, but there is not yet an ...
Live
Parent: 1501 Shared contract: 1500 Goal Add a visible web publisher/admin notification center so artist admins can review creatorappropriate notification events from the web app...
Live
Parent: 1501 Related: 1499 Goal Finish the web UI slice for community custom emoji parity now that the API, storage, reaction persistence, usage analytics, and executable API jo...
Live
Parent: 1501 Shared contract: 1500 Goal Give web listeners an accountlevel notification center for the same reaction, reply, scheduled live show, and donationthanks event catego...
Live
Parent: 1501 Shared contract: 1500 Goal Expose the shared communitychat system emoji reaction set in the web live/community chat UI instead of limiting web listeners to the lega...
Live
Parent: 1501 Shared contract: 1500 Parity parent: 1499 Problem The shared communitychat contract already defines realtime typing presence and native Android/iOS have evidence fo...
Live
Parent: 1499\nContract predecessor: 1500\nBlocks native parity: 1502, 1503\nQA parity: 1504\n\n Problem\n\nPR 1534 / 1500 shipped the shared schema, D1 tables, migration, and ag...
Web
Goal Add platform filters to fanful.net/roadmap so Mark can view the main roadmap at a feature/workstream level instead of digging through noisy GitHub issue lists. Scope Add a ...
Live
Parent: 1499 Depends on shared contract issue: 1500 Goal Add the Discord/Slackgrade live chat capability set to the web app. Scope Show typing indicators such as Rob is typing.....
Commerce
Scope Implement the first shippable web/backend publisher referral scheme. Acceptance criteria D1 schema records publisher referral codes, referredpublisher claims, reward terms...
Admin
Parent: 534 Related platform parent: 1052 Parity driver: 1260 Why The public Fanful feature set now has stronger fanfacing account, shop, lesson, listen, and upload/provenance c...
Admin
Parent: 1052 Shared backend/API dependency shipped: 1186 Parity siblings: iOS 1195 and Android 1204. Add human web/admin controls for membershiptier Stripe Price create/select n...
Admin
Parent: 1052\nNative dependents: iOS 925 and Android 926. Related platform parent: 534.\n\n Why\n\nThe native creator/admin apps need to let Laurel manage membershiptier prices ...
Admin
Parent: 1052 Depends on: 1083 Related: 1058, 925, 926 Why 1083 is adding the confirmed serverowned Stripe Price createandselect wrapper for one lesson/coaching offering through ...
Platform
Context Parent: 1075. Related community shell issue: 560. Fanful's MVP model is one app with fan mode and publisher mode, not one whitelabeled app per artist. Existing community...
Platform
Context Mark clarified the intended MVP product model after the first iOS App Store Connect record was created: Start with one Fanful app, not one whitelabeled app per artist. T...
Commerce
Parent: 504. Motivation The first lessonbooking path already has a dedicated /lessons surface, adminmanaged offerings, and open availability. The homepage support band still sen...
Commerce
Parent: 1052 Unblocks later native write work in 925 and 926. Related tier/entitlement parent: 534. Why The iOS and Android creatorcommerce panels can already read the shared /a...
Admin
Parent/parity context: 921 defined alwayson community channels, and 922/923 need iOS/Android management UI to show membership/entitlement access per channel. That access model i...
Admin
Parent/parity context: 921 clarified the alwayson communitychannel model, while 922 and 923 still need native iOS/Android management parity. Both native issues are blocked on a ...
Commerce
Parent: 928 Context 928 asks for live donations across web, iOS, Android, and admin reporting. Android child 966 covers the native Android Live tab slice. The web can ship a sma...
Media
Mark sees an old darkbackground Now Playing player low on the homepage. The sticky player is now the canonical playback surface, so the legacy embedded player should likely be r...
Auth
Mark questioned whether 'Get Laurel updates' belongs on the homepage when the visitor is already signed in.\n\nAcceptance criteria:\n Audit homepage newsletter/update CTA for si...
Design
Mobile users should not see CmdK or CtrlK shortcut hints because they are irrelevant on phone layouts.\n\nAcceptance criteria:\n Keyboard shortcut hints are hidden on mobile/tou...
Auth
Mark wants 'Alerts' removed from the hamburger menu because alerts/notifications belong as a suboption inside Account.\n\nAcceptance criteria:\n Mobile hamburger menu no longer ...
Platform
Mark clarified that the roadmap is for fanful.net only, not laurelharned.com.\n\nAcceptance criteria:\n laurelharned.com does not expose the public roadmap as a Laurel artistsit...
Design
In Safari/mobile, the hamburger/dropdown menu does not autodismiss when Mark clicks outside it or scrolls/interacts with the page.\n\nAcceptance criteria:\n Menu closes on outsi...
Auth
On the Laurel homepage in Safari/mobile, Mark can still see a lowerpage 'new listener? join / sign in' CTA even when signed in and account is available in the topright navigatio...
Auth
Mark noticed possible duplicate log in / sign up buttons. Native apps should have one clear auth path per context, and every visible auth CTA should work.\n\nAcceptance criteria...
Admin
Admin/native dashboards currently risk showing numbers that are unclear as real vs fake/demo. Mark wants real numbers where available, such as 0 subscribers or /bin/zsh.00 sales...
Admin
During a live stream, listeners should be able to donate/tip in a way that works consistently across web, iOS, and Android while respecting App Store payment policy.\n\nAcceptan...
Admin
When Laurel/admin wants to start a live stream from iOS or Android, the app should offer a simple Go Live Now flow instead of asking for technical stream URL details.\n\nAccepta...
Admin
When Laurel/admin is logged into iOS or Android, the app should not show listener purchase/subscribe CTAs. The artist is not a buyer in her own app context.\n\nAcceptance criter...
Live
Mark clarified that 507 shipped the foundation but the product contract needs to clearly separate two concepts:\n\n1. Alwayson 24/7 community text channels, Slackstyle, such as ...
Admin
Goal Prove the production embeddedroom media path with real RealtimeKit credentials, not just mocked local journeys or Durable Object socket smoke tests. Scope Create or reuse a...
Auth
Parent Part of 873. Scope Add the shared signedin listener displayname update contract that native clients can use without depending on Better Auth internals. Add a server route...
Auth
Summary Manual native crossdevice smoke is blocked because the production magiclink signin endpoint is failing. Android can reach the network and the account form is interactive...
Auth
Context Mark asked for an editprofile path so listeners can change their display name after account creation. This also surfaced during native chat testing because message attri...
Platform
Context PR 426 shipped the first static Fanful competitor matrix at /fanful/competitors and documented that filters/search can come later if the data keeps growing. Goal Make th...
Live
Parent: 505 Related room slices: 523, 524, 839, 844 Production credential blocker: 650 Goal Let a listener, student, or host add a firstparty embedded room to their calendar wit...
Live
Motivation Issue 505 needs iOS and Android to treat embedded rooms as a native platform feature, not only as a web URL handed out by email. The current native contract can read ...
Admin
Motivation Issue 505 needs the first paid lesson/coaching path to stop treating Zoom as the default handoff. The embedded room layer already supports sourceType: lessonbooking, ...
Commerce
Goal Turn a paid artistdomainregistrationintents row from issue 680 into an actual Cloudflare Registrar registration only after a fresh quote check, exactdomain confirmation, pa...
Commerce
Why 680 is a meaty Cloudflare Registrar purchase feature with irreversible billing/registration boundaries and four product surfaces. Track parity as a linked issue family so ea...
Platform
Context\n\nApple App Store Connect and Google Play both need stable public privacy/support URLs before broader TestFlight/Play testing and production submission. The current iOS...
Qa
Context The cloud handoff for 690 could not capture Playwright screenshots because the container lacked browser system dependencies. Local or another capable Codex environment s...
Platform
Context 690 preserves local code for serving Fanful marketing pages from the existing Worker. Production deployment and domain smoke evidence are still separate because the clou...
Qa
Goal Capture durable screenshots and production smoke evidence for the Fanful marketing/comparison surfaces so PRs and postmerge notices are reviewable after branches are delete...
Ops
Goal Deploy the Fanful.net routing changes and verify production behavior on the apex and www hosts. Acceptance checks https://fanful.net/ serves the Fanful marketing page. http...
Commerce
Goal Let a Fanful artist buy an available domain through Fanful using Cloudflare Registrar, charge exactly Cloudflare's cost with no markup, and then let Fanful manage the DNS s...
Auth
Goal Let Fanful artists claim a branded web address before we sell or transfer domains for them. This is the first domain issue because the DNS model affects website routing, cr...
Live
Parent: 505 Followup from 523 / PR 597. Why this exists PR 597 deployed the firstparty embeddedroom RealtimeKit media path, remote D1 migration 0022embeddedroommediaparticipants...
Live
Add low-density reactions, reply context, and scoped mention rendering for community chat without turning the Live tab into a full Discord clone.
Chat affordances
Live
Add creator-configurable slow mode and per-listener rate limits across REST and WebSocket posting, scoped to creator community and channel.
Community slow mode
Admin
Why 511 shipped the firstparty web member idea/upvoting board. This is a meaty product feature, so parity should be tracked as a linked issue family rather than buried inside on...
Live
Context Mark's 20260512 crossplatform design feedback says the listener app should feel social and realtime, with a prominent Live tab, notifications, visible community presence...
Media
Motivation PictureinPicture/background video continuity is now a parity feature family, not one platformonly issue. Android and iOS have shipped native slices, with web still tr...
Live
First slice: expose creator/admin flag, hide, and restore review controls for community notes while keeping flagged/hidden notes out of public reads and realtime updates.
Community note review flow

Live
Link scheduled/live/replay rooms to one persistent community channel so broadcasts, member webinars, and between-stream chat feel like one conversation without duplicating message history.
Broadcast-linked community
Live
Attach Cloudflare Realtime or Calls media sessions to embedded rooms with token minting, WebRTC track exchange, device controls, and operational fallback states.
Media
Context Common Design issue 448 still needs nativedevice Listen Along invite/QR/coscrub evidence. The current code is healthier than before: iOS preflight passes, the iPhone app...
Admin
Scope for this issue Build a firstparty member idea board for Laurel now, shaped as the reusable MusicWebs/Fanful alternative to Canny later. The first shippable slice should le...
Live
Create first-party embedded rooms with host/attendee roles, durable chat, access policies, and a Cloudflare-native media path for lessons, coaching calls, webinars, and private paid sessions.
Media
Mark confirmed that Listen Here / crossdevice playback handoff is impressive when the same track exists on both surfaces, but can become nonsensical when web and native apps hav...
Media
Problem During Common Design 448 smoke on 20260511, an Android emulator host created a production Listen Along invite and a separate web listener was signed in through Better Au...
Qa
Captured from Mark's nativeapp parity directive in the Codex iOS app session on 20260511. Problem Mark explicitly does not want native iOS/Android features to cheat by linking o...
Auth
Captured from Mark's rapid mobile feedback in the Codex iOS app session on 20260511. Problem iPhone and Android settings currently imply email notifications are ON even when ema...
Platform
Goal Create one durable place for notes from other platforms and add an entrepreneurfacing web view that compares Fanful against relevant creator, commerce, course, funnel, and ...
Media
Motivation PR 373 closed 370 by shipping the shared web/backend Listen Along state endpoint. Some docs and one Android listenerfacing/debug string still say realtime coscrub is ...
Media
Motivation Mark asked for thorough crossplatform smoke testing across web, iPhone, and Android using demo listener accounts and the Laurel artist account. The existing issue 288...
Media
Motivation Mark wants Listen Along to be more than an invite/join state: two different listener accounts should be able to keep playback synchronized, and either participant sho...
Media
Motivation Mark feedback from crossdevice playback testing: Listen here handoff is impressive when both surfaces reference the same item, but sync becomes nonsense when web and ...
Media
Motivation Mark feedback from iPhone testing: when Romance Anonimo ended, playback stopped at the end while the large play/pause control still showed pause. He also raised wheth...
Design
Motivation\n\nNext 16 warns during every production build that no longer belongs in the metadata export. The warning repeats for many routes and makes CI output noisier while we...
Commerce
Motivation Mark was explicit: Live, Dates, Shop, Lessons, and Account should be native in iOS/Android, not webview shortcuts. The main exception is Support/Stripe checkout, wher...
Media
Motivation Mark saw truncated native copy like Offline caching requires a signed native manifest... on iPhone track rows. That sounds like internal implementation detail and doe...
Media
Motivation Listen Along needs a web surface as well as native app surfaces: a listener should be able to invite a friend by link, or show a QR code when they are beside each oth...
Auth
Motivation Guest signin/join is currently too buried and too playbackhandoffspecific. Mark wants account entry to be a primary navigation action: on web, the homepage topright C...
Media
Motivation Mark's screenshots show the web player taking over too much of the page when playback is remote or expanded. The bottom mini player remains visible under the expanded...
Media
Motivation Social listening needs a crossdevice contract before native apps can implement it cleanly. A listener should be able to invite another listener to listen along remote...
Qa
Motivation Production /api/roadmap is GitHubbacked, but the server fetch currently requests only perpage=100 from the GitHub Issues API. The roadmap has grown beyond 100 GitHub ...
Design
The shipped roadmap stage headers still feel off in wide Kanban view. Observed from Mark's screenshot: card text briefly appears above the floating stage header while scrolling ...
Admin
Goal\nWhen Laurel signs into iOS or Android, she can create a live room, go live now, schedule a future room, update chat/subscriber settings, and end/cancel live events without...
Admin
Goal\nWhen an owner or Laurel artistadmin signs into iOS or Android, they can manage subscriber and membership state without webadmin handoff for routine support work.\n\n Scope...
Qa
Motivation The live /roadmap page reads GitHub issues and infers a Web/iOS/Android workstream. Newer native issues carry explicit labels like area:iosapp and area:androidapp, bu...
Media
Motivation The web player should not merely be functional; it should feel like the strongest surface. Use Spotifylevel product expectations as a reference for clear hierarchy, c...
Media
Motivation Mark recommended thorough realaccount testing across listener comments, live chat, live creation, and playback sync using demo listener accounts and the Laurel artist...
Admin
Motivation Mark wants iOS and Android to avoid cheating by linking to web for app features. Support/Stripe checkout can link out, but Live, Dates, Shop, Lessons, and artist goli...
Media
Motivation When a track ends, the platform needs a deliberate queue policy. Mark asked whether a next track should autoplay and suggested an adjustable autoplaynext toggle, espe...
Media
Motivation Mark noticed playback sync can become nonsense when web and native apps do not expose the same playlist/catalog order and media identities. Example: one platform has ...
Media
Motivation Current handoff behavior is good for one listener using multiple devices: Listen here claims playback and the other device should stop. Mark wants a separate social m...
Auth
Motivation Mark's nativeapp feedback exposed a shared accountstate problem that web/backend should help solve: email notification state, email verification prompts, push registr...
Design
Followup to 166. The stage headers are now visually distinct and sticky. Add a small polish pass so they feel smoother in use: restrained transitions, hover/focus affordance, an...
Media
Goal Create the durable design source of truth for the Laurel/MusicWebs listener player across web, iOS, and Android so platform work does not drift into three different audio p...

Platform
Add the website/backend account layer for per-category email versus push preferences and native APNs/FCM device-token registration.
Shared notification preference API
Roadmap
Make `/roadmap` separate website/shared-platform, iOS native app, and Android native app work so future branches and agents can stay focused.
Apps
Research native iOS/Android, Kotlin Multiplatform, React Native, Flutter, and PWA options so future Fanful listener apps start from the right architecture.
Native app options
Admin
Goal Design and implement a clearer notification preference model that works for launch email alerts now, browser push next, and future iOS/Android app notifications later. Prod...
Admin
Followup from 108. This builds on the firstparty analytics event stream and durable playback state after the initial dashboard lands. Context 108 ships the schema, ingestion, se...
Media
Followup from 108. This belongs with the active 98 media player surface, not the analytics foundation branch. Context 108 added firstparty analytics storage, ingestion routes, d...
Admin
Followup from 108. This should wait for the active admin/email and roadmap/admin layout branches to settle before touching shared admin UI files. Context 108 added an isolated /...
Admin
Source From Mark's Obsidian notes: TOPIC 8 SECURITY.md and howcodexworkswithmark.md (ranked priority 7 in the corrected list), plus Mark's followup confirmation in Codex chat. G...

Design
Adds restrained motion and microinteractions to CTAs, support cards, newsletter success, and the listening room while respecting reduced-motion preferences.
Subtle flourishes
Media
Source From Mark's Obsidian notes: TOPIC 5 FAN ACCOUNT SETTINGS.md (ranked priority 5), plus Mark's followup confirmation in Codex chat. Goal Make /account feel fast, stable, co...
Auth
Source From Mark's Obsidian notes: TOPIC 4 AUTH AND SIGN UP.md (ranked priority 4), plus Mark's followup confirmation in Codex chat. Goal Implement the agreed relationship betwe...
Auth
Source From Mark's Obsidian notes: TOPIC 4 AUTH AND SIGN UP.md (ranked priority 4). Goal Eliminate contradictory loggedin/loggedout UI states across the site and use Better Auth...
Auth
Source From Mark's Obsidian notes: TOPIC 4 AUTH AND SIGN UP.md (ranked priority 4), plus Mark's followup confirmation in Codex chat. Goal Replace the disruptive Join the list ju...
Source From Mark's Obsidian notes: TOPIC 1 ADMIN AND EMAIL.md and howcodexworkswithmark.md (ranked priority 1). Goal Make inbound mail to site addresses visible and understandab...
Admin
Source From Mark's Obsidian notes: TOPIC 1 ADMIN AND EMAIL.md (ranked priority 1). Goal Make /admin/email a complete email/subscriber work area rather than a crowded block on th...
Admin
Source From Mark's Obsidian notes: TOPIC 1 ADMIN AND EMAIL.md (ranked priority 1). Goal Make the admin surface clearer and safer for the two real admins: Mark and Laurel. Detail...


Media
Track where each public asset came from, capture upload rights metadata, add a replacement review queue, and document the future resumable large-upload path before more artists depend on the media library.
Provenance review

Admin
Give Laurel and Mark admin controls to hide, flag, and restore timed comments while keeping the public player limited to visible notes.
Comment controls



Auth
Audit newsletter confirmation, listen-page account creation, magic-link login, account settings, and sign-out so listeners see one coherent account/subscription state.
Account state


























Operations
A public roadmap backed by GitHub issues so project status survives chat compaction and late-night context drift.
This page
Listener data
Better Auth email/password accounts, newsletter rows, timed comments, progress writes, and the first account page.
Deployed
Foundation
Next.js on Cloudflare Workers via OpenNext, D1, R2, migrations, seed data, custom routes, and deployment notes.
Deployed
Workstream
SwiftUI and AVFoundation work for iPhone: native playback, account handoff, APNs, TestFlight, and the Fanful companion workflows creators and fans need.
Roadmap stage
Useful sparks that might become real once a dependency or user need gets sharper.
No maybe items right now.
Roadmap stage
Committed roadmap work that exists, but is not the next thing to pull.
Admin
Laurel/admin should be able to manage membership commerce from the iOS app instead of seeing purchase prompts. In Stripe terms, this means editing products/entitlements and addi...
Ops
Context The native iOS app now has TestFlight/releasereadiness documentation and physicaldevice build coverage, but the first public App Store submission is a separate checklist...
Roadmap stage
Committed follow-ups that are queued behind the active work.
No next items right now.
Roadmap stage
Current branches and PRs. These should move as GitHub issue labels change.
No active items right now.
Roadmap stage
Shipped work, newest first, with screenshots where the change is visual.
Admin
Motivation Agent/backend lesson availability writes are available through the shared creator.commerce.lessonavailabilityupdate contract, and Android parity shipped in 1880/1882....
Admin
Parent: 925 Shared contract parent: 1052 Parity source: web 1862, agents 1692 and 1750 Related Android parity: 1867 Context Web admin and agent surfaces now expose confirmed sho...
Admin
Context Android now exposes guarded native shop product details controls through 1845 and records executed local APPENV=test evidence through 1847. The shared agent contract is ...
Admin
Parent: 1417 Contract parent: 530 Context The iOS app already consumes the shared lessonpolicyreadiness.v1 read contract and has simulator evidence for ready and unavailable les...
Admin
Parent: 925 Related shared creatorcommerce contract: 1052 Goal Expose the ready creator.shopproduct.visibilityupdate confirmedwrite contract in native iOS so an artist/admin can...
Qa
Parent QA issue: 1504 Related iOS parity issue: 1502 Android precedent: 1604 Journey catalog: 1231 Goal Prove that native iOS can consume local webcreated live chat reply/reacti...
Qa
Parent catalog: 1231 Live chat parent: 1502 Shared notification contract: 159 Goal Add native iOS controls for muting and unmuting community channel notifications, covering the ...
Live
Parent: 1502 Shared parity parent: 1499 Android reference: 1584 Earlier iOS shell: 1527 Goal Let signedin iOS listeners upload a communityscoped custom emoji from the native app...
Live
Parent: 1502 Backend route: /api/admin/notifications Goal Bring the native iOS publisher/admin notification center closer to the live Fanful notification contract by adding refr...
Live
Parent: 1502 Depends on shipped backend route work: 1539 Context iOS already has a native Notifications tab with listener and publisher event rows from the mobile bootstrap/fixt...
Live
Parent: 1502 Depends on shipped backend endpoint issue: 1539 Related shared parity parent: 1499 Goal Replace the native iOS custom emoji "coming soon" shell with real persisted ...
Admin
Parent: 1371 Related commerce parent: 925 Goal Add native iOS publisher controls for creating an inactive membership tier through the alreadyshipped confirmed creatorcommerce ti...
Admin
Parent: 925 Contract parent: 1371 Follows: 1540 Context PR 1552 shipped native iOS archive/restore controls for existing membership tiers. The shared creatorcommerce API on main...
Admin
Parent: 925 Shared lifecycle API: 1371 Crossplatform tier parent: 534 Goal Add native iOS publisher/admin controls for membership tier lifecycle management now that the shared c...
Qa
Goal Update the internal /admin/userjourneys iOS catalog so the latest shipped native iOS parity slices are indexed with exact evidence, related issues, and blocker notes. Scope...
Commerce
Context 1493 tracks referral scheme parity for agents, iOS, and Android. The agent read contract from 1509 is now live through the creatorcommerce manifest, but iOS still lacks ...
Live
Parent: 1502 Shared contract dependency: 1500 Goal Add the native iOS shell for communityscoped custom emoji so the app can render/pick custom emojis from the mobile bootstrap c...
Live
Parent: 1502\nDepends on shared event delivery contract: 1500\n\n Goal\n\nAdd the native iOS notification inbox surface for Discord/Slackgrade Fanful community events without in...
Live
Parent: 1502 Shared contract: 1500 Master parity: 1499 Goal Let iOS listeners react to any community chat message with more than the legacy heartonly control, using system emoji...
Live
Parent: 1499 Depends on shared contract issue: 1500 Web parity reference: 1501 Goal Bring the iOS app to parity with the Discord/Slackgrade Fanful live chat contract. Scope Nati...
Qa
Goal Create fanful.net/userjourneys as the durable catalog of essential Fanful jobs to be done, with iPhone/iOS test steps, screenshots, observations, and links to the related G...
Admin
Parent: 925 Backend/API dependency shipped: 1186 Add the native iOS artist/admin controls for membershiptier Stripe Price create/select now that the shared serverowned creatorco...
Ops
Parent: 636 Why The iOS TestFlight commandline upload path currently depends on Xcode's local Apple account/keychain state. Build 0.1.0 (3) archived successfully, but upload fai...
Admin
Why Mark noted that admin/native screens can be confusing when they show numbers or controls that might be placeholders. In the iOS app, creator/admin metrics and controls shoul...
Admin
Parent: 560 Related: 851 Why Mark's admin feedback: when signed in as Laurel/the creator, the native app should not ask for lowlevel stream URLs. It should provide a simple nati...
Admin
Parent: 560 Parity sibling to create/track for Android and web/agent surfaces as needed. Why Mark clarified that live video/chat rooms are separate from alwayson 24/7 text chann...
Platform
Parent: 560. Related product decision: 1075. Builds on 1107. Context Mark clarified that the MVP should be one Fanful app with fan mode and publisher mode, not a dedicated Laure...
Live
Parent: 560. Contract: 1078. Builds on shipped iOS shell 1090. Context The iOS app now has a selectedcommunity and fan/publisher mode shell, but Mark's oneapp Fanful model also ...
Media
Context Mark asked whether the tiny play buttons in iOS library rows are supposed to be tappable. They should work as direct play/pause controls, but the target is visually and ...
Admin
Parent: 925. Shared backend/API parent: 1052. Backend/agent write slice: 1083. Web parity sibling: 1086. Add the native iOS artist/admin controls for the nowsupported lesson Str...
Platform
Parent: 560. Contract: 1078. Related iOS identity slice: 1077. Android parity sibling: 1087. Add the first native iOS selectedcommunity and fan/publisher mode shell so the app s...
Platform
Context Parent: 1075. Related TestFlight/App Store umbrella: 636. Fanful is now the intended MVP product identity: one app, one human account, multiple creator communities, with...
Media
Parent: 448 Why The shared Listen Along design notes say hosts should be able to share an invite message that includes the current track, shared position, sharedcontrols context...
Commerce
Parent: 530 Parity sibling: Android 858. Ship the native iOS surface for lesson policy and credit state once the shared 530 contract exists. Why Lesson cancellation windows, bun...
Admin
Parent: 925 Parity sibling: Android 959. Ship the safe iOSnative slice for creator commerce before broader Stripe product/price editing. Why 925 remains blocked for actual Strip...
Ops
Context Mark asked to stop using the longer iOS bundle identifiers and make the iOS app be net.fanful.ios. The release config already uses net.fanful.ios, but checkedin Debug st...
Admin
Goal Bring native iOS artist/admin ideaboard curation to parity with web, Android, and agent contracts. Why 599 tracks ideaboard parity across the four channels. Web 511, iOS me...
Commerce
Parent: 928 Related: 700, 709 Context 928 asks for live donations across web, iOS, and Android while respecting App Store payment policy. 700 resolved the Stripeonly posture and...
Admin
Child slice of 922 and 921.\n\nGoal: give Laurel/admin a native iOS Community Channels panel that reflects the current alwayson channel backend honestly, without faking unsuppor...
Admin
iOS child slice for 924.\n\nAcceptance criteria:\n When bootstrap includes artistAdmin, the iOS Account panel uses artist/admin framing instead of listener membership, purchase ...
Admin
Artists logged into the iOS app should be able to create, rename, and configure the artist community text channels defined by the shared channel contract.\n\nAcceptance criteria...
Auth
Parent Part of 873. Depends on the shared displayname update route from the web/API child issue. Scope Add the matching native iOS Account/Profile displayname editor after the s...
Commerce
Goal Bring Cloudflare Registrar domain purchase parity to the iOS admin surface after the platform/web contract in 680 is stable. Scope Decode and display domain search quote, p...
Commerce
Context Issue 700 documents the paymentpolicy posture for Stripeonly native commerce before external TestFlight or App Store review. The policy audit found that iOS currently ha...
Commerce
Context\n\nMark's direction is Stripeonly for support/shop/lessons and no Apple inapp purchase. Before an App Store or external TestFlight review build, iOS needs an explicit po...
Live
Context 629 / PR 660 added public creatorapproved community chat automation replies with durable audit rows and listenervisible attribution. iOS already has base community chat ...
Live
Parent: 505 Split from: 524 Related Android parity issue: 655 Related admin/agent safety issue: 656 Production credential blocker: 650 Goal Bring the iOS app into parity with th...
Live
Context 639 is adding community chat reactions, lightweight replies, and mention parsing/rendering on the web surface. iOS already has base community chat in Live from 571, so n...
Live
Why 528 connected persistent community channels to scheduled/live/ended broadcast context after 571 had already shipped the base iOS communitychat Live tab. iOS should consume t...
Admin
Why 599 tracks parity for the member idea/upvoting board that shipped on web in 511. iOS should get a native implementation rather than relying on a webonly board. Scope Add nat...
Live
Motivation 507 is adding firstparty community chat channels as a platform feature, not only a web /live widget. The iOS app needs the same communityscoped chat experience in the...
Media
Motivation Common Design tried to resume 448 iOS evidence on 20260512 after Xcode began seeing both the physical iPhone and iOS 26.5 simulators. The iOS smoke preflight now runs...
Commerce
Motivation This issue now owns the first focused lessonbooking slice from the broader booking notes: make the current lesson entry path work, let Laurel/creators define basic av...
Design
Motivation Physicaldevice smoke on Mark's iPhone 17 Pro Max showed the signedin Account tab rendering its lower Account actions behind the persistent mini player and native bott...
Admin
Captured from Mark's realdevice testing request in the Codex iOS app session on 20260511/12. Problem Mark wants realaccount iOS smoke using listener demo accounts and laurel@lau...
Media
Mark reported from the physical iPhone build that tapping the playing song name opens the full Now Playing sheet, but tapping the blank/right side of the miniplayer bar does not...
Media
Mark asked that comment reaction behavior stay consistent across iOS, Android, and web: comments should have one emoji reaction option, a heart/Like, and users should be able to...
Media
Captured from Mark's iPhone feedback in the Codex iOS app session on 20260511. Problem Track cards can show truncated copy like "Offline caching requires a signed native manifes...
Media
Captured from Mark's physical iPhone feedback in the Codex iOS app session on 20260511. Problem When "Romance Anonimo" ends on iPhone, audio stops but the playhead remains at th...
Media
Captured from Mark's rapid iOS physicaldevice feedback in the Codex iOS app session on 20260511. Problem Mark reported that the bottom navbar is missing on iPhone. Shared design...
Admin
Motivation Mark asked for realaccount native testing across iOS, Android, and web using listener accounts and Laurel's artist account, including comments, live chat, golive flow...
Media
Motivation PR 373 shipped the shared web/backend Listen Along state contract. The iOS app should now adopt that contract so a joined friend session can actually coplay, copause,...
Media
Motivation Mark tested on a physical iPhone and found that tapping the playing song name opens the expanded player, but tapping the blank/rightside area of the mini player bar d...
Auth
Motivation Mark's iPhone feedback showed confusing notification state: email notifications appeared enabled before email confirmation, while push seemed blocked or still prompti...
Qa
Motivation Mark wants Laurel and friends to test the native iOS app through TestFlight, not only by plugging in his iPhone and pressing CmdR in Xcode. Scope Document the exact l...
Platform
Motivation Mark observed that the iOS app currently lacks a bottom navigation bar, while the shared player/design notes point toward native app chrome similar to Spotify, Apple ...
Media
Motivation Sameaccount Listen here handoff is intentionally exclusive: one listener account on two devices should stop the other device. Mark wants a separate social listening m...
Admin
Goal\nBring /admin analytics visibility into iOS and Android for Laurel/owner accounts, not just compact metric tiles.\n\n Scope\n Native analytics overview for listeners, playb...
Admin
Goal\nWhen Laurel signs into iOS or Android, she can handle the same practical email work available in /admin: view inbound mail, reply to people, review campaign drafts, send p...
Media
Motivation Mark observed that on iPhone, when Romance Anonimo ends, audio stops but the playhead remains at the end of the track and the large primary button still shows a pause...
Auth
Motivation Mark enabled iPhone push through the system prompt, but the app still showed the large enablepush button, confusing device counts, and contradictory copy such as iOS ...
Media
Mark feedback from the Android app session applies across platforms: comments should use one primary reaction, heart/like, not competing star/heart/save actions. Expected behavi...
Qa
Motivation Mark wants each native app to expose a selfcontained roadmap/about surface so a tester can see what this build contains, what is partly shipped, and what remains with...
Qa
Motivation Mark will be testing the iOS app on simulators, physical iPhones, and eventually TestFlight. When playback sync, push, auth, offline downloads, or API origin behavior...
Media
Goal Add a native iOS share affordance so listeners can share a Laurel track or the current Now Playing item through the system share sheet. Scope Add share controls to track ro...
Media
Goal Add native iOS playback speed controls to the expanded Now Playing surface so listeners can slow down or speed up longform audio without leaving the app. Scope Add a native...
Media
Goal Add a native iOS sleep timer so listeners can start Laurel's music and let the app pause itself after a chosen interval. Listener jobs to be done Start a timer from the exp...
Media
Goal Make the iOS app behave like a real listener app on a physical iPhone when audio leaves the foreground: background playback, route changes, interruptions, and mediaservice ...
Commerce
Motivation The iOS app can now expose listener/support/catalog surfaces, but lesson booking is still a webonly handoff. A listener should be able to pick an available lesson slo...
Commerce
Goal Give the native iOS app a Support surface that feels like Laurel's app, not just a weblink grid. Scope Add a mobilesafe support/catalog endpoint for membership tiers, publi...
Platform
Goal Give the native iOS app a real Dates surface instead of only handing listeners to the website. Why now The website already has structured performance data through getPublic...
Media
Goal Add a clear native iOS playbackdevice context pill so listeners can tell whether playback is local, remote, connected, offline, or localonly without reading the larger stat...
Design
Goal Make the native iOS app feel like Laurel Harned's listener app from the first screen instead of a generic MusicWebs utility shell. Why now The core iOS features are now bro...
Media
Motivation The iOS app currently offers a Live hub handoff, while the website already has a real Laurel Live room with room state, stream/replay metadata, presence, and live not...
Media
Goal Add a native Continue Listening surface so returning iOS listeners can resume the most relevant inprogress track without hunting through the full library. Scope Use existin...
Media
Goal Make the native iOS library easier to browse as Laurel's catalog grows by adding native search and quick filters. Scope Add a SwiftUI search field for track title/composer/...
Media
Goal Add a native iOS video playback surface so video tracks are not only labeled as video, and keep the player aligned with the shared web/Android design direction. Scope Use n...
Qa
Goal Document the exact morning path for Mark to test the native iOS listener app on a physical iPhone and prepare an internal TestFlight build. Scope Physical iPhone testing ch...
Design
Goal After the core player surfaces land, add the last layer of native polish so iOS feels intentional while staying aligned with web and Android design decisions. Listener jobs...
Auth
Goal Extend the iOS account surface beyond base signin so listeners can manage the account tasks that matter on the website without losing nativeapp context. Listener jobs to be...
Media
Goal Make the iOS listener app explicit about crossdevice playback ownership, progress sync, and API gaps so it behaves consistently with the website and future Android app. Lis...
Media
Goal Bring the native iOS player closer to website player parity by adding queue/nextup behavior and full iOS system remotecontrol integration. Listener jobs to be done See what...
Media
Goal Bring the native iOS player in line with the shared player design direction: a genuinely compact persistent mini player while browsing, plus a native expanded Now Playing s...
Auth
Motivation PR 212 added a Turnstile challenge for brandnew verified sessions that post timed comments on the website. The native iOS timedcomments composer added in 142 posts th...

Media
Polish iOS library cards with artwork, media-kind labels, locked/loading/error states, and clear member-only calls to action.
Richer iOS media states

Media
Make iOS progress writes durable across spotty connectivity, backgrounding, and future offline playback with a local retry queue.
Durable iOS progress queue
Platform
Define shared native fixtures and contract tests under contracts/mobile-listener/v1 so Swift and Kotlin clients stay aligned with website APIs without forcing a shared UI stack.
Shared native contract fixtures
Operations
Prepare the iOS project for real distribution with bundle identity, signing notes, release-safe configuration, app assets, and TestFlight documentation.

Admin
Add an iOS artist companion area for read-only signal and authenticated handoff to deeper web admin modules.
iOS artist dashboard companion

Admin
Give Laurel a role-gated iPhone companion workflow for live-room status, quick room controls, presence, and chat moderation.
iOS live companion

Platform
Give iOS listeners a native home base with stable web handoff links for Laurel features that are not yet fully native.
Native hub links
Media
Let entitled iOS listeners save eligible recordings for offline playback under the #536 protected-native-cache decision once the signed offline manifest and entitlement refresh contracts are ready.
Media
Bring the website's timed listening conversation into iOS playback with visible comments, timestamp seeking, replies, reactions, and moderation-aware states.

Media
Connect iOS to the Fanful playback sync socket so website, iPhone, and Android sessions can hand off track, position, and active-device state.
iOS playback handoff

Platform
Add APNs registration and account notification settings that distinguish OS push permission from per-category email and push preferences.
iOS notification settings

Platform
Let iOS listeners sign in natively, refresh account state, and unlock paid/member entitlements through the existing Fanful account contracts.
Native iOS account sign-in
Apps
Create the first SwiftUI listener app that consumes the mobile bootstrap/progress contracts, streams playable tracks with AVPlayer, and documents Xcode simulator and phone testing.
Media
Current Session 3 Status PR: 117 โ https://github.com/markitics/laurelharned/pull/117 Branch: codex/session3audiovideoplayer Latest pushed commit: c98bb8e fix: harden playback h...
Workstream
Kotlin, Compose, and Media3 work for Android: native playback, FCM, media sessions, Play readiness, and matching Fanful listener and creator jobs.
Roadmap stage
Useful sparks that might become real once a dependency or user need gets sharper.
No maybe items right now.
Roadmap stage
Committed roadmap work that exists, but is not the next thing to pull.
Admin
Laurel/admin should be able to manage membership commerce from the Android app with parity to iOS. In Stripe terms, this means editing products/entitlements and adding or select...
Commerce
Motivation 530 tracks lesson bundles, subscription credits, cancellation windows, skipweek behavior, refunds, and tierlinked lesson benefits as shared platform policy. Android n...
Ops
Motivation The Android app now has a productionRelease build and a Play Store runbook, but it is not actually ready for Google Play internal testing until release/uploadkey sign...
Roadmap stage
Committed follow-ups that are queued behind the active work.
No next items right now.
Roadmap stage
Current branches and PRs. These should move as GitHub issue labels change.
No active items right now.
Roadmap stage
Shipped work, newest first, with screenshots where the change is visual.
Admin
Parent lesson platform issue: 530 Android parity audit: 1261 Shared agent/backend availability write: 1550 Agent confirmation widget: 1753 Related Android lesson policy slice: 1...
Admin
Parent Android issue: 858 Shared lesson policy parent: 530 Android parity audit: 1261 Related iOS proof: 1671 / iOS userjourney rows for lesson policy cutoff updates Why Fanful'...
Admin
Parent: 534 Related Android parent: 926 Parity audit: 1261 Related shared contract: 1371 Related iOS parity: 1573 Why The public Fanful Memberships promise includes recurring su...
Admin
Parent: 926 Shared contract parent: 1052 Parity source: web 1862, agents 1692 and 1750 Audit parent: 1261 Context Web admin and agent surfaces now expose confirmed shop product ...
Admin
Context The shared creatorcommerce contract now advertises creator.shopproduct.detailsupdate as ready through /api/agent/creatorcommerce. This contract supports safe store item ...
Admin
Parent: 926 Related shared creatorcommerce contract: 1052 Parity/audit parent: 1261 Related iOS slice: 1658 Goal Expose the ready creator.shopproduct.visibilityupdate confirmedw...
Admin
Parent: 926 Shared backend/API parent: 1052 Parity sibling context: agent creator shop product tools are covered by the shared MCP/agent smoke suite. Add native Android artist/a...
Qa
Parent QA issue: 1504 Android implementation issue: 1503 (closed after PRs 1542, 1577, 1580, 1582, 1588, and 1599) Feature parent: 1499 Goal Produce documented Android evidence ...
Admin
Parent: 1503 Crossplatform parity: 1499 QA followup: 1504 Goal Give Android publisher/admin users a native notification center surface for the publisher notification events now ...
Live
Parent: 1503 Shared parity parent: 1499 Goal Let signedin Android listeners upload a communityscoped custom emoji from the native app instead of handing off to Fanful web. Scope...
Commerce
Context Parent 1493 tracks referral scheme parity for agents, iOS, and Android. Agent read parity shipped in 1509 and iOS publisher referral summary parity shipped in 1530. Andr...
Live
Parent: 1499 Depends on shared contract issue: 1500 Web parity reference: 1501 iOS parity reference: 1502 Goal Bring the Android app to parity with the Discord/Slackgrade Fanful...
Admin
Parent: 926 Shared backend/API dependency shipped: 1186 Parity siblings: iOS 1195 and web 1205. Add the native Android artist/admin controls for membershiptier Stripe Price crea...
Admin
Parity sibling: iOS 1164. Android creator/admin screens should either show real backend values or explicitly label placeholder/unavailable states. Mark specifically called out c...
Admin
Parity sibling: iOS 1163. Parent: 560. Related: 851. Android should match iOS/web creator intent: a creator should be able to start a live room with a simple native "Go live now...
Admin
Parity sibling: iOS 1162. Parent: 560. Android should match the agreed community model: live video/event chat is separate from alwayson text channels like general, intros, membe...
Media
Context Parity followup from 1101. The iOS libraryrow direct play/pause control now has a clearer visible target and a 56pt hit area. Android also has an explicit libraryrow Fil...
Admin
Parent: 926. Shared backend/API parent: 1052. Backend/agent write slice: 1083. Web parity sibling: 1086. iOS parity sibling: 1095. Add the native Android artist/admin controls f...
Platform
Parent: 560 Contract: 1078 Related: iOS 1090, Android mode cue 1087 Why 1090 is adding an iOS selectedcommunity and fan/publisher mode shell. Android now has the smaller Account...
Platform
Parent: 1078 Parity siblings: iOS 1077, Android identity/docs 1084 Related: 560 Why iOS now shows a native Fanful appmode cue in Account so the app presents one Fanful app with ...
Platform
Context Parent: 1075. iOS sibling: 1077. Related Android releasereadiness umbrella: 847. Fanful is now the intended MVP product identity: one app, one human account, multiple cr...
Media
Parent: 448 Sibling: 1061 Why The shared Listen Along contract says native share sheets should mirror the web invitemessage pattern: include enough context for a friend to under...
Admin
Parent: 923 Depends on shipped shared contract: 921 Context 923 asks for full native Android artist community channel management. The shared 921 terminology/cap contract is now ...
Commerce
Parent: 928 Context 928 asks for live donations across web, iOS, and Android. Current investigation shows a safe Androidfirst slice is available now: Existing /api/checkout alre...
Admin
Parent: 926 Ship the safe Androidnative slice for creator commerce before broader price/product editing. Scope: Add an Android artist/admin panel that reads the existing /api/ag...
Admin
Android child slice for 924. Acceptance criteria: When bootstrap includes artistAdmin, the Android Account panel uses artist/admin framing instead of listener membership, purcha...
Admin
Artists logged into the Android app should be able to create, rename, and configure artist community text channels with parity to iOS and web.\n\nAcceptance criteria:\n Laurel/a...
Live
Problem During the 851 multiplayer smoke pass, Android Seeker showed the live room start as a raw ISO timestamp: Starts 20260808T00:00:00.000Z The same room is humanformatted on...
Auth
Parent Part of 873. Depends on the shared displayname update route from the web/API child issue. Scope Add a native Android editprofile/displayname path. Show the current listen...
Live
Motivation PR 856 adds GET /api/rooms/{roomId}/calendar plus the Android model field for endpoints.calendarExport, but Android does not yet have a native action that downloads/s...
Commerce
Goal Bring Cloudflare Registrar domain purchase parity to the Android admin surface after the platform/web contract in 680 is stable. Scope Decode and display domain search quot...
Admin
Why 601 is adding the native Android member ideaboard flow: browse, submit, vote, and refresh. Android also supports artist/admin mode, so Laurel should eventually curate the id...
Live
Context 629 / PR 660 added public creatorapproved community chat automation replies with durable audit rows and listenervisible attribution. Android base community chat is track...
Live
Parent: 505 Related server/web slice: 524 Related iOS parity issue: 654 Related admin/agent safety issue: 656 Production credential blocker: 650 Context 524 adds the web/admin/s...
Live
Context 639 is adding community chat reactions, lightweight replies, and mention parsing/rendering on the web surface. Android base community chat is tracked separately in 572, ...
Admin
Why 599 tracks parity for the member idea/upvoting board that shipped on web in 511. Android should get a native implementation rather than relying on a webonly board. Scope Add...
Live
Motivation 507 is adding firstparty community chat channels as a platform feature, not only a web /live widget. The Android app needs the same communityscoped chat experience in...
Admin
Problem Issue 316 still cannot complete the Laurel artist/admin smoke from Android because the native Android auth surface currently exposes email/password signin only. I can cr...
Media
Motivation PR 373 shipped the shared web/backend Listen Along state contract. The Android app has invite/join UI, but realtime coplayback and coscrub should now move from the ol...
Media
Motivation Mark expects the Android player to follow the shared autoplaynext contract: if a listener has a next queue item and autoplay is enabled, Android should advance cleanl...
Commerce
Motivation Mark wants Shop to be native in iOS and Android. The app should not link to the website for normal browsing or product detail tasks. Scope Add a native Android Shop d...
Commerce
Motivation Lessons should be a native Android module, not a website handoff. A listener should be able to discover lesson availability and request/booking options from inside th...
Commerce
Motivation Support is the explicit exception to the nowebhandoff rule: Mark wants Stripehosted checkout for support/contributions rather than Apple/Google inapp purchase. The An...
Auth
Motivation Mark's Android feedback: the top bar currently reads like a website shell (Fanful Listener, laurelharned.com, refresh icon). The app should feel like a native media/l...
Media
Motivation Mark feedback from the Android app session: timed comments should not show star, heart, and save as competing peer actions. The shared product direction is one visibl...
Admin
Motivation Mark wants the Android app tested as a real artist/listener product, not just a UI shell. Artist account laurel@laurelharned.com should be able to go live from Androi...
Auth
Motivation Mark's nativeapp feedback: email notifications can be separate from email confirmation, push should be enableable for any loggedin native user, and unconfirmed email ...
Media
Motivation Sameaccount Listen here handoff is intentionally exclusive: one listener account on two devices should stop the other device. Mark wants a separate social listening m...
Admin
Goal\nGive Laurel native iOS and Android moderation for timed comments and liveroom notes.\n\n Scope\n Native moderation queue combining recent/flagged/hidden timed comments and...
Platform
Mark feedback: the current Android top area reads like a website header (Fanful Listener, laurelharned.com, refresh icon). The Android app should feel native, closer to Spotifys...
Media
Goal: prove Android can play audio and video in one native queue, matching the web demo capability. Expected behavior: Android library/queue shows both audio and video items. Se...
Media
Mark feedback from the Android app session applies across platforms: comments should use one primary reaction, heart/like, not competing star/heart/save actions. Expected behavi...
Media
Mark feedback: Android currently exposes star, heart, and savestyle actions for comments, which is confusing. Product direction is one primary reaction: heart/like. Expected beh...
Commerce
Goal: replace generic listenerhub web handoffs for Support, Shop, and Lessons with native Android surfaces. Expected behavior: Support: native ways to support Laurel, with exter...
Platform
Goal: listeners should be able to browse Laurel performance dates natively in Android without a web handoff. Expected behavior: List upcoming and recent dates. Show venue/date/t...
Admin
Goal: when Laurel is logged in as the artist/admin, she should be able to go live from the Android app without a web handoff. Expected behavior: Native live status panel for off...
Media
Goal: loggedin listeners should be able to view Laurel livestreams natively in the Android app, without opening a web handoff. Expected behavior: Show live/offline/scheduled sta...
Media
Mark noticed raw event names such as trackcompleted, playbackstart, playbackseek, and trackchanged appearing in the Android app. Expected behavior: No internal event or analytic...
Design
Motivation The Android app has one persistent Media3 player, queue, background controls, and an expanded Now Playing sheet. Now it needs a polish pass so the compact player, exp...
Design
Motivation The Android app now has substantial native functionality, but the first screen still feels like a generic Material utility surface. iOS has a native Laurel homesurfac...
Qa
Motivation Mark wants each native app to expose a selfcontained roadmap/about surface so a tester can see what this build contains, what is partly shipped, and what remains with...
Media
Workstream Android mobile app. Goal Bring the Android player shell into alignment with the shared player design notes in docs/design/player/, especially the Spotify/Applestyle s...
Media
Context The native Android MediaSession work can start the shared player and foreground media notification, but production mobile bootstrap is currently handing the app a playab...
Media
Workstream Android mobile app. Goal Make Android playback feel like a real listener app with a clear queue, nextup context, and tracktotrack continuity instead of one isolated p...
Media
Workstream Android mobile app. Goal Bring the Android listener library and player closer to the website media surface before deeper social/offline work lands. Listener jobs to b...
Media
Wrap Android playback in a native MediaSessionService so lock-screen, headphones, audio focus, and foreground playback notifications work correctly.
Media
Make Android progress writes durable across spotty connectivity, backgrounding, and future offline playback with a local queue and WorkManager retry.
Operations
Prepare the Android project for real distribution with package identity, debug/release flavors, safe network config, signing notes, and Play testing documentation.
Admin
Add an Android artist companion area for read-only signal and authenticated handoff to deeper web admin modules.
Admin
Give Laurel a role-gated Android companion workflow for live-room status, quick room controls, presence, and chat moderation.
Platform
Give Android listeners a native home base with stable web handoff links for Laurel features that are not yet fully native.
Media
Let entitled Android listeners save eligible recordings for offline playback under the #536 protected-native-cache decision once the signed offline manifest and entitlement refresh contracts are ready.
Media
Bring the website's timed listening conversation into Android playback with visible comments, timestamp seeking, replies, reactions, and moderation-aware states.
Media
Connect Android to the Fanful playback sync socket so website, Android, and iPhone sessions can hand off track, position, and active-device state.
Platform
Add FCM registration and account notification settings that distinguish OS push permission from per-category email and push preferences.
Platform
Let Android listeners sign in natively, refresh account state, and unlock paid/member entitlements through the existing Fanful account contracts.
Apps
Create the first Kotlin/Compose listener app that consumes the mobile bootstrap/progress contracts, streams playable tracks with Media3/ExoPlayer, and documents emulator and phone testing.
Workstream
Agent-readable Fanful routes, MCP/action contracts, markdown mirrors, and developer surfaces that let assistants understand and operate creator and fan workflows safely.
Roadmap stage
Useful sparks that might become real once a dependency or user need gets sharper.
No maybe items right now.
Roadmap stage
Committed roadmap work that exists, but is not the next thing to pull.
No backlog items right now.
Roadmap stage
Committed follow-ups that are queued behind the active work.
No next items right now.
Roadmap stage
Current branches and PRs. These should move as GitHub issue labels change.
No active items right now.
Roadmap stage
Shipped work, newest first, with screenshots where the change is visual.
Auth
Scope Move listener.profile.displayname.update from contractonly to an executable, confirmed agent write. Deliverables Add a confirmed listener write wrapper, likely through POS...
Web
Problem listener.community.post in /api/agent/actioncontracts still reports contractonly, even though PR 1553 / issue 1546 shipped fanfullistenercommunitymessagesread and fanful...
Web
Problem Fanful exposes member ideaboard reads to agents, but the actioncontract manifest still marks member.ideas.submitandvote as contractonly. A listener should be able to ask...
Admin
Motivation Fanful creatorcommerce agents can now update existing shop product visibility, safe details, inventory metadata, and Stripe Price mappings, but they still cannot crea...
Commerce
Parent: 1052 Related: 1681, 1682, 918, 799 Why PR 1682 made safe existing shop product details agentwritable, but deliberately left product prices and Stripe Price mapping block...
Live
Parent: 1499 Goal Define and implement the shared Fanful contract for Discord/Slackgrade live chat primitives before individual clients build UI on divergent assumptions. Scope ...

Growth
Add a publisher referral loop with shareable artist codes, first-party referral capture, Stripe-safe checkout attribution, reward qualification, admin visibility, and docs for how the growth loop was built.
Publisher referrals v1
Platform
Parent: 526. Related: 511, 525, 527. Why The shipped ideaboard data model already stores artistid, and the module should remain reusable for future Fanful creator communities. T...
Commerce
Parent: 1052 Builds on: 1053, 1057 Related: 799, 925, 926, 534 Why 1057 lets an agent select or clear an alreadyknown Stripe Price mapping for one lesson/coaching offer, but the...
Admin
Parent: 1052 Related: 1058, 1057, 1059, 1060 Why Main CI is red after 1059 and 1060 both landed. The browser journey failure is in tests/journeys/admin.spec.ts, where the 1059 a...
Admin
Parent: 1052 Builds on: 1053 Related: 925, 926, 1057, 534 Why 1053 shipped the shared Stripe catalog readiness API and made it visible to agents and native discovery, while 925/...
Admin
Parent: 1052 Builds on: 1053 Related: 799, 925, 926, 534 Why 1053 made the shared Stripe catalog/readiness boundary visible to web/admin, agents, iOS, and Android, but all billi...
Admin
Context 800 now has confirmed live status, schedule update, and liveevent create wrappers. The remaining useful embeddedroom/stage gap is narrower than the whole 505 Zoomalterna...
Admin
Why Parent 800 now has shipped live status preview/write, live schedule preview, and confirmed existingevent schedule updates. The remaining creator scheduling gap is creating a...
Admin
Why Parent 800 has shipped live status preview/write and live schedule preview, but the schedule path is still contractonly. Artists should be able to ask an agent to apply a pr...
Commerce
Context PR 976 shipped the 971 agentreadable live support preview while 968 was still treated as a blocker. 968 has now shipped liveeventattributed support metadata, purchase ro...
Commerce
Parent: 928 Context 928 originally covered web, iOS, and Android live donations. Mark's parity direction also requires agentic surfaces so assistants can answer what live suppor...
Admin
Parent: 928 Context 928 requires artist/admin visibility into donation totals for a live stream. Existing support checkout records generic support/donation purchases, but livero...
Admin
Why 800 has shipped live status preview and confirmed live status writes, but agents still cannot safely preview a new live schedule or reschedule/edit payload before a creator ...
Admin
Parent: 799 PR 906 shipped the nonmutating creator service price/policy preview surface. The next executable slice is a confirmed write wrapper that can safely turn a preview in...
Admin
Parent: 800 PR 912 shipped the nonmutating live status preview action for agents. The next executable slice is the confirmed write wrapper that can safely turn a preview into a ...
Platform
Add a user persona: events (paid tickets like eventbrite or Luna)
Auth
Parent Part of 873. Depends on the shared displayname update route from the web/API child issue. Scope Decide and expose the agentfacing listener profile update contract. If age...
Ops
Goal Add fanful.net/worklog as a public work diary for humans and agents, with instructions at the top and D1backed agent worklog entries below. Scope Create a public /worklog p...
Platform
Context During travel/offline cleanup, several partial Fanful marketing and agentsupport branches were preserved as draft PRs so local work would not remain stranded on one lapt...
Platform
Why Mark asked for docs.fanful.net to be like docs.stripe.com, targeting both AI agents and human developers. This should become the developerfacing entrypoint for Fanful's agen...
Web
Context Mark noticed fanful.net/roadmap still shows Laureloriented navigation/branding. Fanful roadmap pages should not feel like Laurel's artist website when served on fanful.n...
Web
Context Mark wants a Developers and agents topnav category that summarizes the Fanful MCP server, ChatGPT app direction, agentreadable pages, and automation posture. Scope Build...
Platform
Context Mark wants specific Fanful pages for target user types under /users, with the option to move some to /blog later. Scope Create the top 10 targetuser pages: /users/musici...
Platform
Context Mark wants Fanful's version of Stripe Solutions: "Who uses Fanful?" for use cases by creator/professional type. Scope Build /users as the landing page for Fanful target ...
Platform
Context The existing /features page needs to become the overall Fanful product overview that the navbar can link to. Scope Refine /features as an overview of Fanful products/fea...
Platform
Context Mark wants productspecific Fanful feature pages behind the top navbar. Scope Create individual feature pages for major Fanful product areas, starting with: /features/liv...
Platform
Context Mark wants fanful.net to have a sticky top navigation inspired by Stripe's toplevel categories, adjusted for Fanful. Scope Add a sticky Fanful navbar to fanful.net marke...
Web
Context Mark asked that every individual company listed under /compare/all "Platforms checked / Source notes" keep its existing public source links and also gain an internal Com...
Auth
Why Fanful users need a humanreadable place to inspect and revoke agent access after approving an MCP/CLI/ChatGPT/Codex/Claude client. That should be separate from the codeexcha...
Auth
Why 816 needs a concrete first executable slice for firstparty agent authorization. This issue owns the signedin approval and onetime code exchange path, while keeping the userf...
Auth
Why 810 selects scoped delegated grants as the Fanful agent authorization model, 811 owns the durable grant/token state, and 812 owns resolving scoped principals in /mcp and /ap...
Auth
Why The current public MCP endpoint and agent manifests are guest/readsafe, while admin reads are local environmentgated. After 810 and 811, the MCP and HTTP manifest layers nee...
Auth
Why After 810 defines the Fanful agent authorization model, Fanful needs durable state for scoped agent grants so private MCP/ChatGPT/CLI reads can be authorized, expired, and r...
Auth
Why 809 needs a concrete auth design before implementation starts. Public MCP and public manifests already work, but private listener/creator access needs a portable authorizati...
Auth
Why Fanful now has public MCP discovery and safe public/read manifests, but private creator/listener reads still rely on firstparty web sessions or local environmentgated admin ...
Auth
Why For listeners/fans to use Fanful entirely through agent clients, they need safe access to ordinary account workflows too: inspect profile/contact state, understand notificat...
Media
Why Fan/listener agent parity needs more than creator golive controls. A listener should be able to ask an agent whether a live room, webinar, Listen Along session, or gated eve...
Auth
Why A listener/fan should be able to ask an agent what memberships, tiers, purchases, credits, or gated experiences they currently have access to. 777 exposes the tier catalog, ...
Auth
Why The first agent work exposed public manifests and the member idea board, but Mark's AX goal is broader: listeners/fans should be able to interact with Fanful through agent c...
Admin
Why Mark's AX goal explicitly calls out artists scheduling a golive through agents. Embedded rooms and live/community work already exist as platform issues, but agent scheduling...
Admin
Why Mark's AX goal explicitly calls out creators using agents to do real work, including "amend price of their coaching." The shared write envelope in 786 makes this safer, but ...
Admin
Motivation Fanful now advertises a 2% platform fee and has a Stripe Connect feerouting plan, but admin and agent surfaces should clearly show that live applicationfee routing is...
Platform
Motivation Fanful pricing now lists plan limits based on what can create Cloudflare cost, but the page should be more explicit about the actual metered units: email sends, R2 st...
Commerce
Motivation Fanful's public pricing now advertises a 2% platform fee on fan payments, but the production checkout code currently records that policy in metadata rather than routi...
Web
Motivation Mark asked to be able to check progress on fanful.net/roadmap or GitHub issues while Codex keeps working. The browser roadmap exists, but the Fanful marketing archite...
Platform
Motivation Laurel's Fanful artist host uses /tiers for the fanfacing paidaccess table, with /pricing as a friendly alias. The browser alias exists, but the markdown alias does n...
Commerce
Motivation Laurel's fanfacing membership tiers are seeded in D1 and checkout can create subscription sessions today, but the seeded tiers still have stripepriceid = NULL. That m...
Admin
Motivation The Fanful pricing/admin work now distinguishes artist platform plans from fanfacing membership tiers. Laurel's fan tiers already exist in D1 and on /tiers, but the t...
Admin
Motivation Fanful admin entitlements are visible now, but the artist platformplan assignment is still hardcoded in application code. The next backend/platform step is to make th...
Commerce
Motivation Fanful now advertises a 2% platform fee on fan payments, but checkout metadata should carry that policy consistently so webhooks, admin records, analytics, future age...
Auth
Why Fanful now has a local stdio MCP server and public agentreadable manifests, but ChatGPT Apps SDK connectors and many hosted agent clients need a reachable HTTPS MCP endpoint...
Commerce
Motivation Laurel should be the concrete Fanful case study tenant: laurel.fanful.net should behave like the artist brought an existing site to Fanful, and her fans should have a...
Admin
Motivation Artists/publishers need to understand exactly what their Fanful plan unlocks inside their admin panel, especially as pricing limits and support tiers become real. Sco...
Commerce
Motivation Fanful needs simple annual artist pricing that reflects real Cloudflare cost drivers and sets expectations before any artist upgrades. Proposed tiers Tester: $2/year,...
Platform
Motivation Fanful is the current platform name and fanful.net should read as the platform home, not a MusicWebs salvage route or hidden app path. Scope Remove new/publicfacing M...
Commerce
Goal Expose the domainpurchase flow to future MCP, ChatGPT app, or CLI agents through a permissioned serverside contract rather than browser automation over the web checkout. Sc...
Web
Motivation The Fanful comparison pages now name migration/importer intent, but highintent searchers and AI agents need concrete switching guidance for each major source platform...
Agents
Record live-event admin and automation writes with redacted before/after summaries, and give agents a confirmed status-only route for go-live, end, and cancel transitions.
Live-event admin audit
Design
Context 690 preserves initial thematic guide routes for 2026 ecommerce, coaching, and community platform comparisons. The handoff calls out richer guide content and SEO/schema a...
Platform
Context 690 preserves scaffolded onetoone alternative pages for Shopify, Substack, Bandcamp, Patreon, Kajabi, Circle, and Linktree. The handoff explicitly says the current copy ...
Platform
Context A cloud Codex session created a local Fanful.net marketing/comparison surface but could not use GitHub or Cloudflare from that environment. This local branch preserves t...
Platform
Goal Turn the thematic /blog/best...platforms2026 pages into more useful comparison guides for highintent searches. Initial routes /blog/bestecommerceplatforms2026 /blog/bestcoa...
Platform
Goal Improve the /compare/COMPANYalternative pages beyond scaffold copy so each page has stronger competitorspecific proof, transparent tradeoffs, source notes, and migration gu...
Platform
Goal Move Fanful marketing and comparison surfaces onto fanful.net with a Shopifystyle comparison architecture, agentreadable markdown mirrors, and a durable path for iterative ...
Platform
Why Mark asked to research and build a ChatGPT app if relevant. The current direction from the project docs is MCP first, ChatGPT app second: keep the MCP server as the portable...
Media
Why Mark's Agent Experience goal says listener/fan experiences should be doable through Claude Code, ChatGPT, Codex, or another agent client. A fan should be able to ask what th...
Agents
Expose live room scheduling, go-live readiness, event-linked community channels, live-note moderation, and embedded-room stage controls through the agent manifest and MCP surface.
Agent live controls
Commerce
Why Mark's Agent Experience goal explicitly includes creator workflows such as changing coaching prices and managing commercial policy from Claude Code, ChatGPT, Codex, or anoth...
Agents
Record embedded-room roster/stage writes and private room-chat moderation with actor attribution, redacted summaries, and executable agent-safe moderation/audit endpoints.
Agents
Expose community chat reply context, reaction toggles, and scoped mention metadata through the agent manifest and server-side tool contract.
Agent chat affordances
Live
Route community chat digests and mentions through listener notification preferences, creator-community membership, and mute boundaries.
Chat notification routing
Agents
Turn confirmed creator-approved community automation rules into visibly attributed public replies with trigger linkage, revocation, and durable audit rows.
Automation reply processor
Agents
Expose `GET /api/agent/community-chat` so agents can discover caller capabilities, public channel state, event-linked channels, and permissioned operation descriptors without browser automation.
Agent manifest endpoint
Agents
Add durable audit rows and creator-approved automation rules before agents can perform repeated moderation, settings, channel, or public creator-speech actions.
Community chat audit registry
Ops
Why 606 called out llms.txt and markdown docs as part of making the site agentready. Agents should be able to discover the platform's public docs and safe integration surfaces w...
Auth
Why 442 identified a permissioned MCP server as the canonical agent contract, and 606 called out MCP as one of the remaining agentready implementation slices. Scope Build the fi...
Auth
Why 606 split the remaining agentready checklist after 442 established agents as the fourth surface. MCP, CLI, ChatGPT app, and future agent integrations all need explicit serve...
Admin
Why 599 tracks parity for the member idea/upvoting board that shipped on web in 511. Agent parity means future MusicWebs/Fanful MCP, ChatGPT app, or CLI tools can use the board ...
Agents
Defines the first agent-safe community chat contract so MCP, ChatGPT app, CLI, and automation clients can read channel state, understand event-linked channels, and respect listener/admin/creator-speech permissions without browser automation.
Agent contract seed
Commerce
Add purchase/membership gates, stage role promotion, attendee moderation, and paid private stream controls on top of the embedded room contract.

Live
Replaces the Discord-shaped gap with Laurel-owned community channels on `/live`: durable D1 messages, signed realtime sockets, listener posting, guest reading, and admin moderation.
Community channels
Operations
Add a privacy-filtered Durable Object status stream so active roadmap cards can show short-lived Codex progress without exposing private terminal or mailbox details.
Analytics
Build a first-party event stream, durable listener playback state, source/referrer insight, and artist-facing analytics views without depending on GA4.
First-party dashboard

GitHub issues are the engineering source of truth. This page reads public Fanful roadmap issues, merges them with curated summaries and screenshots, infers the Web/iOS/Android/agent workstream, polls for label changes, and can overlay short-lived sanitized Codex status when an active agent publishes it.
Open GitHub roadmap issues