Skip to main content
T2 chain · creators / media: nika:image_fx makes a duotone twin of each sample photo, then nika:image_compose lays the two photos side by side and the four images out as a 2×2 contact sheet. No model, no image program to install, no network: the same photos give the same sheet, byte for byte, on the same pinned engine.

The job

A contact sheet used to mean a round trip through an image editor, or an exec: call to an image program, with a shell boundary to grant and a tool to install. Here the sheet is a builtin call: the layout is written once in YAML, every input is a read the check judges, and the result carries its own recipe.

The shape

The file

image-compose-sheet.nika

Two things this file teaches

  1. Every input is a read, every sheet a write. The permits: block names the exact files: the two photos and the two duotones the sheet reads back, and the four files the run writes. nika check judges each literal input of nika:image_compose against permits.fs.read before anything runs, so a missing grant is a check-time NIKA-SEC-004, not a surprise at run.
  2. The sheet waits for what it reads. sheet reads the duotones that sunset_duotone and harbour_duotone write, so after: orders it behind both. strip reads only the photos, so it runs in the first wave.

Run it

What it needs: The two sample PNG files. No model, no key, no network.
1

Rehearse it

The sample files come with it and nothing is written in your folder.
2

Get your own copy

Save the file above as image-compose-sheet.nika in a new folder, then download the samples it reads:
3

Check it, then run it

The run writes the two duotones, out/contact/strip.png and out/contact/sheet.png. Each sheet’s output carries its path, sha256, width and height; run it again and identical bytes already at out: are an idempotent skip.