Skip to content

Subspace Frequency Roadmap ​

What exists today, what is left, and how it is tested. Last checked against the code on 2026-10-23 (branch ui-parity).

Status key:

  • Done: works end to end and is covered by tests.
  • Ready, not deployed: built and verified locally, waiting on a server.
  • Placeholder: shown greyed out with a "Coming soon" tooltip.
  • Not started: nothing exists yet.

1. Feature status ​

Identity and accounts ​

FeatureStatusNotes
Register, sign in (by name#0000 or email), sign outDoneArgon2id hashing; 4-digit random tag per username
Rotating refresh tokens; typed JWTs (access, refresh, 2FA challenge)DoneA refresh token is single-use; tokens cannot be used as another type
Authenticator-app 2FA with backup codesDone
Passkeys: add, rename, remove; passwordless sign-inDoneWebAuthn with user verification; Chrome virtual authenticator in the browser suite
Email verification over SMTP; notice bar with ResendDoneHashed single-use tokens, 24 h; email change re-verifies and tells the old address
Subspace Directives (instance rules) gateDone
Password, email and username changes (password-gated)DoneA password change signs other devices out
Logged-in devices: list, sign one out, sign all others outDoneRevocation is immediate in the API, file service and gateway
Disable account (restore by signing in), delete accountDoneDelete refuses while the user owns beacons, then anonymises to "Deleted User"
Phone number, account standingDoneTwilio texts; off without Twilio. Limits per account, number and address; no VPNs or proxies

Profiles and presence ​

FeatureStatusNotes
Display name, pronouns, About Me, avatar, banner, theme colours, name styleDoneGlobal and per-beacon profiles
Profile visibility (everyone, beacons, friends)Done
Online, Idle, Do Not Disturb, InvisibleDoneGhost Mode masking is server-side
Custom status, commendations (badges), staff insigniaDone
Avatar decorations, profile effectsDoneBuilt-in sets

Beacons (servers) and relays (channels) ​

FeatureStatusNotes
Create, rename, icon, banner, delete, leave; folders (Clusters)Done
Clearances (roles), 50 fine-grained permissions, hierarchy, relay overwritesDoneVideo and Holo-Cast, mute and deafen, create and manage relays, invites, expressions, threads, mentions, insights are separate
Frequency Band (category) permissions, sync and Sync NowDoneEditing a synced relay copies the band's permissions and un-syncs it, as Discord does
Slowmode, polls, voice messages, private threadsDoneEach behind its own permission (Bypass Slowmode, Create Polls, Send Voice Messages, Create Private Threads)
Push-to-talk, Priority SpeakerDoneNo Use Voice Activity forces push-to-talk; Priority Speaker plays others quieter while held
Invites, invite page, bans, kicks, onboarding, DiscoveryDone
Frequency Bands (categories), hide relays, custom emojiDone
Text relays: markdown, mentions, replies, reactions, edits, deletes, pins, typing, unreadDone
Link previews (embeds), with a Chat setting to turn them offDoneSSRF-guarded fetcher, Redis cache, signed same-origin image proxy
Archival relays (forums), visual relays (galleries)Done
Comm-Links: voice, video, screen share, chat beside the callDoneLiveKit SFU, real WebRTC in the browser suite
End-to-end encrypted Comm-Links (relay setting)DoneInsertable streams; frame key shared by Double Ratchet signals
Stickers, GIFs, soundboard, threads in text relaysDone
Activities (Watch Together, Whiteboard), Clips, StagesDoneSeveral activities per comm-link; clips mix in everyone in the room and warn them
Voice moderation: server mute, server deafen, move, disconnectDoneMute Members / Move Members; enforced by LiveKit
Audit log, AutoMod, insights, templates, widgetPlaceholderBeacon Settings pages

Direct messages and social ​

FeatureStatusNotes
1-on-1 DMs (Point-to-Point Links), group DMs (Subspace Meshes)Done
Friend requests with a note, message requests, blockingDone
Voice and video calls in DMs and meshesDoneRinging prompt, ringtone, "started a call" and missed-call messages, ring again
End-to-end encrypted DMs (text and attachments)DoneX3DH + Double Ratchet (packages/e2ee); server stores ciphertext only
End-to-end encrypted DM callsDoneAutomatic in encrypted links
End-to-end encrypted meshesNot startedNeeds group key management

Search, files and notifications ​

FeatureStatusNotes
Quick Scan (Ctrl+K)Done
Search panel: text plus from:, mentions:, has:, in:, before:, during:, after:, pinned:DoneBeacons or DMs, paged, sort, Jump to result
Subspace Vault: uploads, quota, list, deleteDoneRecording accepts only the caller's own ticketed object, at its real size
Cloud drive import (Google Drive, OneDrive, Dropbox)DoneOAuth + PKCE, browser-bound state, encrypted tokens; tested against a provider mock
Unread markers, mentions, notification levels and mutesDone
Desktop notifications and ping soundDone
Mobile push (DMs, mentions, incoming calls)DoneExpo push; respects mutes, mobile-push-off and Do Not Disturb

Moderation and instance staff ​

FeatureStatusNotes
Report a transmission, user or beaconDoneSnapshot of the reported content
Command Console: reports, suspend and restore, quarantine filesDoneSuspending ends every session at once
Staff ranks (moderator, admin, root)DoneFirst rank set in the database by design; root changes ranks in the Command Console
Storage groupsDoneAdmins give accounts their own Vault quota and upload limit; DEFAULT_STORAGE_QUOTA_MB / DEFAULT_MAX_UPLOAD_MB for everyone else
Themes: Deep Space, AMOLEDDonePer device; more themes to come

Clients ​

FeatureStatusNotes
Web app (apps/web, React 19 + Vite)Done
Desktop app (apps/desktop, Tauri v2)DoneNative shell: connect screen, tray, close to tray, single instance, external links in the browser; 1.6 MB NSIS installer built on Windows
Mobile app (apps/mobile, Expo SDK 57)DoneNative shell: connect screen, WebView, notification bridge, push, haptics, permissions; Android bundle built
Store releases (signed installers, App Store, Play Store)Not startedNeeds signing certificates and store accounts

Deployment ​

FeatureStatusNotes
Production compose with a schema migrate stepReady, not deployedThe previous compose never created the schema
Staging overlay, LiveKit public config, host nginxReady, not deployeddocker-compose.staging.yml, deploy/nginx/subspace.conf
Live smoke suite (pnpm test:live)DonePasses against the local stack; run it against the server once deployed
Documentation site (apps/docs)DoneBuilds with zero broken links
Native deployment (systemd, one user per service)Readydeploy/server: hardening, platform, services, certificates, releases
Live on subspace.clickIn progressServer hardened and installed; waiting on DNS and certificates

2. Security model ​

  • Secure by default. Every route needs a valid access token unless marked config: { public: true }. Each public route has a reason in tests/e2e/security-route-coverage.test.ts, which also attacks every route with forged, expired and wrong-type tokens and fuzzes the public ones.
  • Sessions. Each sign-in is a device session in Redis that the API, file service and gateway all check. Signing a device out, changing the password, or disabling, deleting or suspending an account cuts access at once.
  • Sensitive changes re-check the current password, and answer a wrong one with 400 rather than 401.
  • Scoped real-time events. The gateway delivers an event only to its resolved audience; call states stay inside their conversation.
  • Outbound requests (link previews, embed images) refuse private, loopback, link-local, CGNAT and multicast addresses on every redirect hop, and pin the checked address.
  • End-to-end encryption. In encrypted DMs and calls the server holds only public keys and ciphertext; see Security and encryption on the docs site.

3. How it is tested ​

SuiteCommandCount
Backend unit and end-to-end (Vitest)pnpm test:native36 files, 278 tests
Web unit (Vitest + Testing Library)pnpm --filter @subspace/web test39 tests
Browser (Playwright)pnpm test:ui63 tests on an isolated stack (real Postgres, Redis, MinIO, LiveKit; mock drives and an SMTP sink)
Live smoke (Playwright)LIVE_URL=… pnpm test:live5 tests
Desktop (Rust)cargo test --manifest-path apps/desktop/src-tauri/Cargo.toml2 tests
Mobilepnpm --filter @subspace/mobile test / typecheck4 tests
Docspnpm --filter @subspace/docs buildBroken-link check

4. What is left ​

  1. Deploy staging on subspace.click once server access is available (guide: apps/docs/operate/deployment.md), run pnpm test:live against it, then the clean-slate rebuild from the docs.
  2. Store releases: desktop code signing, EAS builds and store listings for mobile.
  3. Encrypted meshes (group key management) and frame-key rotation when someone leaves an encrypted call.
  4. Generated SQL migrations instead of schema push, once the schema settles.
  5. The Discord-only features listed as placeholders, as and when the instance needs them.

A transmission from NWD.