SIMU1
Recipe code format
Version 1 · last updated 8 October 2026
A Simu code is one short string holding a whole film recipe, or a whole seven-slot kit. It needs no server, no account and no network.
秋影流光 · Classic Chrome · DR200
SIMU102KQY54AEMG0TN3B
This page documents it completely so anyone can write a Simu code from their own site, script or camera app without asking. Nothing is encrypted and nothing is hidden; the string is short because twenty settings pack into about eleven bytes.
Shape
SIMU1 02KQY54AEMG0TN3B
│ └── Crockford base32 of the payload
└──────── "SIMU" + format version (one digit)
payload = [flags: 8] [body …] [pad to byte] [CRC-8: 8]
A reader that finds a version higher than it knows must refuse the code outright rather than guess at it.
Flags byte
| Value | Means |
|---|---|
0 | one recipe — body is a single record |
1 | a kit — body is [count−1: 3] then that many [slot−1: 3][record] |
Slot numbers are 1–7 and a kit holds 1–7 of them. Slots the kit does not mention are absent, not empty: on the camera they are left untouched.
A record
Eighteen bits of presence mask, most significant bit first, in the field order of the table below. Then, for each set bit and in the same order, that field's value at that field's width. Nothing is written for a field whose bit is clear.
The mask is the reason this format exists rather than a list of twenty numbers. A recipe that never mentioned Shadow is not a recipe asking for Shadow 0. A format that could not tell those apart would hand the receiving camera a value nobody chose.
Fields
| # | Field | Bits | Values, in index order |
|---|---|---|---|
| 0 | Film Simulation | 5 | Provia, Velvia, Astia, PRO Neg. Hi, PRO Neg. Std, Monochrome, Monochrome + Yellow, Monochrome + Red, Monochrome + Green, Sepia, Classic Chrome, Acros, Acros + Yellow, Acros + Red, Acros + Green, Eterna, Classic Neg., Eterna Bleach Bypass, Nostalgic Neg., Reala Ace |
| 1 | D Range Priority | 2 | Off, Weak, Strong, Auto |
| 2 | Dynamic Range | 2 | DR100, DR200, DR400, DR Auto |
| 3 | Monochrome Warm/Cool | 6 | −18 … +18, step 1 |
| 4 | Monochrome Magenta/Green | 6 | −18 … +18, step 1 |
| 5 | Grain Effect | 3 | Off, Weak / Small, Strong / Small, Weak / Large, Strong / Large |
| 6 | Color Chrome Effect | 2 | Off, Weak, Strong |
| 7 | Color Chrome FX Blue | 2 | Off, Weak, Strong |
| 8 | Smooth Skin Effect | 2 | Off, Weak, Strong |
| 9 | White Balance | 4 (+11) | see below |
| 10 | WB Shift Red | 5 | −9 … +9, step 1 |
| 11 | WB Shift Blue | 5 | −9 … +9, step 1 |
| 12 | Highlight | 4 | −2 … +4, step 0.5 |
| 13 | Shadow | 4 | −2 … +4, step 0.5 |
| 14 | Color | 4 | −4 … +4, step 1 |
| 15 | Sharpness | 4 | −4 … +4, step 1 |
| 16 | High ISO NR | 4 | −4 … +4, step 1 |
| 17 | Clarity | 4 | −5 … +5, step 1 |
A numeric field's index is (value − minimum) / step.
This order never changes. A new setting is appended and the version goes up; nothing already here ever moves, because moving it would silently change the meaning of every code already in the world.
White balance
Indices 0–12 are: Auto, Daylight, Incandescent, Underwater, Fluorescent 1, Fluorescent 2, Fluorescent 3, Shade, Custom 1, Custom 2, Custom 3, Auto White Priority, Auto Ambience Priority.
Index 13 means a colour temperature, and is the only value in the
format followed by anything: eleven further bits holding
(kelvin − 2000) / 10. So 6300K is exact rather than
snapped to a nearby entry in a list.
Not carried
ISO and Exposure Compensation. They are free text in practice — "up to ISO 6400" — they are never written to the camera, and carrying them would put a variable-length string inside a format whose whole value is being short. Send them in the readable line instead.
Checksum
CRC-8/ATM: polynomial 0x07, initial value 0, no
final XOR, computed over every byte before it.
It is not optional. Messaging apps wrap and truncate, and a code that decodes into a plausible recipe after losing its tail is worse than one that refuses — twenty settings get written to somebody's camera either way.
Alphabet
Crockford base32, five bits per character, most significant first, zero padded at the end:
0123456789ABCDEFGHJKMNPQRSTVWXYZ
No I, L, O or U. Readers
should accept lower case, and should read I and L as
1 and O as 0, because codes get copied
off photographs by hand. Upper case is worth keeping on the way out: QR encodes
upper-case alphanumerics in a denser mode, which is the difference between a
code that scans across a table and one that does not.
Links
simu://r/<code>?n=<recipe name>
simu://k/<code>?n=<kit name>&r=<slot 1 name>&r=<slot 2 name>…
The same code also opens in a browser, for people without the app. The code sits in the fragment, so it is read in the browser and never reaches a server:
https://simurecipes.com/r#<code>&n=<recipe name>
Links made before October 2026 point to
https://hayamayama.github.io/Simu-Support/r.html, which forwards to
this address with the fragment intact.
Names ride outside the payload. A Chinese or Japanese name inside the code
would double its length and cost the QR its dense encoding, and a name is the
one field where being readable is the point. For a kit there is one
r per slot, in the order the slots appear in the code.
A code found inside surrounding text is still a code: readers should search
for SIMU, a digit, then eight or more alphabet characters, because
people paste whole messages.
Sending one
Two lines are enough, and the first one matters. A bare code means nothing to anybody without Simu.
秋影流光 · Classic Chrome · DR200
SIMU102KQY54AEMG0TN3B
Questions, or a decoder written for Simu codes to be linked here: developer@simurecipes.com