Which features each client supports. Product, design, and engineering use this table as the reference. When adding a feature, decide which platform it belongs to first, then decide whether packages/core needs a new abstraction.

Legend: ✅ full support · ◐ partial support (see notes) · — not supported (by design)

FeatureWebDesktopMobile (planned)
General
Server address configuration— (same origin / build time)✅ First launch: local or a remote server✅ First-launch setup screen
Standalone local run (bundled server)—✅ SQLite + local files, no account—
Multiple servers in tabs—✅ One webview per tab, isolated sessions—
Sign in / sign up / password reset✅✅✅
Two-factor authentication (TOTP / email)✅✅✅
OAuth / OIDC third-party sign-in✅ Redirect✅ Loopback (RFC 8252)✅ System browser
Persistent sign-in (refresh rotation)✅ HttpOnly cookie✅ OS keychain✅ SecureStore
Session sync across tabs/windows✅ BroadcastChannel— Tabs are isolated—
Language and theme✅✅✅
Custom branding (branding.*)✅✅✅
Chat
Conversation list and chat✅✅✅
Streaming replies (SSE)✅✅✅
Markdown / code highlight / math✅✅◐ Simplified rendering
Mermaid diagrams✅✅—
Message attachments and file upload✅✅✅ Camera and gallery
Voice input◐ Browser support◐ Browser support✅ Native
Share conversation links✅✅✅
Conversation export (screenshot / document)✅✅◐ System share
Content management
File library✅✅◐ View and upload only
Knowledge bases✅✅—
Prompt presets✅✅◐ Use only, no editing
MCP / Skill configuration✅✅—
Account
Profile and security settings✅✅✅
Session management (view / revoke devices)✅✅✅
Billing and subscription✅✅✅
Account deletion✅✅✅
Admin console
All Admin features✅✅— Explicitly out of scope
Announcements and statistics✅✅◐ Announcements only
Desktop-only capabilities
Tray / resident—✅—
Auto-update—✅ Signed updater (stable and beta channels)◐ App store
System notifications◐ PWA notifications◐ Depends on the OS notification center✅ Push

Rules#

  1. A platform that is not in the table does not support the feature. Do not add something like Admin to mobile because it is easy. Vague scope leads to two divergent implementations.
  2. A new row must answer two questions: does the logic need a new packages/core abstraction, and does the UI need to be written twice? If the logic is written twice, that is an architecture violation.
  3. A ◐ entry must state the limitation. "Partially supported" alone says nothing.
  4. Desktop does not get new business-feature rows. Desktop = web + system integration. Any business feature that desktop can do but web cannot means the abstraction is at the wrong layer.

For how the boundaries and shared code are enforced, see Architecture and the Desktop App.