reHydrate v1.0.1
Patch release on the v1.0 line. Bug fixes, hardening, and dependency
bumps that landed against main since v1.0.0. No on-disk format
changes; no user-facing behavioural changes outside the fixes below.
The macOS bundle is still Apple-Silicon-only, still unsigned, and
still requires the right-click → Open dance on first launch.
Fixed
- Sync (push side):
delete_document_treefailures now propagate
to the sync result so a failed folder delete stays queued and is
retried on the next push, rather than being silently swallowed
(#23). - Sync (pull side):
record_versionon an archived document is
rejected at the boundary, closing a race where a pull mid-archive
could resurrect a soft-deleted doc (#31). - Device layer:
put_document_treeis now a true replace —
stale tablet-side entries are removed when the library-side tree
shrinks, so a folder rename + child-removal in one push no longer
leaves orphan tablet entries (#22). - Device layer: SFTP entry names containing path separators or
parent references are rejected at the boundary instead of being
treated as leaf names (#33). - Core (blob store):
import_filefailures now unlink the
staged blob, so an interrupted import does not leak a partial
file under the blob fanout (#39). - Core (blob store): blob-fanout ancestor directories are
fsynced up to the blob root after a write, so a crash between
rename and parent-dir fsync cannot leave a blob that exists on
disk but is invisible after reboot (#30). - Core (library):
library.jsonis written atomically via a
tempfile + rename rather than truncated-in-place, so a crash mid-
write cannot leave a zero-byte stamp file (#32). - rm-parser: v3–v5 length-prefixed buffers cap their
preallocation, closing a parser-DoS where a hostile.rmfile
could request gigabyte allocations from a 32-bit length field
(#34). - rm-parser: unknown
SceneItemTypesubtypes are tolerated as
forward-compat skips rather than hard parse errors, so newer
tablet firmwares do not brick the import path (#35). - App (IPC):
open_libraryis allowlisted against the picker,
the recents list, and the default-library path, so a renderer
compromise cannot ask the host to open an attacker-controlled
directory as a library (#36). - App (import): dropped-file size is preflighted before the
bytes are read into memory, so a 5 GiB drag-and-drop is rejected
cheaply rather than after an OOM (#24). - UI: a
refreshLibraryrequest that arrives while another is
in flight is now queued (one pending slot) instead of being
dropped, so a sync-completion event during a manual refresh no
longer leaves the library view stale (#38). - UI: Tauri event listeners unbind cleanly when their owning
component unmounts before thelisten()promise resolves,
closing a leak where a long-running listener kept a reference to
a discarded component (#37). - UI: three v1.0.0 UX dead-ends are unblocked (move-to-folder
affordance, empty-state guidance, and one settings-tab focus bug)
(PR #16).
Changed
- CI: the supply-chain audit job (
cargo audit+cargo deny check) is now a hard gate onmain. A new advisory landing on a
transitive dep fails the build instead of producing a yellow warn
in the log (#19). The triage process is documented in
.cargo/audit.tomlanddeny.toml. - Tests: pull-side and push-side reconciliation now have
coverage at the sync layer (#17). No production-code changes;
these tests pin behaviour that was previously asserted only
end-to-end.
Dependencies
thiserror1.0.69 → 2.0.18 (#29)sha20.10.9 → 0.11.0 (#28)imageproc0.25.1 → 0.26.2 (#27)fs40.9.1 → 1.1.0 (#26)tokio1.52.2 → 1.52.3 (#15)rusqlite0.32.1 → 0.39.0 (#14)directories5.0.1 → 6.0.0 (#13)actions/checkout4 → 6 (#10)actions/setup-node4 → 6 (#9)actions/upload-artifact4 → 7 (#7)actions/attest-build-provenance2 → 4 (#8)tauri-apps/tauri-action0.5.20 → 0.6.2 (#6)
Release engineering
build.shnow removes stalerw.*.dmginterstitials from
bundle/macosbefore invoking the Tauri bundler, and asserts the
expected.dmgexists and passeshdiutil verifybefore
reporting success. Previously abundle_dmg.shfailure could
leave its temporary image inside the source folder, which then
caused the next bundle to try copying its own growing tempfile
into itself (#54).- The release workflow now runs the same gates as CI
(cargo fmt --check,clippy -D warnings, workspace tests,
cargo audit --deny warnings,cargo deny check, UI typecheck- lint + build) as a preflight job before the Tauri build, and
asserts that the tag version matchesCargo.toml,
tauri.conf.json,ui/package.json,ui/package-lock.json,
and a matchingCHANGELOG.mdsection. The release fails
loudly if any of those drift, instead of falling back to a
generic body (#55).
- lint + build) as a preflight job before the Tauri build, and
Download: macOS (Apple Silicon, 11.0+) — .dmg attached below.
macOS builds are unsigned and un-notarized. First launch needs
a right-click → Open to bypass Gatekeeper.
Verifying the download: shasum -a 256 reHydrate_*.dmg
and compare against SHA256SUMS (also attached). For tamper
evidence beyond the workflow log, see this run's
build provenance attestation.
Source: built from
538934be17f9ea34af7aa60e0a43589dd9fc84cb.
See SECURITY.md
for the threat model and the vulnerability-report channel.