Skip to content

Releases: Sohex/musefs

v1.1.0

17 Jun 22:27

Choose a tag to compare

musefs v1.1.0 — a feature and hardening release on top of v1.0.0. No breaking
changes; the read-only, byte-identical-audio invariant is unchanged.

Full detail in the CHANGELOG
and the documentation changelog.

Added

  • -v/--verbose flag on scan and mount (-v info, -vv debug, -vvv
    trace; default warn) so diagnosing a run no longer requires knowing RUST_LOG
    (an explicit RUST_LOG still wins).
  • mount --dry-run validates the --template and configuration and prints a
    sample of the paths the mount would expose (with file/dir counts), then exits
    without mounting.
  • Runtime telemetry (.musefs-metrics) — opt-in --expose-metrics
    (env MUSEFS_EXPOSE_METRICS) surfaces a synthetic Prometheus-format metrics
    file at the mount root: getattr/read/open activity, read-ahead behavior, and
    (with jemalloc) allocator stats. Off by default
    (docs, #394).
  • Scan progress indicatorscan/scan --revalidate render a live progress
    bar on a terminal, falling back to periodic ingested N/M (P%) log lines when
    non-interactive; new --quiet/-q suppresses it (#406).
  • --skip-on-missing template flag (env MUSEFS_SKIP_ON_MISSING) drops a
    track from the mount when a top-level template field stays unresolved, instead
    of substituting --default-fallback — e.g. --template '$!{beets_path}' --skip-on-missing hides tracks beets left without a beets_path (#408).
  • --read-ahead-prefetch flag — opt-in background prefetch threads layered on
    read amplification, default off (amplification alone captures the win; the
    threads add ~10% overhead with no measured benefit) (#255).
  • riscv64 release platform — prebuilt riscv64gc-unknown-linux-{gnu,musl}
    binaries and linux/riscv64 Docker images now ship with each release.
  • statfs reply — the mount reports a synthetic non-zero capacity so df no
    longer shows a 0-byte filesystem and capacity-checking importers (Lidarr et al.)
    don't balk (#368).
  • Per-extension skip breakdown at end of scan (e.g. skipped 42: jpg=20, cue=10, log=8, <none>=4), logged at warn (#341).
  • musefs vacuum command — compact the SQLite store (VACUUM + WAL
    checkpoint), reclaiming free pages left by prunes, orphan-art GC, and the schema
    migration; run while unmounted (#566).

Changed

  • Declared MSRV (rust-version = "1.95") — a too-old toolchain now fails with
    a clear cargo message; best-effort, not CI-gated.
  • Supply-chain license gate — a deny.toml + cargo deny CI job enforces a
    permissive-license allow-list, closing the gap left by advisory-only
    cargo audit.
  • Strict template validation — an unclosed [ … ] section or unterminated
    ${ / $!{ field is rejected at mount time with a message naming the problem,
    instead of silently folding the rest of the template into the open construct.

Fixed

  • Clearer mount errors — a missing or non-directory mountpoint is reported
    with an actionable message before FUSE setup (previously a bare os error 2, or
    a misleading "Permission denied" for a regular-file path); I/O errors no longer
    print their OS string twice.
  • Silent mp4 oversize drops — oversized embedded covr art and binary
    freeform (----) values in .m4a/.m4b are skipped in the format layer and
    now emit a warn line each, matching the other formats (#343).
  • xattr log noisegetxattr/listxattr/setxattr/removexattr now reply
    ENOTSUP explicitly instead of logging a [Not Implemented] warn on every
    xattr probe (ls -l, indexers, backup tools); caller-visible result unchanged
    (#364).

Prebuilt binaries for v1.1.0. Verify with: sha256sum -c <file>.sha256

v1.0.0

12 Jun 19:43

Choose a tag to compare

Prebuilt binaries for v1.0.0. Verify with: sha256sum -c .sha256

musefs v0.2.0

27 May 09:11

Choose a tag to compare

First public release.

Added

  • Formats: synthesis for M4A/M4B (MP4), Ogg (Opus, Vorbis, FLAC-in-Ogg), and
    WAV, alongside the existing FLAC and MP3 — metadata generated on the fly from
    the SQLite store and spliced in front of byte-identical backing audio.
  • Arbitrary tag support: a single canonical tag vocabulary maps common fields
    to each format's native slot (ID3 frame / MP4 atom / Vorbis field); any other
    tag round-trips through the format's extension slot (ID3 TXXX, MP4 ----
    freeform, raw Vorbis field). User-defined key casing is preserved.
  • beets plugin (contrib/beets/): syncs beets' canonical tags and cover art
    into the store keyed by each file's real path, with no remount and no audio
    rewrite.
  • Performance, concurrency & caching pass: worker-pool offload of blocking
    reads, lock-free virtual-tree swap, per-handle I/O, a bounded LRU header-layout
    cache, debounced single-flighted refresh with stable inodes, kernel/mount
    tuning flags, bounded-memory MP4 resolves, and opt-in --keep-cache with
    auto-invalidation.

Notes

  • Read-only mount; tag edits happen out-of-band against the SQLite store and are
    picked up automatically (PRAGMA data_version polling). See the README "Tag
    handling" section for round-trip limitations.