eutopic/docs/OPEN-QUESTIONS.md

54 lines
4.5 KiB
Markdown

# 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