Jivefire 0.4.0
Highlights ✨
- Spring visualiser dynamics are now the default. Spectrum bars snap instantly to new peaks then spring back using harmonica physics, with an amplitude gain for a fuller, livelier look. No flag needed.
- Rebuilt TUI on Charm v2. The entire progress and summary display has been reworked: fixed-width metric boxes, a live file-size gauge, encoder-name readout, and time/speed/audio figures rendered with proper Unicode glyphs. Dynamic range is now shown in dB.
- Audio resampling migrated to libswresample. Mono-to-stereo conversion now uses FFmpeg's own downmix coefficients and correctly drains the decoder at end-of-stream, eliminating subtle sample-count mismatches in the final seconds.
- A/V sync drift corrected. A longstanding offset between audio and video timestamps has been fixed; output MP4s should now stay in lock-step from start to finish.
- Meaningfully faster encoding. Per-frame heap allocations and goroutine churn in the hot path have been eliminated, and shared YUV conversion primitives are now centralised in an internal package, reducing redundant work per frame.
- Stability and race-condition fixes throughout. Preview-frame rendering is now double-buffered (no more concurrent-access panics under load), the encoder worker pool cleans up correctly on initialisation failure, and a data race on asset warnings at startup has been resolved.
Changes since 0.3.3
- fix(ui): double-buffer preview frames to eliminate concurrent access (4666c28)
- chore: update .gif (5942348)
- fix(ui): eliminate data race on preview frame buffer (2e08e92)
- ui: display time, speed, and audio metrics with proper Unicode glyphs (2d4f623)
- refactor(audio): migrate to libswresample for sample conversion (53d8e5d)
- refactor: eliminate comment clutter and improve doc clarity (34f464e)
- chore(deps): bump nixpkgs from
64c08a7toa799d3e(dd266b7) - fix(audio,ui,cli): guard against zero sample rate and eliminate assetWarnings race (73c7922)
- fix(encoder): defer worker pool cleanup on initialization failure (5383c94)
- fix(audio,encoder,cli): correct A/V sync drift, surface asset warnings, and eliminate encoder allocations (01e1b3e)
- refactor: consolidate duplicated code and eliminate redundant operations (e29dd17)
- perf: eliminate heap allocations and goroutine spawning in per-frame hot paths (f98c428)
- fix(audio): duplicate mono samples for stereo channel encoding (ea22ab6)
- refactor: replace custom unsafe helpers with Go standard library utilities (97a3b2b)
- refactor: consolidate bar rendering loops and remove unused UI state (97e5e1f)
- refactor(ui): remove redundant timing fields and extract borderless table (407483a)
- chore: update gif (9836cbf)
- refactor(ui): make blockClamp generic to accept block array length (691a2b7)
- style(ui): remove "Video Preview" and "Live Visualisation" labels (8f2b358)
- refactor(ui): consolidate encoder, duration, and size metrics into finished pass 2 box (8756a31)
- feat(ui): add encoder name display and refactor frame-source layout (12aba78)
- feat(ui): add file size gauge and improve spectrum tracking (0bbf17f)
- refactor(ui): simplify progress labels and remove audio profile rendering (f711f11)
- feat(ui): refactor progress and summary display with fixed-width boxes and metrics (f55be8f)
- feat(renderer): make harmonica spring peak-hold bar dynamics the default (4c503a5)
- feat(ui): add harmonica spring gain for spectrum bar amplitude scaling (2c0f0ca)
- refactor(ui): extract progress bar construction into newProgressBar helper (a12f196)
- feat(ui): refactor progress UI with spectrum springs and modular rendering (ae9ef52)
- docs(agents): document Charm v2 TUI suite and API gotchas (c162367)
- fix(ci): exempt x/sync and go-runewidth from licence check (52097d9)
- build(deps): upgrade charm TUI suite to v2 and fix imports (74f4e56)
- fix(audio): drain decoder at end of stream (5a18c07)
- fix(audio): reject unsupported channel counts (908bc21)
- docs: update architecture to reflect yuv extraction and reader refactoring (0b7400c)
- style(audio): silence gosec G115 false positives in reader (9749286)
- fix(ui): display dynamic range in decibels (17aba13)
- refactor(cli): source CLI colours from the shared theme (5950c58)
- refactor(audio): share the buffer-fill loop between read helpers (308b972)
- refactor(encoder): dispatch frame writes on the input pixel format (fa0de4c)
- test(encoder): benchmark the production YUV path (6cd20a1)
- refactor(audio): drop unused totalFrames from ProgressCallback (ef6f1a8)
- refactor(audio): drop unused Metadata fields (290f23c)
- refactor(audio): type sampleDecoder with named sample formats (d56bde1)
- refactor(renderer): bundle title and episode into PodcastMeta (06c90b7)
- refactor(ui): let the encoder report hardware mode (29a5709)
- refactor(audio): drop single-implementor decoder indirection (f6757bb)
- refactor(audio): name sample formats instead of magic integers (eaac74f)
- refactor(cmd): group runPass2 encoding parameters into a struct (39b5081)
- refactor(encoder): extract shared YUV primitives into internal/yuv (f7a8d3d)
- refactor(encoder): read frame size from the FIFO instead of recomputing (cb92f9f)
- refactor(encoder): pass channel count to AVChannelLayoutDefault directly (9664d1f)
- refactor(encoder): derive AudioFIFO length from the buffer (a79bd5f)
- refactor(cmd): remove redundant ctx no-op assignment (e2b8693)
- refactor(cmd): drop unreachable multi-channel label branch (d6b8aff)
- refactor(audio): remove unused NumChannels from decoder (0238485)
- refactor(audio): drop unused SeekToSample method (62c471b)
- refactor(encoder): source hwaccel probe dimensions from config (9766fac)
- refactor(config): derive Framerate from FPS (5679b1b)
- refactor(config): model overridable colours as a value type (4911f9b)
- refactor(audio): extract shared raw-magnitude FFT binning (a6c7510)
- refactor(cmd): pass title and episode as parameters (da323cd)
- refactor: replace hand-rolled stdlib implementations with standard library (195a1c5)
Installation
Download the appropriate binary for your platform below, make it executable, and move it to your PATH:
# Linux (amd64)
chmod +x jivefire-linux-amd64
sudo mv jivefire-linux-amd64 /usr/local/bin/jivefire
# macOS (Apple Silicon)
chmod +x jivefire-darwin-arm64
sudo mv jivefire-darwin-arm64 /usr/local/bin/jivefireChecksums
SHA256 checksums are provided below for verification.