Manifest (caliper.toml)¶
Every applet ships a caliper.toml manifest. The host parses it before loading
any code: it declares the applet's identity, the ABI epoch it was built against,
an optional minimum host version, and the framework services it needs. Parsing is
strict about required fields and their formats, and lenient about everything
else — unknown keys and tables are ignored so newer manifests keep loading on
older hosts (forward compatibility).
Schema¶
| Section | Key | Type | Required | Meaning |
|---|---|---|---|---|
[applet] |
id |
string | Yes | Reverse-DNS identity, e.g. dev.ahmed.circuitnet. Must be non-empty. |
[applet] |
name |
string | Yes | Human-readable display name. Must be non-empty. |
[applet] |
version |
string | Yes | Applet version, strict semver x.y.z (three numeric parts). |
[applet] |
summary |
string | No | Short one-line description shown in the launcher. |
[applet] |
tag |
string | No | Free-form category label, e.g. EDA. |
[compat] |
abi_epoch |
integer | Yes | ABI epoch the applet was built against. Must be an integer ≥ 1. |
[compat] |
min_host |
string | No | Minimum host version floor, strict semver x.y.z. Omit for no floor. |
[services] |
required |
array of strings | No | Service IDs the applet cannot run without, e.g. ["caliper.ui.v1"]. |
[services] |
optional |
array of strings | No | Service IDs the applet uses if present, e.g. ["caliper.log.v1"]. |
Notes:
- Strict semver means exactly three dot-separated numeric parts (
x.y.z). Values like1.0(too few parts) orv1.0.0(leadingv) are rejected. - Unknown keys and tables are ignored. A manifest may carry extra fields
(e.g.
authors, or a whole[future]table); the host skips them so that manifests targeting newer schema revisions still load. - Missing or malformed required fields are hard errors: the host surfaces a human-readable reason on the applet's failure card rather than loading it.
Example¶
The canonical minimal manifest is the one shipped by the hello fixture
applet (examples/hello/), embedded here verbatim so it can never drift from the
source of truth:
[applet]
id = "dev.caliper.hello"
name = "Hello"
version = "0.1.0"
summary = "Epoch-2 fixture applet: sugar demo + loader-test substrate."
tag = "Demo"
[compat]
abi_epoch = 2
min_host = "0.6.0"
[services]
required = ["caliper.ui.v1", "caliper.log.v1"]
See tutorials/first-applet.md for a full walk of the applet this manifest belongs to.