143 lines
4.9 KiB
Markdown
143 lines
4.9 KiB
Markdown
|
|
{
|
|||
|
|
you are helping design the frontend of eutopic — a
|
|||
|
|
photo-first social app for small, invite-only
|
|||
|
|
communities. it runs on flutter (dart). it has five
|
|||
|
|
main screens: home feed, posters (bulletin board),
|
|||
|
|
compose (center tab), stories, and profile. it also
|
|||
|
|
has secondary screens for onboarding, settings, and
|
|||
|
|
feedback. here's specs:
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## navigation
|
|||
|
|
|
|||
|
|
five-slot bottom tab bar for screens:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
⒣ home | ⇶ posters | ◲ compose | ❣ stories | ☺ profile
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- **home** — chronological feed
|
|||
|
|
- **posters** — bulletin board (`/posters`, `is_event` posts + informational posts + fundraisers)
|
|||
|
|
- **compose** — center slot, filled/distinct treatment. opens compose flow (modal or full screen — TBD)
|
|||
|
|
- **stories** — dedicated tab, not a top strip. intentional destination, not ambient anxiety ring.
|
|||
|
|
- **profile** — own profile. viewing others' profiles navigates within the app but doesn't change the active tab.
|
|||
|
|
|
|||
|
|
stories as a bottom tab (vs instagram-style top strip) is a deliberate choice: it frames stories as something you visit, not something that nags you to check.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## screens
|
|||
|
|
|
|||
|
|
### onboarding (unauthenticated)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
invite gate
|
|||
|
|
└── invite code prefilled from deep link, or entered manually
|
|||
|
|
email + username entry
|
|||
|
|
magic link sent / confirm screen
|
|||
|
|
social handle opt-in
|
|||
|
|
└── signal / telegram / custom. skippable. "re-enable anytime in settings."
|
|||
|
|
follow suggestions
|
|||
|
|
└── friends-of-inviter auto-suggested. skippable.
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
zero technology decisions for the user. no server picker. no handle explanation. no fediverse vocabulary.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### feed (`/`)
|
|||
|
|
|
|||
|
|
- chronological. no algorithm. no ranked content.
|
|||
|
|
- posts with 1–10 photos (swipeable within the post card).
|
|||
|
|
- reactions inline below each post.
|
|||
|
|
- comments accessible via tap (flat, chronological thread).
|
|||
|
|
- **survey card** injected at slot 1 when an active survey exists. GIF cover. taps to `/feedback`. disappears per-user once responded. not a real post.
|
|||
|
|
- no unread indicators. no "new posts" banner. pull to refresh is fine.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### posters (`/posters`)
|
|||
|
|
|
|||
|
|
formerly "bulletin board". renamed because the scope is broader than events:
|
|||
|
|
|
|||
|
|
**post types** (single tag, required, choose one):
|
|||
|
|
- `event` — dated gathering, auto-archives 1 day after `event_ends_at`
|
|||
|
|
- `fundraiser` — community fundraising
|
|||
|
|
- `current affairs` — informational, reading, things worth knowing
|
|||
|
|
|
|||
|
|
layout: 2-column grid (`FlatList numColumns={2}`), infinite scroll, paginated fetch.
|
|||
|
|
|
|||
|
|
filtering by tag: TBD (tab strip or dropdown above grid).
|
|||
|
|
|
|||
|
|
reactions on poster posts: visible to post author only. no public counts. no hierarchy.
|
|||
|
|
|
|||
|
|
RSVP interaction model: open question, not designed yet. see OPEN-QUESTIONS.md.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### compose (◲)
|
|||
|
|
|
|||
|
|
- triggered from center nav slot.
|
|||
|
|
- photo picker first (up to 10 photos).
|
|||
|
|
- caption optional.
|
|||
|
|
- toggle: post to feed or post to posters. if posters: tag picker (single tag required) + event fields if `event`.
|
|||
|
|
- toggle: saveable on/off (default off).
|
|||
|
|
- toggle: reaction set — choose up to 5 emoji, or leave open (open picker only).
|
|||
|
|
- upload starts in background immediately on confirm. progress shown via hand-drawn animation. bad wifi handled invisibly via tus.io resumable upload.
|
|||
|
|
- no drafts, no scheduling, no queue UI.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### stories (❣)
|
|||
|
|
|
|||
|
|
- dedicated tab, not a top strip.
|
|||
|
|
- 10s auto-advance per story.
|
|||
|
|
- filters via swipe gesture (basic, applied at view time or capture time — TBD).
|
|||
|
|
- no replies. "witnessed" metadata only: private per-viewer row, expires with story (24h).
|
|||
|
|
- story author can see flat witness list (like instagram). no public count.
|
|||
|
|
- story creation: camera or photo picker, then post. no drafts.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### profile (☺)
|
|||
|
|
|
|||
|
|
**own profile:**
|
|||
|
|
- avatar, display name, username, bio.
|
|||
|
|
- social handles (signal / telegram / custom) — shown based on `display_social_handle` setting: none / mutuals / all.
|
|||
|
|
- `contact_prefs` free text ("bad texter", "weekends only").
|
|||
|
|
- own posts grid.
|
|||
|
|
- settings access.
|
|||
|
|
|
|||
|
|
**others' profiles:**
|
|||
|
|
- same view, minus settings. follow/unfollow action.
|
|||
|
|
- social handles visible per their `display_social_handle` setting.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### feedback (`/feedback`)
|
|||
|
|
|
|||
|
|
- always accessible (settings link or survey card tap).
|
|||
|
|
- active survey renders at top if one exists (multiple choice, 36h expiry).
|
|||
|
|
- permanent free text field below, always present regardless of active survey.
|
|||
|
|
- no results shown to users. dev use only.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
eutopic has no notifications, no DMs (chat), and no push
|
|||
|
|
alerts. do not include any notification-related files
|
|||
|
|
or widgets.
|
|||
|
|
|
|||
|
|
use feature-first structure. example:
|
|||
|
|
lib/features/feed/feed_screen.dart
|
|||
|
|
lib/features/feed/widgets/post_card.dart
|
|||
|
|
lib/shared/models/user.dart
|
|||
|
|
|
|||
|
|
draw an ASCII tree diagram of the flutter frontend
|
|||
|
|
folder and file structure. include lib/ as the root.
|
|||
|
|
show actual filenames (*.dart), not just folder names.
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
read @AGENTS.md and @docs/ROADMAP.md. given the stack choices and the team size (1-2 people), does the feature scope for v0 and v1 feel right-sized, or is it too ambitious? focus on scope, not timeline.
|
|||
|
|
}
|