Skip to content

ExoSnap 0.2.0

Choose a tag to compare

@Exoridus Exoridus released this 13 Jun 05:55
Immutable release. Only release title and notes can be modified.
f3ace2e

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.

  • SAVING state: the Transport Dock and status pill show Saving… 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 to exosnap.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 GetVolumeInformationW behind an injectable IFilesystemProvider interface,
    following the same pattern as the disk-space provider.

Container compatibility registry

  • ContainerCompatRegistry becomes the single source of truth for container × video-codec ×
    audio-codec compatibility, classifying combinations as Recommended / Allowed / Experimental /
    Prohibited.
  • RecordingPreset::ReconcileContainerCodecs() and SettingsResolver delegate 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 (matches MakeDefaultPreset()).

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: Saved is 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_TEST globally to avoid 0xc0000135
    (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.md updated; the license-bundle test enforces both.
  • KNOWN_LIMITATIONS.md updated 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.