metalign

Handbook

metalign desktop is the Mac app; metalign companion is the iOS field logbook; metalign web is the Mac app's Film section in a browser. Each explains itself on screen. Here is the order the work happens in: four steps, and only the last one leaves the phone. Then the part none of the three can explain on its own — what passes between them.

Document
metalign handbook, first edition
Checked
, against the running apps
Applies to
metalign desktop 0.1 (macOS 14 or later) · metalign companion 0.1 (iOS 17 or later, watchOS 10 or later) · metalign web, which carries no version yet
Status
All three unreleased. This says how they work, not how to get them.

Section 1 A roll, start to finish

Four steps. The first three happen on the phone, over however many days the roll takes; the fourth happens once the scans are back, and it is the only one with a choice in it.

  1. Step 1.1 Your gear, and your name

    Creator and Copyright are copied into a roll when it is created, not added to it later. Set them before the first roll, not after.

    Bodies
    Gear → Cameras. Make and model get written into every scan.
    Lenses
    Gear → Lenses. Mount is optional. The aperture dial can be bounded to the stops the ring really clicks at, half-stops included.
    Creator & Copyright
    Settings.

    The marked rows in Fig. 1 came from a bundled catalogue and still follow it, so an app update can correct one. Editing a row makes it your own copy and stops those corrections, which the editor says before you do it. What you added yourself survives the fork: a lens keeps its serial number, a film its notes and scanned barcodes, and Use the catalogue’s version is the way back without losing either. Films and lenses have a catalogue; cameras do not, on purpose.

    Barcodes are learned rather than shipped. The first scan of a box asks which film it is and every scan after that is instant, which is slower on day one and right for the reason that matters: a wrong barcode in a bundled table would load Portra onto HP5 and be believed.

    Fig. 1 Gear, before the first roll.
  2. Step 1.2 Create the roll, and load it into a body

    Both halves are the same form: the film goes at the top, the body at the bottom.

    Rolls → + → New roll
    format, stock, the ISO you're rating it at.
    Scan the film box
    fills in the stock from the barcode.
    Name
    optional; a roll is labelled by its canister number either way.
    Load into a camera now
    on the same form, or later from the roll or Apple Watch.
    Swapping one out?
    the app asks what happened to the last roll: shot to the end, or pulled part-shot.
    Fig. 2 New roll — film at the top, body at the bottom.
  3. Step 1.3 Log each frame as you shoot it

    A frame logged without the dials in view records the time, place and gear and leaves the exposure blank on purpose. It is never guessed from the frame before it.

    Set the dials, tap Log frame N
    time and place are stamped automatically.
    No dials in view
    Live Activity, Action button, Siri, Apple Watch.
    Skipped a frame?
    Add blank frame holds its place: pairing is positional.
    Finished
    ✓ marks the roll Exposed.

    The dials are for a phone already in your hand. Most of a roll is not like that, so there are paths that log a frame with nothing on screen at all, and one more that decides which camera they log onto. Each records the time, the place and the gear. What none of them ever does is guess an exposure. On these routes a frame's light was either set by a person, in a shortcut or on the wrist's own dials page, or it is not recorded at all. Nothing in the app derives one.

    • The lock screen. A loaded roll puts a Live Activity there: the frame count, and a button that logs the next frame without unlocking. The mark shows in the Dynamic Island.
    • The Log Frame control. One control, placed on the Action button, in Control Centre or on the Lock Screen, with no trip through Shortcuts to set it up.
    • Siri and Shortcuts. Log Frame and Record Track run from a spoken phrase or a shortcut, with the phone locked and without bringing the app forward. The roll picker searches everything, archived rolls included, and the intent takes a Note. It takes the dials too, if the shortcut sets them.
    • In hand. With several bodies loaded, none of these paths can see which camera you just used. The same left-edge swipe that archives a roll offers In hand on a roll that is in a camera, and so does holding that roll down; every blind path logs onto that body until you say otherwise.

    Apple Watch is the one that is an app rather than a button. A page for each loaded body, dials on a page of their own, and a grid two across when there are several: tap the camera you just shot, hold it to open that camera's dials. It does not need the phone to be reachable. Every press is written to the watch's own disk before the radio is asked for anything, and a press that waited is placed on the roll by the time it was made rather than the time it arrived. The watch takes its own fix at the press, because the arm that pressed the shutter is a better answer than a phone in a bag two rooms away; the GPS runs for the press and goes off again, and a press that found no fix carries none. Lock page guards against a stray swipe, the frame count turns orange once the roll is full, and rolls can be loaded and finished from the wrist.

    Every frame records which route made it, which is what answers the question why has this frame no exposure? when somebody asks it months later. It stays in the app: there is no EXIF tag for how a shutter release was pressed, and inventing one would put provenance about this app into somebody else's photographs. An imported log (§3) therefore cannot restore it, and correctly carries nothing.

    Fig. 3 Frame 4 carries no exposure, left blank on purpose rather than guessed.
    Fig. 4 The roll on the lock screen. The count, the last frame's settings, and a button that logs the next one without unlocking. What it does not carry is a pair of dials, which is why a frame logged here records no exposure.
  4. Step 1.4 Write the log onto the scans

    All three routes write from the same document, by the same positional pairing, into the same tags. What differs is which files they open and what they leave behind (§6).

    On the phone
    • ⋯ → Write onto scans, then From Photos or From Files.
    • Check the pairing, tap write. JPEG only: a TIFF is refused.
    • Files replace in place; a photo written back onto itself keeps Revert.
    On the Mac
    • Film → Receive…, then tap this Mac on the phone, or AirDrop the exported .json.
    • Drop in the scans, check the pairing, press Write metadata.
    • Every scan keeps an *_original backup. Full detail: §3.
    In a browser
    • Export shot log, then drop the .json and the scan folder into metalign web.
    • Check the pairing, then Write into the files (Chrome, Edge, Opera) or download a ZIP.
    • Nothing is ever uploaded; see §6.

Section 2 Three hand-offs

The roll above is one of three things that cross between the apps. The other two are about a digital body rather than a roll of film, and they take the same two routes.

What travelsFromToHow
A roll's shot log, one .json Rolls, on the phone Film Over the local network, or as a file you AirDrop
A recorded GPX track Digital → Track Geotag The same two routes, carrying the same bytes
The true time Digital → Sync Clock Timestamp Correction Through a photograph

The third is the odd one. The Sync Clock draws a QR carrying metalign: and the exact instant; you photograph it with the camera whose clock is wrong, and metalign desktop reads the true time back out of that shot. The photograph is the carrier, so it needs no network and no clock on either machine being right. It is for digital bodies: a film frame's time is stamped at the shutter.

Fig. 5 The Sync Clock. Photograph it with the wrong-clocked camera; the frame you get back is the message.

Section 3 Handing over a roll

On the phone

The ✓ in the toolbar — Finish roll — marks the roll Exposed; Mark as in the ⋯ menu carries all five states, Unused through Scanned. Export for metalign is in that menu while the roll is still loaded and in the toolbar once it isn't. It opens a screen showing what the document will contain, any warnings, and the JSON itself.

Fig. 6 The ⋯ menu, and the screen Export for metalign opens. The document is shown before it is sent, JSON included; the bytes are the same whichever route it takes.

On the Mac

In Film, click Receive…. The panel says Listening and names this Mac; that name appears on the phone under Send to metalign. One tap sends it. The Mac answers with the roll and frame count it decoded, not what the phone said it sent, so you know it arrived while you are still standing there. The listener runs only while that panel is open.

Or as a file

Export shot log writes the same bytes to <roll> — shot log.json. AirDrop it and drop it on the Film section together with the scans; one drop zone takes both. No network, no listener, no Mac in the room. It is also the only route to the browser — see §6 — since nothing served to a tab can answer a push.

And back again

The same file comes in. Rolls → Send or import a shot log → Import a shot log takes one or several, and shows what each would add before anything is written: the roll, its frame count, the film and body it names. Gear it would create is called out separately and in orange, because finding a camera in your list that you never added is worse than being told about it first.

It is a reconstruction rather than a restore, and the screen says so plainly: “A shot log carries the roll and its frames. Where the roll was kept, its expiry, whether it was archived and which frames were flagged are not in the file, and the roll gets the next free number for its canister. Gear it names is matched against what you already have, and added when there is no match.” Nor does it carry which route logged each frame (§1.3), so an imported frame correctly says nothing about that.

A roll that is already in the library is refused by its own name rather than merged, and the refusal says what to do: delete the one you have if you meant to replace it. A file that could not be read is named by its filename instead, because a file nothing could be decoded from has no roll to name itself after, and being told “this isn’t a shot log” about one of three files you picked is a message you cannot act on.

Read before you walk to the Mac

Two warnings are properties of the document, so they apply whichever route you take: “This roll has no camera set, so the scans get no Make/Model, and metalign groups by model”, and “No frame has a capture time, so no dates will be written.”

Section 4 Pairing is positional

The rule

A scan is written with the frame it is level with in the table. Nothing else binds them: not the number in the lab's filename, not the frame number in the log.

Scans go down the left in filename order, the log's frames down the right, and only the left column moves. It works this way because the alternative fails silently: labs number files however they like, frame numbers skip, and a delivery missing one frame would mis-assign the whole rest of the roll with nothing to say it happened. The frame number is the label you check the pairing against, never the key it is made with. So check it. A row shows the frame the way the roll's own frame list draws it, with the scan under it: the exposure, time and title on the first line, the thumbnail and filename on the second. An off-by-one across a roll is obvious in pictures and invisible in filenames.

Only the scan column is re-ordered: re-arranging frames would be editing the roll from the wrong end. The frame column can gain one, and only that, a blank frame inserted from the row it belongs on, because the pairing table is the one place the missing negative's position is actually known.

Scans, in filename order
Logged frames
MountRobson-01
MountRobson-02
MountRobson-03
MountRobson-04
Placeholder
Placeholder
1 Berg Lake, first light Right either way Right either way
2 Blank frame Nothing logged to check it against Right if the lab skipped the blanks
3 Blank frame Nothing logged to check it against Right if the lab skipped the blanks
4 Reflection off the lake Right if the lab scanned them Right if the lab skipped them
5 Toboggan Falls No scan Right if the lab skipped them
6 The last of the light No scan Right if the lab skipped them
Fig. 7 Four scans against six logged frames, and the same four with a placeholder above each blank frame. Both are complete arrangements of one delivery, and the log cannot say which is right. A blank frame is a negative nobody logged on, not a negative with nothing on it. So the lab may well have scanned it. If it did, the roll is already in step and frames 5 and 6 simply came back short. If it skipped the two blanks, these four files are frames 1, 4, 5 and 6, and every one of them is currently sitting two rows high. Only the left column moves either way, and nothing on disk is touched. The picture settles it, not the table: open the scan level with a blank and see which frame it is.
Fig. 8 The same case on the phone — the screen Fig. 7 is drawn from — and, beside it, what the app says about that pairing. Neither warning calls the roll wrong. The second one is the whole of Fig. 7 in a sentence: that may be exactly right, and the reason to look is that the log cannot tell you. They are a check, not a gate — Write 4 scans is live underneath them — which is why reading them is the step that matters.
Fig. 9 One scan more than the roll has frames. The spare shows up at the bottom, as No frame. The sentence under it says out loud that the blank frame to add may belong at the top. That is the wind-on case: the two ends of this table are not the same row. The count underneath is the same claim, checkable: seven scans are loaded and six will be written, because the row past the last frame has no frame to be written onto.

Section 5 What gets written

What you loggedWhat the scan carries
Camera make, model, serial EXIF:Make, EXIF:Model, EXIF:SerialNumber
Time, and the zone it was shot in EXIF:DateTimeOriginal, CreateDate, ModifyDate, plus OffsetTime, OffsetTimeOriginal, OffsetTimeDigitized
Shutter EXIF:ExposureTime — except B, which becomes XMP-metalign:shutterSetting
ApertureEXIF:FNumber
ISO (the roll's rated speed, or what you metered)EXIF:ISO
Exposure compensationEXIF:ExposureCompensation; zero writes nothing
Lens make, model, serial, focal length EXIF:LensMake, LensModel, LensSerialNumber, FocalLength
FlashEXIF:Flash; absent writes nothing
Position EXIF:GPSLatitude, GPSLongitude, GPSAltitude, each with its hemisphere reference
A position nobody measured EXIF:GPSProcessingMethod as MANUAL; a measured one writes nothing
TitleXMP-dc:Title and IPTC:ObjectName
Caption, keywords, rating MWG:Description, MWG:Keywords, XMP:Rating
Creator, copyright (set on the roll)MWG:Creator, MWG:Copyright
Filter on the lens; a note on the frameXMP-metalign:filter, XMP-metalign:frameNote
Frame number, roll name, stock, format, process, box speed, rated speed, push or pull, lab XMP-metalign:* — the private namespace, because no schema describes a film stock

A logged frame is not always right, so double-click one — or right-click and choose Correct frame N… — to edit its time, location, exposure, lens and description. The shot log itself is never rewritten: the correction is kept in metalign desktop and applied when the frame is written, so the file that came off your phone stays the record it was. Re-exporting the roll replaces the log and drops corrections made against the old one, and the section tells you how many were dropped.

A position can be worked out rather than measured, and the scan says which it was. A frame that never got a fix can take one from the nearest located frame either side of it, or be given a pin by hand: in the phone's Frame map, or by correcting the frame on the Mac or in a browser. Any of those writes EXIF:GPSProcessingMethod as MANUAL, which is the standard way of saying a person asserted a position rather than a receiver reporting one. A measured position writes nothing there, on the same rule the flash follows: only the positive claim reaches the file. All three apps write it, and all three call a hand-placed pin the same thing, so a place filled in on one of them makes the same statement on the scan whichever one finishes the roll.

Section 6 Mac, phone, or browser

All three write out of one document, by one pairing rule, into the same tags. What they do not share is which files they will open, where the finished file ends up, and what they leave behind. One of the three is worth a paragraph first.

No app on either device can introduce metalign web, because it runs on neither: it puts the Film section in a browser, entirely on the machine it is open on. Nothing is uploaded and there is no account. That is not a promise about our conduct but a property of the page: it is served under a policy that permits it no connections of its own, so there is nowhere for a scan to go.

Propertymetalign, on the Macmetalign companion, on the phonemetalign web, in a browser
Scans it will write What the bundled ExifTool writes, TIFF included JPEG only — ImageIO will not put a capture date into a TIFF's EXIF JPEG and TIFF, written natively; ExifTool only for the files it will not vouch for
Where the file ends up In place, beside the lab's delivery From Files, replaced where it sits; from Photos, edited in place and filed in an album In place, in the folder it came from, on Chromium; everywhere else a ZIP of the roll
Backups An untouched *_original of every scan None of its own — Photos keeps the original, and Revert undoes the write An *_original, written before the new bytes; the ZIP route reads the scans and touches nothing
Flash Writes EXIF:Flash Never writes it, in either direction Writes EXIF:Flash
A position nobody measured Writes GPSProcessingMethod into the EXIF GPS block Writes the same value, into the XMP packet rather than the EXIF block, where a reader of EXIF alone will not find it Writes it into the EXIF GPS block
Caption, title, keywords MWG composites — EXIF, IPTC and XMP together XMP, mirrored into ImageDescription, Artist and Copyright; no IPTC block MWG composites as well — EXIF, IPTC and XMP, in JPEG and TIFF alike
Fig. 10 The phone is the only screen in any of the three that names all three destinations, and it is where the table above comes from.

Section 7 Worth knowing

Fig. 11 The frame map. Blue is a place the phone measured and orange a place somebody worked out; the list says which in words, where there is room to say it.

Provenance

Read out of the three apps on and checked against them again on — the on-screen wording from the sources rather than from their documentation — and copied here by hand. Nothing keeps it in step automatically. Where the apps disagree with this page, the apps are right. The screenshots are of metalign companion running in a simulator on the first of those dates, on made-up film: there is no such roll and the coordinates are a mountain. The second check was every quoted control on both pages — 36 of them — grepped against the three repositories, plus §4's claims against metalign companion's own FRAMES.md and SCANS.md, and the three version numbers above against each project.yml. All of it held. It was run because this page was about to be published, and the seam it sits on is the one with no test on either side: a reworded string in an app breaks a transcription here without changing anything a build could notice. The material added later the same day is the exception to the row above, and says so here rather than quietly joining it. §1.1's two paragraphs on the catalogue, §1.3's account of the five ways to log a frame, §3's And back again, §4's two bullets on deleting a frame and the last four bullets of this section were read out of metalign companion's source and its own documents, not off a running screen. Every control they name and every sentence they quote was matched against a string literal in that repository, which catches a wrong quotation and would not catch a screen that no longer shows it. Only one of them touches a published plate: §1.1 explains the catalogue mark Fig. 1 has always drawn and this page had never named. One claim here was checked from the other side rather than only from this one, and it is the exception worth naming because it had been wrong. §1.3 and the landing page both said the screenless routes put no dials in front of you; the watch has a dials page, and a press there records a real exposure. Corrected 26.08.2026 and then verified against the app's source by a session working in that repository, which also established the boundary this wording now respects: a dial can be carried from an earlier frame rather than set for this one, so what holds is that nothing is ever derived, not that every value was chosen afresh. Added , and belonging to the same exception: §5's paragraph on a position nobody measured, the rows §5 and §6 gained for it, and this section's last bullet. All of it was read out of the three repositories' source rather than off a running screen: the phone's frame map and the picker it opens, the location a frame edit mints on the Mac and in a browser, and, for the question of where the tag lands, each writer's own tests and the measurements recorded beside them. The one screen seen running that day is the one in Fig. 6, whose menu had gained a row.