Client-side follow-up to server federation (accordserver#38). Depends on #168 (SDK support).
Once the SDK can join a remote-homed space and parse origin/qualified IDs, the Flutter client needs UI to actually use federation. None exists today.
Task
- Join entry point: a way to join a space homed on another server — via
daccord:// invite/connect deep links (ServerUri.parseDeepLink() in lib/main.dart) and/or an explicit "join remote space" action, wired to the SDK join trigger.
- Render federated content: display messages, members, reactions, and emoji from remote-homed spaces. Show qualified handles correctly and avoid colliding remote users with local ones.
- Origin indication: surface which server a space/user is homed on where it matters (e.g. space header, member list / profile), so users can tell local vs. remote.
- Remote media: load emoji and attachments from the absolute home-server CDN URLs the SDK now passes through.
- Action routing: ensure send/edit/delete/react/typing/leave in a remote-homed space go through the SDK's forward path (the server re-runs permissions on the home), and reflect the authoritative result returned via fanout.
Pointers
lib/features/spaces/ (space list, join, discovery — accord_discovery.dart)
lib/features/messaging/, lib/features/member/, lib/features/profiles/ (rendering remote content)
lib/main.dart (ProfileGate, deep-link parsing)
- Per-server clients:
lib/features/server/controllers/connections.dart
Acceptance
- A user can join a space homed on a different Accord server and see it in their space list.
- Messages/reactions/members/emoji from that space render, with remote authors shown correctly.
- Posting/editing/reacting in a remote-homed space works and reflects back via fanout.
Client-side follow-up to server federation (accordserver#38). Depends on #168 (SDK support).
Once the SDK can join a remote-homed space and parse
origin/qualified IDs, the Flutter client needs UI to actually use federation. None exists today.Task
daccord://invite/connect deep links (ServerUri.parseDeepLink()inlib/main.dart) and/or an explicit "join remote space" action, wired to the SDK join trigger.Pointers
lib/features/spaces/(space list, join, discovery —accord_discovery.dart)lib/features/messaging/,lib/features/member/,lib/features/profiles/(rendering remote content)lib/main.dart(ProfileGate, deep-link parsing)lib/features/server/controllers/connections.dartAcceptance