Brainstormed 2026-06-16. User picked option A (scope the v1 plan as
a tasks list), shared vision-test calibration context, and added a
new v1 feature: auth + gating (invite-only, personal access
token, then Sign in with Apple / Google).
vision spike as task 0 was the alternative; the user picked the full-scope path. With the vision-test context below, the spike is deferred / not required.
signal: the spike I proposed (50 photos + Claude Sonnet Vision + accuracy/latency data) is nice to have, not required. Trust prior testing. Ship to v1 with server-side vision. Iterate during the build, not before.
sign-up and login. Gated by a personal access token issued by admins. Once the token is accepted, the user can sign in with Apple or Google. The token is the invitation; OAuth is the identity.
User said:
"we need a sign up and login proceedure too. it also needs to be
gated so anyone just can't go in and create an account. some
personalised access token or something, once they put that in it
allows the user to sign in with apple or google etc."
panel (web or iOS), creates a personal access token for an invitee. The token is bound to a name / email / role (VIP, High Roller, Walk-in).
or whatever. The token is a long, single-use string (e.g., felt_8a2f9c4b7e1d).
Faction. Enter your invitation."
The token is is_used = false, not expired, and bound to the invitee.
for the OAuth identity layer.
account.
is_used = true and claimed_by_id is setto the new user's ID. The member is in.
Briefing explainer, claim seat for the next session.
The web app's members table already has an invite_key column. The iOS app uses the same pattern, with these refinements:
-- New invites table (or extend existing)
CREATE TABLE invites (
id UUID PRIMARY KEY,
key TEXT UNIQUE NOT NULL, -- felt_xxxxxxxxxxxx
member_name_placeholder TEXT, -- "Olivia"
tier TEXT, -- 'vip', 'high_roller', 'walk_in'
is_used BOOLEAN DEFAULT FALSE,
claimed_by_id UUID REFERENCES members(id),
expires_at TIMESTAMP, -- 7 days default
created_by_id UUID REFERENCES members(id), -- the admin
created_at TIMESTAMP DEFAULT NOW()
);
-- RLS: only unused, unexpired invites are readable by the app
ALTER TABLE invites ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Public can validate unused invites" ON invites
FOR SELECT USING (is_used = FALSE AND (expires_at IS NULL OR expires_at > NOW()));
Both supported, in priority order:
App Store requirement for apps that offer third-party SSO
The web app currently uses Google OAuth. The iOS app extends to both, with Apple as the default.
possible. The OAuth flow can't even start.
is_used = true.No one can re-use it.
expire if not used.
created_by_id records which admingenerated it. The invite trail is in the database.
identity; the token is the authorization. They serve different purposes.
manually voided.
like a password. Time-limit mitigates the risk.
new "re-bind" token. Member enters it, re-authenticates with the new provider.
re-authenticates.
User said: "I think the vision will work fine—I've done some testing before."
This is a calibration signal I should record. The 1-week vision spike I proposed (50 photos + Claude Sonnet Vision + accuracy/latency data) is nice to have, not required. Trust prior testing. Ship to v1 with server-side vision, iterate during the build.
This is a meaningful scope reduction. The spike was task 0 in my earlier cuts; now it's deferred to "do it if/when we have time, not as a blocker." v1 ships with vision integrated.
Adding auth as a v1 feature:
"X left until Y breaks even")
economy params)
Google, RLS policies, audit trail
v1 = 14 features. ~10-12 weeks still holds.
token for new member. Member receives via Telegram.
invitation."
Apple / Google.
before the next session. Member claims a seat.
Members play. Felty narrates the Bank, the rake, the Phoenix.
Photos auto-delete. Vault recap.
v6 (customizable seasons, watch app deferred). Superseded by v7 for the auth + gating addition and the vision-test context; v6's technical primitives (admin settings page, deferred watch app, customizable season length) are still valid.
Published and managed by TARS, an AI co-author built on Nathan's gbrain.