Flotilla feature matrix
+Flotilla's feature set, grouped by the areas of the pasted outline and expanded +with capabilities found in the codebase. Status values:
+-
+
- Implemented — reachable in the app today. +
- Partial — present but limited, gated behind configuration, or dependent on +the relay/native platform. +
- Not implemented — no code path exists. +
- By design — supplied by the Nostr protocol or the deployment model rather +than by app code. +
Notes point at the route or module that carries the feature; US-nnn refers to
+the story catalog in e2e/USER_STORIES.md.
Chat
+| Feature | +Status | +Notes | +
|---|---|---|
| Spaces (relay-based communities) | +Implemented | +/spaces, app/rooms.ts; NIP-29 relay-as-group. US-009–017 |
+
| Rooms / channels | +Implemented | +/spaces/[relay]/[h], RoomChat.svelte. US-018–028 |
+
| Direct messages | +Implemented | +/chat, app/chats.ts; NIP-17/44/59. US-029–036, US-108–109 |
+
| Group DMs | +Implemented | +ChatStart.svelte, ChatMembers.svelte. US-030 |
+
| Voice & video calls | +Implemented | +app/call.ts, app/callEngine.ts, LiveKit; relay must advertise the endpoint. Calls and video are out of e2e scope |
+
| Push notifications | +Implemented | +app/push/, settings/alerts; web, FCM/APNs and Android fallback. US-086, US-120 |
+
| Threads | +Implemented | +/spaces/[relay]/threads, ThreadBoard.svelte. US-042–045 |
+
| Media / file sharing | +Implemented | +app/uploads.ts, Blossom servers; upload, drag/paste, native clipboard. US-057, US-062 |
+
| Room create / edit / delete | +Implemented | +RoomCreate.svelte, RoomEdit.svelte. US-020 |
+
| Room join / leave and member lists | +Implemented | +RoomMembers.svelte; private-room access requests in RoomAccess.svelte. US-019, US-021, US-022 |
+
| Replies, edits and deletes | +Implemented | +ComposeParent.svelte; up-arrow edit, US-023, US-024, US-035 |
+
| Reactions | +Implemented | +EventReactButtons.svelte, app/reactions.ts. US-025, US-040 |
+
| Pinned messages | +Implemented | +RoomPinnedMessages.svelte, app/roomPins.ts. US-026 |
+
| Forward / share to another room | +Implemented | +Share.svelte, ShareEvent.svelte. US-028, US-106 |
+
| Drafts | +Implemented | +app/drafts.ts. US-058 |
+
| Read out loud and dictation | +Implemented | +SpeechBanner.svelte, app/dictation.ts, app/speech.ts; OpenRouter key. US-119 |
+
| Room and space search | +Implemented | +RoomSearch.svelte, SpaceSearch.svelte. US-017, US-027 |
+
| Mentions, room references, hashtags, custom emoji | +Implemented | +@welshman/editor suggestions, ContentMention.svelte, ContentTopic.svelte, ContentEmoji.svelte. US-056, US-066 |
+
| Link previews and rich embeds | +Implemented | +ContentLinkBlock.svelte, NoteContent*.svelte; notes, articles, threads, images, video, invoices/Cashu. US-062–067 |
+
| Send delay, per-relay delivery status, cancel and retry | +Implemented | +ThunkStatus.svelte, app/thunks.ts. US-068–073 |
+
| Zaps on messages | +Implemented | +Zap.svelte, app/lightning.ts; NIP-57. US-115 |
+
| Unread indicators and mute | +Implemented | +app/notifications.ts. US-103, US-104, US-110–114 |
+
Events
+| Feature | +Status | +Notes | +
|---|---|---|
| Calendar events | +Implemented | +/spaces/[relay]/calendar, CalendarEvent*.svelte; NIP-52. US-046–047 |
+
| Monthly calendar view | +Not implemented | +The calendar renders a chronological agenda, centered on today or the next event | +
| RSVP / ticketing | +Not implemented | +No attendance or ticket kinds | +
| Event detail with location and host | +Implemented | +CalendarEventMeta.svelte, CalendarEventHeader.svelte. US-047 |
+
| Comments and reactions on events | +Implemented | +EventComments.svelte, EventReactButtons.svelte. US-052 |
+
Community content
+| Feature | +Status | +Notes | +
|---|---|---|
| Long-form articles | +Implemented | +/spaces/[relay]/articles, app/articles.ts; NIP-23. US-037–039, US-041 |
+
| Polls | +Implemented | +/spaces/[relay]/polls, PollCreate.svelte; NIP-88, single- and multiple-choice. US-048–049 |
+
| Funding goals | +Implemented | +/spaces/[relay]/goals, GoalCreate.svelte; zap goal kind. US-050, US-052 |
+
| Comments and reactions across content | +Implemented | +CommentTree.svelte, EventActivity.svelte. US-039, US-052 |
+
| Create-from-room composer menu | +Implemented | +ComposeMenu.svelte; publishes a kind-9 quote for interoperability. US-041, US-055 |
+
Moderation
+| Feature | +Status | +Notes | +
|---|---|---|
| Ban / unban | +Implemented | +SpaceMemberMenu.svelte, SpaceMembersBanned.svelte; NIP-86 banpubkey / unbanpubkey. US-095 |
+
| Allow list | +Not implemented | +Only banning is wired up; no allowpubkey path |
+
| Member management | +Implemented | +/spaces/[relay]/directory, SpaceMembersAdd.svelte, RoomMembersAdd.svelte. US-022, US-095 |
+
| Invite codes / access control | +Implemented | +app/access.ts, SpaceInvite.svelte, RoomInvite.svelte; relay claims and scoped codes. US-010–011, US-094 |
+
| Role management and badges | +Implemented | +/spaces/[relay]/directory, app/roles.ts, SpaceRoles.svelte; NIP-29 member tags. US-093 |
+
| Granular RBAC / role permissions | +Partial | +Roles are assignable labels; effective permissions remain relay-level (member/admin), not per-role grants | +
| Tier entitlements | +Partial | +Hosting plans gate Blossom and LiveKit toggles in app/hosting.ts; not a general entitlement system. US-099, US-100 |
+
| Reports and content moderation | +Implemented | +Report*.svelte, app/actionItems.ts; author deletes, member reports, admin removes. US-096 |
+
| Action-items queue | +Implemented | +SpaceActionItems.svelte, app/actionItems.ts. US-097 |
+
| Relay policy warnings | +Implemented | +RelaySummary.svelte, app/policies.ts; auth-required, payment-required, proof-of-work. US-012, US-015 |
+
| Unsigned-relay trust prompt | +Implemented | +SpaceTrustRelay.svelte. US-012 |
+
| Mute rooms and spaces | +Implemented | +app/settings.ts, RoomDetail.svelte. US-104 |
+
| Feature / pin content as admin | +Implemented | +EditFeaturedContent.svelte, app/featured.ts. US-092 |
+
Member tools
+| Feature | +Status | +Notes | +
|---|---|---|
| Member profiles | +Implemented | +/people/[npub], ProfilePage.svelte. US-075, US-080, US-081 |
+
| Edit own profile | +Implemented | +ProfileEditForm.svelte, settings/profile. US-078 |
+
| Searchable directory | +Implemented | +/spaces/[relay]/directory; search by name or role. US-093 |
+
| People search | +Implemented | +Search.svelte, app/social.ts. US-074 |
+
| Classifieds | +Implemented | +/spaces/[relay]/classifieds, ClassifiedForm.svelte; NIP-99, sold status. US-051 |
+
| Content library / pinboards | +Implemented | +/spaces/[relay]/library, Pinboard*.svelte, app/pinboards.ts. US-053–054 |
+
| Follow / unfollow | +Implemented | +ProfileMenu.svelte, follow list. US-076 |
+
| Web of trust | +Implemented | +ProfileTrust.svelte, app/social.ts. US-077 |
+
| Mute accounts | +Implemented | +settings/content. US-082 |
+
| Profile notes feed | +Implemented | +ProfilePageNotes.svelte. US-079 |
+
| Profile sharing, QR and raw info | +Implemented | +ProfileQrCode.svelte, ProfileInfo.svelte, InfoNostr.svelte. US-081 |
+
| Statuses | +Implemented | +ProfileStatus.svelte; NIP-38. US-075 |
+
White-labeling
+| Feature | +Status | +Notes | +
|---|---|---|
| Branded web app | +Implemented | +VITE_PLATFORM_* env, app/env.ts; name, url, logo, accent, description, terms, privacy |
+
| Branded Android app | +Implemented | +android/, @capacitor/assets, pnpm run release:android |
+
| Branded iOS app | +Implemented | +ios/, Capacitor build |
+
| Branded desktop app | +Partial | +electron/, scripts/build-desktop.sh; dev baseline only, no installers, release pipeline or auto-update |
+
| PWA / installable web app | +Implemented | +@vite-pwa/sveltekit, manifest.webmanifest, service-worker.js |
+
| Push to your own app | +Implemented | +VITE_PUSH_SERVER / VITE_PUSH_BRIDGE, app/push/ |
+
| Custom domain | +Implemented | +CustomDomainModal.svelte, app/hosting.ts; CNAME verification for hosted relays. US-101 |
+
| Platform mode (own relays only) | +Implemented | +VITE_PLATFORM_RELAYS; disables browse/add/select and makes the platform relay home |
+
| Configurable defaults | +Implemented | +VITE_DEFAULT_SPACES, VITE_DEFAULT_RELAYS, VITE_DEFAULT_MESSAGING_RELAYS, VITE_DEFAULT_BLOSSOM_SERVERS |
+
| Native share sheet and deep links | +Implemented | +@capacitor/share, Android share intent, nostr: / https: dispatch. US-106, US-107 |
+
Self-hosting
+| Feature | +Status | +Notes | +
|---|---|---|
| Self-hostable | +Implemented | +Dockerfile, server.js; docker run or static build copied to any host |
+
| Open source | +Implemented | +MIT license (LICENSE) |
+
| Static-host deployment | +Implemented | +pnpm run build output can be copied to any static host (README.md) |
+
| Managed hosting platform | +Implemented | +app/hosting.ts, settings/hosting, /spaces/[relay]/admin; create, plan, domain, pause and billing. US-098–102 |
+
| Relay health checks | +Implemented | +HomeHealthChecks.svelte, app/healthChecks.ts. US-116 |
+
SSO
+| Feature | +Status | +Notes | +
|---|---|---|
| SAML / OIDC / SCIM / Workspace SSO | +Not implemented | +No enterprise identity provider integration | +
| Email / OTP sign-in | +Partial | +LogInEmail.svelte, LogInOTP.svelte, app/pomade.ts; custodial Pomade flow, enabled only when VITE_POMADE_SIGNERS is set. Out of e2e scope |
+
| Browser extension sign-in | +Implemented | +NIP-07, LogInSelect.svelte. US-004 |
+
| Remote signer / bunker | +Implemented | +NIP-46, LogInBunker.svelte, BunkerConnect.svelte, QR flow. US-005 |
+
| Native Android signer | +Implemented | +NIP-55; out of e2e scope | +
| Relay authentication | +Implemented | +NIP-42, app/access.ts, settings/privacy |
+
| Key backup on signup | +Implemented | +KeyDownload.svelte; plain nsec or password-encrypted ncryptsec. US-002 |
+
| Data export | +Not implemented | +No user-data export; the privacy page only sends diagnostic logs to the developer | +
| Account deletion | +Implemented | +ProfileDelete.svelte, settings/profile; broadcasts account deletion. US-008 |
+
Portable identity & history
+| Feature | +Status | +Notes | +
|---|---|---|
| Customer holds keys | +By design | +Identity is a self-sovereign nsec/npub; no account lives with the operator |
+
| Customer holds source and data | +By design | +Self-hostable relay plus user-chosen relays; events are portable Nostr events | +
| One-click export / import | +Not implemented | +No bundled export or re-import of a user's data | +
| Multi-device sync | +Implemented | +NIP-78 app-data sync, app/sync.ts; read state and settings follow the account |
+
| Local-first history | +Implemented | +IndexedDB persistence, app/storage.ts, lib/indexeddb.ts; read conversations survive relay loss. US-109 |
+
| Account portability across clients | +By design | +The same keys and relay events work in any NIP-29 client | +
| Key recovery | +Implemented | +KeyRecoveryRequest.svelte, KeyRecoveryConfirm.svelte for custodial (Pomade) accounts |
+
Home & discovery
+| Feature | +Status | +Notes | +
|---|---|---|
| Home dashboard / inbox | +Implemented | +/home, HomeInbox.svelte, app/inbox.ts. US-105, US-116 |
+
| Cross-space activity summary | +Implemented | +HomeActivity.svelte, app/feeds.ts. US-116 |
+
| Network feed of follows | +Implemented | +HomeNetwork.svelte, app/feeds.ts. US-117 |
+
| Space browse, search and reorder | +Implemented | +/spaces, PrimaryNavSpaces.svelte, drag reordering. US-009 |
+
| Join by invite / direct link | +Implemented | +SpaceJoin.svelte, /join, invite parsing in app/access.ts. US-010, US-011 |
+
| Link and bech32 resolution | +Implemented | +[bech32] route, app/routes.ts; npub/nevent/note. US-107 |
+
Lightning & payments
+| Feature | +Status | +Notes | +
|---|---|---|
| Zap messages and profiles | +Implemented | +Zap.svelte, app/lightning.ts; NIP-57 |
+
| Wallet connection (NWC / WebLN) | +Implemented | +settings/wallet, app/lightning.ts; NIP-47. US-115 |
+
| Lightning address and zap presets | +Implemented | +settings/wallet, app/lightning.ts. US-091 |
+
| Hosting billing and invoices | +Implemented | +PaymentDialog.svelte, PaymentSetup.svelte, app/hosting.ts; Lightning and card. US-102 |
+