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 | Implemented | CalendarMonth.svelte, CalendarWeek.svelte, CalendarAgenda.svelte; month, week and agenda views, remembered per user |
| RSVPs | Implemented | CalendarRsvp.svelte, app/calendar.ts; NIP-52 going, maybe and can't go. No ticketing or paid attendance |
| 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 |
| 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 | Implemented | Roles are assigned in /spaces/[relay]/directory; a relay extension enforces the per-role permissions |
| 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 release |
| Branded iOS app | Implemented | ios/, Capacitor build |
| Branded desktop app | Implemented | electron/, scripts/package-desktop.mjs; pnpm run package:desktop:linux / :windows / :macos |
| 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 |
|---|---|---|
| Email / OTP sign-in | Implemented | LogInEmail.svelte, LogInOTP.svelte, app/pomade.ts; custodial Pomade flow, enabled 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 | Implemented | hosting/DataTransferModal.svelte, app/hosting.ts; a space's events download as JSONL and re-import into another relay |
| 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 |