First pass by sharpness
Everyone
Opens a folder, waits until the app has measured every frame where the camera focused, then gives the sharpest tenth five stars, the next fifth three stars, and rejects the softest third. A start to look through, not a verdict.
bun auto-cull.ts <folder>
Download auto-cull.tsFrom the card to the desk
Press
Put the card in and cull: every picture you pick is sent to the newspaper's server as a JPEG developed from the RAW, with your by-line, credit, the event, the place and a caption template in it.
bun card-to-desk.ts <desk connection> [<folder on the server>] --name "<your name>" [--credit …] [--event …] [--city …] [--caption …]
Download card-to-desk.tsCredit every picture
PressEvents
Your name, credit line and copyright on every picture the folder shows, and keywords added, without touching the captions, headlines or keywords each picture already has.
bun batch-iptc.ts "<your name>" ["<credit line>"] [keyword …]
Download batch-iptc.tsExport the picks
Everyone
Shows only the picks with three stars or more, and exports them as JPEG to the folder you give, or beside the pictures.
bun export-picks.ts [<folder>]
Download export-picks.tsEvery copy on every disk
Everyone
Scans the disks in the library and lists what exists more than once, whole folder copies first, with how much space they take. Give it a DNG and it also names the raw file it came from.
bun find-duplicates.ts [<picture.dng>]
Download find-duplicates.tsDarker sky, brighter faces
Everyone
Two masks on the picture on screen: the top of the frame narrowed to its bright tones and darkened, and the skin tones lifted. Shows how a mask is put together from parts in a script.
bun local-adjustments.ts
Download local-adjustments.tsFrom the course to the desk, with names
Events
Takes the frames off an SFTP server as the camera sends them, reads the race numbers, looks them up in the start list, and delivers HD JPEGs with the riders' names in the metadata to a folder or Google Drive. Two races finishing on the same day are read in one pass.
bun race-delivery.ts <connection> <remote-path> <work-dir> <event-dirs> --drive <folder link>
Download race-delivery.tsOne frame per moment
PressEvents
For holding the shutter down: frames close in time are one burst, bursts that look alike are one moment, and only the best frame of each moment goes on, to a folder, Google Drive or the desk's FTP. The desk stops getting twenty near-identical frames.
bun burst-delivery.ts <connection> <remote-path> <work-dir> --to <connection>
Download burst-delivery.tsPortraits of the runners
Events
Shoot wide, deliver people: every runner is cut out of the frame in the same shape (9:16 unless you choose another), and so are pairs running together and groups, with the race number read off each runner.
bun runner-crops.ts <connection> <remote-path> <work-dir> --out <folder>
Download runner-crops.tsSign this machine in to Google Drive
Everyone
Once per machine. Deliveries to Google Drive then renew their own access, instead of stopping an hour into a job.
bun drive-login.ts
Download drive-login.tsSee what the app is doing
Everyone
Prints every event the app sends as it happens: a picture rated, a folder opened, a delivery done. Where to start when writing a script of your own.
bun event-watcher.ts
Download event-watcher.tsLet Claude watch a delivery
PressEvents
Prints one line per batch of finished pictures from a running workflow (what each step did, what went out), and a line for each error, start, stop and pause. Run it under Claude Code's Monitor, and the session looks at each batch and holds back or redoes a picture that is wrong.
bun follow-workflow.ts --batch-seconds 60
Download follow-workflow.tsSlideshow from the keyboard
Everyone
Starts and stops the slideshow, steps through it, and rates and flags the picture on screen, one key at a time from a terminal: for showing pictures to a client while you sort them.
bun slideshow-controller.ts
Download slideshow-controller.ts