0.1.87 (2026-10-22)
Features
- core: add a per-inode FIFO scheduler and a fixed fuse worker pool for FUSE requests (96807bf)
- core: add a setting to turn off streamed uploads and start streaming at 100 MB instead of 10 MB (2ae74c4)
- core: drain the per-inode scheduler before a planned restart hands the FUSE connection over (d677f78)
- core: keep the mount and open files alive across a daemon restart by handing the live FUSE connection to the next daemon (90ec216)
- core: make systemd the only restart keeper: drop the fd holder, hand over on SIGTERM, ping the watchdog, and fix the handoff review findings (ef0cd79)
- core: run FUSE requests on the fuse pool ordered per inode so one slow request no longer freezes the whole mount (dbe9b2b)
- core: stream a large new file only while the disk is low, and upload a long tail at close in chunk-sized pieces read one at a time (a4f3154)
- fuser: carry a reattach patch that runs a session on an already-initialised /dev/fuse connection (15841c5)
- gui: start the daemon as the ncrs.service user unit and wait out its restarts instead of showing Unmounted (6620382)
- packaging: run ncrs as a watched systemd user service that keeps the fd store across restarts only, and document restart survival (2dd375a)
Bug Fixes
- core: address the per-inode scheduler review: cut the sent chunk out in place, keep fuse workers warm, park uncached lookups, move a renamed folder's subtree, apply stream settings live (c834513)
- core: address the restart-survival and disk-reserve review: one streamed chunk per write, keep streaming once started, small copies where chunks can't be cut out, bound a stalled takeover, restore signals after a failed exec (1461071)
- core: find an older writer behind newer clean or failed handles, answer EIO for already-streamed bytes, probe hole punching at mount, and drop the unshipped snapshot compatibility (c9d48ac)
- core: keep a streamed file's first chunk local until close for muxer trailers, read a writer's whole-file staging before its first write instead of downloading again, and stage write() data outside the open-files lock (447b9f8)
- core: leave a reattached connection in the systemd fd store instead of storing it again, and never FDSTOREREMOVE a copy of the one taken (cbceaed)
- core: let MIME sniffs and queued streamed finishes read correctly, fail a failed writer's own reads, agree on the newest writer for size, and remember only unsupported hole punching (533f39f)
- core: punch sent chunks out of a staging file laid out at the file's own offsets instead of cutting or copying, give up a stalled takeover from the watchdog, and re-exec with execve directly (0f550aa)
- core: resolve a read's queued upload as the newest one for the path again, share the staged-size lookup, and rate-limit the streamed-away warning per file (534cf39)
- core: resolve a read's queued upload newest-first and stop at a delete, take rename's staged size before the cache lock, share one newest-writer rule, and throttle the hole-punch probe (3d67e65)
- core: route handoff threads through bg and point the lockfile at the vendored fuser (3c95403)
- core: send one streamed chunk per write as a sliding window so crossing the threshold no longer freezes the mount while 100 MB uploads (bc7c06a)
- core: stage in full where holes can't be punched, never serve or extend a failed handle, version the handle snapshot, and only exit on a takeover that is still stalled (5c99976)
- core: stop a read's queued-upload search at a delete unless a rename onto the path came after it, and take rename's staged size from the source inode (6232460)