ExoSnap 0.2.0
Summary
ExoSnap 0.2.0 is the reliability foundation release. It ships the remux-first MP4 strategy
(ADR 0014), a crash-recovery workflow, low-disk guards, FAT32 filesystem checks, a container
compatibility registry, and MP4 split via per-segment remux. MKV remains the sole recording
container; MP4 output is delivered by stream-copying the transient MKV to a progressive,
faststart-enabled MP4 after recording stops.
This is a pre-v1 preview. Settings, preset, and recording-history file formats are not frozen
and may change incompatibly before 1.0.0.
Highlights
MP4 via remux-on-stop
MP4 output is no longer written directly. ExoSnap now always records to a crash-tolerant MKV
transient file and stream-copies it to a faststart progressive MP4 after stop. The transient MKV
is deleted on success and retained for recovery on failure.
SAVINGstate: the Transport Dock and status pill showSaving…while the remux runs in the
background. All recording controls are locked during this phase.- App-exit guard: closing ExoSnap while a save is in progress shows a modal "Wait / Cancel save
and close" dialog. - MF/SinkWriter MP4 writer removed: the legacy Media Foundation mux path is gone; libavformat
handles all remux and future trim work. - libavformat is the LGPL-shared prebuilt from the companion
Exoridus/exosnap-ffmpeg-build (r3, SHA256-pinned),
statically linked against mux/demux DLLs deployed flat next toexosnap.exe.
Crash recovery
If a recording session is interrupted by a crash or forced kill, ExoSnap writes a
recovery-manifest.json to its config directory before every session starts. On the next launch a
recovery overlay appears for each orphaned artefact, showing filename, size, and date, with these
actions per entry (ADR-0015):
- Finish — saves the recording as it was originally configured (MKV rename/repair, or MP4
remux), honouring the manifest snapshot. No user format choice is offered. - Continue — shown only for non-finalized (true-crash) artefacts. Arms the coordinator in a
paused state; Resume starts the next recording slice aligned with the per-segment machinery. The
1–2 s data loss at the crash boundary is accepted and visible as the slice boundary. - Delete — inline two-step confirmation; permanently removes the artefact.
- Decide later — an explicit text button (replacing the bare
×). Entries remain in the
manifest and the overlay re-shows on the next launch.
At most one Continue session can be armed at a time; continued sessions produce independent
recording slices (no single-file concat — Quick Trim is planned for 0.11.0).
Low-disk guard
ExoSnap now monitors free space on the output drive during recording:
- Warning — 2 GB free (
rec.005): a Notice appears in Diagnostics. Recording continues. - Hard stop — 500 MB free (
rec.007): a running recording is stopped gracefully; start is
blocked when below the threshold. - For MP4 sessions the effective hard-stop threshold is raised by the current transient-MKV size
so the remux phase can always complete (roughly 2× the file size must be available). For split
MP4 sessions the reserve sums all in-flight transient MKV sizes plus the live segment estimate. - A background thread polls every 5 s; the stop is single-fire to avoid duplicate stops on
oscillating drives.
FAT32 / filesystem check
- New diagnostic check rec.008: when the output volume is FAT32, a Notice (not a Blocker) warns
that the 4 GiB per-file limit will truncate long recordings. NTFS, exFAT, and other filesystem
types pass silently. Recording is not blocked — short clips on FAT32 work correctly. - Detection uses
GetVolumeInformationWbehind an injectableIFilesystemProviderinterface,
following the same pattern as the disk-space provider.
Container compatibility registry
ContainerCompatRegistrybecomes the single source of truth for container × video-codec ×
audio-codec compatibility, classifying combinations as Recommended / Allowed / Experimental /
Prohibited.RecordingPreset::ReconcileContainerCodecs()andSettingsResolverdelegate to the registry;
ad-hoc switch/if chains were removed.CapabilitySet::QueryCombo()gates recording start: Prohibited → Invalid → recording blocked.- MKV + H.264 + Opus reclassified from Prohibited to Allowed (Matroska carries Opus natively; the
write path is production-validated via AV1 + Opus). - Default profile confirmed as
MKV + AV1 + Opus + CFR 60 fps(matchesMakeDefaultPreset()).
MP4 split via per-segment remux
- When the output container is MP4 and a split boundary fires (manual or automatic), each completed
transient MKV segment is remuxed to a progressive MP4 in a background thread while recording
continues into the next segment. - Per-segment recovery manifest lifecycle: an entry is created before each segment starts, updated
on finalization, and removed on success; entries persist across crashes. - Stop semantics:
Savedis reported only after all segment remux threads have drained. - The disk reserve (
PendingRemuxReserveBytes) sums all in-flight transient MKV sizes and is added
to the hard-stop threshold to keep the disk guard correct during concurrent background remuxes.
Fixes and internal changes
- Build: test discovery switched to
DISCOVERY_MODE PRE_TESTglobally to avoid0xc0000135
(FFmpeg DLLs not found) during build-time test discovery. - ADR 0008 / 0010 / 0014: container-backend choice resolved; stale fMP4 labels removed from the
codec/container matrix; remux-on-stop decision (no fMP4 recording writer) accepted with the split
consequences section added. - ADR 0016: the on-screen overlay architecture is recorded for the upcoming 0.3.0 presence wave.
- License compliance:
licenses/ffmpeg.txt(LGPL-2.1) is staged from the FFmpeg build;
THIRD_PARTY_NOTICES.mdupdated; the license-bundle test enforces both. KNOWN_LIMITATIONS.mdupdated throughout: crash-recovery workflow, disk-space thresholds,
FAT32 behaviour, and MP4 split status are all documented.
Known limitations
See KNOWN_LIMITATIONS.md (shipped with the package) for the full current boundary.
- NVIDIA NVENC only — no AMD/Intel/software encoding fallback.
- No toast or tray notification when a recovery overlay is dismissed (planned for 0.3.0).
- FAT32 auto-split not implemented: when the 4 GiB limit is approached, recording stops rather
than auto-splitting (the rec.008 Notice warns ahead of time). - Poll-based disk monitor: a very fast sequential write burst could exceed the hard-stop
threshold between 5 s polls. - Network-drive space reporting may be unreliable; no special network-drive handling.
- No automatic update checking or in-app updater.
- No code signing (portable ZIP and MSI both unsigned); Windows SmartScreen may warn on first
launch. - No Replay Buffer.
- No built-in editor, trimming, or Quick Trim.
- No HDR10 / 10-bit pipeline (8-bit 4:2:0 only).
- No multi-vendor hardware-encoder matrix (NVIDIA only).
- Display identity uses the GDI device name and may be reassigned on a monitor topology change;
re-select a saved Region/Display target after a reboot or reconnect. - Hot-swap during recording is not supported.
Supported formats (0.2.0)
| Container | Video | Audio | Notes |
|---|---|---|---|
| MKV (default) | AV1, H.264 (NVENC) | Opus, AAC-LC | Crash-tolerant recording format; split supported |
| WebM | AV1 (NVENC) | Opus | Split supported |
| MP4 | AV1, H.264 (NVENC) | AAC-LC | Remuxed from MKV on stop; split supported |
HEVC, PCM, and FLAC are not implemented. Exact codec availability depends on your GPU generation,
driver, and the selected container/codec combination; invalid combinations are not offered.
Pre-v1 notice
ExoSnap 0.2.0 is a pre-v1 preview. Configuration, preset, and recording-history file schemas are
not frozen and may change in incompatible ways before 1.0.0. The recovery-manifest.json
schema is v1 in this release; corrupt or future-schema manifests are silently reset (no migration
attempt). Keep your own backups of presets you care about.
Install
Portable ZIP and MSI are attached to this release. The portable build needs no installer — extract
the ExoSnap-0.2.0-windows-x64-portable folder and run exosnap.exe. The Microsoft Visual C++
2022 x64 Redistributable is required (usually already present); the WinGet package installs it
automatically, other distributions do not bundle it. Neither artifact is code-signed; Windows
SmartScreen may warn on first launch.
Verify a download with Get-FileHash <file> -Algorithm SHA256 against the published .sha256
sidecar.
Reporting issues
Please open an issue at https://github.com/Exoridus/exosnap/issues. Including your Windows
version, GPU model, NVIDIA driver version, and the startup log
(%TEMP%\exosnap-recorder-app-startup.log) helps a lot.
ExoSnap is licensed under GPL-3.0-or-later. Third-party component licenses are listed in
THIRD_PARTY_NOTICES.md, with full texts under licenses/. The bundled FFmpeg libraries are
LGPL-2.1 dynamically linked builds from
Exoridus/exosnap-ffmpeg-build; see
licenses/ffmpeg.txt for the full text.