Releases: borgbase/vykar
v0.17.0
⚠️ Breaking Changes — Coordinated Upgrade Required
This release stamps snapshots with format version 1 to support non-UTF8 path fidelity. Compatibility is backward-readable but not forward-compatible:
- New 0.17.0 binaries read all existing repositories and older snapshots.
- Older binaries cannot read snapshots written by 0.17.0 — they fail cleanly with a decode error, not silent corruption.
If multiple machines share a repository, upgrade them all at the same time. An older binary restoring a snapshot written by 0.17.0 is the direction that is not supported. Existing repositories and old snapshots remain fully readable by this release.
Features
- Hard links: regular files with multiple links are now preserved across backup and restore. Each member records its source
(dev, ino); restore regroups members and relinks them, with the relink path hardened against malformed-snapshot attacks (authoritative chunk-id fingerprint, parent-containment checks, O_EXCL creation). - Non-UTF8 paths: filenames and symlink targets that are not valid UTF-8 are now preserved byte-faithfully through backup and restore on Unix. Snapshots additively gain a
format_versiondiscriminator (see Breaking Changes). - Restore metadata: restore now applies uid/gid (when run as root), directory mtimes, and symlink mtimes, with a uniform
chown → xattrs → chmod → mtimeordering so restored caps/setuid and read-only modes survive. - S3 multipart upload: packs larger than 16 MiB upload via the S3 multipart API, so a connection reset mid-transfer costs one 16 MiB part instead of restarting the whole pack. Each part is retried independently. We recommend an
AbortIncompleteMultipartUploadlifecycle rule (#154). - Special files: FIFOs, sockets, and device nodes that vykar cannot represent now emit a per-entry warning instead of being dropped silently. Warn-only — the backup still succeeds.
- GUI: notifies you with a clickable "(update)" link when a newer release is available.
Bug Fixes
- Restore durability: restored files are now fsynced (data + inode) before rename, and the destination directory is fsynced after — closing a window where a crash could leave correct-sized files with unflushed contents.
- Restore retry: a killed restore no longer leaves a temp dir that blocks the next attempt; reserved temp dirs are swept safely on the following run.
Documentation
- Corrected crash-orphan reclamation guidance (
vykar check --repair) in the architecture and maintenance docs, with a regression test.
Updating
To update to the latest version, run:
curl -fsSL https://vykar.borgbase.com/install.sh | shSee the quickstart guide for other install options.
Downloads
| Platform | Artifact |
|---|---|
| Linux x86_64 (gnu) | vykar-v0.17.0-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (musl) | vykar-v0.17.0-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (gnu) | vykar-v0.17.0-aarch64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl) | vykar-v0.17.0-aarch64-unknown-linux-musl.tar.gz |
| macOS aarch64 | vykar-v0.17.0-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.17.0-x86_64-pc-windows-msvc.zip |
| GUI (AppImage) | vykar-gui-v0.17.0-x86_64.AppImage |
SHA256 checksums are attached to this release.
v0.16.2
Bug Fixes
- Windows backup: skip locked files instead of aborting the whole backup when a file can't be opened (#147)
- List: show restore size and add an "Added" column reporting newly stored bytes per snapshot (#153)
Improvements
- S3: surface an actionable hint when a PUT fails due to a connection close, pointing at the likely cause (#151)
Updating
To update to the latest version, run:
curl -fsSL https://vykar.borgbase.com/install.sh | shSee the quickstart guide for other install options.
Downloads
| Platform | Artifact |
|---|---|
| Linux x86_64 (gnu) | vykar-v0.16.2-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (musl) | vykar-v0.16.2-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (gnu) | vykar-v0.16.2-aarch64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl) | vykar-v0.16.2-aarch64-unknown-linux-musl.tar.gz |
| macOS aarch64 | vykar-v0.16.2-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.16.2-x86_64-pc-windows-msvc.zip |
| GUI (AppImage) | vykar-gui-v0.16.2-x86_64.AppImage |
SHA256 checksums are attached to this release.
v0.16.1
Bug Fixes
- Prune now groups by source label regardless of local config. Previously, running
prunefrom a repo without a configuredsources:block (e.g. on a central server backing up clients) pooled every snapshot into a single bucket and ignored source labels, producing wrong retention. Labels are intrinsic to each snapshot, so grouping is now consistent with how snapshots were created. (#138) - SFTP pool-acquire waits no longer masquerade as transport retries. On connection-capped servers (e.g. Hetzner Storage Box), concurrent uploads previously logged
connection error (attempt N/5)for pure pool contention and consumed the user-visible retry budget. Pool waits now log distinctly (waited Ns for connection pool slot), do not touch the retry budget, and don't trigger backoff. A wedged-pool fuse preserves liveness if a slot ever leaks. - Multi-path sources can now share the same basename. Snapshots prefix each source-path's contents by the full configured absolute path, so paths like
/etcand/var/lib/machines/base/etccan coexist in one source. Single-path single-source files keep the legacy basename layout. (#143) - Windows path normalization fixed. A
str::replaceregression in the duplicate-basename fix broke compilation onx86_64-pc-windows-msvc. The Linux/macOS builds never compile that branch, so the issue surfaced only on Windows. - GUI link error on macOS fixed. Pinned
slintandslint-buildto~1.15to avoid duplicatemudaObjective-C class registration that broke macOS release linking.
Dependencies
- Security:
russhbumped to 0.60.3 andrussh-sftpto 2.1.2 for two upstream CVEs —GHSA-f5v4-2wr6-hqmg(keyboard-interactive OOM) andCVE-2026-46673(compression ZIP-bomb that bypassed max-packet checks). - Hygiene bumps:
rusty-s30.9.1,fastcdc4.0.1,nix0.31.3,tray-icon0.22.2,lru0.18. urequnified on v3 across the workspace, eliminating a duplicate v2 from the CLI dev-dep test pipeline.
Infrastructure
- All Node.js-based GitHub Actions bumped to current majors for Node.js 24 compatibility (the runner forces Node 24 by default starting 2026-06-02).
Downloads
| Platform | Asset |
|---|---|
| Linux x86_64 (glibc) | vykar-v0.16.1-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (musl) | vykar-v0.16.1-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (glibc) | vykar-v0.16.1-aarch64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl) | vykar-v0.16.1-aarch64-unknown-linux-musl.tar.gz |
| Linux x86_64 (GUI AppImage) | vykar-gui-v0.16.1-x86_64.AppImage |
| macOS aarch64 | vykar-v0.16.1-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.16.1-x86_64-pc-windows-msvc.zip |
v0.16.0
Bug fixes
- Backup performance on iCloud-heavy macOS trees: skip
getxattron dataless inodes. The walker was round-tripping tofileproviderdfor every cloud-managed file, serializing the pipeline; dataless xattrs are already supplied by the parent snapshot or skipped entirely. (#133) - GUI: surface previously-swallowed config-read and tmp-cleanup errors via the in-app log channel instead of
let _ =dropping them silently. - Linux quota syscalls: switch FFI pointer casts to
ptr::from_mutto satisfy Rust 1.95 clippy::pedantic on Linux-only code paths.
Reliability & code quality
- Crypto:
MasterKey::generatenow propagatesOsRngfailures instead of panicking — relevant for sandboxed/container environments where kernel entropy may be temporarily unavailable. - Storage: document that synchronous
StorageBackendmethods (notably SFTP) may block on a Tokio runtime internally and must not be invoked from inside an async context. - Workspace lints: tighten clippy policy across all crates — deny
unwrap_used,panic,panic_in_result_fn,cast_precision_loss,unsafe_code(per-module opt-in with SAFETY comments), enable pedantic with a focused allowlist. ~94 files adapted; lossyas-casts replaced with checked integer math. - Types: encapsulate
ChunkId/PackId/SnapshotIdnewtypes behindfrom_bytes()/as_bytes(); drop the unusedVykarError::Storagevariant. - CLI: split
main.rsintolib.rs+ helpers, introduce athiserror-basedCliError, grouprun_backuparguments intoBackupRunOpts. - Core: gate
BudgetGuardand dead helpers oncfg(test), drop avoidable clones in pending-index recovery, document blocking sleeps in session/lock helpers. - GUI: refactor UI state models; split megamodules into focused submodules.
Infrastructure
- CI now runs lint, test, and docs on pull requests, not just post-merge.
Downloads
| Platform | Asset |
|---|---|
| Linux x86_64 (glibc) | vykar-v0.16.0-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (musl, static) | vykar-v0.16.0-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (glibc) | vykar-v0.16.0-aarch64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl, static) | vykar-v0.16.0-aarch64-unknown-linux-musl.tar.gz |
| macOS Apple Silicon | vykar-v0.16.0-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.16.0-x86_64-pc-windows-msvc.zip |
| GUI (Linux AppImage) | vykar-gui-v0.16.0-x86_64.AppImage |
SHA256 checksums are attached as SHA256SUMS.
Full changelog: v0.15.0...v0.16.0
v0.15.0
Features
- Check: report snapshot items affected by missing packs, so you can see exactly what's lost (#122)
- Check: item-granular repair drops bad items but preserves the snapshot, instead of failing the whole snapshot (#123)
- Backup: handle macOS dataless (cloud-only) iCloud files cleanly
- GUI: snapshots table now defaults to newest-first (#126)
Bug Fixes
- Backup: skip Windows unsupported reparse points and cloud-file errors with a path-bearing warning instead of aborting (#127)
- GUI: open the config file in the system editor on Linux/Windows (#125)
- Check: honest existence-progress reporting and a TOCTOU hint when sizes mismatch
- Limits: renice all threads on Linux, not just the calling task
Infrastructure
- Windows signing: pin SimplySign Desktop 2.9.14, dismiss the version-check modal, surface keytool errors instead of silencing them, and capture CI screenshots
- Satisfy clippy 1.95 lints
Downloads
| Platform | Artifact |
|---|---|
| Linux x86_64 (glibc) | vykar-v0.15.0-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (musl) | vykar-v0.15.0-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (glibc) | vykar-v0.15.0-aarch64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl) | vykar-v0.15.0-aarch64-unknown-linux-musl.tar.gz |
| macOS aarch64 | vykar-v0.15.0-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.15.0-x86_64-pc-windows-msvc.zip |
| Linux GUI (AppImage) | vykar-gui-v0.15.0-x86_64.AppImage |
v0.14.1
Fixes a few issues that came up with recent GUI features and adds the first version of a web UI.
Features
-
Daemon web UI (
feat(daemon)):vykar daemonnow exposes an optional read-only HTTP status page mirroring the GUI overview — process info, schedule, per-repo stats, recent snapshots, last cycle outcome, and an expandable sources list. Auto-refreshes every 30s and re-renders after every backup cycle / SIGHUP. No actions, no auth, no JS.Run it with:
vykar daemon --http-listen 127.0.0.1:7575 # or via env var (matches the Docker recipe): VYKAR_HTTP_LISTEN=127.0.0.1:7575 vykar daemonEndpoints:
GET /(HTML),GET /healthz(plain text liveness probe),GET /api/status.json(JSON). Non-loopback binds are rejected at startup unless--http-allow-public(orVYKAR_HTTP_ALLOW_PUBLIC=1) is also set — front it with a reverse proxy if exposing publicly. -
Find files: slash patterns are now auto-routed to path globs, so
/etc/**does what you'd expect without an explicit flag. -
GUI: redesigned find-files results layout, snapshot table column reorder with a wider time column.
Bug Fixes
- GUI: don't highlight the repo row when a sub-item is selected.
- GUI: pack find-files result groups at the top of the scroll view instead of stretching to fill.
Downloads
| Platform | File |
|---|---|
| Linux x86_64 (musl) | vykar-v0.14.1-x86_64-unknown-linux-musl.tar.gz |
| Linux x86_64 (gnu) | vykar-v0.14.1-x86_64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl) | vykar-v0.14.1-aarch64-unknown-linux-musl.tar.gz |
| Linux aarch64 (gnu) | vykar-v0.14.1-aarch64-unknown-linux-gnu.tar.gz |
| macOS aarch64 | vykar-v0.14.1-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.14.1-x86_64-pc-windows-msvc.zip |
| Linux GUI (AppImage) | vykar-gui-v0.14.1-x86_64.AppImage |
SHA256 checksums are attached as *.sha256 siblings.
v0.14.0
Features
- GUI + CLI
diffcommand: compare regular files between two snapshots (added, removed, modified, with size deltas). - GUI – multi-row selection and batch delete on the Snapshots page.
- GUI – grouped find results by snapshot for easier scanning.
Reliability & Correctness
- Symlink validation on restore: validates symlink targets and warns on unsafe ones (absolute or escaping the restore root).
restore --verify: optional plaintext chunk hash check during restore for end-to-end integrity verification.- Harden stale lock crash recovery so a crashed maintenance run no longer blocks subsequent operations.
- Harden backup reads against TOCTOU races between stat and open.
- Bound non-segmented reads to
pre_meta.size + 1to detect files growing during backup. - Validate
Item::sizeinvariant during restore + check; surface metadata failures as errors instead of silently corrupting output. - Harden pack offset arithmetic against corrupted indexes.
- Enforce the durable commit boundary via the type system (
refactor(commit)). - Surface post-commit failures as warnings rather than aborting the snapshot.
- Surface
command_dumpfailures as typed errors instead ofexpect()panics.
Refactors
- Split
backup/pipeline.rsinto orchestrator + stage submodules. - Split
commands/restore.rsinto phase submodules; stream restore in bounded batches. - Drop redundant clones on backup/restore hot paths.
Bug Fixes
- GUI: write config files with owner-only permissions (0600).
- GUI: rephrase prune dialog to avoid tinyfd quote-rejection on Windows.
- core: format byte counts in daemon-visible summary logs.
- storage: drain PUT request body in s3_backend test mocks (test stability).
Infrastructure
- Stop stress test scripts on first failure.
- Gate the absolute-symlink warning test to Unix.
Downloads
| Platform | Artifact |
|---|---|
| Linux x86_64 (glibc) | vykar-v0.14.0-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (musl) | vykar-v0.14.0-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (glibc) | vykar-v0.14.0-aarch64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl) | vykar-v0.14.0-aarch64-unknown-linux-musl.tar.gz |
| Linux GUI (AppImage) | vykar-gui-v0.14.0-x86_64.AppImage |
| macOS aarch64 | vykar-v0.14.0-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.14.0-x86_64-pc-windows-msvc.zip |
v0.13.0
Features
- GUI: New sidebar-driven layout. Tabs and multi-window are gone; pages are now split into
ui/components/andui/pages/, repo selection persists by name (survives reordering/renaming), Overview shows the newest three snapshots, an in-window Cancel button mirrors the tray path, andPageis now a typed enum shared between Slint and Rust (4610137). - GUI: Browse snapshots via WebDAV. A new Mount button on Overview (whole repo) and Snapshots (single snapshot) binds
127.0.0.1:0, opens the default browser at the bound URL, and shows a footer banner with a clickable link and Stop button (2dac663).
Performance
- File cache: ~33% smaller on disk and in RAM. The save path is now zstd-compressed behind a new
FORMAT_VERSION_BYTE 0x10,csizeis no longer cached (rehydrated from the index at commit), and single-chunk entries are inlined via a custom serde codec that emits the same wire format asVec<CachedChunkRef>with zeroVecallocation on deserialize. Measures 63 B/entry on disk on a 10k-entry regression test (was ~95 B) (806d24b).
Bug Fixes
- Scheduler survives system sleep. Both GUI and daemon schedulers stored
next_runasInstant; on macOS and Linux monotonic clocks freeze during sleep, so a 2h interval effectively restarted from wake.next_runis nowSystemTime, and each wait is capped at 60s so the loop re-evaluates wall-clock state within a minute of wake. Fixes #110 (9276384). - Sessions reap stale markers at 45 min with an independent heartbeat. Long-running backups on one host could block maintenance on another for up to 72h. A dedicated
SessionGuardheartbeat thread replaces pipeline-driven refreshes,refresh_sessionis now non-resurrecting, andVykarError::ActiveSessionsnow carries host/pid/age plus a structuralNonefor malformed markers so maintenance fails closed. Fixes #107 (2c7a393). - File cache: drop hardcoded 256 MiB plausibility cap. A ~714 MiB cache on a host backing up
/srv/mail+/srv/nextcloud/datawas silently rejected every run, costing ~7 min of parent-reuse rebuild per backup. Cap removed; decode outcomes are now split intoLoaded/Rejected/Malformedso rejections and parse failures log distinctly (49a1ea3). - Retry: default backoff widened to ~70s.
max_retriesraised from 3 to 5 andretry_delay_msfrom 1000 to 1500, so cumulative backoff (base 47s, max 93s with jitter) can ride out a typical WiFi reconnect after laptop sleep. Healthy connections are unaffected (0a48b13).
Downloads
| Platform | Artifact |
|---|---|
| Linux x86_64 (glibc) | vykar-v0.13.0-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (musl) | vykar-v0.13.0-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (glibc) | vykar-v0.13.0-aarch64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl) | vykar-v0.13.0-aarch64-unknown-linux-musl.tar.gz |
| Linux GUI | vykar-gui-v0.13.0-x86_64.AppImage |
| macOS aarch64 | vykar-v0.13.0-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.13.0-x86_64-pc-windows-msvc.zip |
v0.12.15
Bug Fixes
- Restore file and symlink source paths via unified root policy (
8d9862b)
Infrastructure
- Eliminate
APPIMAGEenv race in GUI autostart tests (f3a1b0f)
Downloads
| Platform | Artifact |
|---|---|
| Linux x86_64 (glibc) | vykar-v0.12.15-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (musl) | vykar-v0.12.15-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (glibc) | vykar-v0.12.15-aarch64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl) | vykar-v0.12.15-aarch64-unknown-linux-musl.tar.gz |
| Linux GUI | vykar-gui-v0.12.15-x86_64.AppImage |
| macOS aarch64 | vykar-v0.12.15-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.12.15-x86_64-pc-windows-msvc.zip |
v0.12.14
Features
- GUI: New autostart and start-in-background settings (#82).
- GUI: Restore window tree view now shows source paths (#57).
- CLI:
--repo/--sourceoptions on the bare command; unavailable repos are skipped instead of aborting. - CLI: Delete multiple snapshots in a single command (#87).
- Backup: Verbose logging fixed for the bare
vykarcommand; excluded files are now logged (#73).
Bug Fixes
- Mount: Recover from a poisoned mutex in the WebDAV read path instead of deadlocking.
- GUI: Tray Open/Quit stays responsive during startup refresh.
- Deps: Bumped all dependencies; fixes the
aws-lc-sysbuild failure (#90).
Internal
- Consolidated filesystem walkers across platforms (#101).
- Unified entry materialization across the pipeline and sequential backup paths.
- Split
worker.rsmegaswitch (GUI) andrepo/mod.rsfacade into focused submodules. - Privatized core
chunkerandlimitsmodules; trimmed default features and narrowed hook error types. - Bundled oversized parameter lists into context structs across pipeline and GUI.
Infrastructure
- CI now runs the full test suite on Linux, macOS, and Windows (#102).
Downloads
| Platform | Artifact |
|---|---|
| Linux x86_64 (glibc) | vykar-v0.12.14-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (musl) | vykar-v0.12.14-x86_64-unknown-linux-musl.tar.gz |
| Linux aarch64 (glibc) | vykar-v0.12.14-aarch64-unknown-linux-gnu.tar.gz |
| Linux aarch64 (musl) | vykar-v0.12.14-aarch64-unknown-linux-musl.tar.gz |
| Linux GUI (AppImage) | vykar-gui-v0.12.14-x86_64.AppImage |
| macOS (Apple Silicon) | vykar-v0.12.14-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | vykar-v0.12.14-x86_64-pc-windows-msvc.zip |