Skip to content

RFC 0056 — Sovereign Guide

Summary

Add Sovereign Guide, a platform plugin that helps users understand their Sovereign instance after first login. The plugin explains the instance model, core apps/plugins, privacy expectations, self-hosting concepts, and next actions in a short, task-oriented guide.

Guide is not a marketing page and not a docs-site replacement. It is an in-product orientation surface. Each user can complete or hide it for themselves; hiding Guide should not disable the plugin for other users or remove operator access to update guide content.

Motivation

Sovereign has several concepts that are clear to contributors but not obvious to new instance users:

  • an instance is self-hosted and controlled by its operator;
  • plugins are installed applications inside one workspace;
  • Account controls personal profile, security, preferences, and data rights;
  • Console is admin/owner-only;
  • Launcher is the user's app grid;
  • public docs live outside the product, but users should not need to read them before they can orient themselves.

Without an in-product guide, the first user experience depends on external docs, operator explanation, or trial and error. A small platform plugin gives every instance a consistent default orientation path while preserving user control: once a user has seen enough, they can hide it for themselves.

Current State

  • Launcher exists as the default root plugin and shows installed, enabled, non-chrome plugins.
  • Account contains per-user preferences and sidebar/plugin visibility controls.
  • Console is admin-only and manages platform/plugin settings.
  • Platform roles and plugin capabilities exist, so Guide can show admin-only sections only to users who can act on them.
  • Instance identity exists, so guide copy can use the configured instance name instead of hardcoding "Sovereign" everywhere.
  • There is no dedicated in-product onboarding or help plugin.

Proposed Design

Product Shape

Guide ships as a platform plugin:

text
plugins/guide/
├── manifest.json
├── icon.svg
├── package.json
├── app/
│   ├── page.tsx                 # guide home / checklist
│   ├── basics/page.tsx          # instance, plugins, data model
│   ├── account/page.tsx         # profile, security, preferences, data rights
│   ├── admin/page.tsx           # Console/operator guide; gated by role
│   └── _components/
└── db/
    └── schema.ts

Suggested manifest:

jsonc
{
  "schemaVersion": 1,
  "id": "fs.sovereign.guide",
  "name": "Guide",
  "version": "0.1.0",
  "description": "An in-product guide for getting started with Sovereign.",
  "type": "platform",
  "runtime": "native",
  "routePrefix": "/guide",
  "shell": "default",
  "database": "isolated",
  "permissions": ["auth:session", "db:readWrite"],
  "capabilities": {
    "manage-content": {
      "description": "Edit instance-specific guide content.",
      "defaultGrant": "none",
    },
  },
  "compatibility": {
    "minPlatformVersion": "0.10.0",
  },
}

Guide should be intentionally lightweight. Phase 1 can ship with platform-owned static content and per-user state only. Operator-editable guide content is a later enhancement.

The plugin should be implemented as part of the platform, not as a third-party proposal, because it describes platform concepts and needs tight integration with Launcher, Account, role checks, and instance identity.

Per-User Visibility

Guide is globally installed/enabled like other platform plugins, but visibility is per user.

The user can:

  • mark the guide complete;
  • hide the guide without completing every step;
  • reopen it later from a stable help path or Launcher affordance if available.

Guide dismissal must not:

  • disable the plugin globally;
  • hide Guide for other users;
  • erase progress state;
  • require admin privileges.

This is guide-specific visibility, not a general plugin uninstallation feature. It may reuse existing user plugin/sidebar preference infrastructure where appropriate, but the product rule is per-user dismissal.

Guide Sections

Phase 1 sections:

SectionAudiencePurpose
Welcomeall usersExplain the instance, privacy posture, and plugin workspace.
Launcherall usersExplain app grid, installed plugins, and opening apps.
Accountall usersProfile, password/security, preferences, data export/delete.
Notificationsall usersHow in-app and web-push notifications behave when available.
Admin Basicsadmins/owners onlyConsole, user management, plugin management, instance settings.
Self-hostingowners/operatorsBackup, upgrade, version awareness, and where docs live.

Guide copy should use "app" for end-user labels and reserve "plugin" for developer/admin-facing sections.

User State Model

Suggested isolated table:

TablePurpose
guide_user_stateOne row per tenant/user tracking progress and hide.

Suggested columns:

ColumnTypeNotes
tenant_idstring
user_idstring
hidden_attimestamp?Set when the user hides Guide.
completed_attimestamp?Set when the user marks Guide complete.
last_seen_versionstring?Last Guide content version seen by this user.
progressjsonSection/checklist progress. Defaults to {}.
created_attimestamp
updated_attimestamp

Composite PK: (tenant_id, user_id).

last_seen_version allows Guide to present a non-intrusive "Guide updated" affordance after meaningful guide updates without forcibly un-hiding the plugin.

Optional Content Model

Phase 1 can keep content in code. A later operator-editable version may add:

TablePurpose
guide_content_sectionsInstance-specific guide sections and ordering.
guide_content_blocksMarkdown/rich text blocks inside sections.

Operator-editable content should be capability-gated and should not support arbitrary script/HTML. Markdown or a safe block model is enough.

UI Flows

First Login

text
User logs in
  └─ Launcher or shell sees Guide not hidden/completed
       └─ Show Guide tile, nudge, or default first-run card
            ├─ Open Guide
            ├─ Hide Guide
            └─ Continue to Launcher

The exact surface can be lightweight. A Launcher tile plus first-run card is enough; a blocking modal is not recommended.

Completing or Hiding

text
User opens /guide
  └─ Reads sections / checklist
       ├─ Mark complete → completed_at set, Guide no longer nudges user
       └─ Hide Guide → hidden_at set, Guide no longer appears in first-run surface

Admin User

text
Admin opens /guide
  └─ Sees normal user sections
       └─ Also sees Admin Basics and Self-hosting sections

Admin-only guide content should be hidden from non-admin users, not merely disabled.

Security and Privacy

  • Guide requires an authenticated session.
  • User progress/dismissal state is private to that user.
  • Admin sections must be role/capability gated.
  • Guide should not leak instance configuration that the current user could not otherwise see.
  • Operator-editable content must be sanitized and should not allow arbitrary HTML or scripts.
  • Guide should not call external services.

Alternatives Considered

Put first-run content directly in Launcher

Rejected as the whole solution. Launcher can surface a nudge, but guide content will grow into sections, checklists, and admin/operator variants. Keeping that as a plugin preserves the plugin-first architecture.

Put guide content only in the public docs site

Rejected. Public docs are useful but are outside the product. New users should have an in-product orientation path even on private/offline instances.

Make Guide globally dismissible by admins

Rejected for the primary user flow. An operator may disable the plugin globally, but ordinary completion/hide behavior is per user.

Force every new user through a blocking onboarding modal

Rejected. Sovereign should remain quiet and user-controlled. A visible guide entry and dismissible nudge are enough.

Open Questions

  1. Should Guide be visible in Launcher by default after a user hides it, or only reachable through a help/account route?
  2. Should hidden_at suppress Guide forever, or should major Guide content updates show a small "Guide updated" affordance?
  3. Should operators be able to add custom instance guide content in v1, or is static platform-owned content enough?
  4. Should Guide progress use a checklist, simple read/unread sections, or both?
  5. Should Guide be eligible as a root plugin for first-run instances?

Adoption Path

  1. RFC draft: agree on Guide's product boundary and per-user hide behavior.
  2. Phase 1 — Static platform guide: platform plugin, static sections, user-state table, complete/hide actions, Launcher/shell nudge.
  3. Phase 2 — Role-aware guide: admin/operator sections, capability-aware copy, instance identity-aware text.
  4. Phase 3 — Operator content: optional capability-gated custom sections.
  5. Phase 4 — Help affordance: stable path from Account/Launcher to reopen Guide after hiding.

Phase 1 may require small runtime/Launcher integration so hidden/completed Guide state affects per-user surfacing. No published package change is expected unless the integration requires manifest-level visibility metadata.

Changelog

VersionDateChange
0.1June 2026Initial draft

Open source under AGPL-3.0. Each Sovereign instance is independently operated.