acme-fonts/
├── __tpkg__/
│ └── manifest.yaml
├── AcmeSans-Regular.otf
├── AcmeSans-Bold.otf
└── LICENSE
GUIDES · 05
Create a data payload.
A data payload is a directory of files — fonts, datasets, word lists — pressed into a .tfs image together with a manifest. No toolchain is required, because imaging runs in-process inside the tfs command-line interface (CLI).
|
Note
|
This guide is part 2 of the Basic payloads tutorial. The blog chapter builds the fonts example step by step. |
The directory layout.
The directory holds the files exactly as they should be mounted, plus one addition: the manifest, at __tpkg__/manifest.yaml inside the image.
The manifest.
schema_version: 1
kind: data
name: acme-fonts
version: 2.1.0
producer: {tool: tfs, tool_version: "0.2.5"}
created: "2026-08-01T00:00:00Z"
digest: {tree_hash: "…", blob_sha256: "…"}
signing: {state: unsigned}
encryption: {state: none}
mount_semantics: {suggested: /usr/share/fonts/acme}
capabilities: {exec: false, read: true}
platforms: universal
-
kind: datadeclares that nothing here executes, andcapabilities.exec: falsemakes that a fact the loader enforces rather than a courtesy. -
The value
universalforplatformsmeans one image serves every operating system (OS); platform-split payloads name their triplets instead. -
mount_semantics.suggestedis a hint, not a rule — the consumer decides the mount point (see the mount rule below). -
mkimagefills in the digests, andsigningstaysunsigneduntil the artifact is signed — see the verify guide.
Creating the image.
$ tfs mkimage acme-fonts/ -o acme-fonts-2.1.0.tfs
The default image format is limnifs, a pure-Rust, content-addressed format: nothing requires compilation, no external tool is installed, and imaging happens in-process. --format dwarfs opts into the dwarfs writer explicitly; dwarfs stays a first-class read backend, so existing dwarfs images mount everywhere they always have.
Checking the image.
$ tfs info --manifest acme-fonts-2.1.0.tfs
$ tfs ls acme-fonts-2.1.0.tfs
$ tfs ls -r -l acme-fonts-2.1.0.tfs
tfs info --manifest prints the manifest back as parsed, which catches a YAML mistake quickly. tfs ls lists the tree without extracting anything.
The mount rule.
A slice never decides where it lives. The consumer’s manifest declares the dependency in its requires — the payload, a version range, and the mount point — so one installed copy of acme-fonts can serve every application that mounts it, each at its own path.
Consumers attach the payload in two ways: through their manifest’s requires (resolved from the store, shared machine-wide), or through tebako press --image <path>:<mount> (carried inside their package). Either way, the image ships location-agnostic.
Publishing the payload.
The image is the artifact. The publisher releases it on its own releases page with a registry index consumers can add; the walkthrough is in Publish to your own registry.
The manifest model, field by field, is the manifest reference.