Skip to main content
The schema and validator for tassyir.app.toml, the manifest of a Tassyir app (manifest v1, API version 2026-10). Give it the parsed manifest. It returns either the normalised manifest or every error at once, each with a stable code, the path of the field, a message and a one-sentence fix. The Tassyir API validates uploads with this same code, so a manifest this package accepts is one the API accepts, with the same errors in the same order. It never throws, reads no file, clock or network, and runs in Node and in browsers. ESM and CommonJS, named exports only.

Install

Example

Parse the TOML with any TOML 1.0 parser (smol-toml here), then validate:
A hosted app (Tassyir Hosting):
An app on your own server, headless, with its compliance webhooks on another host:
Both examples are validated by this package’s tests, so they cannot drift from the code.

What you get back

The normalised manifest is what the API stores for a version: the file’s keys in a fixed order (name, handle, api_version, access, hosting, auth, admin, webhooks, data, storefront); every list present (empty when absent); auth and admin only when they hold a value; scopes, their reasons and each webhook’s topics in catalogue order, allowed_hosts sorted; lists of tables in file order. Validating a normalised manifest returns it unchanged. An error looks like this:
path is the field in the parsed file ("" for the whole document). The list is sorted by field (manifest order, then array index), then code, so the same document always gives the same errors in the same order, whatever the order of its keys. One error per field. At most 50 errors, then MANIFEST_TOO_MANY_ERRORS. A code is never renamed or reused:

API

JSON Schema

The JSON Schema of each API version ships with the package: @tassyir/app-manifest/schemas/manifest.2026-10.schema.json. It states the shape (types, required and unknown fields, list sizes, patterns) for editors and agents. The validator also checks the rules across fields and the precise URL and hostname rules, so a document the schema accepts can still be refused. In an editor that reads schema directives (Taplo, Even Better TOML), start tassyir.app.toml with:

The vocabulary, and keeping up with the API

MANIFEST_VOCABULARY is the data the validator checks against: supported API versions, scopes and webhook topics. It equals what the Tassyir API builds from its live catalogues, and the schema file is byte-for-byte the one the API publishes. When the API adds a scope, a topic or an API version, a new release of this package ships it; until you update, the validator refuses the new names. The API itself passes its live vocabulary (validateManifest(input, vocabulary)). How the SDK repo proves that equality: docs/APP_MANIFEST.md.

License

MIT