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
- Copy
DITools.appto/Applications(or run it from any folder). - 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. This applies to a build you downloaded in a browser; a build installed by Check for Updates… opens with a plain double-click.
- 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 a browser download, the right-click → Open path only needs to be done once. Later builds installed from inside DITools carry no quarantine flag, so the step is never repeated.
Checking for Updates
DITools can tell you when a newer build is published on 32thirteen.com, and install it for you.
Choose DITools → Check for Updates… to compare the build you are running against the one the site publishes. The panel shows the installed version, the published version, and when the check last ran. When a newer build exists it offers Download Update.
- Download Update fetches the published zip with a progress bar. Nothing is downloaded until you click.
- DITools checks the download before it touches anything: the size and SHA-256 must match the manifest, the manifest's Ed25519 signature must verify against a key built into the app, the unpacked zip must hold exactly one app with the DITools bundle id and the published build number, it must not require a newer macOS than this Mac runs, and
codesign --verify --deep --strictmust pass. A download that fails any check is discarded and the panel says why. - Install and Relaunch replaces the installed app and reopens it. Nothing is installed until you click this second button.
- Check automatically when DITools opens runs the same comparison at launch, at most once a day. It is silent unless a newer build is published — no window, no dialog, and no error if the Mac is offline or behind a captive portal. It never downloads anything on its own. Safe to leave on in a truck with no uplink.
- Skip This Build stops that one build from opening the panel at launch. A newer build still announces itself, and a manual check always reports honestly.
- If the panel says AHEAD, you are running a build the site has not published yet — normal for a development build, or for a ship still in flight.
- If the app you are running is named
DITools_bNN.app, the new build is installed beside it asDITools_b<new>.appand the old one is removed; a Dock tile pinned to the old path may need re-adding. Any other name, such asDITools.app, is kept and the contents are swapped in place. - The installed app carries no quarantine flag, so the first-launch right-click → Open step is not needed after an in-app update.
When DITools will not install in place
DITools refuses to replace itself when it is running from a quarantined location macOS translocates (an app opened straight from a browser download or a zip), from a read-only disk or a DMG, from a folder you cannot write to, or from a development build folder. The panel offers Save to Downloads or a link to the website instead. Save it, quit DITools, drag the saved app over the installed one, and open it from /Applications.
What gets sent
The check is a single read of 32thirteen.com/downloads/latest.json, a small public file listing the current build number, size, and checksum. Clicking Download Update adds one more request, for the zip itself. No project data, file paths, or identifying information leave your Mac, and nothing is downloaded automatically.
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 ofYYYYMMDD,MMDDYYYY, orDDMMYYYY— with an optional Dashes in dates checkbox for2026-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, FX9/FX6/FR7, FX5/FX3/FX30/FX2), ARRI (incl. AMIRA, ALEXA SXT / SXT W), RED, Panavision (Millennium DXL2), Blackmagic (URSA Cine 12K LF/17K 65, PYXIS 12K/6K, URSA Mini Pro 12K/4.6K G2, Cinema Camera 6K, Pocket Cinema Camera 4K/6K/6K G2/6K Pro), Canon (EOS C400, C80, C50, C300 Mark III, C500 Mark II, C70, R5 C), FUJIFILM GFX ETERNA 55, DJI (Ronin 4D-6K/8K, Inspire 3, legacy Zenmuse X7/X5S/X5R/X5), Nikon (ZR), Panasonic (VariCam PURE/35/LT, AU-EVA1), 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 horizontal lens multipliers; 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).
- Separate iPhone 18 Pro and Pro Max profiles include their four physical cameras and standard UHD/HD modes (Blackmagic Camera 3.5+). Main-camera Apple RAW references use Open Gate 4224 x 3024 and native “17:9” 4224 x 2240, documented for Final Cut Camera. Confirm RAW availability and orientation in your recording app; iPhone 17 portrait verification is not inherited. Physical sensor dimensions remain unpublished.
- iPhone Duo has its own profile: 26mm main and 13mm ultra wide rear cameras, outer 12MP Center Stage front camera (4K/1080p), and inner under-display front camera (1080p only). Modes offer HEVC/H.264, without assuming ProRes, RAW, Apple Log, open gate, or upright portrait rasters. Folding the displays does not change the recording canvas.
- Apple’s native “17:9” recording raster is 1.885714:1. The literal 17:9 frameline fits to 4224 x 2236 (2 pixels above and below) at 100% and 1x squeeze. For a native outline use Aspect Ratio None and enter 4224 x 2240. Open Gate RAW is 1.396825:1, rather than exact 4:3.
- 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. - Choose Custom to name a virtual camera: optional fields beside Manufacturer, Camera, Sensor Mode, Recording Codec, and Recording Resolution replace the default labels on the framing leader and image exports. Blank fields keep the defaults. Labels persist with projects, autosave, and share links; canvas dimensions and lens squeeze still control geometry.
- The 17:9 (1.8889) and 1.90:1 frameline presets are distinct exact ratios. Camera mode names can be nominal: VENICE 2 5.8K 17:9 uses a 5792 × 3056 raster, about 1.895288:1. To outline the native image area exactly, choose Aspect Ratio None and enter its active raster width and height.
- Format Comparison labels the selected camera and sensor mode as Base. Lens H is reference active width ÷ base active width: multiply the base lens focal length by it to match horizontal framing at the same viewpoint and lens squeeze. Wider formats read above 1.00; a VENICE 35.90mm base and RIALTO 65 53.75mm reference give ×1.50 (50mm → about 75mm). Different gate aspects do not also match vertical framing. Sensor outlines and image circles retain their physical scale; an unknown base geometry shows — instead of a fabricated multiplier.
- 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. The Preview panel leads the screen: it shows the focused label large, with every label in the set (drive, box, and warning) as thumbnails underneath. Click a thumbnail, or a drive row's eye button, to show it; the checkbox under each thumbnail decides whether it prints, and copies of one label are grouped. Switch between Screen and 1-bit Print. Zoom in with the magnifier buttons or a pinch (Fit resets), or open the preview in its own resizable window with the window button; it follows the label you click, steps through labels with the arrows, and closes with Esc. Previews update as you edit. The print bar at the bottom holds copies, the USB printer, Export (PNG, vector PDF, and 1-bit PNG per label, or raw print streams), and Print.
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.
Fonts & Logo
In Label Setup (beside the preview), the Type tab's Text font sets headers and details and Code font sets drive names and box lists; the recommended fonts stay solid on 1-bit thermal print. UPPERCASE (off by default) prints every line in capitals without changing what you typed; capitals run longer, so the label may grow. Logo adds an image in a column to the left or right of drive and/or box labels, making them longer; Size scales it from 25% to 200% (it can't be taller than the tape, so above 100% a wide logo gets longer). Labels print in one ink, so dark areas of the logo print and light ones drop out — check the 1-bit preview. A PNG with transparency works best; PDF logos are rasterized.
- Mounted-volume autofill attaches serial and capacity via DiskArbitration.
Drive X of Ynumbers the complete deliverable set across roles; box labels list contents with aCONTAINS N DRIVEScount and degrade gracefully on narrow media.- Save Set / Load Set writes a reprintable JSON spec that reproduces byte-identical rasters later. The logo is embedded in the spec; fonts are saved by name, and a font missing on another Mac falls back to the system font with a warning in the log.
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
cpfallback 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
ascmhlfolder 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 --deletedry-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.movand.mxfwith 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/VeniceCnnn, 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
/Volumesusing the shared Auto Reference filters. - Output writes
INDEX_OF_<directory>_<timestamp>.txtinside 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.
DataQ
Plan footage, cards and offload for a multi-camera show.
Project
Set the project frame rate (default 23.976), a headroom margin (default 10%), offload speed in MB/s with an optional verify pass, and one row per show with its own run time in minutes or h:mm.
Cameras
Each row picks a Sony, ARRI, RED, Panavision, Blackmagic, DJI, Canon, Nikon or Panasonic body, a recording format (the sensor mode and recorded resolution — ARRI, RED, DJI, Canon, Nikon and Panasonic rates depend on the mode, not just the resolution), codec and quality (RED: HQ / MQ / LQ / ELQ, or a compression ratio on DSMC2 and older bodies) — only combinations the maker publishes a rate for are offered — with an optional per-row frame rate and a roll % for cameras that don't roll the whole show. Grouped shows one row per setup with a quantity; Per camera gives every camera its own row and letter (A…Z, then AA, BB…). Switching expands groups into single cameras or merges identical cameras back.
Naming (Auto / 01 / A / 01/A, as in MultiPing) names cameras that don't have a name of their own, from their card letter: 01/A (the default) gives CAM 01/A, CAM 02/B …, 01 gives CAM 01, A gives CAM A, and Auto shows the letter only. The generated name shows in the Name field and goes into the CSV and PDF; a name you type or import from a sheet always wins, and card names (A101, A102 …) don't change. Saved shows keep their naming.
Add from Framelinez adds the camera, imager mode, recorded raster and codec currently set up in Framelinez. Camera and mode names come from Framelinez's catalog (the FX3 and FX3A share one entry). If DataQ has no rate for that exact codec it keeps the camera and format and says what it substituted; cameras DataQ has no rates for yet (Blackmagic, Apple, GoPro…) are reported rather than added.
Import cameras from a spreadsheet
Import cameras… (or drop an .xlsx or CSV file on the Cameras section) reads a production camera breakdown — one row per camera with a camera ID and a camera type, such as a CAMERA BREAKDOWN tab. DataQ picks the sheet and the header row (skipping title rows above it) and guesses the Camera ID and Camera type columns; change any of them in the Source bar. Also group by splits one camera type by a second column — for example by LENS #1, when the VENICE format depends on the lens.
Each distinct camera type is listed once with how many rows use it. DataQ suggests a camera from the text (“FG SONY VENICE II (8K)” → VENICE 2 8K, “SONY FR7 (S)” → FR7) with its default format and card; pick the format, codec and card once per type, or Skip it. Types DataQ can't place (a GoPro, say) say needs a camera and aren't imported until you pick one. Rows whose type is blank or N/A are skipped. Every mapping is remembered, so the next sheet from the same rental house comes in already set (remembered).
The preview lists every camera in sheet order with its card letter; untick any to leave them out. Each camera keeps the sheet's ID as its name (shown in Per camera view, the CSV and the PDF's card names) and gets the next free letter, A…Z then AA, BB…, so card names stay A101-style. Replace swaps out the camera list; Add appends, continuing the letters. In Grouped view identical setups merge into one row.
Show Projects
The folder menu in the page head holds the open show's name (• when it has unsaved changes). Save keeps the project inputs, shows and cameras in DataQ's Projects library; Save As, Rename, Duplicate and Delete manage it, and saved shows are listed most recent first. New Show starts empty. Switching shows with unsaved changes asks to save first. Save to File writes a .dataq file for the job folder or another Mac; Open File opens one and adds it to the library. Remembered camera-type mappings are shared by every show.
Card plans
- Single — records to slot A only.
- Relay A→B — fills A, rolls to B, and the full card is swapped while the other records (A101 in slot A, A102 in slot B, A103 in slot A…). Slot B may hold a different card, e.g. 1 TB in A and 512 GB in B.
- Simultaneous — both slots record the same footage; both copies count toward offload.
Card names are camera letter + show number + two-digit roll: show 1 is A101, A102…, show 2 is A201….
Results and checks
Each row shows GB per minute, footage per show, record time per card and cards needed; Totals add nominal and headroom footage, offload hours and a card pull list (per show, spares, total). Checks flag setups Sony doesn't offer at that frame rate, cameras with no card, cards on the wrong media for the codec (VENICE 1 records ProRes and XAVC to SxS and X-OCN to AXS), cards slower than the codec's bitrate, rates that are derived rather than Sony's published figure for that exact setting (with the reason — frame-rate scaling, borrowed from a sibling body, or a disputed Sony source), rates that are card-time figures, and cards whose usable capacity is estimated. The green all-clear only appears when none of these apply. The CSV carries each row's rate basis (verified, derived or gross).
Exports
CSV writes one row per camera per show — rate, footage, cards, card names and record time per card — then per-show totals and the card pull list, with plain numbers ready for a spreadsheet. PDF is a one-page-first production report headed with the Projectz job number, job name, production company and dates: summary figures, the camera setups, per-show totals, the card pull list, every card name per show, and any checks. Files are named DataQ_<job>_<date>, or after the saved show when Projectz has no job.
Where the numbers come from
Rates are the makers' published nominal video bitrates — Sony, ARRI, RED, Panavision, Blackmagic, DJI, Canon, Nikon and Panasonic — in decimal units (1 GB = 109 bytes) — padding lives only in the visible headroom setting. Card capacity is what a card actually holds: a 1 TB AXS-A1TS66 records 935 GB of footage. XAVC 4K and Alpha-body codecs are variable bitrate, so their figure is a ceiling.
DJI: Ronin 4D (X9-6K / X9-8K), Inspire 3 (X9-8K Air) and the Inspire 2 / Inspire 1 Zenmuse X7, X5S, X5R and X5, from DJI's own per-frame-rate tables (Apple's white paper for the X7's ProRes). CinemaDNG is compressed RAW with a variable rate: the Inspire 3 and X5S figures are DJI's planning maximum, so real files usually run smaller, but the X5R and X7 figures are averages, so footage can run higher — allow extra headroom. On the X9-8K, 8K ProRes RAW above 25 fps drops to about half the per-frame rate — DJI's figure, as the camera switches from ProRes RAW HQ to ProRes RAW. A DJI PROSSD 1TB holds 935 GB. On the Ronin 4D, ProRes RAW, 4444 XQ and 8K record only to the PROSSD; CFexpress takes 6K ProRes up to 30 fps plus C4K and 2K, and a USB-C SSD only C4K and 2K — Checks flags any other card. DJI publishes no usable capacity for CINESSD or microSD, so those are estimated (Checks says so).
Canon: EOS C400, C80, C50, C300 Mark III, C500 Mark II, C70 and R5 C, from Canon's own recording-format tables (every figure is Canon's printed Mbps; Canon calls them variable bit rate). XF-AVC and XF-AVC S Intra offer three bit rates per resolution and frame rate, shown as high / mid / low. The C300 Mark III's plain RAW is one figure at every frame rate, so it is a ceiling. SD cards take Canon XF formats up to 600 Mbps: on the C400 and C50 the heavier settings (all full-frame RAW, the top 4K Intra tiers) need CFexpress, the C80 records everything to SD, and the C300 Mark III's SD slot takes proxies only — Checks flags a card that can't carry the setting and names its bit rate. DataQ also knows each Canon body's slots: a C400 or C50 holds one CFexpress and one SD card, so two CFexpress cards are flagged, and relay recording isn't offered with Cinema RAW Light on the C400, C80 or C50 (nor double slot on the C400), nor with RAW HQ, ST or LT on the C300 Mark III (its plain RAW relays). A 512 GB CFexpress card plans at 472 GB and a 512 GB SD card at 470 GB, worked back from Canon's recording-time tables.
Nikon: the ZR, from Nikon's ZR Reference Guide and spec page. N-RAW and R3D NE rates include the H.264 proxy the camera always records alongside RAW, because it fills the same card; H.265 and H.264 are Nikon's average rates, so allow headroom. RAW and ProRes need the CFexpress Type B slot; the microSD slot takes H.265 and H.264 only. The ZR records video to one card — it has no relay or backup for video — so Checks flags a two-card plan. Nikon's recording-time table doesn't support a usable capacity for its 660 GB card, so it is estimated (Checks says so).
Panavision: the Millennium DXL2 uses RED's MONSTRO 8K VV sensor; its REDCODE rates use Panavision's own Data Calculator formula (about 1.4% below RED's tool). Above 24 fps a format is offered only where RED publishes the MONSTRO's lowest compression for that rate. It records to Panavision MINI-MAGs in one bay.
ARRI AMIRA and ALEXA SXT / SXT W: from ARRI's Formats & Data Rate Calculator and manuals. SXT ARRIRAW uses the storage rate that matches ARRI's record times (about 3% below its headline figure). The SXT's card limits differ by raster even within one sensor mode (3.2K vs UHD), and DataQ follows them. The SXT mirrors ProRes on SXR and XR Capture Drives (the ALEXA LF on SXR), so DataQ plans those drives at half their capacity for ProRes and the card list says "ProRes mirrored". AMIRA records to CFast 2.0 with one active card (no relay); the SXT has one media bay.
Blackmagic: Pocket Cinema Camera 4K, 6K, 6K G2 and 6K Pro, Cinema Camera 6K and URSA Mini Pro 4.6K G2. Blackmagic publishes rates at 30 fps, so other frame rates are scaled (each frame is coded alone). Constant Bitrate figures are maximums; Constant Quality uses the midpoint of Blackmagic's indicative range, so allow headroom. SD takes Blackmagic RAW only up to the heaviest load Blackmagic recommends SD for; where Blackmagic recommends no card at all (3:1 at 6K), the rate says so. Cards are a short list of Blackmagic-recommended models (Blackmagic publishes no usable capacities).
Panasonic: VariCam PURE, VariCam 35, VariCam LT and AU-EVA1. VariCam AVC-Intra and AVC-LongG rates come from Panasonic's AVC-ULTRA tables; where Panasonic publishes none (V-RAW, 4K-LT at 59.94) the rate is worked back from its recording-time tables and says so. EVA1 rates are Panasonic's averages, so allow headroom. VariCam 35 and LT record to expressP2 (Panasonic publishes no usable capacity, so it is estimated); V-RAW records to the Codex Capture Drive 2.0, planned at its full 2 TB to match Panasonic's recording times. The VariCam 35 relays across its two expressP2 slots (not with ProRes) but has no backup recording; the LT and PURE have one planned slot; the EVA1's two SD slots relay or record simultaneously with any codec. Sub-recorder and proxy recordings aren't planned.
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. - Mounted Volumes lists every external drive (as in Labelz). HFS+ and APFS volumes have an Add button; FAT32, exFAT and other formats are shown dimmed as not tested, and the startup, internal, network, disk-image and Time Machine volumes are never offered. Automatically add external HFS+ / APFS volumes adds each eligible drive as a target when it mounts (after the current run, if one is going); a drive you remove stays out until it's unmounted.
- Optional per-drive text report, combined project log, and CSV speed log for graphing.
- Low-level POSIX I/O with
F_NOCACHEandF_FULLFSYNC; safe cleanup removes only theDITools_DiskSpeed_Testfolder 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:IPlists (also comma- or space-separated) or.csvfiles (optionalname,hostheader; columns are matched by name), or add devices manually — even while monitoring runs. An exported status report (TXT or CSV) can be loaded back as a list; only its NAME and HOST columns are used. - Bulk Add IP Range: tick the checkbox, enter a base name plus the first and last IPv4 address, and Add creates every address in between. A name ending in a number counts up from it, keeping its zero-padding (
CAM 01→CAM 01,CAM 02, …); a name without one getsNAME 1,NAME 2, … (duplicates are skipped; 1024-address limit). The Naming picker beside it chooses the style: Auto (as above), 01 (CAM 01, CAM 02 … CAM 100), A (CAM A … CAM Z, then CAM AA, CAM AB) or 01/A (CAM 01/A, CAM 02/B … CAM 26/Z, then CAM 27/AA); the last three use NAME as the prefix and always start at 01 / A. Sorting by NAME follows the same order, so CAM AA comes after CAM Z. - Load List and Manage Presets → Import also accept Excel
.xlsxcamera plots: pick the worksheet, the header row, and the NAME and HOST columns (guessed for you and remembered for the next plot), plus an optional second address column that adds aNAME Colordevice per row. Rows marked N/A or without a valid address are listed but unchecked. A.csvwith more than two columns and no recognised header opens the same mapper. Legacy.xlsand Numbers files must be saved as.xlsxfirst. - Scan Network sweeps the local subnet — or an edited From/To range — and lists live hosts with hostname, MAC, and latency. Tick the rows you want and Import them; with a non-empty list you choose Replace or Append.
- UP / DOWN / WAITING / ERROR states with latency, packet loss, and last-seen tracking; configurable refresh interval, timeout, ping count, offline threshold, and max pings in flight (DITools raises its own open-file limit at launch so even large lists refresh in one round; hosts that don't answer hold a slot for the full timeout). An optional MAC column (Settings → Columns) shows each on-link host's hardware address from the ARP table, refreshed every cycle while shown.
- Preset manager (save/load/duplicate/rename/delete, TXT/CSV/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 and stays on its screen; when the rows don't fit (a shorter external display, or a smaller window), they scroll under a pinned header; a Table | Tiles switch in its title bar shows each device instead as a NAME-over-IP tile, coloured by status (green UP, red DOWN, amber ERROR, dim WAITING; hover a tile for its status in words), laid out left to right and scaled so every device fits as you resize the window; the Dark checkbox beside it draws the tiles near-black with the name, IP and outline in the status colour instead, for a dark set; a device that misses a ping but hasn't yet reached the Offline threshold shows MISS (dimmed green, in tiles and the table) instead of looking unchecked, so a single dropped packet doesn't blank a tile; two Latency alerts in Settings (e.g. slower than 10 ms in pink, slower than 200 ms in purple) each have their own on/off, ms value, colour picker and Blink — an UP device answering slower than a threshold takes its colour in the STATUS and LATENCY columns and the tiles (the higher exceeded threshold wins; DOWN, ERROR, MISS and WAITING are unaffected); 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. - Five workflow presets: center crop to target aspect (the standard Resolve still cleanup), remove black bars (content-aware, any side — restrict with the Black bars picker), remove bars then crop to aspect, a two-pass pixel crop prefilled with the old Automator flow (1577×1080 → 1577×886), and resize only. 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.
- Lock bar crop for the whole batch replaces per-image detection with fixed per-side pixel trims, so a sequence comes out at one consistent size. Detection can be fooled when dark content sits against a bar (night exteriors, fades), which shows up as output widths that drift frame to frame. Click Measure selected on a frame with bright content against the bars to fill the trims at full resolution, correct them by hand if needed, and every still then gets exactly that crop. Locked trims are source pixels, so the locked crop always runs before any resize. While Two-Pass Crop is enabled it takes precedence and black-bar removal is ignored.
- 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
.cubeLUT (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.
- Click Import XML… and select one or more
.xmlfiles. - Choose Imperial (ft) or Metric (m) focus units.
- 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.
- Drop a folder or volume onto Target, or click Choose…. Every hash list at or below that folder is discovered —
ascmhlhistories including nested ones, plus loose MHL v1.x manifests. - 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.
- 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