Releases: DRNKNDev/valv
Releases · DRNKNDev/valv
Release list
v0.2.2
First release of Valv: valv (CLI) and valvd (sync daemon), the Valv macOS app, and the open-core sync engine behind them.
Sync
- server-authoritative op log: every change is an op the server orders, so two devices converge on the same tree instead of racing
- content-defined chunking with deduplication, so an edit to a large file uploads only the chunks that actually changed
- version history on every file, with
valv versions <path>to list stored versions andvalv restore <path> --version <id>to roll one back - conflicting edits become conflict copies beside the original rather than a silent overwrite
- moves and renames are tracked as moves, not as a delete plus a create
- deletes are tombstoned and propagate correctly to a device that was offline when they happened
- realtime push over a websocket, with a delta pull that resumes from a cursor
CLI (valv)
valv loginsigns a device in through the browser and writes its local configvalv mount <path>takes an explicit source:--folderto attach a folder you can already reach,--keyto redeem an access key, or--newto create a folder from that pathvalv statusreports this machine's principal, daemon health, and every mounted folder's sync statevalv syncis a barrier, not a nudge: it repeats a push+pull round trip and exits0only once a round leaves nothing pending, so scripts can wait on it instead of pollingvalv syncexits75(sync_timed_out) when it doesn't settle inside its 120s bound, and1(sync_mount_error) when a mount is persistently faulted while the backend is reachable; a backend outage is treated as connectivity and retried, not as a mount faultvalv pauseandvalv resumestop and restart background watching and sync for the device--jsonis honored by every command, with a stable output contract and named error codesvalv updateresolves, verifies, and installs the latest releasedvalv/valvd
Sharing & access keys
valv share <path> --to <email>invites a person, who accepts in a browser with their own accountvalv share <path> --key <name>issues a runnable access key, shown once, for a machine that has no Valv account- a headless machine redeems that key with
valv mount <path> --key <token>: no browser, no account, no device token on disk - access keys cannot re-delegate: a machine you hand a key to cannot share the folder onward
--read-onlygrants read access without write, and a read-only mount refuses local pushes instead of accumulating changes it can never send- grants are node-scoped, so a grant can cover a subtree rather than the whole folder, with nearest-ancestor-wins resolution
valv share <path>with no flags lists who has access and since when;valv revoke <path>takes--to,--key, or--id
Daemon (valvd)
- installs itself as a real service on first use: your first
valv loginorvalv mountsets up a systemd user unit on Linux, or a launchd agent on macOS, and starts it - runs without an account credential, so an access-key-only machine is a first-class deployment
GET /statusreports the running version, the machine's principal, backend connectivity, and per-mount sync state- surfaces a forbidden push as a real mount error rather than retrying it forever, and keeps its pending-op count honest
- checks for its own updates in the background
macOS app
- menu-bar app with a File Provider extension: mounted folders appear in Finder and materialize on demand
- Finder Sync extension for sharing a folder straight from Finder
- Manage Folders window showing each folder's real sharing list, and handing over a runnable access key for a headless machine
- in-app updates via Sparkle, over a signed appcast
Server & core (self-hosters)
- the sync backend is open core (
oss/core): schema, op submission, blob store, and realtime, runnable against SQLite or Postgres - S3-compatible blob storage with per-tenant chunk keys and signed uploads/downloads
- garbage collection of unreferenced chunks, runnable on a cron
- protocol version handshake with a server-side floor, so an out-of-date client is told to update rather than failing obscurely
- upload quota enforcement that fails closed
Install
curl -fsSL https://valvsync.com/install | bashinstallsvalvandvalvdto a user-writable directory onPATH, and prints the exact command to add it if it isn't there- every release ships a
SHA256SUMSmanifest, minisign-signed, and the install script verifies each downloaded asset against it - macOS binaries (
aarch64-apple-darwin) are Developer ID signed and notarized, so a tarball downloaded in a browser runs without a Gatekeeper prompt; Linux binaries (x86_64-unknown-linux-gnu) are checksum-only - downloading a tarball from this page and extracting it by hand is a supported path, independent of the install script
Testing
- a smoke suite that drives real
valvdprocesses against a real backend and blob store: two-device sync, conflict copies, offline deletes, moves and renames, version restore, grant scoping and revocation, large-file chunk reuse, and the headless access-key mount path against a genuine systemd unit and launchd agent