File times are only as fine as the kernel clock tick. A manifest rewritten
right after a check with the same length (one page replaced by another)
looked unchanged, so the change was never picked up. Files up to 64 KiB
(manifest, open marker, small pages) now also carry a content hash.
Showed up as a flaky test_page_still_being_synced_is_tried_again in CI.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Storage location setting: the notebooks can be moved into a folder kept in
sync by Nextcloud, Google Drive, Syncthing etc. (subfolder `ink-notes`);
existing notebooks are copied there if it is still empty, the originals stay.
- Changes from other devices are taken over while everything local is saved:
changed pages are reloaded, new/removed/reordered pages and titles come in
through the manifest. A page file still being synced is retried later
instead of being set aside as damaged.
- Conflict copies made by sync clients become pages of their own.
- `.opened_by.json` marks the device that has a notebook open; opening a
notebook open elsewhere shows a warning.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>