Automerge backed Markdown editor for the Atmosphere
README.md

Tested Obsidian plugin catalog #

The client reads /plugin-catalog/catalog.json by default. A deployment can set VITE_PLUGIN_CATALOG_URL=https://plugins.example.com/catalog.json to use an independent static host. This requires one app release to configure the endpoint; subsequent catalog additions only require publishing the catalog host.

Publish independently #

From the repository root:

npm run plugins:catalog
docker build -f plugin-catalog/Dockerfile -t reams-plugins .
docker run --rm -p 8080:8080 reams-plugins

Put the container behind the existing HTTPS proxy on the chosen subdomain. The host serves static files, permits CORS GET requests, refreshes catalog JSON, and caches versioned bundles immutably. Static object storage/CDN can serve the same generated directory. No application server or user credentials are needed.

Do not replace a published version's bytes. Publish a new version directory; upload its files before publishing the catalog JSON that references them. Keep old version directories when publishing new catalogs. Installed plugins keep their pinned version; this first slice does not auto-update installed code.

Add a plugin #

  1. Fetch a specific upstream release, including its license: node scripts/fetch-plugin-release.mjs owner/repo tag fixture-name.
  2. Test real browser behavior, settings, disable/re-enable, reload and offline restoration. Record the tested version, supported flows and limitations.
  3. Add an entry to plugins.json, pointing to the fixture and evidence. Use status: "blocked" for evaluated plugins that cannot yet be enabled.
  4. Run npm run plugins:catalog and publish the generated static directory or container. The builder includes SHA-256 digests; the client checks downloaded JS and CSS before saving or executing them.

Compatibility changes requiring new Reams APIs still require a Reams release. The catalog is a host-owned admission list, not a sandbox. Old arbitrary manual installs remain preserved in localStorage and are not restored or executed. Catalog bundles and their admission receipts are device-local in IndexedDB; plugin settings and enable intent continue through the existing stores.

Natural Language Dates and Datacore are available for their documented tested flows. Datacore's initial activation waits for the host metadata index. See docs/verification/2026-10-10-plugin-catalog.md.

Development playground #

In a Vite development session, open /?invariantFixture=datacore, using the same startup fixture mechanism as the other editor fixtures. It creates 11 ordinary Markdown notes under Datacore Playground and opens Start here: projects, people, a meeting, four ready-to-render dashboards, and a short manual test guide. Enable Datacore from its usual settings card to render the queries. Reopening the fixture fills in missing notes without overwriting edits. This URL trigger is development-only; plugin settings contain no corpus-install action.