Skip to content

CLI and sync walkthrough (2026-09-24)

This is a record of one end-to-end run of the calternal CLI and the calternald sync daemon, done as a user does it. All output is real. The run used a debug build on a Linux VM (Debian 13, kernel 6.12, zone Europe/Berlin) and a local server on http://localhost:18431 with an empty data directory. A Playwright browser with a CDP virtual authenticator acted as the user’s browser: it registered the owner passkey, signed in, and clicked Approve on the CLI approval page. A second user, sam, was registered through an invite so that share has a recipient.

Redactions: one-time approval codes are shown as <code>. No bearer token or cookie appears in this document. Long JSON lists are cut where marked with ….

Bugs found in this run were fixed on the branch; see Fixed during the walkthrough. The output below is from the run after the fixes. Problems that were not fixed are in Papercuts.

Before a login, a command tells the user what to do:

Terminal window
$ calternal whoami
calternal: not logged in: run `calternal login <server-url>` or pass --server
[exit 1]

calternal login opens the approval page in the default browser (xdg-open). The browser posts the approval, the server redirects it to the CLI’s loopback port, and the CLI exchanges its PKCE verifier for an installation token.

Terminal window
$ calternal login http://localhost:18431
Approve the installation at http://localhost:18431/api/v1/auth/cli/approve?user_code=<code>
Confirm code: <code>
{
"logged_in": true,
"server": "http://localhost:18431"
}
[exit 0]

What the browser showed:

Approve calternal CLI
Signed in as Owner
Confirm that your terminal shows this code: <code>
[Approve this installation]
-> http://127.0.0.1:<port>/callback?approved=1
calternal login approved. You can close this page.
Terminal window
$ calternal whoami
{
"disabled": false,
"display_name": "Owner",
"id": "01a0d45a-fa73-75f6-a170-0d08d793443a",
"role": "owner",
"username": "owner"
}
[exit 0]
$ calternal --json whoami
{"disabled":false,"display_name":"Owner","id":"01a0d45a-fa73-75f6-a170-0d08d793443a","role":"owner","username":"owner"}
[exit 0]

--device does not open a browser and does not listen on a port. The user opens the URL on any signed-in device.

Terminal window
$ calternal login --device --name devbox http://localhost:18431
Approve the installation at http://localhost:18431/api/v1/auth/cli/approve?user_code=<code>
Confirm code: <code>

The URL in a browser that is not signed in (before the fix this was the raw JSON {"code":"unauthenticated","message":"Authentication required"}):

Sign in to approve calternal CLI
This browser is not signed in to calternal.
1. Sign in to calternal (opens in a new tab).
2. Come back to this tab and reload it.
Or open the approval link on a device that is already signed in.

The same URL in a signed-in browser, then the CLI result:

Approve calternal CLI
Signed in as Owner
Confirm that your terminal shows this code: <code>
[Approve this installation]
-> CLI installation approved. Return to your terminal.
Terminal window
[exit 0]
{
"logged_in": true,
"server": "http://localhost:18431"
}
Terminal window
$ calternal put hello.txt Files/hello.txt
{
"hash": "284e86c2a221a62b272319f5bedd048a9405a3906c388ec58b2b57e89efc312c",
"path": "Files/hello.txt",
"size": 16
}
[exit 0]
$ calternal put hello.txt Files/Docs/deep/hello.txt
{
"hash": "284e86c2a221a62b272319f5bedd048a9405a3906c388ec58b2b57e89efc312c",
"path": "Files/Docs/deep/hello.txt",
"size": 16
}
[exit 0]
$ calternal --json ls Files
{"breadcrumbs":["Files"],"entries":[{"content_hash":null,"has_thumbnail":false,"item_id":"667d2eee-6478-4b10-ac6f-27cc380669c8","kind":"directory","mime":null,"modified":"2026-09-24T16:59:06+00:00","name":"Docs","share_badges":[],"size":60},{"content_hash":"284e86c2a221a62b272319f5bedd048a9405a3906c388ec58b2b57e89efc312c","has_thumbnail":false,"item_id":"db457927-2366-476a-be02-874e744507d5","kind":"file","mime":"text/plain","modified":"2026-09-24T16:59:06+00:00","name":"hello.txt","share_badges":[],"size":16}],"next_cursor":null}
[exit 0]
$ calternal cat Files/hello.txt
hello calternal
[exit 0]
$ calternal --json cat Files/hello.txt
{"base64":"aGVsbG8gY2FsdGVybmFsCg==","path":"Files/hello.txt"}
[exit 0]

Files visibility is per User and follows the User across Installations. The listing flags show either kind for one command; preferences set the default used by the web app:

Terminal window
$ calternal ls Files --show-hidden --show-sidecars
$ calternal files preferences
$ calternal files preferences set-preferences --show-dot-files true --show-sidecar-files false

Overwrite, then download. get into a folder uses the remote name, like cp, and never replaces a local file:

Terminal window
$ calternal put hello.txt Files/hello.txt
{
"hash": "b6e1100c53b9c5f288785e81547e3bdaa60e6c2d25f2b854ad4c65bc6a31afb3",
"path": "Files/hello.txt",
"size": 12
}
[exit 0]
$ calternal get Files/hello.txt downloads
{
"hash": "b6e1100c53b9c5f288785e81547e3bdaa60e6c2d25f2b854ad4c65bc6a31afb3",
"local": "downloads/hello.txt",
"path": "Files/hello.txt"
}
[exit 0]
$ calternal get Files/hello.txt downloads
calternal: downloads/hello.txt already exists; calternal get never replaces a local file
[exit 1]
$ calternal versions Files/hello.txt
[
{
"content_hash": null,
"has_thumbnail": false,
"item_id": null,
"kind": "file",
"mime": "application/octet-stream",
"modified": "2026-09-24T16:59:06+00:00",
"name": "20260924T165907.025816848Z",
"share_badges": [],
"size": 16
}
]
[exit 0]

Move, rename and trash work for files and folders (folders failed before the fix):

Terminal window
$ calternal mv Files/hello.txt Files/greeting.txt
{
"from": "Files/hello.txt",
"to": "Files/greeting.txt"
}
[exit 0]
$ calternal mv Files/Docs/deep Files/Archive/deep
{
"from": "Files/Docs/deep",
"to": "Files/Archive/deep"
}
[exit 0]
$ calternal rm Files/greeting.txt
{
"trashed": "Files/greeting.txt"
}
[exit 0]
$ calternal rm Files/Docs
{
"trashed": "Files/Docs"
}
[exit 0]
$ calternal --json trash
[{"content_hash":null,"has_thumbnail":false,"item_id":null,"kind":"directory","mime":null,"modified":"2026-09-24T16:59:07+00:00","name":"Docs","share_badges":[],"size":40},{"content_hash":null,"has_thumbnail":false,"item_id":null,"kind":"file","mime":"text/plain","modified":"2026-09-24T16:59:07+00:00","name":"greeting.txt","share_badges":[],"size":12}]
[exit 0]
$ calternal restore Docs
{
"path": "Files/Docs"
}
[exit 0]
$ calternal ls Files/missing
calternal: server returned HTTP 404 Not Found: file not found
[exit 1]

Search. The full-text hits now link to the user’s own paths (before the fix the href was /files?path=users%2F<user-id>%2FFiles%2F…):

Terminal window
$ calternal search hello
{
"results": [
{
"href": "/files?path=Files/Archive/deep/hello.txt",
"id": "Files/Archive/deep/hello.txt",
"plugin_id": "files",
"score": null,
"snippet": null,
"title": "hello.txt"
},
{
"href": "/files?path=Files%2Fhello%2Etxt",
"id": "users/01a0d45a-fa73-75f6-a170-0d08d793443a/Files/hello.txt",
"plugin_id": "search",
"score": 25.521196,
"snippet": "<b>hello</b> again",
"title": "hello.txt"
},
{
"href": "/files?path=Files%2FDocs%2Fdeep%2Fhello%2Etxt",
"id": "users/01a0d45a-fa73-75f6-a170-0d08d793443a/Files/Docs/deep/hello.txt",
"plugin_id": "search",
"score": 25.416721,
"snippet": "<b>hello</b> calternal",
"title": "hello.txt"
}
],
"timed_out": false
}
[exit 0]

Share with sam (the recipient is a user ID; see Papercuts):

Terminal window
$ calternal share Files/Archive 01a0d45b-1738-7530-a54c-995d13a63504 viewer
{
"access": "viewer",
"direction": "outgoing",
"id": "b963f3a9-b1dd-40d4-96f6-5dc7ecf85d42",
"owner_id": "01a0d45a-fa73-75f6-a170-0d08d793443a",
"path": "Files/Archive",
"recipient_id": "01a0d45b-1738-7530-a54c-995d13a63504"
}
[exit 0]
$ calternal share Files/Archive 01a0d45b-1738-7530-a54c-995d13a63504 owner
calternal: server returned HTTP 400 Bad Request: invalid path or request
[exit 1]

today and new notes use the local zone now (18:59 CEST; before the fix the CLI got UTC and the wrong Daily note between local midnight and 02:00):

Terminal window
$ calternal today
{
"body": "\n# 2026-09-24 Daily Note\n\n## 📝 Log\n\n",
"etag": "\"9faf5bee010f711190dc116b71c27dbcd0e64a5c2b391c01bdf3200b17bda366\"",
"id": "path:Notes/Journal/20260924-dailynote.md",
"path": "Notes/Journal/20260924-dailynote.md",
"properties": {
"date": "2026-09-24 18:59:08",
"last edited": "2026-09-24 18:59:08",
"next": "'[2026-09-25-daily-note](<Notes/Journal/20260925-dailynote.md>)'",
"previous": "'[2026-09-23-daily-note](<Notes/Journal/20260923-dailynote.md>)'",
"tags": [
"journal/daily-note"
],
"title": "2026-09-24 Daily Note"
},
"title": "2026-09-24 Daily Note"
}
[exit 0]
$ calternal note new "Sync design review" --body "First paragraph."
{
"body": "\n# Sync design review\n\nFirst paragraph.\n",
"etag": "\"ea53667d1d1826940290697f5d3d1faa6da99493f0c0e12fce28578bb33dfc45\"",
"id": "064c45e2-2a6e-46b5-b78b-2948de9bc8f5",
"path": "Notes/20260924-sync-design-review-064c45e2.md",
"properties": {
"calternal-id": "064c45e2-2a6e-46b5-b78b-2948de9bc8f5",
"date": "2026-09-24 18:59:08",
"last edited": "2026-09-24 18:59:08",
"slug": "sync-design-review",
"tags": [],
"title": "Sync design review"
},
"title": "Sync design review"
}
[exit 0]

note append adds a new paragraph (before the fix it glued the text onto the last line):

Terminal window
$ calternal note append f8c3ab9b-67cc-4e84-88e6-e6c34c99151e "Appended from the CLI."
{
"body": "\n# Scratch\n\nAppended from the CLI.\n",
…
}
[exit 0]
$ calternal --json note open f8c3ab9b-67cc-4e84-88e6-e6c34c99151e
{"body":"\n# Scratch\n\nAppended from the CLI.\n","etag":"\"46eec2921b58ed0915c7852fd3dd699df7af85c7523df8ee8df9443e7a669789\"","id":"f8c3ab9b-67cc-4e84-88e6-e6c34c99151e","path":"Notes/20260924-scratch-f8c3ab9b.md",…}
[exit 0]

log uses the composer parser. The owner’s regression line keeps its connecting words and its time range. gym 7-8pm logged 07:00 - 20:00 before the fix:

Terminal window
$ calternal log 'on and off working on calternal.js 22:00 - 23:00 #dev'
{
"end": "23:00",
"path": "Notes/Journal/20260924-dailynote.md",
"start": "22:00",
"tags": [
"area/dev"
],
"title": "on and off working on calternal.js"
}
[exit 0]
$ calternal --json log 'Coffee with Sam #social'
{"end":null,"path":"Notes/Journal/20260924-dailynote.md","start":"18:59","tags":["area/social"],"title":"Coffee with Sam"}
[exit 0]
$ calternal log 'gym 7-8pm'
{
"end": "20:00",
"path": "Notes/Journal/20260924-dailynote.md",
"start": "19:00",
"tags": [],
"title": "gym"
}
[exit 0]
$ calternal log 'Review from 09:30 to 10:00 #work'
{
"end": "10:00",
"path": "Notes/Journal/20260924-dailynote.md",
"start": "09:30",
"tags": [
"area/work"
],
"title": "Review"
}
[exit 0]
$ calternal log ''
calternal: server returned HTTP 400 Bad Request: log text must be one nonempty line
[exit 1]

The Daily note body after these commands:

# 2026-09-24 Daily Note
## 📝 Log
- 22:00 - 23:00 on and off working on calternal.js #area/dev
- 18:59 Coffee with Sam #area/social
- 19:00 - 20:00 gym
- 09:30 - 10:00 Review #area/work

Two pairs: ~/calternal-e2e/Full syncs all of Files; ~/calternal-e2e/Selective syncs only Projects/alpha (the server also has Projects/beta).

Terminal window
$ calternal sync add http://localhost:18431 ~/calternal-e2e/Full Files
{
"pair_id": "285973bd-6d77-4888-9121-33932f50a64e"
}
[exit 0]
$ calternal sync add http://localhost:18431 ~/calternal-e2e/Selective Projects --include alpha
{
"pair_id": "e0aea9f1-19f9-4d25-9a73-53ff36dcf08c"
}
[exit 0]
$ calternal sync status
{
"pairs": [
{
"guarded": false,
"id": "285973bd-6d77-4888-9121-33932f50a64e",
"include": [],
"local_folder": "/home/kayg/calternal-e2e/Full",
"paused": false,
"remote_folder": "Files",
"server_url": "http://localhost:18431"
},
{
"guarded": false,
"id": "e0aea9f1-19f9-4d25-9a73-53ff36dcf08c",
"include": [
"alpha"
],
"local_folder": "/home/kayg/calternal-e2e/Selective",
"paused": false,
"remote_folder": "Projects",
"server_url": "http://localhost:18431"
}
],
"service_active": false
}
[exit 0]

calternald started with no arguments. The first pass downloaded both trees (only alpha for the selective pair):

Terminal window
$ find ~/calternal-e2e -type f
calternal-e2e/Full/Archive/deep/hello.txt
calternal-e2e/Selective/alpha/plan.md

Then a script made real edits: local edits with ordinary file writes and renames, web edits with the Files API calls the web app makes (tus upload, rename, move, trash) under the browser session. Each line shows the time from the edit until the other side showed it.

# local edit -> server
ok: server has the local edit (0.50 s)
# web edit -> local
ok: local file has the web edit (0.37 s)
# local rename -> server
ok: server shows the rename (0.43 s)
# web rename -> local
ok: local shows the rename (0.30 s)
# local move into a new folder -> server
ok: server shows the move (0.25 s)
# web move -> local
ok: local shows the move (0.10 s)
server: ['Files/Archive/deep/hello.txt', 'Files/Archive/renamed-on-web.txt', 'Files/Moved/renamed-locally.txt']
local: ['Archive/deep/hello.txt', 'Archive/renamed-on-web.txt', 'Moved/renamed-locally.txt']
# local delete -> server trash
ok: server file is gone (0.31 s)
server trash has renamed-locally.txt: True
# web delete -> local freedesktop Trash
ok: local file is gone (0.26 s)
new in ~/.local/share/Trash/files: ['renamed-on-web.txt (calternal 0064425e-7f9e-4596-8d2e-a2c126112e30)']
[Trash Info]
Path=%2Fhome%2Fkayg%2Fcalternal%2De2e%2FFull%2FArchive%2Frenamed%2Don%2Dweb%2Etxt
DeletionDate=2026-09-24T18:59:19

Before the fix, the local delete above did not reach the server: deleting one of three files tripped the mass deletion guard (more than 30 %), which paused the pair and printed only sync pair stopped: mass deletion guard paused this sync pair to the daemon’s stderr.

Conflicting edits: the pair was paused, shared.txt was edited on both sides, and the pair was resumed. The local side became the conflict copy, named per DESIGN §24 with the device’s host name and local time:

# conflicting edits on both sides while paused
ok: base uploaded (0.57 s)
$ calternal sync pause 285973bd-6d77-4888-9121-33932f50a64e
{"paused": "285973bd-6d77-4888-9121-33932f50a64e"}
$ calternal sync resume 285973bd-6d77-4888-9121-33932f50a64e
{"resumed": "285973bd-6d77-4888-9121-33932f50a64e"}
ok: conflict copy appears locally (0.27 s)
ok: local shared.txt holds the web side (0.48 s)
ok: conflict copy uploaded (0.06 s)
local 'shared (conflict, calternal-dev, 2026-09-24 18.59).txt': 'local side\n'
local 'shared.txt': 'web side\n'
server: ['Files/shared (conflict, calternal-dev, 2026-09-24 18.59).txt', 'Files/shared.txt']

Before the fixes, the same copy was named shared (conflict, installation, 2026-09-24 16.33).txt: $HOSTNAME is not exported, and the time was UTC.

Terminal window
$ calternal sync conflicts
{
"conflicts": [
{
"created_at": 1790269162,
"original_path": "shared.txt",
"pair_id": "285973bd-6d77-4888-9121-33932f50a64e",
"path": "shared (conflict, calternal-dev, 2026-09-24 18.59).txt"
}
]
}
[exit 0]

Selective pair:

# selective pair: only Projects/alpha is synced
ok: alpha/new.md arrives (0.00 s)
local: ['alpha/new.md', 'alpha/plan.md']
ok: alpha/local.md uploaded (0.48 s)
server has Projects/gamma/outside.md: False

(Projects/beta/new.md was uploaded on the web at the same time and did not arrive. A local file in gamma/, outside the include list, stays local.)

Other checks in the exploratory run (same build):

  • An editor-style atomic save (write .doc.txt.swp, rename over doc.txt) reached the server as one edit of doc.txt.
  • Downloaded files get mode 0664 (umask 002). Before the fix they were 0600, and a remote edit removed a local executable bit.
  • A symlink in the pair (hostname-link -> /etc/hostname) is now skipped and the rest syncs. Before the fix every pass failed with local path cannot be represented in the remote API and the pair stopped syncing.
  • An idle daemon used about 5 % CPU before the fix (its own file reads woke the watcher, so it rescanned in a loop). After the fix: 0.9 ms CPU in 10 s idle.
Terminal window
$ calternal sync install
Created symlink '/home/kayg/.config/systemd/user/default.target.wants/calternald.service' → '/home/kayg/.config/systemd/user/calternald.service'.
{
"installed": "/home/kayg/.config/systemd/user/calternald.service"
}
[exit 0]
$ systemctl --user --no-pager status calternald.service
● calternald.service - calternal file synchronization
Loaded: loaded (/home/kayg/.config/systemd/user/calternald.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-09-24 18:59:29 CEST; 47ms ago
Main PID: 539706 ((lternald))
…
[exit 0]
$ calternal sync status
{
"pairs": [ … both pairs as above … ],
"service_active": true
}
[exit 0]

A new local file reached the server 0.57 s after the unit started. With the unit running, sync pause, resume, add and remove restart it, so the change takes effect at once.

A symlink next to a file, then a logout and a new login while the unit runs:

beside-link.txt on the server: True (0.40 s)
hostname-link on the server: False
Terminal window
$ calternal logout
{
"logged_out": "http://localhost:18431"
}
[exit 0]
$ calternal login http://localhost:18431
Approve the installation at http://localhost:18431/api/v1/auth/cli/approve?user_code=<code>
Confirm code: <code>
{
"logged_in": true,
"server": "http://localhost:18431"
}
[exit 0]
while-logged-out.txt on the server after login: True (3.9 s)

Before the fix the unit kept the revoked token and logged HTTP 401 every two seconds until someone restarted it. Now the journal shows:

sync pair restarting in 10 s: server returned HTTP 401
Terminal window
$ calternal sync remove e0aea9f1-19f9-4d25-9a73-53ff36dcf08c
{
"removed": "e0aea9f1-19f9-4d25-9a73-53ff36dcf08c"
}
[exit 0]
$ calternal logout
{
"logged_out": "http://localhost:18431"
}
[exit 0]
$ calternal whoami
calternal: installation credential unavailable
[exit 3]

Small file (about 30 bytes), 20 samples per direction, systemd unit, debug build, server and client on one VM over loopback.

  • local → server: the clock starts when the local write() returns and stops when a download from the server returns the new bytes.
  • server → local: the clock starts when the web upload (tus PATCH) returns and stops when the local file holds the new bytes.
Direction p50 p95 min max
local → server 435 ms 562 ms 300 ms 911 ms
server → local 242 ms 403 ms 122 ms 436 ms

Both directions meet the DESIGN §24 target (small files p95 < 1 s). Before the rescan-loop fix, server → local was p50 275 ms and p95 963 ms (max 1297 ms). Notes on the remaining time:

  • Local → server includes a 150 ms debounce, a full local scan (hash every file), a full remote tree listing, the tus create and patch, and two stats.
  • The tail follows fsync on this VM: p50 9 ms, max 257 ms. One download does about eight fsync calls (temp file, Trash info, directories).
  • These numbers are from a debug build. A release build will be faster.

Each fix has a regression test.

Commit Fix
cli: remember the logged-in server … After login, every other command failed with --server is required without a sync pair.
cli: mv and rm work on folders mv and rm of a folder failed with invalid server URL or response.
cli: send the local time zone … today used UTC: wrong Daily note from local midnight to the UTC date change; note times in UTC.
cli: note append adds a new paragraph … note append glued text onto the last line.
notes-core: a bare range start takes the end's pm log 'gym 7-8pm' logged 07:00 - 20:00.
cli: show the server's reason …, cli: read the reason from the server's nested error envelope Errors said only HTTP 400 Bad Request.
cli: get into a folder saves under the remote name get <file> <folder> failed; get onto an existing file gave a misleading error.
sync: name the device from the kernel host name Every device was installation in conflict names; every login was calternal-cli.
sync: downloaded files get the normal file mode, not 0600 Synced files were 0600; remote edits dropped the executable bit.
sync: one ordinary delete no longer trips the mass deletion guard Deleting 1 of 3 files paused the pair.
sync: stamp conflict copies with local time Conflict copies carried the UTC time.
sync: skip symlinks instead of stopping the whole pair One symlink stopped all sync of the pair.
auth: CLI approval page tells a signed-out browser how to continue A signed-out browser got raw JSON 401 on the approval page.
search: full-text hits link to home-relative paths Full-text hits linked to users/<id>/…, which does not exist in the client.
sync: file reads no longer wake the daemon into a rescan loop Idle daemon rescanned forever (about 5 % CPU); slower sync under load.
sync: a new login resumes sync without restarting calternald After logout and login the daemon kept the revoked token; any pair error stopped that pair until restart.

These were seen in the run and are not fixed. None of them loses data.

CLI output and help:

  1. Output without --json is pretty-printed JSON for every command. There is no human form (a table for ls, trash, versions, search, sync status).
  2. calternal --help has no text for any command or argument. share does not say that access is viewer or editor; a wrong value gives invalid path or request.
  3. ls shows .calternal. trash does not show the original path or the deletion time. versions shows timestamps with content_hash: null, and the CLI cannot download or restore a version.
  4. whoami after logout says installation credential unavailable, not “not logged in”. rm of a missing path says server returned HTTP 404 without the path.
  5. mount <dir> (DESIGN §18) does not exist yet.

Accounts and shares:

  1. share needs the recipient’s user ID. No API or command lists users or resolves a username. The server also accepts a well-formed ID of a user that does not exist and creates a share for nobody.
  2. A second login to the same server replaces the local token but does not revoke the old installation session on the server.
  3. The CLI approval page is plain, unstyled HTML (not the calternal design system).

Notes and log:

  1. properties.previous and properties.next of a Daily note keep their YAML quotes: "'[2026-09-23-daily-note](<…>)'".
  2. log writes #dev as #area/dev (the calternal.js event-tag rule; it is intended, but the user typed #dev). Log entries are appended in the order they were logged, not sorted by time.
  3. note open and note append need the note ID; there is no lookup by title or path.

Search:

  1. The same file is listed twice: once by the Files name match and once by the full-text index. The full-text hit id is still the data-directory path.

Sync:

  1. sync status shows no last sync time, pending work or error. A foreground calternald prints nothing while it works. A guarded pair shows only "guarded": true.
  2. sync add needs the server URL although the CLI is logged in. pause, resume and remove need the full pair UUID.
  3. With a foreground calternald, sync resume does not reach the running process (only the systemd unit is restarted). pause works, because the loop reads the config each pass.
  4. Every remote edit moves the previous local copy to the desktop Trash. The latency run (20 remote edits of one file) left 20 Trash items, while the server already keeps versions.
  5. Empty folders are not synced. After a local rm -r Folder, the files go to the server trash but Files/Folder/sub/ stays on the server.
  6. Editor temporary files (.swp, ~, .#…) are synced; there is no ignore list.
  7. A file created in a selective pair outside the include list stays local with no message.
  8. During a conflict, the original local file is missing for a moment: the engine renames it to the conflict copy, uploads that copy, and only then downloads the winner.
  9. Each pass lists the whole remote tree and hashes every local file; the change feed only supplies the cursor. The change wake-up stream wakes on any user’s change, so each daemon on the instance runs a full pass for every change by anyone. This does not scale to large trees or many users.
  10. After each download, the daemon’s own writes wake the watcher and cause one more (empty) pass.
  11. sync conflicts shows created_at as Unix seconds.