The manifest entry
tappify.extension.json instead — the
$schema line gives your editor completion and validation, and
tappify extension doctor checks the result.
singleton: true means one document per scope key, addressed with get, set and patch.
Leave it off and you get a collection with ids: list, get, put, delete.
A collection name is lower snake_case, and one extension declares at most ten of them. The
name settings is reserved — it is the settings
panel’s own document.
Reading and writing
A singleton has a hook:useTapStorage returns { data, error, isLoading, refetch, save, patch }. save replaces
the document; patch merges and resolves to the merged document. data is undefined while
the first read is in flight and null until the document is first written.
A collection with ids goes through the bridge:
tappify extension types — an unknown collection name
or a document that does not match the schema is a type error, not a runtime surprise.
Rules
- Writes are validated against the schema. Reads are not, so adding a field costs nothing and old documents keep loading. A change that breaks readers is a new collection name.
- Your install reaches only its own documents. There is no path to another install’s or another extension’s.
install- andorganization-scoped documents are passed to your server read-only asdocumentson every call, so your server never asks Tappify for them. Servers cannot write storage.- A write broadcasts to every mount of your extension and every open tab of that install.
- Uninstalling deletes every document. When a teammate leaves the workspace, their
user-scoped documents go with them. An owner can export an install’s documents as JSON. - Personal-data field names —
email,name,phone,address,ip— put your release in front of a reviewer. Do not store personal data here.