# OPEN-QUESTIONS.md — eutopic decision log. open = not yet decided. closed = locked, with resolution noted. --- ## open priority 0: - exact reaction palette (design collab pending) - branding + visual identity (design collab pending) - RSVP interaction model (deferred, not designed yet) - email notification format/timing for RSVPs (deferred) - DMs — websockets/simple in-app vs matrix vs no DMs ever. decide before v2 launch. - social handle platform list expansion (signal + telegram primaries. custom covers edge cases. expand tbd.) - server/media migration path — which host migration is least painful for media storage (filesystem → s3-compatible). greenhost/hetzner candidates. - which njalla plan tier? - comment hearts/likes — do comments get a heart reaction? tension with "no hierarchy" value. deferred. - compose — modal sheet over current screen, or full dedicated screen? - stories — filters applied at capture time or view time? - posters — tag filter UI: tab strip or dropdown? - stories access — purely via tab, or also accessible from own profile? - CI/CD on codeberg possibly? - feed reaction visibility — should users see all reactions on a post, only their own, or none? (poster-tab reactions already locked: author-only. this is feed-only.) --- ## closed - ~~no push notifications ever~~ → v1: none. v2: DM notifications only if DMs land. never for feed activity. - ~~federation UI~~ → locked off. activitypub via fedify active in stack, flag OFF. UI stays invisible always. - ~~reaction model~~ → poster defines up to 5 emoji as their reaction set. open emoji picker always available as fallback. reactions stored as user + post + emoji + timestamp (not counters). - ~~bulletin board as separate entity~~ → `is_event` flag on regular posts. event fields: `event_date`, `event_location`, `event_ends_at`. auto-archives 1 day after `event_ends_at`. - ~~event reactions visibility~~ → visible to post author only. no public counts on bulletin board. no class hierarchy. - ~~who can post to bulletin board~~ → anyone. filters/subpages handle noise. - ~~save/bookmark~~ → optional, toggled by poster at compose time. default off for personal posts. - ~~story interaction model~~ → no replies. "witnessed" metadata: private, per-viewer row in story_witness table, expires with story (24h). story author can view flat witness list (like ig). no public count. - ~~comments~~ → flat, chronological, on posts only. not on stories. - ~~DMs in v1~~ → not shipping. replaced by `display_social_handle` user flag. may become vestigial if DMs land in v2. - ~~social handle as boolean~~ → `display_social_handle: none | mutuals | all`. single field, three states. - ~~social handle structure~~ → array of `{ platform, handle, label?, active }`. one entry per platform. `label` only used for custom platform. `active` hides without deleting. plus free text `contact_prefs` ("bad texter", "weekends only" etc). - ~~third-party auth / handle linking~~ → rejected. store strings, display them, done. - ~~social handle onboarding~~ → opt-in during onboarding. if skipped: "re-enable at any time in settings." - ~~bulletin board layout~~ → 2-column grid (`SliverGrid` / `GridView.builder`), infinite scroll, paginated fetch. - ~~survey creator~~ → admin only (you). `is_admin` flag on user record, used only for this. - ~~survey format~~ → multiple choice only. separate `/feedback` subpage always has free text field. - ~~survey visibility~~ → dev use only. no results shown to users, no public engagement metrics. - ~~survey feature~~ → v1, non-negotiable. community sees product is actively iterated on their feedback. - ~~survey delivery~~ → slot 1 in feed as injected card (not a real post). GIF cover image. tapping routes to `/feedback` where active survey renders above permanent free text field. card drops from slot 1 per-user once they've responded (checks `survey_response` on feed load). no modal. - ~~survey expiry~~ → ephemeral, 36h. - ~~bulletin board route + name~~ → `/posters`. scope is broader than events: three post types, single required tag (choose one): `event`, `fundraiser`, `current affairs`. - ~~event tags — max count~~ → max 1 tag per poster post. single required tag forces a clear primary classification, reduces compose cognitive load. - ~~nav structure~~ → five-slot bottom tab bar: home / posters / compose (center) / stories / profile. stories as dedicated tab, not top strip — intentional destination, not ambient check-in prompt. - ~~PWA~~ — fallback option to consider if run into problems with apple app store