diff --git a/AGENTS.md b/AGENTS.md index 68f883f..cc3375f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -50,14 +50,14 @@ target: 5–50 users at launch, growing by invite only. - **notifications**: off in v1. DM notifications only if DMs land in v2. never for feed activity. - **DMs**: deferred to v2. three options on table. not decided. - **federation**: flag off. may flip in v2/v3. UI stays invisible either way. -- **PWA**: deferred. may ship in v1.5. +- **PWA**: fallback option to consider if run into problems with apple app store. --- ## stack (settled) runtime: bun / framework: elysia / activitypub: fedify / db: sqlite (postgres-ready) / -storage: filesystem → s3-compatible / uploads: tus.io / mobile: react native + expo (no EAS) / +storage: filesystem → s3-compatible / uploads: tus.io / mobile: flutter + go_router / hosting: njalla VPS / proxy: nginx / process: systemd / forge: radicle / funding: liberapay --- @@ -76,7 +76,7 @@ hosting: njalla VPS / proxy: nginx / process: systemd / forge: radicle / funding - anti-attention economy: check every feature decision against this. - "the architecture is the belief" — values show in what's built and refused, not in copy. -- compromises (react native, app stores) are named honestly in the about/credits page. +- compromises (flutter/dart, app stores) are named honestly in the about/credits page. --- diff --git a/docs/CONCEPT.md b/docs/CONCEPT.md index 10dce6a..e10720b 100644 --- a/docs/CONCEPT.md +++ b/docs/CONCEPT.md @@ -19,7 +19,7 @@ the immediate goal is to give a specific community a real alternative to instagr - **feed** — chronological, no algorithm, posts with up to 10 photos - **stories** — 10s auto-advance, basic filters via swipe, no replies, 24h expiry -- **reactions** — a curated set of meaningful reactions (8 max), replacing the generic "like" +- **reactions** — poster defines up to 5 emoji as their reaction set, plus open emoji picker fallback. stored as user + post + emoji + timestamp. - **profiles** — username, display name, avatar, bio - **invite-only signup** — magic-link email auth, no passwords - **community surveys** — adding the possibility of feedback for dev work, unusual for mass social media. shows that we care @@ -55,11 +55,11 @@ the immediate goal is to give a specific community a real alternative to instagr - **process management**: systemd ### mobile -- **framework**: react native + expo (framework only, not EAS) -- **navigation**: expo router -- **builds**: local on M3 mac for ios, radicle CI for android -- **upload**: tus client + expo-background-task / URLSession background tasks -- **animations**: lottie or APNG, hand-drawn DIY +- **framework**: flutter (dart) +- **navigation**: go_router +- **builds**: local on M3 mac for ios, radicle CI for android. CI/CD on codeberg possibly. +- **upload**: tus client (tus_client package) + background isolates / WorkManager (android) / URLSession background tasks (ios) +- **animations**: lottie (rive or flutter_lottie), hand-drawn DIY ### infrastructure - **hosting**: njalla VPS from day one (skip the laptop-server phase for public use) @@ -139,9 +139,9 @@ a single quiet page. no manifesto, no flags. example phrasing: ## the subversive stance (internal value, not surface copy) -eutopic is built on tools the giants gave away — react native (meta), bun (originally seeded by US capital), the npm registry (microsoft), apple's runtime (apple), even activitypub (a w3c spec adopted by what used to be a small twitter alternative). we are using their open work to build something they wouldn't. +eutopic is built on tools the giants gave away — flutter (google), bun (originally seeded by US capital), the npm registry (microsoft), apple's runtime (apple), even activitypub (a w3c spec adopted by what used to be a small twitter alternative). we are using their open work to build something they wouldn't. -this isn't compromise, it's strategy. opensourcing tools is the one good thing big tech does. using those tools against the extraction economy they invented is the entire point. linux ran on intel chips and ate intel's lunch in servers. eutopic runs on react native and aims to make meta's social graph products less necessary, one community at a time. +this isn't compromise, it's strategy. opensourcing tools is the one good thing big tech does. using those tools against the extraction economy they invented is the entire point. linux ran on intel chips and ate intel's lunch in servers. eutopic runs on flutter and aims to make meta's social graph products less necessary, one community at a time. internal mantras for design and engineering decisions: - *take their rope, use it to leave* @@ -150,7 +150,7 @@ internal mantras for design and engineering decisions: surface-level: a credit line in the about/credits page is enough for nerds who notice: -> "eutopic uses react native, an open-source framework made by meta. we use their open work to build something they wouldn't." +> "eutopic uses flutter, an open-source framework made by google. we use their open work to build something they wouldn't." everywhere else: this stance is invisible. it's a private joke we share with anyone who asks. @@ -176,10 +176,9 @@ firebase, meta SDKs, google analytics, cloudflare, amazon, github, stripe-as-pri - **apple developer program** ($99/yr) — required for ios distribution - **apple app store** — gatekeeping, content review power; mitigated by PWA fallback option - **google play store** — same gatekeeping; mitigated by F-Droid + sideloaded APK -- **react native** (meta-maintained) — small irony of using meta's framework to flee meta, named honestly +- **flutter** (google-maintained) — using google's toolkit, no worse than meta's. dart is a small price for a single codebase that ships real native iOS and android ### neutral with caveats -- expo (US company, but framework is MIT and works without EAS) - node/npm (microsoft-owned registry but packages themselves are FOSS) - njalla (values-aligned but small; backup plan = greenhost / 1984 / flokiNET) - fedify (small project, low bus factor; AP is a spec so swappable) diff --git a/docs/DATA-MODEL.md b/docs/DATA-MODEL.md index 18d3679..8de472e 100644 --- a/docs/DATA-MODEL.md +++ b/docs/DATA-MODEL.md @@ -45,7 +45,8 @@ reaction_set: string[]?; // emoji, max 5. null = open picker only. event_date: timestamp?; // required if is_event event_ends_at: timestamp?; // required if is_event event_location: string?; -event_tags: string[]; // max 2, for bulletin board filters +poster_tag: string?; // one of: event | fundraiser | current affairs +// constraint: poster_tag required if is_event = true archived_at: timestamp?; // set by background job 1 day after event_ends_at ``` diff --git a/docs/DESIGN.md b/docs/DESIGN.md index 14b0947..150bfa3 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -92,7 +92,7 @@ formerly "bulletin board". renamed because the scope is broader than events: - `fundraiser` — community fundraising - `current affairs` — informational, reading, things worth knowing -layout: 2-column grid (`FlatList numColumns={2}`), infinite scroll, paginated fetch. +layout: 2-column grid (`SliverGrid` / `GridView.builder`), infinite scroll, paginated fetch. filtering by tag: TBD (tab strip or dropdown above grid). @@ -164,7 +164,7 @@ RSVP interaction model: open question, not designed yet. see OPEN-QUESTIONS.md. - "we don't notify you — visit when you want to." - running costs (hosting, domain, apple developer program) — real numbers, updated manually. - liberapay donation link (opens in browser). -- credit line: "eutopic uses react native, an open-source framework made by meta. we use their open work to build something they wouldn't." +- credit line: "eutopic uses flutter, an open-source framework made by google. we use their open work to build something they wouldn't." - "made with care in EU." no donor badges. no public donor list. donation is private. diff --git a/docs/OPEN-QUESTIONS.md b/docs/OPEN-QUESTIONS.md index 97b1509..505ff6c 100644 --- a/docs/OPEN-QUESTIONS.md +++ b/docs/OPEN-QUESTIONS.md @@ -11,7 +11,6 @@ priority 0: - branding + visual identity (design collab pending) - RSVP interaction model (deferred, not designed yet) - email notification format/timing for RSVPs (deferred) -- PWA — day one alongside native, or v1.5? - 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. @@ -21,6 +20,8 @@ priority 0: - 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.) --- @@ -40,7 +41,7 @@ priority 0: - ~~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 (`FlatList numColumns={2}`), infinite scroll, paginated fetch. +- ~~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. @@ -49,4 +50,5 @@ priority 0: - ~~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 / stories / profile. stories as dedicated tab, not top strip — intentional destination, not ambient check-in prompt. +- ~~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 diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 37ef52a..81cfeff 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -15,13 +15,12 @@ rough versioned plan. not a project management doc. no dates. - feed + stories + reactions - background + resumable upload via tus.io - onboarding via invite link -- bulletin board (`is_event` posts) +- posters (`/posters`, `is_event` posts with single required tag: event | fundraiser | current affairs) - liberapay donation page - njalla deployment with systemd ## soon (v1.5) - F-Droid release -- PWA fallback for iOS users avoiding app store - mobilepay via stripe if community needs it ## later (v2 — after v1 stable 3+ months)