From c50be161d27979f5038a1e67d1beeb5b664315c0 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 11 Sep 2026 16:47:17 -0700 Subject: [PATCH] Add feature matrix --- docs/feature_matrix.html | 725 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 725 insertions(+) create mode 100644 docs/feature_matrix.html diff --git a/docs/feature_matrix.html b/docs/feature_matrix.html new file mode 100644 index 00000000..579437c8 --- /dev/null +++ b/docs/feature_matrix.html @@ -0,0 +1,725 @@ + + + + + +Flotilla feature matrix + + + +
+

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:

+ +

Notes point at the route or module that carries the feature; US-nnn refers to +the story catalog in e2e/USER_STORIES.md.

+

Chat

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Spaces (relay-based communities)Implemented/spaces, app/rooms.ts; NIP-29 relay-as-group. US-009–017
Rooms / channelsImplemented/spaces/[relay]/[h], RoomChat.svelte. US-018–028
Direct messagesImplemented/chat, app/chats.ts; NIP-17/44/59. US-029–036, US-108–109
Group DMsImplementedChatStart.svelte, ChatMembers.svelte. US-030
Voice & video callsImplementedapp/call.ts, app/callEngine.ts, LiveKit; relay must advertise the endpoint. Calls and video are out of e2e scope
Push notificationsImplementedapp/push/, settings/alerts; web, FCM/APNs and Android fallback. US-086, US-120
ThreadsImplemented/spaces/[relay]/threads, ThreadBoard.svelte. US-042–045
Media / file sharingImplementedapp/uploads.ts, Blossom servers; upload, drag/paste, native clipboard. US-057, US-062
Room create / edit / deleteImplementedRoomCreate.svelte, RoomEdit.svelte. US-020
Room join / leave and member listsImplementedRoomMembers.svelte; private-room access requests in RoomAccess.svelte. US-019, US-021, US-022
Replies, edits and deletesImplementedComposeParent.svelte; up-arrow edit, US-023, US-024, US-035
ReactionsImplementedEventReactButtons.svelte, app/reactions.ts. US-025, US-040
Pinned messagesImplementedRoomPinnedMessages.svelte, app/roomPins.ts. US-026
Forward / share to another roomImplementedShare.svelte, ShareEvent.svelte. US-028, US-106
DraftsImplementedapp/drafts.ts. US-058
Read out loud and dictationImplementedSpeechBanner.svelte, app/dictation.ts, app/speech.ts; OpenRouter key. US-119
Room and space searchImplementedRoomSearch.svelte, SpaceSearch.svelte. US-017, US-027
Mentions, room references, hashtags, custom emojiImplemented@welshman/editor suggestions, ContentMention.svelte, ContentTopic.svelte, ContentEmoji.svelte. US-056, US-066
Link previews and rich embedsImplementedContentLinkBlock.svelte, NoteContent*.svelte; notes, articles, threads, images, video, invoices/Cashu. US-062–067
Send delay, per-relay delivery status, cancel and retryImplementedThunkStatus.svelte, app/thunks.ts. US-068–073
Zaps on messagesImplementedZap.svelte, app/lightning.ts; NIP-57. US-115
Unread indicators and muteImplementedapp/notifications.ts. US-103, US-104, US-110–114
+

Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Calendar eventsImplemented/spaces/[relay]/calendar, CalendarEvent*.svelte; NIP-52. US-046–047
Monthly calendar viewNot implementedThe calendar renders a chronological agenda, centered on today or the next event
RSVP / ticketingNot implementedNo attendance or ticket kinds
Event detail with location and hostImplementedCalendarEventMeta.svelte, CalendarEventHeader.svelte. US-047
Comments and reactions on eventsImplementedEventComments.svelte, EventReactButtons.svelte. US-052
+

Community content

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Long-form articlesImplemented/spaces/[relay]/articles, app/articles.ts; NIP-23. US-037–039, US-041
PollsImplemented/spaces/[relay]/polls, PollCreate.svelte; NIP-88, single- and multiple-choice. US-048–049
Funding goalsImplemented/spaces/[relay]/goals, GoalCreate.svelte; zap goal kind. US-050, US-052
Comments and reactions across contentImplementedCommentTree.svelte, EventActivity.svelte. US-039, US-052
Create-from-room composer menuImplementedComposeMenu.svelte; publishes a kind-9 quote for interoperability. US-041, US-055
+

Moderation

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Ban / unbanImplementedSpaceMemberMenu.svelte, SpaceMembersBanned.svelte; NIP-86 banpubkey / unbanpubkey. US-095
Allow listNot implementedOnly banning is wired up; no allowpubkey path
Member managementImplemented/spaces/[relay]/directory, SpaceMembersAdd.svelte, RoomMembersAdd.svelte. US-022, US-095
Invite codes / access controlImplementedapp/access.ts, SpaceInvite.svelte, RoomInvite.svelte; relay claims and scoped codes. US-010–011, US-094
Role management and badgesImplemented/spaces/[relay]/directory, app/roles.ts, SpaceRoles.svelte; NIP-29 member tags. US-093
Granular RBAC / role permissionsPartialRoles are assignable labels; effective permissions remain relay-level (member/admin), not per-role grants
Tier entitlementsPartialHosting plans gate Blossom and LiveKit toggles in app/hosting.ts; not a general entitlement system. US-099, US-100
Reports and content moderationImplementedReport*.svelte, app/actionItems.ts; author deletes, member reports, admin removes. US-096
Action-items queueImplementedSpaceActionItems.svelte, app/actionItems.ts. US-097
Relay policy warningsImplementedRelaySummary.svelte, app/policies.ts; auth-required, payment-required, proof-of-work. US-012, US-015
Unsigned-relay trust promptImplementedSpaceTrustRelay.svelte. US-012
Mute rooms and spacesImplementedapp/settings.ts, RoomDetail.svelte. US-104
Feature / pin content as adminImplementedEditFeaturedContent.svelte, app/featured.ts. US-092
+

Member tools

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Member profilesImplemented/people/[npub], ProfilePage.svelte. US-075, US-080, US-081
Edit own profileImplementedProfileEditForm.svelte, settings/profile. US-078
Searchable directoryImplemented/spaces/[relay]/directory; search by name or role. US-093
People searchImplementedSearch.svelte, app/social.ts. US-074
ClassifiedsImplemented/spaces/[relay]/classifieds, ClassifiedForm.svelte; NIP-99, sold status. US-051
Content library / pinboardsImplemented/spaces/[relay]/library, Pinboard*.svelte, app/pinboards.ts. US-053–054
Follow / unfollowImplementedProfileMenu.svelte, follow list. US-076
Web of trustImplementedProfileTrust.svelte, app/social.ts. US-077
Mute accountsImplementedsettings/content. US-082
Profile notes feedImplementedProfilePageNotes.svelte. US-079
Profile sharing, QR and raw infoImplementedProfileQrCode.svelte, ProfileInfo.svelte, InfoNostr.svelte. US-081
StatusesImplementedProfileStatus.svelte; NIP-38. US-075
+

White-labeling

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Branded web appImplementedVITE_PLATFORM_* env, app/env.ts; name, url, logo, accent, description, terms, privacy
Branded Android appImplementedandroid/, @capacitor/assets, pnpm run release:android
Branded iOS appImplementedios/, Capacitor build
Branded desktop appPartialelectron/, scripts/build-desktop.sh; dev baseline only, no installers, release pipeline or auto-update
PWA / installable web appImplemented@vite-pwa/sveltekit, manifest.webmanifest, service-worker.js
Push to your own appImplementedVITE_PUSH_SERVER / VITE_PUSH_BRIDGE, app/push/
Custom domainImplementedCustomDomainModal.svelte, app/hosting.ts; CNAME verification for hosted relays. US-101
Platform mode (own relays only)ImplementedVITE_PLATFORM_RELAYS; disables browse/add/select and makes the platform relay home
Configurable defaultsImplementedVITE_DEFAULT_SPACES, VITE_DEFAULT_RELAYS, VITE_DEFAULT_MESSAGING_RELAYS, VITE_DEFAULT_BLOSSOM_SERVERS
Native share sheet and deep linksImplemented@capacitor/share, Android share intent, nostr: / https: dispatch. US-106, US-107
+

Self-hosting

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Self-hostableImplementedDockerfile, server.js; docker run or static build copied to any host
Open sourceImplementedMIT license (LICENSE)
Static-host deploymentImplementedpnpm run build output can be copied to any static host (README.md)
Managed hosting platformImplementedapp/hosting.ts, settings/hosting, /spaces/[relay]/admin; create, plan, domain, pause and billing. US-098–102
Relay health checksImplementedHomeHealthChecks.svelte, app/healthChecks.ts. US-116
+

SSO

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
SAML / OIDC / SCIM / Workspace SSONot implementedNo enterprise identity provider integration
Email / OTP sign-inPartialLogInEmail.svelte, LogInOTP.svelte, app/pomade.ts; custodial Pomade flow, enabled only when VITE_POMADE_SIGNERS is set. Out of e2e scope
Browser extension sign-inImplementedNIP-07, LogInSelect.svelte. US-004
Remote signer / bunkerImplementedNIP-46, LogInBunker.svelte, BunkerConnect.svelte, QR flow. US-005
Native Android signerImplementedNIP-55; out of e2e scope
Relay authenticationImplementedNIP-42, app/access.ts, settings/privacy
Key backup on signupImplementedKeyDownload.svelte; plain nsec or password-encrypted ncryptsec. US-002
Data exportNot implementedNo user-data export; the privacy page only sends diagnostic logs to the developer
Account deletionImplementedProfileDelete.svelte, settings/profile; broadcasts account deletion. US-008
+

Portable identity & history

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Customer holds keysBy designIdentity is a self-sovereign nsec/npub; no account lives with the operator
Customer holds source and dataBy designSelf-hostable relay plus user-chosen relays; events are portable Nostr events
One-click export / importNot implementedNo bundled export or re-import of a user's data
Multi-device syncImplementedNIP-78 app-data sync, app/sync.ts; read state and settings follow the account
Local-first historyImplementedIndexedDB persistence, app/storage.ts, lib/indexeddb.ts; read conversations survive relay loss. US-109
Account portability across clientsBy designThe same keys and relay events work in any NIP-29 client
Key recoveryImplementedKeyRecoveryRequest.svelte, KeyRecoveryConfirm.svelte for custodial (Pomade) accounts
+

Home & discovery

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Home dashboard / inboxImplemented/home, HomeInbox.svelte, app/inbox.ts. US-105, US-116
Cross-space activity summaryImplementedHomeActivity.svelte, app/feeds.ts. US-116
Network feed of followsImplementedHomeNetwork.svelte, app/feeds.ts. US-117
Space browse, search and reorderImplemented/spaces, PrimaryNavSpaces.svelte, drag reordering. US-009
Join by invite / direct linkImplementedSpaceJoin.svelte, /join, invite parsing in app/access.ts. US-010, US-011
Link and bech32 resolutionImplemented[bech32] route, app/routes.ts; npub/nevent/note. US-107
+

Lightning & payments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureStatusNotes
Zap messages and profilesImplementedZap.svelte, app/lightning.ts; NIP-57
Wallet connection (NWC / WebLN)Implementedsettings/wallet, app/lightning.ts; NIP-47. US-115
Lightning address and zap presetsImplementedsettings/wallet, app/lightning.ts. US-091
Hosting billing and invoicesImplementedPaymentDialog.svelte, PaymentSetup.svelte, app/hosting.ts; Lightning and card. US-102
+ +
+ +