github borgbase/vykar v0.21.1

3 hours ago

A feature release centred on hooks and network reliability: a before hook can now skip a run quietly with exit 75, REST and S3 verify certificates against the OS trust store, and stalled connections no longer hang the daemon. The Linux GUI also drops its GTK dependency.

This is the first published release since v0.20.1. The v0.21.0 tag exists, but Windows signing failed during its release, so it has no GitHub Release. Its Docker images (0.21.0) contain the same code as this release. These notes cover everything since v0.20.1.

Behaviour changes to check before updating

  • Linux hosts with no CA bundle now fail over HTTPS, including to public endpoints, with No CA certificates were loaded from the system. This affects REST and S3 repositories on minimal containers and similar systems. Install ca-certificates, or point SSL_CERT_FILE or SSL_CERT_DIR at your certificates. There is deliberately no fallback to the previously bundled Mozilla roots. The official Docker images already include ca-certificates.

  • macOS and Windows now use OS certificate verification, including any revocation checks it performs.

  • A before hook that already exits 75 now skips the run instead of failing it.

  • A skipped run exits 0. vykar backup && ping therefore reports success even though no snapshot was created. For monitoring, ping from an after_backup hook, which does not run on a skip.

  • In GUI cycles, before hooks now run before the passphrase dialog, and a failure to open the repository now fires failed and finally hooks.

  • compact on append-only servers now leaves the repository larger. The repack succeeds and the deletion of the source packs fails, so the repository stays consistent but does not shrink.

Skipping a run from a hook

Setups like "only back up on home Wi-Fi" gate runs with a failing before hook, so every gated run was reported as an error. A before hook at the global, repository or source level can now exit 75 to skip the command: (#64)

hooks:
  before_backup: nmcli -t -f active,ssid dev wifi | grep -q '^yes:HomeNetwork$' || exit 75
  • The command and its after and failed hooks do not run. finally hooks still do, and the CLI exits 0.
  • Skipping backup in a cycle also skips prune, compact and check, so nothing connects to the repository.
  • One skipped source lets the others continue. If every selected source skips, it counts as a repository-level skip.
  • The daemon reports a new skipped outcome only when every attempted repository skipped.

Known limitation: the daemon's status paths still contact unreachable repositories (#206). See Skipping a run for the full behaviour.

Storage and TLS

  • REST and S3 use the OS trust store, so repositories behind a private CA now work when the OS already trusts that CA. (#202)

  • REST and S3 requests can no longer wait forever. A pooled connection to a silently vanished peer blocked indefinitely and hung the daemon. Both clients now set resolve, send-request and receive-response timeouts, with longer waits for admin actions (11 minutes) and repack (60 minutes). Repack is no longer retried, so a timeout surfaces instead of stalling the cycle. (#204)

  • S3 listings can no longer come back silently short. Listing completion now follows IsTruncated, and a truncated page without a continuation token is an error. Only an object with a known size of zero counts as a soft-delete tombstone.

  • SFTP: russh 0.65.1 brings client-side security fixes for unbounded EXT_INFO allocation, a zero max-packet-size stall and kex_done ordering. The lockfile refresh also picks up advisory fixes in rustls, rustls-webpki, tokio, zstd and others.

Compact

  • The client now deletes repacked source packs. The server used to delete them during repack, so a lost or timed-out response could leave the index pointing at deleted packs. Each batch's index updates are now persisted first, so the same failure leaves only unreferenced new packs. (#204)

Server

  • PUT is cancellation-safe. A client disconnecting mid-upload left packs/<xx>/.tmp.* behind permanently, so compact warned on every run and ?verify-structure reported each file as two errors. Temp files are now removed on cancellation, error and panic.

  • Old temp-file debris is swept. The quota walk removes temp files older than 24 hours, at startup, after each backup and hourly. ?verify-structure counts them in a new temp_files field instead of reporting them as malformed packs.

GUI

  • The passphrase prompt now appears inside the main window. As a separate window it could open underneath the main window on Linux. A prompt raised while the app is in the tray now opens the main window, and hiding to tray during a prompt cancels it. (#193)

  • The Linux GUI no longer needs GTK, AppIndicator or libxdo. The tray moved to Slint's built-in SystemTrayIcon, with Slint updated to 1.18.1. The bare vykar-gui binary now needs fontconfig, FreeType and xkbcommon at runtime. The tray needs a StatusNotifierItem host: KDE Plasma, Xfce and most other desktops include one, and GNOME needs the AppIndicator extension. Without a tray, close-to-tray now quits.

  • Init is no longer offered for unavailable local repositories. A repository on an unplugged drive or unmounted share triggered the init dialog on startup and after every backup, and answering "Yes" could create it on the root disk under an empty mount point. A missing parent directory now shows "Not available", and a non-empty folder without a config shows an error.

  • Browse, restore and mount find the repository faster. The lookup now fetches snapshot metadata instead of decoding the full item stream and discarding it.

Other fixes

  • diff no longer downloads the index twice when the restore cache is missing or stale.
  • find no longer swallows an interrupt on the cache path.
  • delete now names the snapshot when deleting its blob fails, as prune already did.

Internal

  • Hook lifecycle, delete/prune removal and restore-cache fallback each moved to one shared implementation.
  • Clippy 1.99 lints are fixed, and agent configuration is consolidated on AGENTS.md.
  • Windows signing was repaired: the job is pinned to ubuntu-24.04, and the login automation matches SimplySign's current sign-in page.

Updating

To update to the latest version, run:

curl -fsSL https://vykar.borgbase.com/install.sh | sh

See the quickstart guide for other install options.

Downloads

Platform Artifact
Linux x86_64 (gnu) vykar-v0.21.1-x86_64-unknown-linux-gnu.tar.gz
Linux x86_64 (musl) vykar-v0.21.1-x86_64-unknown-linux-musl.tar.gz
Linux aarch64 (gnu) vykar-v0.21.1-aarch64-unknown-linux-gnu.tar.gz
Linux aarch64 (musl) vykar-v0.21.1-aarch64-unknown-linux-musl.tar.gz
macOS aarch64 vykar-v0.21.1-aarch64-apple-darwin.tar.gz
Windows x86_64 vykar-v0.21.1-x86_64-pc-windows-msvc.zip
GUI (AppImage) vykar-gui-v0.21.1-x86_64.AppImage

SHA256 digests are shown next to each asset on this release page.

Don't miss a new vykar release

NewReleases is sending notifications on new releases.