Skip to content

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.

acme-fonts/
├── __tpkg__/
│   └── manifest.yaml
├── AcmeSans-Regular.otf
├── AcmeSans-Bold.otf
└── LICENSE

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: data declares that nothing here executes, and capabilities.exec: false makes that a fact the loader enforces rather than a courtesy.

  • The value universal for platforms means one image serves every operating system (OS); platform-split payloads name their triplets instead.

  • mount_semantics.suggested is a hint, not a rule — the consumer decides the mount point (see the mount rule below).

  • mkimage fills in the digests, and signing stays unsigned until 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.