Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Full Registry V1

This page defines the milestone for signed plugin registry distribution in Lapis Notes. It is intentionally separate from the Complete Daily-Use App release milestone so plugin distribution work can move without widening that release target.

Release Goal

Lapis Notes supports installable plugins distributed through a signed official registry while preserving the existing Obsidian-compatible plugin runtime.

The app can fetch verified registry metadata, install verified plugin files into the existing .obsidian/plugins/<plugin-id>/ layout, record provenance outside plugin-controlled manifests, manage installed plugins from Settings, and pilot the flow with the first official installable Docs plugin.

In Scope

  • Locked built-in official registry source.
  • Signed catalog, plugin detail, and release metadata.
  • Browser-compatible hash and signature verification.
  • Verified staging installer, update, and uninstall flows.
  • Installed provenance state in .obsidian/installed-plugins.json.
  • PluginDistributionManager exposed through App beside PluginManager.
  • Settings UI for Installed, Browse, Updates, and Sources.
  • On-demand install prompt for official Docs file handlers.
  • Monorepo release tooling for official plugin packages.
  • Docs plugin pilot from package artifact to registry install.

Non-goals For V1

  • Replacing PluginManager.
  • Trusting plugin manifests as proof of official, verified, or core status.
  • Arbitrary user-added third-party registry sources.
  • Full TUF timestamp, snapshot, or delegated target metadata.
  • Chunked or multi-entry plugin bundles beyond the first pilot needs.
  • Moving Bases or other baseline/core plugins out of the bundled bootstrap.
  • Silent installation or enablement of privileged desktop plugins.

Policy

Core is a bundling and runtime ownership concept. Official is a provenance and signature concept.

Downloaded official plugins remain community-style installed plugins at runtime. They are official only when they come from a verified official registry entry and a verified official release signature. True bundled core behavior remains reserved for code registered by the app bundle.

The official registry source is locked for v1. Community or manual plugins may still load through the existing plugin runtime, but the UI must label them as community, manual, or unverified unless provenance is recorded by the distribution layer.

The external registry repository layout, generated metadata contract, signing roles, static hosting requirements, and first Docs pilot registry shape are defined in Plugin Registry Distribution.

Ordered Backlog

The Full Registry V1 implementation sequence is:

  1. ROADMAP-PLUGIN-REGISTRY-001: Define Full Registry V1 milestone and spec contract.
  2. TASK-PLUGIN-REGISTRY-001: Add plugin registry metadata schemas and verification primitives.
  3. TASK-PLUGIN-REGISTRY-002: Implement official registry client and cache.
  4. TASK-PLUGIN-REGISTRY-003: Implement installed plugin state and verified installer.
  5. TASK-PLUGIN-REGISTRY-004: Expose PluginDistributionManager through App services.
  6. TASK-PLUGIN-REGISTRY-005: Add Plugins settings registry UI.
  7. TASK-PLUGIN-REGISTRY-006: Add monorepo packaging and signing tooling for official plugins.
  8. TASK-PLUGIN-REGISTRY-007: Create official registry repository bootstrap plan and first generated registry.
  9. TASK-PLUGIN-REGISTRY-008: Package Docs as the first official installable plugin.
  10. TASK-PLUGIN-REGISTRY-009: Add on-demand install for Docs file handlers.
  11. TASK-PLUGIN-REGISTRY-010: Move Docs out of bundled workspace bootstrap after registry install works.
  12. TASK-PLUGIN-REGISTRY-011: Add update and revocation handling for installed official plugins.
  13. TASK-PLUGIN-REGISTRY-PUBLISH-REMAINING-OFFICIAL: Publish and activate remaining official plugin registry releases.
  14. TASK-PLUGIN-REGISTRY-UNBUNDLE-REMAINING-OFFICIAL: Remove migrated official plugins from bundled workspace bootstrap.
  15. TASK-PLUGIN-REGISTRY-MARKDOWN-LINT-OFFICIAL: Move Markdown Lint into the official plugin registry.

TASK-PLUGIN-REGISTRY-PUBLISH-REMAINING-OFFICIAL includes the app-repo local asset publisher and Forgejo workflow for building, signing, staging, and publishing immutable official plugin assets to Forgejo release downloads under the app repo. Registry metadata activation remains owned by the registry repo after those assets exist.

Do not remove a first-party plugin from the bundled workspace bootstrap until the verified install path works in both browser/PWA and Electron.

Docs Pilot

Docs is the first official installable plugin pilot.

The pilot is successful when:

  • Docs has a decided official installable ID and documented migration policy from the current bundled docs ID if that ID changes.
  • The package emits manifest.json, main.js, and styles.css suitable for standalone installation.
  • The official registry advertises Docs with .lapisdoc and .lapissheet contribution summaries.
  • The app can install, enable, restart, open Docs files, disable, and uninstall Docs in browser/PWA and Electron.
  • Docs is removed from bundled workspace bootstrap only after that flow passes.

Remaining First-Party Migration

Canvas, Graph, Markdown Lint, Notebook, PDF, Slides, Telemetry, and Docs now use official installable lapis-* IDs and are external to the bundled workspace bootstrap. Installed official records load from /.obsidian/plugins/<id>/, remain compatible with community-plugins.json enablement, and appear under Core plugins when their installed provenance is official. First-party packages remain in the monorepo for official artifact builds and publish flows.

Bases remains bundled for this phase. Its registry entry, if present, must stay pending/non-installable until a separate issue changes that ownership decision.

Markdown itself remains bundled; Markdown Lint is an external official plugin with manifest id lapis-markdown-lint while preserving the markdown-lint.disabledRules configuration namespace.

Release Gate

Do not consider Full Registry V1 complete until all of these are true:

  • The app verifies official registry, detail, and release metadata.
  • .lapis-plugin bundles and every signed bundled file are hash-checked before final install.
  • Installed provenance is stored outside plugin-controlled manifests.
  • Official, community, manual, and bundled provenance are visually distinct.
  • Desktop-only or privileged plugins are blocked or gated by Workspace Trust.
  • Install, update, uninstall, and failure states are recoverable.
  • The Docs pilot works end to end in browser/PWA and Electron.
  • Existing manually installed community plugin loading remains compatible.

Validation

Use the narrowest package checks for each issue:

  • API distribution work: pnpm --filter @lapis-notes/api check:all.
  • Workspace UI or app integration: pnpm --filter @lapis-notes/workspace check:all.
  • Script or cross-package work: pnpm check:all.
  • App-runtime or bootstrap behavior: pnpm test:smoke.
  • Spec changes: make spec-lint and mdbook build spec when practical.

Every implementation commit that touches code should keep the owning package or contract spec current.