Choose a type, then give it a name.
Maintenance utilities scoped to your own tree. Sync conflicts
merge per-field where shapes are known; dangling refs flags
node:<uuid> links whose target is gone.
fh-sync leaves .conflict files when two devices
edit the same structured file. The resolver re-combines fields
that the shape says are safely combinable
(merge semantics).
Dry-run previews without writing.
The winner is the live file kept by fh-sync (newer mtime).
The loser is the .conflict sibling. Per-shape rules:
| File | Rule |
|---|---|
.node.yaml |
Scalars: winner wins. tags: array union. Unknown fields preserved from whichever side has them. |
.installed.json, .applet-keys.json, .applet-state/**/*.json |
Deep object merge; arrays and primitives: winner wins. |
.auto-update-log.json |
Not merged. Append-only log; interleaving cycles would be incoherent. |
| Any other file | Surfaced in the scan but never auto-merged. |
Not a CRDT. Two concurrent edits to the same scalar still lose one side. The goal is to stop losing fields that can be combined.
On resolve, the merged value is written atomically and the conflict file is renamed to .merged so it's preserved but no longer scanned.
Scans your tree for node:<uuid> references in
text files whose target no longer exists.
node:<uuid>
Rewrites markdown link targets like [text](projects/foo)
to [text](node:<uuid>) so renames won't break the
link. Anchors, external URLs, and canonical refs are left alone.
Dry-run first.
Per-app passwords let your bookmark sync extension, calendar client, and similar tools sign in without your main account password. Issued once, shown once, scoped to DAV protocols.
Files that arrived under a name already in use, but with different content.
FractalHoard keeps both so you can pick which one to keep. Files with the
conflict-… suffix in their name are the new arrivals.
Pick which screen edges the persistent applet dock can use. Docked applets appear on the first enabled edge; you can enable more so multiple applets can dock side-by-side.