talks.
The team's operating system.

One place to understand the product, the plan, and how we operate. Whether you're onboarding, running a campaign, writing code, or closing a partnership — start here. Pick a section below to go deep.

Foundation

Core beliefs, brand voice, and the framework behind every decision. Read this before contributing to any campaign or product work.

Loading…

Where We Are

App status, the team, what's live in production, and what still needs work.

Loading…

Marketing

What we're posting, what campaigns are live, and who we're working with. Primary audience: Renata, Gilberto, Christian, Marta.

Loading…

Roadmap

The north star, what we're shipping now, and what's coming next. Everything on the roadmap serves the vision below.

Loading…

Engineering

Stack, dev workflow, coding standards, and branch strategy. Primary audience: Samer and JM.

Loading…

Decisions

Open questions that need an answer, and finalized decisions with the reasoning behind them.

Loading…

Rebuild Plan

The whole wall of work as one ordered, checkable list. Read every track through the strategic gates; criticals ship to prod now, the rest lands as one “new talks.” drop in August. Checkboxes persist in your browser.

0 / 0 items checked
0%

What's in here

  1. Locked decisions — release strategy + build order
  2. The gates — how to judge any feature before building it
  3. The narrative — what we're actually selling
  4. Why people post — the incentive ecosystem
  5. Track 0 — critical hotfixes → ship to prod NOW
  6. Track 1 — foundation (rebuild branch, before screens)
  7. Track B — backend & data contract (notifications engine, admin panel, tracking)
  8. Track 2 — social-media maturity (bottom-up, screen by screen)
  9. Track 3 — own features / big bets
  10. Track 4 — expansion / business
  11. USP brainstorm shelf — 45 suggestions, run through the gates
  12. Open questions — what's left to brainstorm per track

Locked decisions — read first

Release strategy
Hybrid. Cheap critical security fixes ship to prod off main now. The big UI + feature rebuild happens on a long-lived branch and lands as one "new talks." drop in August.
Build order
Risk-first, then bottom-up. Criticals first → sign-up / email → feed → profiles → social-media features → own-features. Fix the foundation before stacking screens on it.
Two tracks
(1) What makes us a real social media — images/video, reposts, profile pictures, notifications. (2) Our own features — Talks Match, Fresher Hub, alias mini-games, The Frame.
Audit findings
All 20 Critical/High findings from the audit xlsx are hard checklist items here — every one hit. The 45 USP suggestions are a brainstorm shelf to run through the gates, not commitments.
Talks Match
Context only. Victor owns the base build. Only talks-side integration hooks appear in this code list.
Canonical source
Decisions live in brain/data/decisions.json. This page is the thinking / sequencing surface — when something is decided, it graduates to the JSON.

§1The gates

Before anything gets built, it runs the gates. This is the filter that keeps us from becoming a worse Instagram. Two hard gates are pass/fail. Then a feature needs 2 of 4 soft gates. The discoverability gate asks whether a second-session user can stumble into it — if a feature needs a tutorial, it failed.

Hard gates — both required

Hard gate · anonymity
Does it preserve anonymity?
Anonymity is the technology the whole product runs on. If a feature can deanonymize a user — directly or by correlation — it does not ship. No exceptions.
Hard gate · cost
Can we afford it at scale?
Firestore reads/writes and storage cost real money per user per load. If a feature multiplies reads or needs unbounded storage with no plan, it does not ship until the cost model is solved.

Soft gates — need 2 of 4

Soft · USP test
Could only an anonymous campus app do this?
If Instagram could ship it unchanged, it's not our edge.
Soft · Instagram test
Is this a copy without a twist?
Copying a mainstream feature is fine only if anonymity / campus context gives it a new shape.
Soft · retention test
Does it give someone a reason to come back tomorrow?
Daily ritual, FOMO, status — does it feed the loop, or is it a one-time novelty?
Soft · ecosystem test
Does it strengthen the campus ecosystem?
Does it make talks. more embedded in campus life, or just add surface area?

Discoverability gate — score 0–3

3 — a user stumbles into it in normal use (best).  ·  2 — one tap from a main screen.  ·  1 — buried in settings.  ·  0 — invisible / needs a tutorial ("a bug, not a feature").

Aim for 2–3. If it scores 0–1, the feature isn't done — the surfacing is.

Anti-patterns — if you catch yourself doing these, stop

Instagram-copy-without-twist — shipping a mainstream feature with no anonymity/campus angle.  ·  Identity creep — features that slowly erode anonymity "just a little."  ·  Volume traps — chasing post count over post quality.  ·  Surface-area sprawl — adding screens instead of deepening the loop.  ·  Building-for-the-already-convinced — features only power users will find, ignoring the second-session user.

§2The narrative

The one-paragraph repositioning that every feature decision should ladder up to.

Anonymity is the technology, not the product.

We don't sell "an anonymous app." Anonymity is the engine that makes the real product possible: a campus being honest with itself. People say the true thing, ask the embarrassing question, confess the real feeling — because the cost of identity is removed. The product is the honest campus culture that falls out of that. So we never market anonymity as the feature; we market what anonymity unlocks — and we protect anonymity as fiercely as a bank protects its vault, because it's the infrastructure everything else stands on.

§3Why people post — the incentive ecosystem

Anonymity removes the usual reason to post (clout tied to your name). So we have to give people other reasons. This is the retention model the gamification, notifications, and identity tracks all feed. Eight motivations:

Catharsis
Getting something off your chest with no consequence. The confession wall's core fuel.
Belonging
"These are my people." Sub-communities (degree / year / campus) make the room feel like yours.
Status — anonymous-flavoured
Clout without a name: culture score, alias reputation, rare-alias prestige. Status you earn but can't be doxxed for.
Curiosity — the lurker
Most users read, don't post. The feed has to reward lurking so they keep opening the app.
Humour
Our strongest acquisition lever. A funny post screenshotted and shared off-platform is free growth.
Info-seeking
"Which prof is easier? Is the library open?" Fizz's wedge — underserved by us today, huge retention potential.
Identity exploration
Trying on a persona. The mascot / alias bet — people invest in an identity that isn't their real name.
FOMO trigger
"This is happening now and I might miss it." The Frame's whole design — a shared moment you have to act on.

T0Critical hotfixes — ship to PROD off main NOW critical

Cheap, surgical security + correctness fixes. These don't wait for the August rebuild — they ship to production off main immediately. Every Critical/High audit finding that's hotfixable lives here. The one finding that needs a schema migration (strip authorId from public docs) is too big to hotfix — it moves to Track 1.

T0.AAuth, roles & GDPR4 items
GDPR fan-out delete on Auth user deletion critical
deleteAccount removes the Auth user but leaves Firestore docs behind. Add a Cloud Function that fan-out deletes all user docs on Auth deletion. N1 · lib/services/user_service.dart · gdpr-deletion-missing
noweffort: H
Gate setUserRole with an admin check critical
setUserRole has no admin guard — any caller can escalate their own role. Gate it behind an admin check. N1 · functions/src/index.ts · role-escalation-unguarded
noweffort: M
Fix isValidUserUpdate bypass high
Rule doesn't check deletedKeys — a client can strip fields. Check deletedKeys and enumerate the valid updatable fields. N22 · firestore.rules · isvaliduserupdate-bypass
noweffort: M
Preserve blocklist on transient error high
A transient read error clears the user's blockList. Preserve existing blockList on error instead of wiping it. N15 · lib/providers/user_providers.dart · error-clears-blocklist
noweffort: L
T0.BSecurity rules batch (N22)6 items
Aliases owner-only read — stop deanonymization critical
The aliases collection is publicly readable, exposing the UID→alias map. Restrict to owner-only read. This is a direct anonymity breach. N22 · firestore.rules · aliases-public-deanonymization
noweffort: M
Announcement update → admin-only + field-validated critical
Any authenticated user can update any announcement field. Restrict update to admins and validate fields. N22 · firestore.rules · announcements-any-field-update
noweffort: M
Vote counters → Cloud-Function-only writes critical
Vote counters are client-writable and unvalidated — trivially gameable. Move all counter writes to a CF; rules forbid direct client writes. N22 · firestore.rules · vote-counters-unvalidated
noweffort: M
Remove users list permission — PII exposure high
A client can list the users collection, exposing PII. Remove list permission entirely. N22 · firestore.rules · users-list-exposes-pii
noweffort: L
Confession votes require auth + 1/user high
Confession votes are publicly writable with no per-user limit. Require auth and enforce one vote per user. N22 · firestore.rules · confession-votes-public
noweffort: M
Announcement poll votes require auth + isOwner high
Poll votes are unauthenticated. Require auth and an isOwner write check. N22 · firestore.rules · poll-votes-unauthenticated
noweffort: L
T0.CBackend correctness & cost5 items
Delete createTestComment from prod critical
A test Cloud Function is deployed to production. Delete it and redeploy. N21 · functions/src/index.ts · test-function-deployed
noweffort: L
Rate limiter → fail-closed on counter read error critical
On a counter read failure the limiter fails open, disabling rate limiting. Make it fail closed. N5 · functions/src/index.ts · rate-limit-bypass-fallback
noweffort: M
Add missing notifications composite index high
Live regression: notifications query needs a userId ASC + createdAt DESC composite index. Deploy immediately. N23 · firestore.indexes.json · notifications-missing-index
noweffort: L
Remove duplicate logPostCreated double-count high
post_created is logged twice, double-counting the analytics event. Dedupe the call sites. N3 · lib/services/app_analytics_service.dart · double-log-post-created
noweffort: L
Move fixCommentCount write out of build() high
post_card.dart does a Firestore write inside build() — fires on every rebuild. Move to a one-time migration Cloud Function. N4 · lib/widgets/post_card.dart · write-in-build
noweffort: M
T0.DSecrets & error handling4 items
Rotate Algolia key → Remote Config high
Algolia key is hardcoded in client source. Rotate it and move to Remote Config. N6 · lib/services/algolia_service.dart · algolia-key-hardcoded
noweffort: L
Remove logged GIF API key high
The GIF API key is printed via debugPrint. Remove the debugPrint. N16 · lib/services/gif_service.dart · gif-api-key-logged
noweffort: L
Remove hardcoded Klipy key fallback → Remote Config high
Klipy key has a hardcoded default fallback in source. Rotate, remove the fallback, fail gracefully, move to Remote Config. N16 · lib/services/gif_service.dart · klipy-key-hardcoded-default
noweffort: L
Fix handleError catch-all high
The fallback branch swallows unknown errors silently. Log unknown errors to Crashlytics and show a user-facing message. N10 · lib/utils/error_handler.dart · handleerror-fallback-broken
noweffort: L

T1Foundation — rebuild branch, before screen work summer

Structural work that has to land before any screen gets rebuilt — otherwise every screen is built on sand and re-touched later. Routing, de-hardcoding for expansion, breaking up the monolith, the private-identity schema migration, and the shared conventions that kill the audit's recurring read-cost patterns.

T1.AArchitecture & routing3 items
Adopt go_router routing system high
Current ad-hoc navigation is a summer blocker — deep links, web app, and the redesign all need real routing. N13 / N24 · summer blocker
summereffort: H
De-monolith Cloud Functions medium
The 4,999-line index.ts is unmaintainable. Split into modules by domain before adding more functions. N21 · functions/src/index.ts
summereffort: H
Storage / CDN pipeline groundwork medium
Firebase Storage + compression + CDN, set up before any media (images/video/PFPs) ships. Hard cost gate dependency. techDebt · media prerequisite
summereffort: H
T1.BDe-hardcode for expansion (Remote Config)1 grouped item
Move IE-specific constants to Remote Config + university context middleware high
Everything hardcoded to IE blocks a second campus. De-hardcode and add an assertUniversityContext middleware so all queries are scoped to a university. USP N21 / N42 · expansion blocker
summereffort: M
@student.ie.edu sign-up domain
europe-west1 functions region
IE rank names & XP thresholds
Report reasons list
University context on all queries (assertUniversityContext)
T1.CPrivate-identity schema migration1 item — the 20th critical
Strip authorId from public docs → postMeta private identity layer critical
Public post/comment docs carry authorId — anyone reading the doc can correlate authorship. Move identity into a private postMeta subdoc (or hash) so deanonymization is structurally impossible, not just rule-gated. Too big to hotfix — it's a schema migration, so it lands on the rebuild branch. This is the 20th Critical/High finding. N22 authorid-in-public-documents · USP N22 postMeta
summereffort: H
T1.DShared conventions — kills the recurring audit patterns5 items
Session-singleton providers with keepAlive
The N-reads pattern (re-fetching the same data per screen) is the audit's #1 recurring theme. One session-scoped provider per resource, kept alive, kills it. N28 · pattern-1
summereffort: M
One optimistic-update utility
Votes, bookmarks, follows all reimplement optimistic updates differently. One shared util, used everywhere.
summereffort: M
One empty / error / retry widget
Every screen hand-rolls its own empty and error states. One shared widget for consistency and less code.
summereffort: L
Document the autoDispose convention
No documented rule on when providers autoDispose vs keepAlive — a blocker for JM. Write it down so two devs build the same way.
summereffort: L
Remove dead code alongside replacements
Audit found old implementations left in place beside their replacements. Delete the dead path when shipping the new one. N28 · dead-code-alongside-replacements
summereffort: L

TBBackend & data contract — the layer everything else emits into summer

The two backend pieces Samer scoped — own notifications engine + standalone admin / moderation panel — plus the data contract they share. Designed once, to "leave everything open": track the richest possible behavioral data and stay airtight, by keying everything to a rotating pseudonym, never to identity. Foundational — it has to exist before screens emit events (T2) and before moderation has a home. Built on the postMeta migration (T1.C).

TB.AThe anonymity firewall — public / private split5 items
Invariant: a real UID never lives in a doc more than one person can read critical
The whole contract rests on this. Every "is this mine?" check and every moderation join resolves Cloud-Function-side, against the private layer — the client surface never needs a UID on shared content. This is the standard that makes deanonymization structurally impossible, not just rule-gated.
summereffort: M
Public content docs carry NO authorId → identity in CF-only postMeta critical
Today createPost writes authorId: uid straight into the public post doc, and comments do the same — any authed user can read every post's real UID. Move identity into a private postMeta layer. This is the mechanism behind T1.C. N22 authorid-in-public-documents · functions/src/index.ts:4346
summereffort: H
Close the live deanonymization chain — users no-list + aliases CF-only critical
Right now: read a post → get authorIdusers allows list to any authed user → pull that UID's real .edu email. One query, full deanonymization. The rules half ships in the T0 hotfix wave; this item is the cross-reference so the firewall reads as one story. N22 · firestore.rules (users list / aliases read)
noweffort: L
Behavioral / analytics identity = rotating pseudonym, never the UID high
This is what lets us "track everything about the user" and stay airtight. All rich tracking is keyed to a hashed, rotating pseudonym — not the Firebase UID, never the email. A breach, subpoena, or rogue admin gets behavior with no name attached.
summereffort: M
Interaction graph stored pseudonymous-only — the most sensitive dataset high
"Who they interact with most" is the single most dangerous thing to hold against identity — it's a social map of an anonymous campus. It lives keyed to pseudonyms exclusively, with no join table back to UIDs.
summereffort: M
TB.BEvent taxonomy + context envelope — track everything5 items
A context envelope on every event high
One shape attached to every analytics event + notification, set once per session: universityId · campusId · degreeId · gradYear · cohortId · aliasAgeDays · isOnExchange. Today GA events carry none of this — the dimensions live on documents only, so no metric can be sliced by campus/degree/cohort. cohortId (e.g. ie-2026-fall) is the unit you expand and report on. lib/services/app_analytics_service.dart
summereffort: M
Set the envelope as GA user properties at login
So every existing metric slices retroactively by cohort / campus / degree without re-instrumenting. Today only user_role, has_created_post, post_count are set.
summereffort: L
Rich behavioral events — "what they like, who they interact with" high
Content affinity (upvotes / saves / dwell by tag), interaction frequency, session depth, feed-tab habits, time-of-day patterns. Everything we could possibly collect — all keyed to the rotating pseudonym (TB.A), so richness costs no anonymity.
summereffort: M
Versioned event registry (schemaVersion per event)
Central naming + a version stamp on each event, so adding features or a second university never means renaming events or breaking dashboards. The "leave everything open" guarantee.
summereffort: L
Bring existing thin events up to the envelope
post_created sends only tag; vote_cast has no dimension; post_viewed just an id. Backfill all current events to carry the envelope + pseudonym so the dataset is consistent from day one. lib/services/app_analytics_service.dart
summereffort: M
TB.COwn notifications engine — the DAU/MAU lever5 items
notificationCampaigns — server-defined sends high
Trigger + audience filter (by the TB.B envelope) + copy + schedule + A/B variant, defined server-side. Lets us run growth sends without shipping an app build.
summereffort: M
notificationDeliveries ledger — the bounce-back data high
One row per send: { pseudonymId, campaignId, channel, sentAt, deliveredAt, openedAt, dismissedAt }. Without a delivery ledger you can't measure opens or retry misses — the data deck named notifications the single biggest DAU/MAU lever, and this is the table that makes it measurable.
summereffort: M
userCommsState — caps, quiet hours, channel prefs (private)
Per-user frequency caps, quiet hours, last-sent, channel preference. The guardrail against notification-spam → uninstall. Private layer, owner + CF only.
summereffort: M
Scheduled bounce-back CF
Query deliveries for sends with no openedAt, re-engage on a schedule, gated by userCommsState caps. The scalable bounce-back mechanism the data deck asked for.
summereffort: M
Replace inline fan-out with the engine
Notification writes are currently scattered inline across the monolith (reply, milestone, takedown, trending — many call sites). Route them through the engine so every send is logged and cap-aware. functions/src/index.ts · notifications writes
summereffort: M
TB.DAdmin / moderation backend — standalone web panel4 items
Roles → Firebase custom claims, not the users.role string high
Today isModerator() does a get() on the user doc on every rule eval, and the role lives in a client-adjacent field. Custom claims are signed, can't be self-escalated, and are free to check in rules. The setUserRole admin-gate (T0) is the bridge to this. N1 role-escalation · firestore.rules isModerator()
summereffort: M
moderationQueue + standalone web panel medium
Replaces the Firebase-console manual workflow and the throwaway in-app admin panel. Web-based, CF-mediated. N25 · admin backend
summereffort: H
auditLog — append-only, CF-only
Every moderation action recorded by actor pseudonym. Accountability internally, and a clean, provable moderation record for a university partner conversation.
summereffort: M
Panel resolves identity via CF endpoints only
Legitimate moderation can resolve postMeta identity server-side when it has to — but the join is never exposed to any client, including the admin SPA's own browser. Keeps the firewall (TB.A) intact even for staff.
summereffort: M
TB.EWhere the data lives — storage decision2 items
Firestore = ops state · BigQuery = the event stream
Operational state (deliveries, queue, prefs) stays in Firestore. The analytics event stream routes to BigQuery via GA's native export — cheap retention + SQL for the investor metrics. Don't build a second Firestore "events" collection: cost with no upside.
summereffort: L
Pseudonymous identity in the warehouse + retention policy
Only the rotating pseudonym lands in BigQuery, so even our own BI can't reverse to a person. Set an explicit retention window — indefinite retention of rich behavior is a liability even pseudonymized (see open Qs).
summereffort: L

T2Social-media maturity — bottom-up, screen by screen summer

Track 1 of the two Samer named: what makes us a real social media. Worked bottom-up, in the order a user meets the app — sign-up first, then the screens they hit most. Each screen folds in its audit fixes (read-cost, friction) and its USP upgrades. Order: sign-up/email → alias & profile → feed → post detail → comments → explore → notifications → global chat → gamification → moderation.

T2.ASign-up / onboarding / email — start here6 items
Custom verification email templates
Replace the default Firebase verification email with branded talks. templates. First touch a fresher has — it should not look like a system error.
summereffort: L
Reduce 4-gate sign-up friction + progress indicator
Onboarding has 4 sequential gates with no sense of progress. Cut what we can and add a progress indicator so people don't drop.
summereffort: M
Auto-trigger verify check on app resume
User clicks the email link, returns to the app, and nothing happens until they manually retry. Auto-check verification on resume.
summereffort: L
Move buried verify CTA up
The verify call-to-action is buried below the fold. Move it up so it's the obvious next step. N1
summereffort: L
Fix client-only password / domain checks
Password and email-domain validation are client-side only — bypassable. Enforce server-side too.
summereffort: M
"Make profile-building fun"
From the meeting: onboarding should feel like building an identity, not filling a form — ties into the mascot/alias work below.
summereffort: M
T2.BAlias & profile3 items
AI-generated mascot PFP derived from alias usp bet
Penguin / Reddit-style: each alias gets a generated mascot avatar. Self-expression without identity. The identity-exploration motivation made visible. meeting · gate: passes anonymity
summereffort: H
Color-scale to disambiguate identical alias+number
Marta's idea: when two users share an alias+number, use a color scale so they're visually distinct without revealing identity.
summereffort: M
Alias change → PFP changes
When a user changes their alias, the derived mascot regenerates to match. Richer self-expression loop.
summereffort: M
T2.CFeed & content7 items
Images + video in posts (CV-moderated) real-social-media
The biggest "real social media" gap. Requires the storage pipeline (T1) and CV moderation (T2.J) first. Hard cost + moderation gates.
summereffort: H
Reposts / quote posts real-social-media
Core social primitive we're missing. Brainstorm needed: how does repost interact with anonymity (see Open Qs).
summereffort: M
Default new users to Trending usp
A new user landing on an empty Latest feed sees a dead app. Default to Trending so first impression is the liveliest content. USP N1
noweffort: L
"Trending in your degree" usp
Degree-scoped trending — the belonging motivation. Only a campus app with sub-communities can do this. USP N3 / N9
summereffort: M
Polls discovery tab usp
Anonymous polls already exist but are buried. Surface them in a discovery tab — anonymity makes honest polls possible. USP N11 / N23
summereffort: M
Rich link previews usp
Pasted links render as plain text. Add rich previews so shared content looks native. USP N14 / N33
noweffort: M
Campus-pulse framing so feed ≠ Reddit usp
The feed reads like generic Reddit — our USP is invisible. Reframe it as a live campus pulse, not a content browser. N6 / N29 · USP-invisible
summereffort: M
T2.DPost detail & voting2 items
Fix per-feed N individual reads
Each post in the feed triggers an individual read. Batch / cache via the session-singleton pattern (T1.D). N4
summereffort: M
Aggregate vote transparency usp
Show aggregate vote breakdown (up/down split) — transparency that's safe because votes are anonymous. USP N4 / N12
noweffort: L
T2.EComments — worst active-user friction1 item
Fix N×N reads per thread open
Opening a comment thread fans out into N×N reads — the single worst read-cost pattern for active users, and they hit it constantly. Highest-leverage cost fix. N5 / N29
summereffort: M
T2.FExplore2 items
Fix 200+ reads on Explore open
Explore fires 200+ reads every time it opens. Paginate / cache. N6 / N29
summereffort: M
Reframe Explore as "campus pulse"
Not a generic content browser — frame it around what's happening on campus right now.
summereffort: M
T2.GNotifications4 items
Stop invalidate-kill-stream per mark-read
Marking one notification read invalidates and rebuilds the whole stream. Update in place. N9
summereffort: M
Smart notification batching usp
Batch low-priority notifications so users aren't spammed — protects the retention loop. USP N6
noweffort: M
"Your post is blowing up" milestone usp
Notify a poster when their post hits a milestone. Pure status dopamine — strongest reason to post again. USP N7 / N18
noweffort: L
Digest vs real-time preference usp
Let users choose a weekly digest or real-time pushes. Re-engagement for lurkers. USP N13 / N20 / N32
noweffort: M
T2.HGlobal chat3 items
Move entry button to bottom-middle (Instagram-style)
Gilberto's idea: the global-chat entry should sit bottom-middle in the nav, where the thumb expects it. Discoverability bump.
summereffort: L
Web-app layer for global chat
From the meeting: students want to scroll / chat in class on a laptop. A web layer enables that — cross-listed with the web-app big bet (T3).
summereffort: H
Real-time "N active now" indicator usp
Show how many people are in chat right now. Liveness = FOMO = reason to stay. USP N11 / N27
noweffort: L
T2.IGamification4 items
Culture-score breakdown usp
Show how the culture score is calculated so it feels earned, not arbitrary. Status motivation. USP N15 / N36
noweffort: L
Achievements usp
Community-given awards and achievement badges. Status without a name. USP N10 / N15 / N25
summereffort: H
Leaderboard fixes so freshers aren't disadvantaged
Current leaderboard structurally favours older accounts, so new freshers can never climb. Rework so a fresher can compete. N8
summereffort: M
Alias mini-games / clout economy
From the meeting: Flappy-Bird-style mini-game to win rare aliases. A clout economy around scarce identities — needs economy rules (see Open Qs).
summereffort: H
T2.JModeration3 items
Stand up web admin backend
Replace the throwaway in-app admin panel with a standalone web backend — stop relying on the Firebase console for moderation. N25
summereffort: H
CV image moderation (Cloud Vision + Perspective, ES/Spanglish)
Hard prerequisite before images ship. Cloud Vision for imagery + Perspective tuned for Spanish/Spanglish text. Moderation gate.
summereffort: H
Community-jury brainstorm usp
Crowd-sourced moderation by trusted users. Brainstorm only — abuse vectors need working out before committing. USP N5 / N13
summereffort: H

T3Own features / big bets summer

Track 2 of the two Samer named: our own features — the things that aren't "catch up to Instagram" but the bets that make talks. its own category. Build these after the social-media base is solid, so they land on a stable foundation.

T3.AFresher Hub2 items + brainstorm
Degree + campus auto group chats
From the meeting: auto-create group chats by degree+campus so incoming freshers meet their cohort before arrival. Belonging, pre-arrival.
summereffort: M
IE Freshers 2030 onboarding structure (Marta)
Structured onboarding for the incoming class, potentially with student government. Owner: Marta. (Open Q: does student gov already have a freshers structure?)
summereffort: M
Brainstorm
Keep the Fresher Hub use-case distinct from the WhatsApp community — no overlap. WhatsApp is the open top-of-funnel; the in-app Fresher Hub has to do something WhatsApp can't, or it's redundant.
T3.BTalks Match — CONTEXT ONLY (Victor owns base)integration hooks only

Victor builds the base. The full spec lives in docs/talks-match/TALKS_MATCH_SPEC.md + the v4 wireframes (28 screens, 8 sections; palette bone/terracotta/plum, Fraunces + DM Sans). Only the talks-side integration hooks are Samer's code work — everything else is linked context, not re-specced here.

Shared identity hook
talks. account ↔ Talks Match. Note: Match uses real profiles, not anonymous — keep the boundary clean.
summereffort: M
Analytics sink with hashed UIDs
Weekly match-volume data collection (hashed UIDs) — the proof we pitch partners with post-launch.
summereffort: M
iOS share-sheet + FCM reuse
Reuse the existing FCM setup and wire an iOS share-sheet for Match. Integration plumbing only.
summereffort: L
T3.CThe Frame, confession wall, web app3 items
The Frame — BeReal-style community photo
Everyone sees the same photo; uploading a new one replaces it. Leaderboard for longest-standing photo. The FOMO-trigger feature. Parked — open Q: the name. roadmap H2
summereffort: H
Confession wall (Liberty) — iterate
Already live. The catharsis engine. Iterate on what's working rather than rebuild.
summereffort: M
Web app — scroll / chat in class
Cross-listed with global chat (T2.H). Students on laptops in class are a real usage moment we don't serve. Depends on go_router (T1.A).
summereffort: H

T4Expansion / business summer

The work that turns one campus into a company. Not code-heavy, but it shapes what the code must support (multi-university, Spanish, analytics-as-product). Runs in parallel with the rebuild.

T4.AExpansion2 items
Universidad Europea — second campus
Thoughts only, no formal approach yet. Depends on T1.B de-hardcoding being done first. Owner: Samer + Marta.
summereffort: H
Spanish translation
Full ES localization — required for any non-IE Spanish campus. l10n scaffolding already exists (en/es).
summereffort: M
T4.BBusiness & monetization3 items + brainstorm
Business plan — doc-first, then HTML
From the meeting: write the plan as a doc first, then build the HTML version. Due to the Mexican angel before end of August; also needed for the Mark Cuban family-office contact.
summereffort: H
University-subscription monetization
Samer's dad's idea: sell visibility + analytics to the university (IE), not to users. Keeps the user experience clean and the anonymity promise intact.
summereffort: M
Valuation via comparable analysis
No revenue yet, so value via comparables. Feeds the investor conversations. (Open Q: which method + what ask amount.)
summereffort: M
Brainstorm — stakeholder session
Run as two segments: (1) a youth focus group (product/feature feedback) and (2) an older valuation group (business/valuation input). Don't mix the two — they answer different questions.

USPBrainstorm shelf — 45 suggestions brainstorm

The 45 USP suggestions from the audit. These are brainstorm fuel, not commitments. Each card gets a one-line gate prompt — run it through anonymity + cost (hard) and 2-of-4 soft gates before it earns a slot in a track above. Effort / when / UX-impact carried from the audit. Several of the best ones are already pulled up into Track 2.

USPAll 45 suggestionsrun each through the gates
1 · University verification badge usp
Verified-student badge. Gate: passes USP + ecosystem. Pulled into T2.
nowLUX: high
2 · Default sort to Trending usp
First impression = liveliest feed. → T2.C.
nowLUX: high
3 · Personalized feed v1 usp
Gate: cost (ranking reads) + does it stay honest, not engagement-bait?
summerMUX: high
4 · Ghost mode indicator usp
Show you're browsing invisibly. Gate: USP (only anon app).
nowLUX: med
5 · Anonymous streak counter usp
Daily-ritual retention. Gate: retention + does it create pressure or delight?
summerMUX: med
6 · Smart notification batching usp
Protect the loop from spam. → T2.G.
nowMUX: med
7 · Community heat map usp
Where's the activity on campus. Gate: USP + cost (aggregation).
summerMUX: med
8 · Post expiry / ephemeral usp
Snap-style decay. Gate: USP + retention (FOMO). Strong anon fit.
summerHUX: high
9 · Trending in your degree usp
Belonging + USP. → T2.C.
summerMUX: high
10 · Culture Score leaderboard usp
Status engine. → T2.I (with fresher-fairness fix N8).
nowMUX: high
11 · Anonymous polls usp
Honest polls only anon enables. → T2.C discovery tab.
nowMUX: high
12 · Vote transparency (aggregate) usp
Safe because votes are anon. → T2.D.
nowLUX: med
13 · Community jury system usp
Crowd moderation. → T2.J brainstorm (abuse vectors TBD).
summerHUX: high
14 · Controversial feed improvements usp
Gate: ecosystem — does it surface honesty or just fights?
nowLUX: med
15 · Anonymous awards / reactions usp
Community-given status. → T2.I achievements.
summerMUX: high
16 · Search by emotion / vibe usp
Gate: cost (NLP) + is it discoverable or a gimmick?
summerHUX: med
17 · Related posts widget usp
Curiosity / lurker retention. Gate: cost (reads).
summerMUX: med
18 · "Your post is blowing up" notification usp
Status dopamine → reason to repost. → T2.G.
nowLUX: high
19 · Post series / threads usp
Gate: USP — does anon change it, or is it just X threads?
summerHUX: med
20 · Weekly digest usp
Lurker re-engagement. → T2.G digest preference.
nowMUX: high
21 · Anonymous persona customization usp
Identity exploration. Overlaps the mascot bet (T2.B).
summerMUX: low
22 · Time-shifted feed usp
Gate: discoverability — would anyone find/use it?
summerLUX: low
23 · Shadow-ban detection transparency usp
Gate: ecosystem — trust win, or invites gaming?
summerLUX: low
24 · Campus-specific trending searches usp
USP + belonging. Gate: cost (Algolia).
summerMUX: med
25 · Achievement system usp
Status without a name. → T2.I.
summerHUX: high
26 · "New since you left" counter usp
Curiosity hook on return. Gate: cost (cheap if cached).
nowLUX: med
27 · Real-time activity indicator usp
Liveness = FOMO. → T2.H "N active now".
nowLUX: high
28 · Anonymous AMAs usp
Strong USP + info-seeking. Gate: moderation burden.
summerHUX: high
29 · Reputation-gated features usp
Earn access via culture score. Gate: does it gatekeep newcomers (N8 risk)?
summerMUX: med
30 · "You might like" shelf usp
Curiosity. Gate: cost + honesty (not engagement-bait).
summerHUX: high
31 · Topic clusters / follow tags usp
Belonging + curiosity. Gate: cost (fan-out on follow).
summerMUX: high
32 · Digest vs real-time preference usp
→ T2.G.
nowLUX: med
33 · Rich link previews usp
Feels native. → T2.C.
nowMUX: med
34 · Feed diversity control slider usp
User-tuned feed. Gate: discoverability (will anyone touch it?).
summerMUX: high
35 · Cross-campus mode usp
Depends on expansion (T4) + de-hardcode (T1.B). Gate: ecosystem.
summerMUX: high
36 · Culture Score breakdown usp
Makes status feel earned. → T2.I.
nowLUX: med
37 · GIF reactions to posts usp
Humour lever. GIFs already in comments — extend to posts. Gate: cost.
summerMUX: med
38 · Trending topics panel usp
Campus-pulse surfacing. Gate: cost (aggregation).
summerMUX: high
39 · First-post encouragement usp
Convert lurkers → posters. Cheap, high impact. Gate: discoverability.
nowLUX: high
40 · Anonymous leaderboard shadow usp
Status without doxxing. Pairs with T2.I. Gate: anonymity (safe).
summerMUX: high
41 · Community context on all events usp
Every event framed by campus context. Cheap ecosystem win.
nowLUX: med
42 · University context middleware usp
assertUniversityContext — expansion prerequisite. → T1.B.
nowMUX: high
43 · postMeta identity layer usp
Structural anonymity. → T1.C (the 20th critical).
summerHUX: high
44 · hasPoll index for community polls usp
Cheap index → unlocks poll discovery (T2.C). Gate: cost win.
nowLUX: high
45 · Community-scoped query optimization usp
Scope queries to sub-communities → fewer reads. Cost win + belonging.
nowMUX: med

?Open questions — what's left to brainstorm open

The unresolved decisions per track. These block their items from graduating to a track slot. When one's answered, it moves to brain/data/decisions.json. Filter to these with "Open Qs" above.

?Open questions backlog13 questions
Image / video storage + moderation cost open
What's the real per-user cost of storing + CV-moderating media, and does it pass the cost gate at scale? (Blocks T2.C images.)
Repost mechanics vs anonymity open
How does a repost work without leaking authorship or creating identity trails? (Blocks T2.C reposts.)
PFP generation budget open
What's the per-generation cost of AI mascot PFPs, and is it sustainable at fresher-intake volume? (Blocks T2.B.)
Fresher Hub vs WhatsApp community split open
What does the in-app Fresher Hub do that the open WhatsApp community can't? Keep the use-cases distinct. (Blocks T3.A.)
Talks Match double-date cadence open
Frequency / mechanics of the double-date feature (parking-lot item). Context for Victor's base.
Alias mini-game economy rules open
How rare aliases are won/priced/traded without becoming pay-to-win or gameable. (Blocks T2.I mini-games.)
The Frame — name open
"The Frame" is a placeholder. Needs a real name before it ships. (Already in openQuestions.json.)
University-subscription model open
What exactly do we sell IE (visibility? analytics? both?), at what price, without compromising anonymity. (Blocks T4.B.)
Valuation method + ask amount open
Which comparable-analysis method, and what raise amount, with no revenue yet. (Blocks T4.B / investor talks.)
Stakeholder-session structure open
Confirmed two segments (youth focus group + valuation group) — still need format, recruiting, and the question set for each.
Student-gov freshers structure open
Does student government already have a freshers structure to build on / align with? (Blocks T3.A onboarding. Already in openQuestions.json.)
Pseudonym rotation cadence vs longitudinal analysis open
Rotate the analytics pseudonym often = max unlinkability but breaks cohort retention curves; rotate rarely = clean analysis but weaker anonymity. Where's the line? (Blocks TB.A.)
Behavioral-data retention window open
How long do we keep the rich event stream? Indefinite retention of detailed behavior is a liability even pseudonymized. (Blocks TB.E.)