- 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.)
- ~~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).
- ~~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.
- ~~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.