yafm v0.9.0 — 1.0 candidate
Stability + the last extension points. Mostly about making yafm actually live up to its one promise — it never freezes — after real use turned up big folders and drag-and-drop that did exactly that.
Fixed — the never-freeze pillar, for real
- Big folders no longer freeze on open. Listing re-sorted the entire growing partial on every stream batch (O(n²) sort on the main thread). Now it sorts once when complete: measured 1767 ms → 68 ms (26×) for 8 000 files.
- Tag dots no longer cost a syscall per row — they come from the in-memory index in one batch (Downloads opened by reading getxattr for every file before).
- No more beachball on large folders / re-sort — the tag editor was a
.popoveron every row; now one sheet for the table. - Drag between panes is smooth — the drop highlight no longer re-renders the whole list on every hover.
- Delete confirmation keeps focus — Return now confirms instead of opening the file behind the dialog.
Added
- Transformers (bulk-rename rules: lowercase, numbering, space-replace) and custom previewers — the last VISION extension points.
- Plugin API frozen at 1.0 — a 1.x compatibility promise.
- OPS-1 atomic replace — a
.replacecopy now swaps via a temp +replaceItemAt(the original survives a failed copy) and opens outputO_EXCL|O_NOFOLLOW.
Docs
- User Guide now in English and Russian.
Deferred
- Photo Ingest (needs device detection) and a notarized DMG (Developer ID).
DMG is unnotarized — first launch: right-click ▸ Open ▸ Open Anyway. Tests: 80 Core.