Skip to content

Releases

v1.48.0

Choose a tag to compare

@github-actions github-actions released this 13 Nov 23:32
Scoreboard: make one from scratch in three looks; QR fit and fixes (v…

v1.47.0

Choose a tag to compare

@github-actions github-actions released this 12 Nov 04:25
Build: pin the bundled ffmpeg, and drop -vsync from smoke (v1.47.0)

The first v1.47.0 build failed on both platforms: requirements.txt said
imageio-ffmpeg>=0.5, so CI installed a newer wheel carrying ffmpeg 8,
which removed -vsync, and six of smoke's frame-extraction checks died
on it. Nothing shipped -- no release was created.

The real problem was the unpinned wheel: it is the ffmpeg every user's
app bundles, and it had silently jumped a major version past everything
golden and the byte-identical timer check were run on (7.1). It is now
pinned to the tested 0.6.0. Smoke's extraction uses -fps_mode
passthrough instead, which works on 7.1 and 8 alike. Smoke passes
locally (697).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

v1.46.0

Choose a tag to compare

@github-actions github-actions released this 28 Oct 02:41
Spinner: cinematic zoom, 300 entries, and Tidy my list (v1.46.0)

The owner's youth conference has 300 people, so the wheel now takes 300
entries (names show on the slices up to 100; above that the winner card
carries the name). Cinematic zoom, a toggle with its own ZOOM seconds
after SPIN, pushes straight in on the arrow until about ten names fill
the bottom half under a big arrow, then the last five or so names crawl
past while the arrow flicks at each one; on landing the other slices
sink into shadow and the WINNER card fades in above the arrow. Zoom off
is pixel-identical to v1.45.0 (frame hashes compared at 6, 12 and 100
names; golden passes).

TIDY MY LIST sorts a messy paste into one entry per line. The owner's
first 300-name try sat on "Tidying..." for three minutes: the low-cost
router picked a model that spent all 12,000 tokens reasoning and
returned nothing, then the free pool queued. The list now goes out in
~60-name pieces side by side on the paid auto router: 300 messy names
come back exact in 10-15 s, verified live, including names ending in
numbers, which one model had dropped until digits joined the coverage
guard. Both AI buttons now show a spinner, elapsed seconds and CANCEL
(text untouched), with a 150 s cap, and a tidy names the model it used.

README: Mac install steps for macOS 15 ("Open Anyway"), Apple Silicon.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

v1.45.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 23:27
Beat opener: the hit lands on the beat, and the waveform zooms (v1.45.0)

The owner's kick drum played a few frames after the screen cut to black:
their window began in the quiet before the kick, playback starts at the
window's edge, and a mouse can't land that edge on the exact sample.
Measured 150 ms late on every cut. The app now finds the hit inside the
chosen part (where it goes from quiet to loud) and plays from there, so
the kick lands 1.2 ms after each cut - a deliberate 1 ms lead-in. A part
that is already sounding at its start, like a pad, is never moved. The
status says where the hit was found and a marker shows it on the waveform.

A long sound was "very very hard to select a small portion" from, so the
waveform now zooms (1x-32x, slider or scroll over it), with an overview
strip to move around, a 1x button to zoom back out, and real detail when
zoomed. 636 smoke checks, golden passes; render/ is unchanged. The PLAY
preview's audio was checked by its state, not by ear.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

v1.44.0

Choose a tag to compare

@github-actions github-actions released this 15 Oct 04:57
Timer: drag the numbers into place, and colour them (v1.44.0)

A classic countdown's numbers can now be dragged on the preview into a
gap in the background - the owner's Summit graphic has a speech bubble
that is obviously where the timer goes - and sized with SIZE, with RESET
to start over. The accent colour now colours the numbers too (a WHITE
swatch, the default, keeps today's look), and background images are no
longer dimmed 45 % by default.

Untouched timers are byte-identical to v1.43.0; golden passes; 633 smoke
checks. A placed, sized, blue-numbered timer was exported and inspected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

v1.43.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 02:20
Timer: pick the part of your beat sound that plays (v1.43.0)

The beat opener's MY SOUND gains the waveform picker the owner asked
for, modelled on Instagram's audio trimmer: drag a window over the
uploaded sound to choose the part that plays on every cut, capped at two
beats so the selection is exactly what plays, and preview it with PLAY.
A 1.5 s keyboard hit now plays 1.5 s, and a long sustained tone gives up
just the stretch that's wanted. The uploaded sound now lasts one visit:
cleared on app start, page reload and opening the countdown, so a sound
from a previous session never turns up.

Ordinary countdowns are byte-identical to v1.41.0, golden passes, 621
smoke checks. The PLAY preview's audio was verified by state only; it
could not be listened to here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

v1.42.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 01:20
Timer: a beat opener that flashes and sounds on the song's beat (v1.4…

v1.41.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 23:18
Timer: type the countdown's layout; quicker Fill with AI (v1.41.0)

Three checkboxes (Show milliseconds, Full-size milliseconds, Fixed
00:00:00) described one thing, the shape of the numbers. The countdown
now has a FORMAT box under Advanced instead: M:SS.000 turns a 20-second
timer into 0:20.000, HH:MM:SS gives 00:05:00, and the first unit
stretches on its own. Empty is the usual layout, and it renders
byte-identically to v1.40.0.

Fill with AI was slow on the free model pool. It now defaults to
OpenRouter's auto router on its lowest cost tier, about a fraction of a
cent per fill. A key with no credit falls back to the free models on its
own, so nobody loses the feature. That path is tested against a faked
OpenRouter only; no live call has been made from the dev machine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

v1.40.0

Choose a tag to compare

@github-actions github-actions released this 21 Sep 07:23
Timer: say whether the graphics card did the encoding (v1.40.0)

On Windows the owner's exports took longer than on the Mac, on a machine
with an NVIDIA card — and nothing could say whether the GPU was being used.
The app probes NVENC, QuickSync and AMF and takes the first that works,
but it recorded the choice nowhere and threw ffmpeg's refusal away, so a
graphics card being skipped looked exactly like having none. It matters
more than it sounds: drawing a 5-minute countdown takes 0.2 s of a 6.2 s
render here, so the encoder is nearly the whole time. The bundled Windows
ffmpeg does include all three hardware encoders — read from the configure
string inside the shipped binary — so the path is real, not dead code.

The timer's ADVANCED drop-down now ends with "Last export": plain words
first ("Made on the graphics card, in 3.1 seconds."), the codec and
ffmpeg's reason on a dim line beneath. Not under the finished filename,
where "h264_nvenc" meant nothing to a volunteer. Analytics gains an
encoder property on the export event, so GPU use is visible across every
church, and on a Windows fallback nvenc/qsv/amf each give a one-word
reason (no_driver, no_device, unsupported, timeout, other). ffmpeg's text
itself never leaves the machine: it can name a DLL by full path, and a
Windows path carries the user's name. A smoke test plants exactly that
and proves none of it reaches analytics. The README says so too.

The first version asked pick_codec() after every job. That named a codec
for PNG exports that encode no video, and fired the hardware probes — up
to a 20 s timeout each on Windows — on transparent exports, whose code
exists to avoid them. It now records the codec the encoder actually used.
Smoke 503/503, golden 23/23 pixel-identical, and the encoder checks were
also run against a simulated GPU-less Windows runner, the state that
turned the v1.39.0 build red. Not verified on Windows itself.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

v1.39.0

Choose a tag to compare

@github-actions github-actions released this 20 Sep 14:16
Smoke: the console-window check assumed it was running on a Mac

The new "other platforms add no spawn flags" check called
no_console_kwargs() and expected {} — true on this machine, false on the
Windows CI runner, where sys.platform really is win32 and the flag is
exactly what should come back. It turned the v1.39.0 Windows build red
while the app code it guards was correct, so the release published with
only a Mac asset.

Both assertions now come from explicitly faked platforms rather than the
host, so the check means the same thing wherever it runs. The same blind
spot the release itself is about: something written on a Mac that only
Windows disagrees with.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>