32Thirteen Production Utility

# DITools

A native macOS toolset for Digital Imaging Technicians — project setup, verified media syncing, drive labeling, render verification, on-set diagnostics, and lens-metadata conversion in one app.

## Overview

DITools bundles the daily workflows of an on-set DIT into one dark-themed interface. Every module keeps its own settings, activity log, and state; the sidebar (or `⌥↑`/`⌥↓`) switches between them without interrupting running work.

### Prep & Delivery

Project builds standardized day folders, Labelz prints drive/box labels, Sync mirrors media to up to eight destinations per slot, and TreeGen writes delivery inventories.

### Verification

FileCompare diffs drives against a reference, RenderCheck confirms every camera original has a transcode, and Housekeeping cleans up render artifacts.

### On-Set Math

ExpoDelta, Screen NITs, FlickerFree, and FreqCheck answer exposure, LED-wall, shutter-flicker, and radio-coordination questions instantly.

### Diagnostics & Conversion

DiskSpeed benchmarks drives, MultiPing watches network devices, FrameExtract/ColorStamp processes stills, and PrestonMeta converts FI+Z lens XML to CSV.

Module settings persist automatically and can be exported/imported as JSON from the Settings page for sharing between workstations.

## System Requirements

Item | Shipping requirement
--- | ---
Operating system | macOS 15.0 (Sequoia) or later.
Mac architecture | Apple Silicon or Intel. The shipping app is Universal 2.
Bundled tools | GNU rsync 3.4.1, `libhackrf`, and `libusb` ship inside the app bundle — no Homebrew or external installs needed.
Permissions | Read/write access to the media volumes you select. FreqCheck's Wi-Fi scan needs Location access; DiskSpeed's Spotlight control needs Full Disk Access.
Optional hardware | HackRF One for live RF sweeps (FreqCheck) and Brother P-Touch / QL-800 label printers over USB (Labelz).
Network | None required. The HTTP control server listens on localhost only.

## Installation

1. Copy `DITools.app` to `/Applications` (or run it from any folder).
2. On first launch, macOS may warn that the app is from an unidentified developer — the beta is ad-hoc signed. Right-click the app, choose Open, then confirm.
3. Grant permission prompts as modules need them (Location for FreqCheck Wi-Fi names, Full Disk Access for DiskSpeed Spotlight control).

### Beta note

Beta builds are not notarized. If macOS quarantines the app after download, the right-click → Open path only needs to be done once.

## Projectz

Generate standardized DIT day-folder structures.

Set the job number, job/client name, production company, shoot dates, and output directory, then create ready-to-use day folders with OCN, transcode, audio, and DIT subfolders. A live preview shows exactly what will be created.

- OCN options (`ORIGINAL_CAMERA_NEGATIVE_ONLINE`, `OCN`, custom), transcode presets (DNxHD 36, DNxHR LB, ProRes Proxy/LT, three custom slots), and audio (`AUDIO`, `MOS`, custom).
- DIT output folders: `DOCUMENTS`, `FRAMING_CHARTS`, `LOGS`, `LUTS`, `RESOLVE_PROJECT`, `SILVERSTACK_LIBRARY`, `STILLS`, plus two custom subfolders.
- Multi-day naming (`DAY01_OF_DAY03`), numbered subdirectories, date-as-prefix, and date formats of `YYYYMMDD`, `MMDDYYYY`, or `DDMMYYYY` — with an optional Dashes in dates checkbox for `2026-08-07`-style dates. Synq's date-mismatch warning understands both spellings.
- A Starting day offset (typed field + stepper, 1–99) numbers folders from the day you join — offset 5 on a 3-day selection yields `DAY05_OF_DAY07`.
- The UPPERCASE option (on by default) writes Job Number, Job Name / Client, and Production Co. in UPPERCASE in the generated folder names; the fields keep exactly what you type, so Labelz labels and the Framelinez leader title are unaffected.
- Typed names are made filesystem-safe automatically — whitespace and reserved punctuation (`\ / : * ? " < > |`) collapse to underscores, invisible format characters are removed, and leading/trailing dots are dropped, in both the preview and the created folders.

## Framelinez

Build frame lines and framing-chart leaders for cinema cameras.

Framelinez is the standalone CineFrameline app hosted inside DITools, behavior unchanged. Pick a Sony VENICE/BURANO, ARRI, RED, Blackmagic (URSA Cine 12K LF/17K 65, PYXIS 12K/6K, URSA Mini Pro 12K), FUJIFILM GFX ETERNA 55, GoPro (MISSION 1 series, HERO13 Black), iPhone (Blackmagic Camera for iOS), Vision Research Phantom, or PixBoom sensor mode — or a user-defined Custom canvas — add up to three frame line sets with per-line aspect ratio, scale, offsets, opacity, and styling, and watch the preview update live over a framing-chart leader.

- Frame lines fit the sensor or nest ARRI-style inside another line (Fit Inside), with locked aspect ratios that cascade when the container changes. Scaling accepts two decimals.
- Sensor Info reads out the Maximum Capture Rate for the exact camera, sensor mode, recording format, and codec selected (with license/media/mode qualifiers where the manufacturer states them); unpublished combinations say "Not published" and legacy combined Phantom entries say "Varies by model". Phantom cameras are now listed per body (Flex4K, VEO4K 990/590, Flex 2.5K, VEO 640).
- The Compare preview tab draws sensors — and standards-based film formats from Regular 8 through Super 35, 65mm 5-perf, IMAX 15-perf, VistaVision, and the 70mm print aperture — to true physical scale with color-keyed references and a legend of dimensions and diagonal crop factors; film rows carry role badges (camera capture vs telecine/projection), cited SMPTE/ISO/ARRI/BKSTS authorities, procedural film-strip rendering, and optional extraction overlays. Export Image writes the chart.
- Frame leader elements drag freely with right-click justification and Center Horizontally/Vertically; the Title can fill from the Projectz module, Director/DoP rows offer DIR:/DoP: prefixes and a cinematography-society suffix dropdown, and the camera-info caption can split into one detail per line.
- Exports camera-ready frame line files per manufacturer, framing-chart leader images (PNG/JPEG/TIFF or true-vector SVG with outlined text, named layers, and real millimetre document size), ASC FDL (validated by the official ASC reference core), and transparent ColorBox overlay PNGs scaled into 4K DCI / UHD / 2K / HD containers (frame lines and center marks only).
- iPhone 17 Pro/Pro Max offer Open Gate Internal (1920 x 1440) and Open Gate External · ProRes RAW (4224 x 3024 to an external USB-C drive).
- Setup share links use the legacy `veniceflt://` scheme, so links made in standalone CineFrameline still paste in.
- Projects autosave to the same Application Support location as the standalone app — existing work carries over automatically.

## Labelz

Author and print label sets for drive deliverables.

Labelz reads the active Project's identity and builds drive, box, and warning labels. Add drives, assign copy roles (`MASTER`, `CLONE`, `VFX`, `SHUTTLE` — with configurable house-style display terms), set per-drive audio and dailies codec, or import drives from a completed Sync job.

### Preview & Export

Every label renders a grayscale preview and a device-true 1-bit raster at the media's exact dpi, so hairlines that vanish in print are visible first. Export writes PNG, vector PDF, and 1-bit PNG per label.

### Direct USB Printing

Print straight to Brother P-Touch TZe (24/36 mm) and QL-800 DK rolls (62/38/29/12 mm) over USB with auto-cut, media-width guards, and two-color (black/red) support on DK-22251 rolls.

- Mounted-volume autofill attaches serial and capacity via DiskArbitration.
- `Drive X of Y` numbers the complete deliverable set across roles; box labels list contents with a `CONTAINS N DRIVES` count and degrade gracefully on narrow media.
- Save Set / Load Set writes a reprintable JSON spec that reproduces byte-identical rasters later.

## Synq

Mirror camera media from a source to up to eight destinations per slot, twice over.

Two independent sync slots each take one source and one to eight destinations, run simultaneously or sequentially, with live per-destination progress (current file, %, speed, ETA, byte and file counts).

- Bundled GNU rsync 3.4.1 with fast or thorough modes; native `cp` fallback with honest no-progress state.
- Verify picker — three tiers, described in the callout below.
- Destination preflight checks permissions and capacity: each run measures the source once (by stat, nothing is read) and a destination that cannot hold it fails before any bytes move. What that destination already holds is discounted first, so topping up a finished offload is never blocked by its own data. A pre-run source check blocks stale unmounted paths.
- Date Mismatch Warning flags destinations whose 8-digit date tokens disagree — the classic wrong-day client-drive mistake — before anything copies.
- Per-destination temporary disable (eye toggle) skips a drive without clearing its path; disabled drives are logged, never silently dropped.
- Optional global sync log plus per-destination `rsync_log.txt`; optional auto-eject of the Sync 1 source after success.
- ASC MHL seal after copy (off by default; always on for the Inline tier): each destination gets a chain-of-custody generation written after its copy succeeds, in the ASC reference tool's exact format. The sealed folder follows rsync's own trailing-slash rule — a source without a trailing slash seals the copied card folder, a source with one seals the destination itself. Re-syncing creates the next generation with existing hashes re-verified. A slot isn't complete (and Sync 1 won't auto-eject) until its seals are written.
- A destination whose seal records hash failures is not a success. Those files differ from what the source's own history says they should be, so the destination reads Copied · N hash FAILURES in red rather than Completed, the slot pill shows Verify FAILED, the log says the destination is not verified and not to wipe the source, a watch batch reports the run as failed, and auto-eject cannot fire. The generation is still written — documenting damage is the ASC-correct outcome, and the log names the manifest holding the evidence.
- Sealing refuses rather than damaging a history it cannot read. If an `ascmhl` folder exists but a manifest under it will not parse, the seal aborts and says why instead of restarting the history at generation 1 and overwriting the chain file.
- Hold auto-sync while media apps busy (off by default): while DaVinci Resolve is transcoding or Silverstack is offloading, a watch-triggered sync would fight them for the same drives and throttle both. With this on, DITools samples those apps' actual disk I/O every 5 seconds (per-process, so Time Machine or Spotlight can never trigger it); sustained traffic over 20 MB/s holds watch-triggered syncs — the slot shows an amber "Auto-sync held" note, files stay queued — and about 30 seconds after the app goes quiet, held batches resume within a couple of seconds. An app that is merely open never holds anything: only its measured I/O does. Manual Run and HTTP-triggered runs are never held (you get one heads-up log line), and a copy already in flight is never interrupted. The app list and threshold live in the settings JSON (`io_hold_apps`, `io_hold_threshold_mbps`); the default list covers the Resolve and Silverstack families.
- Watch source & auto-sync (per slot, off by default): the slot watches its own source folder and runs itself when new files land and finish copying — only deltas transfer. Auto-runs never show dialogs: a busy slot or a date mismatch holds the run (files stay queued, one log line explains why) and retries once the condition clears; three consecutive failed runs park the batch until the files change or the watch restarts, and cancelling a run stops its batch from re-triggering. Dropped-in folders are detected, per-slot processed histories keep same-folder slots independent, and the watch refuses configurations whose output would land inside the watched tree. With auto-eject on Sync 1, a successful auto-sync ejects the watched source and stops the watch.

### Which verification tier to use

Tier | What it does | Reads
--- | --- | ---
Quick | rsync compares size and modification date. Nothing is hashed. | none
Full (xxh64) | rsync `--checksum --checksum-choice=xxh64` hashes both sides to decide what to send. | source + destination
Inline | DITools performs the copy itself and hashes each file's bytes as they are written, then seals the destination from those digests. | source only

With sealing on, Full costs three passes over the data (rsync reads the source, rsync reads the destination, the seal reads the destination again). Inline costs one. Inline always writes an ASC MHL generation — the manifest is where the digests it computed are recorded.

The honest trade: Inline hashes the bytes on their way to disk, so it catches a bad read from the card and corruption in flight, but not a write that landed wrong on the destination media. Full plus the seal's own read-back remains the stricter check. Inline is a considered choice for long walk-away ingests, not a free upgrade. An interrupted inline copy leaves a truncated file under its final name — the same hazard as native `cp`; nothing is ever deleted.

## FileCompare

Compare mounted drives or directories against a reference.

- Add paths manually or pull every drive from `/Volumes`; set any drive as the reference, or let Auto Reference pick one matching `_1`/`_01`-style names (with Settings filters for camera rolls, the startup volume, and an excluded directory).
- Attribute comparison for size, modification date, and creation date; optional `rsync -avn --delete` dry-run comparison.
- Filters for hidden items, `.mhl`, GoodSync `_gsdata_`, `.DS_Store`, and custom extensions.
- Cancellable runs discard partial results — a cancelled comparison can never report real files as missing.

## RenderCheck

Verify every camera original has a matching transcode.

Two independent check slots each compare a Camera Originals folder against a Transcodes folder and flag anything missing.

- Source formats: `.mov`, `.mxf`, `.r3d`, `.cine`, `.mp4`, `.ari`, `.arx`, `.dng`, `.braw`, `.krw`, `.crm`; transcode matching against `.mov` and `.mxf` with optional suffix stripping (e.g. `_LT`).
- RED R3D span and DJI DNG sequence handling; Avid audio-companion (`_A1.mxf`) skipping.
- Camera-original gap detection for RED/BMD/Canon `_Cnnn`, ARRI/Venice `Cnnn`, and iPhone-style trailing numbers.

## TreeGen

Produce text inventories of one or more directories.

- Recursive tree output with standard connectors, per-file and recursive directory sizes, and optional skip-hidden.
- Auto Detect Drives adds mounted externals from `/Volumes` using the shared Auto Reference filters.
- Output writes `INDEX_OF_<directory>_<timestamp>.txt` inside the scanned directory; the target is validated as writable before the walk starts.
- Cancellable — a partial file is kept and ends with a `[CANCELLED — TREE INCOMPLETE]` marker.

## Housekeeping

Clean render artifacts: trash DRX and CDL files, fix RED proxy names.

### Trash DRX / CDL

Recursively move `.drx` or `.cdl` files to the macOS Trash (Put Back preserved). A Keep-original-CDL mode spares each shot's original; ambiguity is always resolved toward keeping files. An optional watch folder trashes new `.drx` files automatically.

### Fix RED Proxies

Strips the trailing `_NNN` (or a custom literal suffix) from `.mov`/`.mxf` names in one directory. Existing files are backed up to `.backup` before any overwrite; names that would collapse to a dotfile are skipped.

## FreqCheck

Multi-band RF coordinator and analyzer: 2.4 GHz lens control, 900 MHz camera control, 5/6 GHz wireless video, and custom sweeps.

### 2.4 GHz Lens Control (default)

- Channel maps for Preston G4/BD (30 ch, 2 MHz), ARRI WCU-4/HI-5 (14 ch, 5 MHz), and Cmotion CPRO (14 ch, 5 MHz), with multiple units per manufacturer.
- Exact and near-conflict detection with a configurable 1–20 MHz proximity threshold, drawn on a 2400–2480 MHz spectrum display.
- Optional HackRF live receive-only sweep (bundled `libhackrf`/`libusb`) with auto-scan interval, LNA/VGA gain, and sweep count controls; Wi-Fi-only fallback via CoreWLAN; mock scan mode for testing without hardware.

### Analyzer profiles

- 900 MHz Camera Control — 902–928 MHz stitched sweep with BitBox NA / SPUDNIK reference-range overlays (reference only — energy is never attributed to a product), an editable region-dependent 868 MHz sub-preset, user markers, and quiet-candidate ranking at 1/2/4/8 MHz widths. Automatic-frequency-selection products may change channels during observation.
- 5 GHz Video — 5150–5850 MHz with U-NII sub-band and DFS reference boundaries, 20/40 MHz candidate ranking matching Teradek Bolt 4K channel modes, a toggleable Bolt 4K reference overlay (Bolt 4K hops frequencies by default unless fixed-frequency mode is set; DFS frequencies need a 1-minute scan before use), and CoreWLAN 5 GHz network names shown separately as metadata (never as spectrum). A quiet region is not automatically legal to use.
- 6 GHz Video — Teradek Bolt 6 U-NII-5 context (5925–6425 MHz). With a classic HackRF/H4M+ the receiver measures only up to 6.000 GHz: the unmeasured remainder is hatched, excluded from rankings, and flagged with a persistent PARTIAL COVERAGE warning. A detected HackRF Pro (tunable to 7.1 GHz) measures the full span; 6.0–7.1 GHz is flagged as above the Pro's operating specification.
- Custom — user start/stop/candidate width with validation against the receiver's 1 MHz–6 GHz range, optional reference marker, and savable presets.
- Trace / Waterfall / Split display with a bounded-history waterfall (pause, clear, adjustable depth, auto or manual levels, hover readout) and a Clear/Caution/Busy/Stale/Partial/Unmeasured candidate table.

### PortaPack H4M+ connection

Put the H4M+ in HackRF/USB mode and connect it with a data-capable USB-C cable (charge-only cables will not enumerate). Fit an antenna suited to the band you are sweeping — the stock 2.4 GHz whip is deaf at 900 MHz. The radio receives roughly 1 MHz–6 GHz with about 20 MHz of instantaneous bandwidth (a HackRF Pro is auto-detected and extends the tunable ceiling to 7.1 GHz — hardware validation pending); wider spans are measured as stitched sweeps — overlapping sequential tunes blended onto one axis, not simultaneous full-band monitoring (the Scan Controls card shows segment count and full-span revisit time).

### Honest measurements

Levels are uncalibrated relative power, not laboratory dBm. FreqCheck is a receive-only Layer 1 energy analyzer: it never transmits, and it cannot decode or identify BitBox, SPUDNIK, Teradek, or any other product from RF energy alone. CoreWLAN supplies network names only, is limited to Wi-Fi bands, and is no substitute for spectrum data at 900/868 MHz — without a HackRF those profiles offer mock mode instead of fake live data.

### Location permission

macOS requires Location access before it reveals Wi-Fi network names. Nothing leaves your Mac.

## ExpoDelta

Compare two camera exposures in stops, and solve LED-wall EI.

### Compare tab

Side-by-side inputs for base FPS, shooting/off-speed FPS, ND, shutter (angle or speed, bidirectionally converted), T-stop, and EI. The stop breakdown itemizes frame rate, shutter, T-stop, ND, and EI deltas; ND uses true optical-density math (ND 3.0 = 9.97 stops). Camera presets cover Venice 1/2, Alexa 35, Mini LF, V-RAPTOR, and Phantom.

### Screen NITs tab

Solves `EI = K·N² / (t·L)` for an LED-volume wall from its measured patch nits (100% white or 18% gray), snaps to the nearest standard third-stop EI, and recommends cine ND toward a target EI. The shutter readout shows the exact reciprocal (23.976 at 180° reads `1/47.952 s`, not `1/48`).

### On LED volumes

Prefer IRND, and confirm with false color or waveform on a gray patch — narrow-band spectra and IR pollution behave differently than the photometric solve.

## FlickerFree

Find flicker-free shutter angles for any frame rate.

- Frame rates 1–120 FPS including fractional NTSC rates; flicker source of 50 or 60 Hz mains (treated as a 100/120 Hz source) or a custom frequency, with an offline country picker.
- Lists every safe angle up to 360° with equivalent shutter speed and exposure delta vs 180°; the angle closest to 180° is flagged as the recommended start.
- Phase-locked rates (e.g. 24/30/60 FPS at 60 Hz) are detected and reported as "all shutter angles are safe"; impossible pairs get a higher-frequency suggestion.

## DiskSpeed

Measure sustained read/write throughput on target directories.

- Single Large 8K File mode (1–64 GB presets or custom) and 8K Image Sequence mode with per-frame flush — reported speeds are true sustained rates, never buffer-fill spikes.
- Simultaneous or sequential multi-directory testing with live current/peak speeds, cycle counts, and comparison cards; targets persist across launches.
- Optional Spotlight disable on target drives via `mdutil` (needs Full Disk Access), verified after every change and restored automatically when a target is removed.
- Optional per-drive text report, combined project log, and CSV speed log for graphing.
- Low-level POSIX I/O with `F_NOCACHE` and `F_FULLFSYNC`; safe cleanup removes only the `DITools_DiskSpeed_Test` folder it created.

### Scope

DiskSpeed is a throughput test only — it performs no checksum verification and is not a media certification tool.

## MultiPing

Live ping monitor for cameras and on-set network devices.

- Load `NAME:IP` lists (also comma- or space-separated), or add devices manually — even while monitoring runs.
- UP / DOWN / WAITING / ERROR states with latency, packet loss, and last-seen tracking; configurable refresh interval, timeout, ping count, and offline threshold.
- Preset manager (save/load/duplicate/rename/delete, TXT/JSON import-export), CSV/TXT status reports, and launch restore.
- Floating detached monitor window with Keep-on-Top that sizes itself to the visible columns and rows; Terminal Style green-on-dark theme on by default.

## FrameExtract

Crop, resize, and color-stamp stills and frame grabs from any source — originals untouched.

### FrameExtract tab

- Aspect-ratio calculator: enter a source size and target ratio (decimals, `16:9`, or cinema ratios 1.33–2.76) and read off the exact centered crop, per-side pixel trim, and output size — no manual algebra.
- Workflow presets include the two-pass Resolve still cleanup (1577×1080 → 1577×886) that reproduces the old Automator flow exactly, plus content-aware black-bar removal that measures real letterbox/pillarbox bars per image. A Crop cleaned frame to target aspect option (and the "Remove bars, then crop to aspect" preset) chains an aspect crop after bar removal — bars removed, resulting size analyzed per image, then cropped to the delivery ratio.
- Batch processing with live progress, optional CSV log, configurable naming (`Name_FrameExtract_1577x886.ext`), and JPEG/PNG/TIFF output. Sources are only ever read.

### ColorStamp tab

- Bakes a `.cube` LUT (3D or 1D) into LiveGrade LOG stills and tags the chosen output colorspace via embedded ICC — Rec.709 (Gamma 2.4), sRGB, P3-D65, Rec.2020, and HDR PQ/HLG variants. Pixels pass to the LUT untouched; the colorspace is assigned, never converted.
- Output colorspace auto-detects from the LUT filename/title with a visible badge; manual choice always wins.
- Watch Folder mode stamps new stills automatically: FSEvents detection, a stability gate for half-written files, interval batching, a per-folder dedupe ledger, and explicit Resume on launch.

## PrestonMeta

Convert Preston FI+Z lens-metadata XML to CSV.

Import one or more Preston XML files and export per-frame lens data. Each `<data>` row's hex values decode to focus, iris, zoom, and aux readings alongside the timecode.

1. Click Import XML… and select one or more `.xml` files.
2. Choose Imperial (ft) or Metric (m) focus units.
3. Click Export CSV. One file prompts for a save location; multiple files batch-export one CSV each into a chosen directory.

Column | Value
--- | ---
`Timecode` | The row's `<time>` value (missing reads `00:00:00:00`).
`Focus (ft)` / `Focus (m)` | Focus distance, unit per the toggle.
`Iris (T)` | T-stop on a 1.4–22 scale.
`Zoom(mm)` | Focal length on an 18–100 mm scale.
`Aux` | Raw auxiliary channel value.

Output CSVs match the standalone Preston XML to CSV Converter byte-for-byte. Filenames ending in a `_YYYYMMDD_HHMMSS` stamp keep it: `Clip_20260101_123456.xml` exports as `Clip_20260101_123456_Imperial.csv`; anything else becomes `Name_Imperial.csv` / `Name_Metric.csv`. Malformed rows are skipped, never fatal.

## MHLVerify

Verify media against its hash list, compare two drives, and seal new generations.

ASC MHL is the chain-of-custody format written by offload tools such as Silverstack, Hedge, and YoYotta: an `ascmhl` folder beside the media holds numbered generation manifests plus a chain file sealing the manifests themselves. MHLVerify re-checks all of it without ever writing a generation.

Legacy MHL v1.x is read too. ShotPut Pro, Silverstack, OffShoot and YoYotta still write a flat `.mhl` file beside the media by default, with no `ascmhl` folder at all. Point MHLVerify at a folder and it finds both: v2.0 histories and loose v1.x manifests, verified side by side in one run. All the v1.x manifests in a folder are read as one scope for that folder. The v1.1 checksum spellings are normalised on the way in — `xxhash` is a decimal XXH32, `xxhash64` is the deprecated little-endian form and `xxhash64be` the big-endian one, and both land on the same value so a manifest from an older tool still compares correctly. A `<null>` entry (size-only) is reported as NO CHECK, never as verified. v1.x has no chain, no generations and no directory hashes, and the report says so rather than presenting their absence as a fault.

1. Drop a folder or volume onto Target, or click Choose…. Every hash list at or below that folder is discovered — `ascmhl` histories including nested ones, plus loose MHL v1.x manifests.
2. Click Verify. Each manifest is checked against the chain file, then every recorded file is re-hashed with every format its history recorded — xxHash 64, XXH3 (64/128), MD5, SHA1, and C4 — in a single read pass per file.
3. Read the scope cards (generations, chain state, counts) and the file table, filterable by judgment. Export a text or CSV report for production paperwork.

Judgment | Meaning
--- | ---
Verified | Every recorded hash format matches the bytes on disk.
FAILED | At least one recorded hash mismatches — the file changed after sealing. The reference is always the earliest healthy record, so damage documented by a later generation can never verify against itself.
Missing | Recorded in the history but absent on disk.
New | On disk but never sealed in any generation.
Unreadable | The file could not be read for hashing.
NO CHECK | The history records the file but carries no checksum we can verify it against — a v1.1 `<null>` entry, or an empty checksum element. It is not a pass: a scope containing one never reports ALL CLEAN.

The chain file is checked from both ends. Every manifest is verified against its chain entry (all recorded formats, not just the first), and the chain is walked for entries whose manifest has gone from the `ascmhl` folder, for manifests the chain never sealed, and for gaps in the generation numbering. Deleting a generation from the middle of a history is exactly what the chain exists to expose.

A cancelled run is never reported as a verification. Files the run never reached were never checked, so a partial result is labelled CANCELLED — PARTIAL on screen and carries a banner in the exported report. It can never show ALL CLEAN, however clean the files it did reach happened to be.

Directory and root hashes recorded by the sealing tool are recomputed with the ASC reference algorithm and compared — a mismatch means the folder's sealed contents changed even if no individual file failed. Nested sealed folders (a reel folder of separately sealed cards) are verified as their own scopes and never flagged as new files of the parent. Ignore patterns recorded by the sealing tool (`.DS_Store` and the like) are honored.

### Compare — two hash lists, no re-hashing

The Compare section answers "do these two drives carry the same media?" from the manifests alone. Pick Side A and Side B — each may be a folder with a history or a single `.mhl` file, and the two sides may be different formats, so a ShotPut v1.1 drive can be compared against your own ASC MHL card. Verifying two 2 TB drives means reading 4 TB; comparing their manifests means reading two XML files.

Verdict | Meaning
--- | ---
MATCH | Same paths, same hashes, same recorded times.
MATCH — timing differs only | Same paths and hashes; only modification dates differ. Routine after a copy that did not preserve times.
DIFFERENT LAYOUT | Every shared path agrees, but one side holds files the other does not — a partial copy, or an extra sidecar.
DIFFERS | At least one shared path hashes differently, sizes disagree, or one side's own history records a failed verification.
NOT COMPARABLE | The two sides share no checksum format, so nothing was compared that could prove the bytes agree. Not a pass.

A side whose history contains a failed record is never half of a clean match, even when both sides still agree on the original hash — otherwise a drive that documents its own corruption would compare as identical to a healthy one.

### Seal

Seal writes a new generation: pick a hash format (xxHash 64 is the on-set default) and click Seal…. A first seal creates the `ascmhl` history with every file recorded as original; later seals re-verify all existing hashes, document the outcome (verified, or failed with the damaged bytes' hash), and add new files as originals. The manifest and chain entry match the ASC reference implementation byte for byte — the reference `ascmhl` tool reads, verifies, and extends histories DITools writes, and vice versa. Sealing refuses to run when recorded files are missing, so damage is surfaced instead of buried — deliberately stricter than the reference `ascmhl create`, which writes the generation first and only then reports the failure. It also refuses when an existing history cannot be read, rather than restarting it at generation 1 and overwriting the chain. Elements another tool wrote into the chain file are re-emitted verbatim. Media files are only ever read.

## Settingz

Import, export, and manage settings for all modules.

- Universal Settings Export/Import writes one JSON covering every module — share setups between workstations or archive per-project configurations.
- Default Settings and Working Configuration paths with auto-load/auto-save toggles, plus Save Current as Working.
- FileCompare Auto Reference filters (skip camera rolls, skip startup volume, excluded directory) — shared with TreeGen's Auto Detect Drives.
- HTTP Control Server configuration and a Test-local-connection action.

All settings persist in `UserDefaults` under `DITools.master`, `DITools.httpControl`, and `DITools.module.<module_id>` keys.

## HTTP Control Server

Trigger Sync from Companion, Stream Deck, or curl.

A localhost-only HTTP server (`http://127.0.0.1:32132`) lets Bitfocus Companion, an Elgato Stream Deck, or any HTTP client trigger approved commands — designed first for the Synq module. Control surfaces never send paths; DITools stays responsible for selected directories, options, and safety checks.

See Help → HTTP Control Server Help… for endpoint reference, Companion button setup, and troubleshooting.

## Files and Configuration

Location | Contents
--- | ---
`UserDefaults` | All module settings (`DITools.master`, `DITools.module.*`, `DITools.httpControl`).
`~/Library/Application Support/DITools/` | Sync log fallback (`Sync Logs`), MultiPing presets, watch-folder ledgers.
Inside tested/scanned volumes | DiskSpeed's `DITools_DiskSpeed_Test` folder (auto-cleaned) and TreeGen's `INDEX_OF_…` files.
Legacy migration | `ditools_config.json` under `~/Library/Application Support/DITools/` or `~/Library/DITools/` imports once when no UserDefaults state exists.

## Version and Support

This help describes DITools v__VERSION__ (build __BUILD__).

- Check DITools → About DITools for the exact version of your copy.
- Website: 32Thirteen.com