Repository navigation
photon — v0.2.0 — 2026-10-22
This release adds photon tune, a timing editor that runs in your browser, and gives storyboards a camera that aims and zooms, plus captions drawn over the GIF.
Breaking changes
- A beat no longer takes a
zoom— a storyboard written for v0.1.0 that setszoomon a beat is now refused when it loads, withbeat <id>: zoom: removed; zoom with camera.zooms and aim with camera.positions. What to do: move each beat zoom into an entry of the storyboard'scamera.zoomslist, and aim it with an entry incamera.positions. frame.font_sizemust lie between 6 and 72 — a storyboard whose font size is outside that range now fails to load, andphoton lintreportsframe.font_size: want in [6, 72], got …. What to do: setframe.font_sizeto a value from 6 to 72.
New
photon tune, a timing editor in the browser —photon tune <storyboard> [<take>]serves an editor on 127.0.0.1 (any free port, or the one you give--port), prints its address and previews the take until you press Ctrl-C. You can edit each beat'sduration,holdandcutand the clip's framewidth,fps,font_size,line_height,paddingandscalewith undo, redo and revert, and saving writes back only the values you changed.- A camera that aims and zooms — a storyboard can declare a top-level
camerawithpositions(where the camera aims: acellor a text target, withat,holdandease) andzooms(tofrom 1 to 3, withat,overandease), whereatis a clip time or a beat plus an offset.photon renderholds each position, glides to the next and keeps the crop inside the frame, andphoton lintreports camera mistakes such as a position naming an undeclaredarea. - Captions — a storyboard can declare a top-level
captionslist of text shown on the clip's clock (at, thenfororuntil) with a font size and weight, a place, alignment, offset or explicitposition, colours, a background box and fades.photon renderandphoton tunedraw captions on top of everything, cursor included, so zooming or aiming the camera never moves or scales them, andphoton lintreports bad captions. - Caption fonts — captions use the built-in Source Sans 3 Regular and Bold, or the font files you name with
caption_font.regularandcaption_font.boldinphoton.yaml; acaption_fontentry that names a directory is refused when the config loads. Release archives now include the font's licence,SourceSans3-OFL.txt. - Smooth preview while playing or scrubbing —
photon tune's preview shows quick draft frames while it plays or while you scrub, fetching up to 4 frames ahead, and settles on the exact framephoton renderwould produce once it stops. - Editing the camera in
photon tune— you can change, add and remove camera positions (at,hold,ease, acellor a text target) and zooms (at,over,ease,to), and move the edges of the transition between two positions, with only those keys written back. An edit that would make two positions or two zooms overlap is refused with a message naming both, and removing a list's last entry removes the list, andcamera:too once it is empty. - Position lane —
photon tune's timeline shows each camera position as a bar (or a point when it has no hold) with a transition bar between it and the next, each opening a panel to edit it; bars and their edge grips drag in 50ms steps, each drag one undoable edit. The lane's+adds a point at the playhead on the cell the camera is already centred on, so adding it does not move the camera. - Zoom lane —
photon tune's timeline shows one bar per zoom, labelled with its zoom factor:+adds a zoom at the playhead and dragging a bar moves it while keeping its beat. Clicking a bar opens a panel that editsat,over,toandease, shows the zoom's errors and removes it. - Aiming on the full frame — selecting a camera position in
photon tunejumps the playhead to it, and while paused the preview shows the whole frame with the camera's crop dashed and a marker you drag onto the cell the position should aim at. A pick's Set as position target sets the selected position's text target instead, and stays disabled until a position is selected. - Captions lane —
photon tuneshows captions as bars on their own lane:+adds one at the playhead, dragging moves it in 50ms steps, and its panel editstext,at,fororuntil,placeandalign, moves it up or down the list or removes it. A caption's rendering error, such as a box bigger than the frame, shows on its own panel, and the Inspect list marks captions that have one. - Caption style and timing in
photon tune— the caption panel edits font size and weight, text and box colours, box opacity, fade in and out, an offset and an explicit position, and sets start and end by beat or clip time plus an offset in milliseconds. Choosing "none" for the end turns anuntilinto aforof the same length. - Target picker — press ⌖ Pick in
photon tuneand drag across one row of the paused frame to get a target photon has checked against the screen, ready to copy as click, seen, drag-from or drag-to YAML. A target'snth: lastis kept when it is set or copied. - A page that fits the window — in a short window
photon tuneshrinks the preview (keeping its shape, never below 120px tall) so the transport bar and timeline stay on screen. The transport bar also shows which photon build serves the page, and why a lane's add button was refused, until the next accepted edit.
Improved
photon versionshows the build —photon versionandphoton --versionnow print the version with the commit it was built from, such asphoton 0.1.0 (a1b2c3d), adding, dirtywhen the tree had uncommitted changes; a build without that information prints justphoton 0.1.0.- Takes recorded out of order are refused —
photon check,photon renderandphoton tunerefuse a take that started its beats in a different order from the storyboard, naming both orders so you know to re-record it, and report a beat that started twice. photon lintchecks caption sizes — once the storyboard and config load cleanly,photon lintlays the captions out with the config's fonts and reports any caption box larger than the frame, instead of leaving it forphoton renderto fail on.- All-cut storyboards caught early — a storyboard in which every beat is cut is now refused when it loads (
beats: every beat is cut), sophoton lintreports it.
Fixed
- Stopped services free their port — when photon stops a project service it now waits for every process of that service to exit, so the service no longer keeps holding its port afterwards (Windows ends those processes with a delay); a process that survives being killed is reported.
Docs & install
- README rewritten — the README is reorganised with Contents, Why, Features, FAQ and License sections, and Install now leads with Homebrew (
brew install airiclenz/tap/photon) and Scoop, thengo installand release archives, without the pre-release caveat. - Camera and captions documented — the README gains Camera (positions, transitions, zooms, eases) and Captions reference sections, and its
photon tunesection,photon tune --help,photon render --helpand the glossary describe camera positions and zooms.