* New collapsible pane sits between the main split and the footer and
shows per-core CPU utilisation as btop-style vertical bars. Polls
/proc/stat once a second, paints with the live Omarchy accent colour
via Cairo. Collapsed/expanded state persists in
~/.config/nocoder/config.json as cpu_pane_expanded (default true) so
the pane reopens however the user last left it.
* Footer "complete" state now reports TOTAL TIME alongside Succeeded /
Failed / Output size. Wall time captured via time.monotonic() when the
encode worker starts and again when the state flips to complete; only
successful (non-cancelled) batches get a time. Formatted via the
existing data.format_duration helper so it matches the pre-encode
estimate's display.
The /proc/stat parser lives in its own pure-Python module
(nocoder/cpu_sampler.py) so it's GTK-free and easy to test in isolation.
SystemPane mirrors the Footer attachment pattern (Gtk.Box subclass +
__gtype_name__ + add_css_class), attached from MainWindow exactly like
the footer is. Timer auto-stops on widget detach via a get_root() check,
so no explicit teardown wiring is needed.
CSS gets a .system-pane block (top border + padding) and a .cpu-bar-area
rule that sets foreground colour to @accent — the Cairo draw callback
reads that via widget.get_color() so the bars track the live theme
without re-plumbing.
Verified:
* CpuSampler reports 32 cores at idle baseline; under stress-ng --cpu 0
aggregate hit 99.9% with all bars saturated.
* Theme accent cascades correctly; bars use the active Omarchy theme.
* cpu_pane_expanded round-trips (manually setting false then relaunching
reopens the pane collapsed).
* TOTAL TIME shows 0:02 for a 2.28s encode of a 3-second HEVC test clip.
* Installed copy at ~/.local/share/nocoder/ updated and verified via the
walker launcher.
Profile, naming, output folder, audio bit depth and auto-reveal toggle
now round-trip via ~/.config/nocoder/config.json instead of resetting
to defaults on every launch. Alpha is deliberately NOT persisted because
the toggle is conditional on the chosen profile and would create more
confusion than value when restored from a stale session.
* New nocoder/config.py owns the JSON file with read-modify-write
merging so multiple writers (hwaccel.py + UI prefs) don't clobber
each other. Atomic write via tempfile + os.replace.
* hwaccel.py refactored to use the shared load_config / update_config
helpers; CONFIG_PATH still re-exported for backward compat.
* settings_pane.Settings gains to_persistable() that returns the
subset to round-trip; new load_persisted_settings() validates each
field against its allowed range and falls back to defaults.
* window.py loads settings on startup and persists them every time
the settings-changed signal fires (which already covers the folder
picker via set_output_folder).
Verified: round-trip works, validation rejects bogus values cleanly,
hwaccel survives the merge.
Native GTK4 + libadwaita app that wraps ffmpeg to batch-convert source
video into editorial-ready Apple ProRes .mov. Targets Omarchy / Hyprland
on Arch Linux specifically.
Highlights:
* Real ffmpeg encode (prores_ks → prores fallback) with live progress
parsing, cancelable serial queue, disk-space pre-check, source-missing
guard, output-collision (N) suffixes.
* GPU decode auto-probe at install time — picks cuda → qsv → vaapi based
on what actually initialises on the host. ProRes encoding stays on CPU
(no vendor ships a GPU encoder); offloading the decode side cuts wall
time 25-40% on H.264 / HEVC sources.
* Theme-aware: tracks the active Omarchy theme on every launch by
parsing colors.toml / ghostty.conf / alacritty.toml / kitty.conf in
priority order. 34 stock + custom themes verified.
* Pro camera support: .MXF (Canon XF / Sony XDCAM / Panasonic AVC-Intra)
with proxy-directory pruning so dropping a Sony XAVC card maps masters
in CLIP/ but skips the low-res duplicates in SUB/.
* Multi-track audio preserved — 4 mono PCM streams from a Canon C300/C500
land in the output as 4 separate tracks. Optional 24-bit toggle.
* Live encode-speed indicator with ffmpeg -progress parsing; ETA refines
from real measured throughput rather than a fixed heuristic.
* Hyprland-aware install — registers walker entry, six hicolor icon
sizes, float+centre windowrule for class dev.nocoder.NoCoder.
Distribution model: git clone + bash install.sh. The installer copies the
source tree to ~/.local/share/nocoder/ so the clone is disposable. Updates
are git pull + re-run install.sh.
Documented at README.md.