Repository navigation
Releases: agirish/sync-cloud
Release list
v5.5 — Edit becomes a place to write Markdown
Edit gets a format bar, tables, and lists that carry on
- A format bar above the text. In a Markdown note, Source — and Split's Source half — now has a
bar of the Markup verbs, a capsule to each group: the Body menu, which names the style the
caret is in and shows each style as it looks; B, I and S; the lists; Code, Code Block
and Quote; and Link, Table and Divider. A button is lit when pressing it would take that
formatting off. Where there is room each button carries a word beside its icon; a narrower window
drops the words, then folds the groups one by one, and keeps Bold, Italic and Strikethrough to the
last. Right-click the bar for Icon and Text, Icon Only or Hide Format Bar. View ▸
Format Bar turns it back on, as does the same item on the text's own right-click menu. - Tables without typing pipes. Markup has a Table submenu, and the bar a Table button: Insert
Table, Make Table from Selection (tab- or comma-separated lines), add and delete rows and columns,
and Format Table, which lines the columns up. With the caret in a table, a Table capsule appears
on the bar. An edit keeps a table's style: one written lined up stays lined up, and one typed by
hand changes only in the row or column you touched, so a synced file shows a one-line change. - Lists carry on. Return at the end of a list item starts the next one — the same bullet, the
next number, or an empty box after a task — and one⌘Ztakes back the Return and the marker
together. Return on an empty item ends the list. Tab and ⇧Tab move an item in and out a level.
Text ▸ Continue Lists turns this off. Return and Tab follow the same rules in Preview, and ⇧Return
or ⌃Return writes a plain line break. - Bullets, Numbered, Tasks, the headings and Quote work on a blank line. On an empty line or in
an empty note they did nothing; they now start the item, with the caret after its marker, and a
numbered item carries on from the one above. Pressed again, the marker comes off. - Paste an address over words to link them. Pasting one
httporhttpsaddress over selected
words makes[words](address). Every other paste is unchanged. - Drop a picture into a note. An image dropped from Finder, or pasted, is copied into an
Imagesfolder beside the note as<note>-1.pngand so on, and linked on a line of its own. An
existing file is never replaced, and⌘Ztakes the link back but leaves the copy. JPEG, HEIC, GIF
and WebP pictures keep their format, and a drop or paste whose pictures total more than 25 MB is
refused before anything is copied. - Horizontal Rule is now Divider, in the Markup menu, the bar and the right-click menu.
- Each Markup verb is its own undo step. A verb used straight after typing was undone together
with the typing: type "foo", choose Bold, and one⌘Ztook both back. Now it takes back the verb. - The Markup verbs write only where they belong. A line verb leaves code blocks, front matter
and dividers alone and finds nested, indented and quoted markers; Italic over bold keeps the bold;
an inline style never takes in a line break or a trailing space; and undoing a verb gives back its
selection. Markup is greyed in files that are not Markdown. - Bold, Strikethrough and Inline Code no longer turn two spans inside out. Over a selection
reaching from one bold word into another, Bold read the two as one span and turned them inside
out; it now adds a pair.
Type in Preview — experimental
- A Markdown note's Preview can be typed in. Fix a word, add a sentence, press Return for a new
paragraph or list item, tick a box, change a table cell: each change is written to the Markdown as
you type, and⌘Zundoes it, a run of typing at a time, as in Source. The format bar, the Markup
menu and⌘Fwork there too. In Split both halves can be typed in, and scrolling either one
moves the other. - It is on unless you turn it off — with Edit in the top-right corner of Preview, or Text ▸
Edit in Preview (Experimental). It is marked experimental, and the first time a Preview becomes
editable a note says what that means. - It never guesses. A change Preview cannot make faithfully — joining two paragraphs, say — is
not made: the file is left as it was, and the line under the document says That change needs
Source., with Show in Source beside it. Markdown files only, and a note longer than 256 KB
stays read-only in Preview.
Edit around the document
- Expand gives the document the window. "Just the text" was a ≡ that read as "justify", with no
menu item or key. It is now Expand, a button of its own at the end of the header, and Text ▸
Expand (⌃⌘E). It folds the file pane, the Text Files list and the sidebar, and leaving puts
back exactly what was showing. - The sidebar works beside a folded pane. In Edit the sidebar (
⌃⌘S) existed only while the file
pane was open, and the pane starts folded, so the switch was greyed most of the time. It now stays,
and a click in it still re-points the Text Files list. - The status line names the heading you are in. In a Markdown note with headings it starts
"in Heading ▾", and its menu lists every heading to jump to. - It counts the selection — "12 of 78 words", "64 characters selected" — and goes to a line:
click "Line, Col", or Text ▸ Go to Line… (⌃⌘L), and type a line orline:column. - Readable Line Length. Text ▸ Readable Line Length keeps wrapped text in a centred column
as wide as Preview's, so a wide window no longer runs a paragraph 150 characters across. Off by
default; also on the text's right-click menu, beside Wrap Lines. - Edit notices when its file changes elsewhere. It learned only at the next save, so a note
showed stale text, and one moved away was written back at its old path. Now, with nothing unsaved,
the new version loads quietly and the caret stays put. With unsaved typing, a banner offers
Compare, Keep Mine and Use the Disk's, and holds autosave until you choose. A moved or
renamed file is followed, and a deleted one keeps its text, with Save Again to write it back. - Edit writes plain LF line breaks only. In a file with Windows (CRLF) or old-Mac (CR) line
breaks, Return, the list and block verbs, and a multi-line paste wrote LF breaks in among the old
ones, and the status line read "Mixed". Now the first edit converts the whole file to LF, inside
that edit's undo step, so one⌘Zgives back the file exactly as it was opened. A file you only
read is never touched. ⌘Zin Edit undoes your typing, never a file operation. In the find field, or right after
switching between Source, Split and Preview,⌘Zcould undo your last file move, copy or rename
instead. Now, whenever the document, Preview or the find bar was the last thing used,⌘Ztakes
back text; file operations are undone from the file pane.⌘Zis saved. An undo put the old text back on screen while the document — and so autosave
and the unsaved dot — kept the undone version. After switching between Source, Split and Preview,
⌘Zcould also undo a view that was no longer showing and use up the step. Both are fixed, and a
box ticked in Preview can be undone.
Opening files into Edit
- SyncCloud is in Finder's Open With for text files. A file opened that way, dropped on the Dock
icon or passed toopen -alands in Edit, fetched first if it is still in the cloud. SyncCloud is
offered, never made the default. Opening several files at once opens the first and gives each
other folder a tab, its files selected. A launch from Finder opens in Expand. - The file pane follows the file you open, by tab. Opening a file from
⌘O, the Info inspector,
a duplicate or the palette switches to the tab already showing its folder, or opens a new tab
there, on whichever source holds it — instead of re-rooting the tab you were in. From Compare and
Organize it moves only within the pane's own source, so your comparison and Organize's results stay
put. ⌘Nmakes its file in Notes when the pane's folder is no place for one. On a whole-disk source
it offered the top of the disk or/Applications, and with no folder open it was greyed. A system
folder, the top of the home folder, a Trash, a folder you cannot write to, or none, now sends the
new file to~/Documents/Notes, made if it is missing.
Compare: faster after a switch, and right about linked folders
- Compare after a switch reuses what a pane already read. Switching a pane's source or tab
emptied every cached folder walk, so the next Compare read both folders from disk: Home against
Dropbox's Documents took 4–6 seconds instead of under 2. The other pane's walk is now kept, and
the scan's status dates the comparison by the walks it read rather than by when it ran. - The differences come out faster. Every file present on one side only got a full row built, then
most were folded into their folder's row. Now only the rows that survive are built: on a Home
scan of about 200,000 entries against 13,766, that step went from about 1.06 s to 0.35 s. - iCloud Drive's Documents and Desktop compare as what they hold. With a pane on iCloud Drive ▸
Documents, the scan read the link instead of the folder, found nothing, and reported every item on
the other side as "Folder missing on left" — 15 such rows on every iCloud-against-Dropbox launch.
At the iCloud Drive container itself, rows could offer to copy into a path spelled
<other side>/Users/…. Both read through the link now. - Folders reached through a link behave like any other. Below a folder symlink, under a root
reached through one (such as/var), and above iCloud's linked Documents:- Compare only this folder and Open no longer refuse with "Can't Fo...
v5.4 — Setup that shows its reading, and six ways into Edit
The keyboard reaches the file panes
- Click a file, then use the arrow keys. ↑ and ↓ move the selection and ⇧↑ / ⇧↓ extend it a
row at a time, in Columns and in Tree alike — in Browse, in both Compare panes and in Organize's
list. On macOS 27 a click selected the file but left the keyboard with the window, so every key
pressed after it did nothing at all; ⇧-click or a drag was the only way to select a run of files.
A click now hands that list the keyboard, and a caret you click into a field is left where it is.
A right-click does the same, so the menu's verbs and the arrow keys always mean the same list. - The differences list takes the keyboard too. Click a difference, wherever in the list, and the
arrows and ⇧↑ / ⇧↓ work on that list. The review queue is deliberately unchanged: during a review
the card keeps the keyboard, so ↩ and Skip go on working.
Columns gives names the row, and each column its own width
- Names run to the end of the row. A file's size no longer sits beside its name in Columns —
Finder's column view shows names alone, and Tree keeps the size and the date — and the room held
back for things that were not there is gone, so a name runs up to its folder's chevron or to the
place a file's ☁ appears. A name too long for its column is cut in the middle, keeping its start
and its ending: a folder of "Statement - Account - January 2024.pdf", "… - February 2024.pdf" reads
as different months rather than as identical rows. A search hit is cut at the end away from its
match, so the emboldened part stays in view. Tree's rows gain the same room, up to their size and
date. - The ⌂ badge is gone from the rows. It marked every file and folder outside your cloud
folders, which in a Home folder was nearly every row. The Info inspector's Where it lives says
it instead, and now says it for folders too: "This Mac only", or "In" and the source's name. - Swiping sideways across the columns is smooth. Every visible row re-measured itself on every
frame of a sideways swipe; each column now reads its rows' positions from its own list. The action
bar moves to the top when it would cover the selected row's highlight — a few points sooner than
when it reached the row's text. - Clicking is lighter in a big folder. Every visible row's right-click menu is built along with
the row, and on every click each one looked the selection up in the folder tree — in both panes.
A row outside the selection now answers from itself, and the selection is looked up once for all
the rows in it. - Switching workspace keeps your place. Browse, Organize, Edit and Compare each rebuild the
pane, which put its columns back at the first one and every list back at its top. A pane in
Columns now comes back scrolled as you left it — at the far end of the columns if that is where
you were, even if the preview has opened or the window has narrowed since — and a folder opened
again later in the session opens where you left it. - And its folder. Opening Organize moved the left pane to the top of its source, so the folder
you were in was gone when you came back to Browse. It stays put now: the folder open in Browse is
the one Organize's file pane shows, and a folder you open there is the one Browse shows. With no
scope chosen, Organize's sections work on that folder, as they already did when you clicked to one
inside Organize. - Size one column at a time. Drag a column's edge and that column alone changes width; hold ⌥
to size every column together, the way dragging always worked. Settings ▸ Readability ▸ Column
widths swaps the two — Each column or All columns — and choosing All columns puts every
column back to one width. The deepest column has an edge of its own now, with a strip kept clear
after it so the preview's divider or the pane's never covers it. Double-click an edge to fit the
column to its longest name (⌥ fits them all), and Reset Column Widths, on the right-click menu
of a column's empty space, puts them all back. A column can be up to 600 points wide (it was 340),
and is never drawn wider than its pane.
Getting a file into Edit
- Four ways in from a file pane. A text file in a file pane can now be opened in Edit from four
places: File ▸ Open in Edit, on ⌘O, for the text file selected in the focused pane; Open in
Edit first in a file's right-click menu, under Refresh, where it used to sit below Get Info and
Reveal in Finder; an Edit button by the file's name in the preview (⇧⌘P) — beside it, or under
it when the name is long; and Open in Edit first among the Info inspector's actions (⌘I).
Until now the right-click menu was the only way, and it was easy to miss. - Compare's list of differences offers it too, once for each side. Right-click a row whose file
is text and Open in Edit is offered for each copy there is, named for the pane it opens from:
both panes' copies when the file is on both sides, where the items sit under Compare…, and the one
that exists when it is missing from a side, where it comes first. A folder, or a file Edit does
not open, gets no such item. The list shown during a guided review offers it as well. It opens
the file without moving the left pane, where every other way in takes the pane to the file's
folder: in Compare that pane is half of the comparison the list is showing, so moving it would
re-run the comparison and forget what you had set aside with Ignore in Comparison. The folder name
above the document says where the file lives; click it when you do want the pane there. Edit the
file and go back to Compare, and the comparison runs again, so the row describes the file as you
left it rather than offering to copy the old version over it. - Each one is offered for a text file and never for a folder — all six, those four and the rows
in Compare's differences and Duplicates' copies, ask the question the right-click menu always
asked, so they agree about what a text file is. The preview is the one that holds back further:
for a file whose content is still in the cloud it goes on offering Download, because previewing
that file is exactly what would start the download. - ⌘O was free, and it is the key most people try first. It is the only one of File's row verbs
with a key, and the ⌘/ shortcuts list shows it beside ⌘N. - And a way back out, from any file in Edit's Text Files list. Right-click a file there for
Reveal in Browse, Get Info, Reveal in Finder and Quick Look, each acting on the
file you clicked rather than the one that is open. Until now the list had no right-click menu, and
Reveal in Browse was offered only on the open file's own name above the document. A file Edit will not
open — too large, or still in the cloud — keeps the menu, since that is when you most want to see
it somewhere else. Reveal in Browse leaves the open document as it was: ⌘4 comes back to it. - A duplicate that is a text file opens in Edit from its right-click menu. In Organize's
duplicates, right-click a copy's row and Open in Edit comes first, above Compare with keeper —
on every copy, the one being kept included, whose row had no right-click menu at all until now. A
copy that is not a text file keeps the menu it had. Those rows also answer a right-click anywhere
along them now, where some answered only over the file's name and picture. Like the other ways in,
it takes the left pane to the copy's folder — so back in Organize the duplicates are still listed,
and their Rescan button becomes Organize "‹folder›", to point Organize at that folder instead. - The Info inspector's row of actions now wraps instead of squeezing. At the inspector's usual
width those buttons had been shrinking until their labels were a few letters and an ellipsis —
"Reve…", "Cop…" — and adding a fourth would have left two with no letters at all. Each one now
keeps its whole name, taking a second line where it needs one.
Edit with fewer columns
- Edit shows one list of files, never two. Open the source pane beside the document and the
Text Files list steps aside: the pane is the list. Files Edit cannot open — a PDF, an image, a
text file over its size limit — are dimmed there, with the reason as their tooltip, and a
single click on a text file opens it, as does moving the selection to one with the arrow keys.
Collapse the pane and the list comes back. - Just the text. A button beside Find, above the document, hides the Text Files list and folds
the source pane if it was open, leaving the document alone in the window. It stays hidden until
you ask for it back — the same button, or the new rung on the strip at the left edge — and the
choice is remembered across launches. - ⌘N follows the list. With no list on screen, the new file's name is typed at the top of the
document instead, with the folder it will be created in named beside the field. Return creates and
opens it; Escape puts it away. - The file ⌘N makes shows up in the list, selected. With the source pane open, the new file
appears in the folder it was created in and is selected there, the way a file you click is, so the
list says where the document lives. A PDF you export into the folder is listed there too. The pane
used to go on listing the folder as it was until something else re-read it. - The document says where it lives. Under its name, beside Autosave, the header now names the
file's folder. With the source pane open it reads "in Finance": click it and the pane goes to that
folder with the file selected. With the pane folded away it spells out the whole path the pane's
breadcrumb would show — "iCloud › Documents › Finance" — and each part is a place to go: the folded
pane moves there, without opening, and the Text Files list follows it. Under Just t...
v5.3 — The menus Edit never had, and a pass that reads every document
Edit gets its menus
- Two new menus, Text and Markup, after Organize in the menu bar. Edit's whole menu-bar presence
was New Text File… and Save; everything else it could do was a click or a right-click. Both menus
grey out unless Edit is on screen with a document open, the way Compare's items follow a
comparison. In Preview the Markup verbs and the two find items grey too, because the rendered page
has no text to select in. - Text is about the document as a whole. Source, Preview and Split on ⌃⌘1, ⌃⌘2 and ⌃⌘3,
ticked for the one showing and greyed for a file with nothing to preview; Find Next ⌘G and
Use Selection for Find ⌘E, which the find bar had and nothing answered; the Wrap Lines and
Check Spelling While Typing switches; and Autosave This File, the header's switch as a menu
item — same setting, same tick. - Markup is the right-click menu's verb list, with keys. Bold ⌘B, Italic ⌘I,
Strikethrough ⇧⌘X, Inline Code ⇧⌘K, Link… ⇧⌘L, then the headings, lists, quote,
code block and rule with no keys — ⌘1 through ⌘4 are the workspaces, and nothing this app
registers may use ⌥. The right-click menu now shows the same five keys, because they work. - ⌘I is Italic in the text and the Info inspector everywhere else. One key, two jobs, decided
by where the caret is when you press it: in the document's own text it wraps the selection in
asterisks; in the Go to field, the rename row, a pane's search box, the find bar's own field, or
anywhere outside Edit, it shows or hides the inspector as it always has. The five Markup keys
follow the same rule — they never edit the document from a field you are typing in.
Seeing what changed, before choosing which version wins
- The alert about a file that changed under you gains "Show What Changed…". When a document
moves on disk while it is open, autosave stops and an alert asks Save Anyway, Reload from Disk or
Cancel — a question about a difference the person answering has never seen. The new button opens
an in-window overlay that diffs what you have against what arrived, with the same three verbs at
its foot, so the decision is made looking at it. - Both sides are selectable, because the common case is one changed line on each side, where
"which version wins" is the wrong question and a merge by hand is the honest answer. Left is your
buffer, right is the disk. - A file that is now too large, or no longer text, is refused with the reason rather than
diffed, and a file that moved keeps its two-button alert — there is nothing at the path to read. - The header's amber "not saving — changed on disk" is a second door onto the same overlay.
Cancel leaves autosave stopped, and without that door the only way back to the question was ⌘S.
Browse gets a status bar
- A line at the foot of the pane, on by default. How many items are in the tree, what your
selection comes to, how much of the tree is still in the cloud, and when the listing was read.
It has been deferred since v4.2 on what it would say in Compare, where two panes want two
answers and one strip can only give one — so it ships where that question does not arise. View
▸ Status Bar turns it off; there is no key for it. - It sheds from the right as the pane narrows, keeping the item count longest: the freshness
goes first, then the cloud-only count, then the selection. VoiceOver is never shed — it reads
every fact at every width, and it is the one place a stale listing is described in words rather
than by colour. - The cloud-only count reads
—until it is true. It is onelstatper file over a tree that
can hold forty thousand of them, so it is counted in the background after the rows are already on
screen, and the bar shows a dash rather than a number climbing towards the answer. Navigating,
scanning or deleting starts it again, and the dash comes back with it. - "Scanned N ago" is about the listing you are looking at, not about a comparison. Coming back
to a folder you were in ten minutes ago says ten minutes, not "just now" — the age belongs to the
walk that read the disk, and it survives being served from memory.
The preview works in the tree too
- Selecting a file in a tree pane opens a preview beside it, the same Quick Look preview the
Finder-style columns have had. The switch is the one that was already there — the pane header's
pill, ⇧⌘P, and Show Preview in the pane's right-click menu — so the preference travels with the
surface rather than with the way it happens to be listing files: turn the preview on in columns,
switch that pane to a tree, and it is still there. - The rows give up the room, and only ever room they have. The preview is pinned to the pane's
trailing edge and the list reflows into what is left, so nothing is covered and nothing scrolls
sideways. Drag the seam between them to resize it; the width is remembered and is the same width
the columns use. A pane too narrow to hold a legible list beside a preview shows no preview at
all, and gets it back when you widen the pane. - View ▸ Preview Column is now View ▸ Preview, because it is no longer a column in one of the
two views. Same key, same tick. - A PDF in the preview shows a whole page, and scrolls through the document. It used to be
scaled to fit the preview's width, so the wider you made the pane the more of the page fell
below the fold — a letter page in a wide preview rendered about twice the height it had, and there
was no way to reach the rest. It is now fitted so the whole page is visible whichever way the pane
is shaped, and scrolling walks the pages. Other formats are unchanged: images already came out
whole and text already scrolled.
Walking the columns, and clicks that land
- ⌘↓ opens the selected folder into a new column, ⌘↑ closes the rightmost one. Both are in the
Go menu beside Back and Forward, as Open Selected Folder and Enclosing Folder. They move
the column stack, which costs nothing and leaves every difference badge valid — not the
comparison scope, which would reload the tree and re-run the scan. Both are dead in Tree view,
which draws no columns. - ⌘↑ is not a second spelling of ⌘[. ⌘[ pops the same stack and then keeps going, stepping the
comparison scope back through the pane's focus history. ⌘↑ stops at the root column and greys.
Finder draws the same line between Back and Enclosing Folder. - ⌘↑ and ⌘↓ are also the field editor's move-to-start and move-to-end, so both hand the key
back to the caret when you are typing — in a pane's search box, a rename row, the ⌘K field or an
open document. ⌘↓ also refuses a row that is not in the deepest open column, since silently
closing three columns is not what anybody pressing it is asking for. - ⌘-click and ⇧-click multi-select in Columns works now. Roughly one click in ten registered,
on rows all over the list, with the main thread idle — a tap gesture on the row claimed the
mouse-down and then, far more often than not, never completed, so the click never reached the
table and the table selected nothing. Measured live rather than argued from the source: with the
gesture on, 28 clicks produced 3 selections; with it off, 6 produced 6. Plain clicks always looked
fine because they had a second committer, which is what made this read as a modifier-key problem
for so long. - The cost, decided rather than assumed: ⌘-double-click no longer opens a folder in a new tab.
It stays on the row's context menu and on ⌘T.
Three menu items that were missing
- View ▸ Text Size ▸ Bigger ⌘+ / Smaller ⌘− / Default Size ⌘0. The whole app's type, from the
keyboard. They step the same stops the Text size slider in Settings ▸ Readability has and nothing
between or beyond them, so the keyboard cannot reach a size Settings cannot; at either end the
item greys. - File ▸ Download, for one selected file whose content is still in the cloud. The row's
right-click menu had it and the File menu, which carries the rest of the row's verbs, did not. It
asks iCloud to fetch the file exactly as the row does, and the cloud badge clears when the content
lands; for other providers Reveal in Finder remains the way, as before. - Window ▸ Sync History was already there — SwiftUI lists every window automatically — and the
audit that proposed adding it had read the source rather than the menu. Left as it is: the only
way to move it beside Activity Log removes the main window's own entry from that menu, which is
measured and pinned.
⌘K takes you to a path in another source
- A typed path in a source the pane is not showing is delivered now, not refused. ⌘K's Go to
Folder has accepted/…and~/…paths since v4.1, and a path inside a different configured
source answered “In Dropbox — switch source first” — a row that named the fix and then made you do
it. It reads “Open in Dropbox”, and ↩ points the pane at that source and lands it on the
folder. Only the pane ⌘K was aimed at moves; in Compare the one beside it keeps its source, its
tree and its place. - The other three refusals are still refusals, and each says something different: “Not in any
source” is about your configuration rather than about the folder, “Backup SSD is not mounted” is a
source that cannot be shown at all, and “No folder at that path” is the only one claiming nothing
is there. - A path in another source is not checked until you press ↩, so typing one never waits on a
sleeping drive. If the folder has gone since, the pane stays where it is rather than switching
source and landing somewhere else, and the Activity Log says so.
Print a document, or write it as a PDF
- ⌘P prints what Preview shows. File ▸ Print… renders the open Markdown document the way the
Preview mode does — the same h...
v5.2 — A workspace that writes, and one that moves in
Storage moves into Organize
- Storage is a section of Organize now, not a workspace of its own. It is the sixth item on
Organize's rail, after Rules, and everything it does is unchanged — the treemap, the ranked lists,
the magnitude bars, and the promise that it never moves, deletes, or evicts a file. What changes
is where you find it: ⌘3, then Storage on the rail, instead of a tab of its own. If you quit
with Storage open, it reopens exactly there. - ⌘4 was Storage and is now Edit. The bar is still four segments — Browse, Compare, Organize,
Edit — so the count has not moved; which four has. That one chord is the thing to relearn. - All / Largest / Untouched / Reclaim moved into the page, as a capsule above the list, because
the row they used to sit in belongs to Organize's rail. - Storage follows Organize's scope. Set a scope and it re-analyses that folder rather than
filtering the report it already had — a treemap is a picture of a whole, so a filtered one would
misstate every proportion in it. - Organize's overview page carries a Storage card: when the last analysis ran, which folder it
covered, and the totals, with Re-analyze beside it. It is a receipt rather than a to-do — Storage
never wears a count badge, because a badge means there is something to act on.
A new workspace: Edit
- SyncCloud can now change what is inside a file. Every workspace until now moved files around;
Edit opens one text file, shows it, and writes it back when you ask. A collapsible file pane on
the left browses to any folder, a rail beside it lists that folder's text files, and the document
sits beside them. ⌘4, or the new segment in the workspace bar. - Markdown renders in Source, Preview or Split, with a divider you can drag. Real Markdown — tables
and task lists included — laid out in the app's own type at Settings ▸ Text size, not a web view's. - It saves itself. A couple of seconds after you stop typing, and whenever the document leaves
the screen — switching workspace, closing the tab, quitting. Every write is staged and swapped in
atomically, exactly like every other write in the app, so there is no moment where the file on
disk is half of anything. ⌘S still means "now", and stays available even when the document is
clean. - Autosave stops rather than guessing. If the file changes on disk while you have it open — or
an Organize run files it somewhere else — writing would either discard what arrived or leave a
second copy at the old path. So it stops, says so on the header line, and asks straight away which
version wins. Declining leaves it stopped rather than asking again every two seconds, and ⌘S is
how you settle it when you are ready. - A file comes back as the file it was. Line endings are untouched, and a file written in UTF-16
or carrying a byte-order mark is saved in the encoding it was read in rather than quietly becoming
UTF-8. - It asks before writing over a surprise. If the file changed on disk since it was opened — or
was filed somewhere else by an Organize run — ⌘S says so and names which, and Cancel means nothing
happened. - It refuses rather than guess. A file that is not valid text opens read-only, because saving it
would replace the parts that could not be read. One that is too large, still in the cloud, or
holds no text at all is listed and dimmed with the reason, instead of opening empty. - The rail has two tabs: Text Files and Outline. Text Files is the folder's list, with the
folder it is reading named under the tabs — the same folder ⌘N creates in. Outline is the headings
in the open Markdown document: click one to go to it, and the heading you are in is marked as you
move about. Each tab gets the whole rail, so a long document's outline is a list rather than a
peephole — and it keeps its place per file, so coming back to a document does not send you to the
top of it. The one exception is the heading you are actually in: if remembering the place would
leave that off the fold, the outline opens there instead. - ⌘N makes a new file in the folder you are in — a name row in the rail, nothing on disk until
you press ↩, and a name with no extension becomes.md. - Open in Edit is on the right-click menu of any text file anywhere in the app — Browse, either
Compare pane, the columns view — and brings it here with the rail already pointed at its folder. - Typing has its own undo. ⌘Z in the editor takes back what you typed and can never reach into a
file move or a copy, which have their own history and their own Undo button.
Writing Markdown, and moving around a document
- The markup verbs are on the right-click menu — Bold, Italic, Strikethrough, Inline Code,
Link…, Heading 1–3 and Body, Bulleted and Numbered List, Task Item, Block Quote, Code Block,
Horizontal Rule. They are toggles rather than inserts, so Bold on bold text takes the asterisks
off again, and a verb dragged across several lines asks whether every line already carries the
prefix before it decides to remove one — toggling line by line turns a mixed selection inside out,
which is never what dragging across a paragraph meant. Each verb goes in the way typing does, so
⌘Z takes back exactly one of them, and Cut, Copy, Look Up and the spelling submenu stay where the
system puts them. - A checkbox in Preview can be ticked from Preview. Clicking it writes the change into the file.
A checkbox written in the middle of a sentence stays prose, which is the same distinction the
Markdown parse makes. - ⌘F searches the open document, and the Replace row is showing when it opens. Find, replace,
replace-all, next and previous, and a live match count. The chord routes rather than choosing: with
the caret in the document it opens the document's bar, and everywhere else it is Find in Pane,
unchanged. - A status line under the document gives words, characters and lines, where the caret is by line
and column, the encoding the file was read in, and how its lines are terminated — LF, CRLF, CR, or
Mixed where a file holds more than one kind. Line endings are named, never normalised: these
are cloud folders shared with other machines, and an editor that quietly rewrote a file that
arrived from Windows would report the whole of it as modified to every sync client on the account.
The strip sheds segments as the column narrows, keeping the caret longest — it is the only one that
changes as you work and the only one you cannot get anywhere else. - The rail filters by name, behind a button rather than a permanent row, because 232pt is too
narrow to spend one on a control most sessions never touch. Case- and diacritic-insensitive, and a
filter of nothing but whitespace is no filter at all: somebody who has typed a space and stopped is
mid-thought, and answering "no files" to that is a rail that appears to have emptied itself. - The file with unsaved changes wears a dot in the rail, at the leading edge of its row — accent
while the write is pending, amber when writing has stopped, nothing when the file matches the
buffer. Only the row that is actually open can wear one. - Wrapping and spell checking are yours to set, on the text view's context menu and remembered
across launches. Everything that rewrites text unasked — smart quotes, dash substitution, text
replacement, autocorrect — stays off with no switch anywhere, because these are real files in real
cloud folders and a curly quote in somebody's YAML is a corrupted file. Continuous spell checking
rewrites nothing; it draws a red line, which is why it is the one that is offered. - Links open, and local images draw. A
#headinglink scrolls the preview instead of leaving the
app, and a near-miss scrolls nowhere rather than sending you somewhere you did not ask to go. An
image already on this disk is drawn; one that is still in the cloud is refused and says so,
showing the alt text its author wrote — drawing it would materialise it, pulling a file onto your
disk and through your connection because you opened a note. - Autosave can be switched off for one file, on the line under its name — then nothing is written
until ⌘S, and the questions you expect on the way out come back for that file. It is session-only
by choice: quitting restores autosave everywhere, because a remembered list of files that silently
do not save would stay invisible until it cost something. - Undo survives a file switch. Each document keeps its own history, so coming back to a file you
edited earlier can still take back what you did there. A history is thrown away rather than
replayed when the file comes back different — reloaded from disk, filed elsewhere by an Organize
run, or left with autosave off and abandoned with "Don't Save". - The document header answers two questions and stops. Which file, and how you are looking at it.
The size moved down to the status line beside the other measurements, so the header no longer grows
as the file does, and the status word now appears only where it changes what you have to do:
unsaved — ⌘Swhen autosave is off for this file, a stop when it has stopped,read onlywhen
saving is not on offer. The rest of the time the dot beside the filename is the whole answer.
Comparing two files is findable now
- Select a file and the action bar offers "Compare with…" — press it, then click the file to
compare against, in either pane and in any folder. One selected file is what every click already
gives you, and it is the only route that reaches a counterpart in the OTHER pane: selecting there
would clear the selection here, so "one on each side" is not a state that exists. - ⇧⌘C does the same from the keyboard, and the verb is on the Compare menu and in the ⌘/
reference too. Every way into the file-pair...
v5.1 — Compare copies works on files
Duplicates
- "Compare copies" works on files, not just folders. A file group's copies each carried a 40pt
thumbnail and that was the whole comparison; folder groups got a side-by-side review. Any two
copies now open in one surface: a strip across the top giving name, location, size, date and — for
two PDFs — page count for both, with whatever differs picked out, and two live previews under
it. Choose which copy to
keep with ←/→ or the button over either pane; the card underneath follows. - The verdict is one copy, not the whole group. Trashing from here removes the copy you were
looking at and leaves a third copy of the same file alone. It goes through the same last-moment
re-check every other removal does: if either copy changed since the scan — or a rescan landed
while the surface was open — it refuses and says which one and why, rather than trashing on a
verdict that has expired. - Two copies the group is not keeping get no verdict at all. Open the second and third copies
of a three-copy group against each other and neither of them is the keeper — so neither is
marked as one, the trash button is withheld, and a line names the copy that IS being kept. The
facts on screen are current, so it does not send you off to rescan. - ⏎ and esc both mean Done. Trashing a copy is always a deliberate click.
- A byte-identical pair can be re-checked on the spot. "Verify now" hashes both files as they
are on disk right now, and reports three outcomes rather than two: they match, they no longer
match (so the scan is stale — rescan before removing either), or one of them could not be read,
naming which side and why. - A copy that has not been downloaded says so and offers to fetch it, instead of showing an
empty pane. Previewing it would pull the whole file down, which on a cloud folder is the normal
case rather than the exception. - The surface resizes and remembers it. Drag any edge or corner; it opens at that size next
time, held to what the window can actually show — so moving to a smaller display cannot leave
its verdict bar off screen.
Two PDFs, or two images, move together
- Synchronised panes for PDFs and images. Scroll or zoom one side and the other follows, and
⌥ held breaks the sync while you move one alone. Zoom survives a trip out to an overlay mode and
back, so reading a table closely, checking the pixel difference and returning does not drop you
at fit-to-page. Quick Look has no scroll or zoom to synchronise at all, which is why this arrives
with per-type viewers rather than earlier. - Paging is the PDF half — two images have no pages to turn. ⇞/⇟ move both sides at once, and
scrolling onto another page walks the page strip along with you, so1–4open on the page you
were actually reading rather than on the one you started at; ⌥ breaks that too. A
strip under the panes marks each page once it has been compared — green where nothing changed,
amber where something did, with the figure in the tooltip; blue where only one document has that
page, red where a side could not be rendered. A page carries no mark until its comparison has
actually run, so nothing on the strip stands for a page that has not been looked at. Where one
document is longer, the strip runs to the longer one and the shorter side stops at its last page
rather than hiding the pages only one file has. - Three ways to overlay the two sides, picked with
2–4or the segments —1is the plain
side-by-side you start on: swipe a divider
across them, blend one into the other, or see the pixel difference on black — where identical is
black and anything that changed glows. The difference view says outright that it compares pixels
with no alignment, so two scans of one sheet of paper glowing all over reads as scanner noise
rather than as content.
Two text files, line by line
- A read-only side-by-side diff for text, source, CSV, JSON and the like. An edited line shows
as one row with both versions on it and the changed WORDS picked out, rather than as a deleted
line above an added one. ↑/↓ step between changes, not between lines. - Files that are not quite text still open. A log truncated mid-character decodes with the
unreadable bytes marked and says so, and a file that announces its encoding with a byte-order
mark is read in that encoding rather than sniffed as binary. Files over 4 MB, files that are not
downloaded, and files that turn out to be binary each say which of those they are. - A diff it cannot afford is declined, not started. Two large files with almost nothing in
common would take minutes to line up, and a single line long enough to be a whole minified file
would take as long again to compare word by word. Both are now refused up front and said out
loud — the other modes still work, and a line marked whole says it was marked whole — rather
than spinning over a pane that is never going to answer. - CRLF against LF is reported as a line-ending difference, not as a thousand changed lines, and
two files holding the same words in different encodings show no changed rows at all — the
comparison is over decoded text, not raw bytes, and a note above the diff is what tells you the
bytes differ.
The same surface in Compare
- "Compare…" on a changed row in the Differences list opens the identical viewer — facts,
previews, modes, the text diff — with a Done-only bar. Differences already owns copying, moving
and ignoring a row, so the viewer adds no second way to do them.
Deleting
- A move between volumes spends a retry before it destroys anything. Such a move copies to the
destination and then clears the source to the Trash — and if that step failed, the cleanup fell
straight through to a permanent delete. The refusal macOS raises on files you own, in folders you
own, is exactly such a failure, so under it a move could quietly become a deletion of the
original. That refusal is now retried first, which is what rescues it. The unrecoverable fallback
is still there for a volume with no Trash at all, and the log names it when it is taken. - A Trash refusal is retried before it is reported. The app asks the system's own Trash
service, and failing that re-registers the item with a move in place and tries again. Whether
that clears any particular refusal is not promised — the failure comes and goes on its own — but
one that survives both attempts now says what was tried and what was observed, rather than
naming a cause it cannot know.
Elsewhere
- The Activity Log survives a log file it cannot fully decode. One byte of invalid UTF-8 — an
append cut short by a crash, or a path written by another process — took the entire
previous-session history with it and put an error note where the history should have been. The
unreadable bytes are now marked and everything around them loads.
Known limitations
- Folder groups keep the existing Compare-workspace review; this surface is for pairs of files.
- The pixel modes align pages by their frames only. Two scans of the same page will not line up,
and there is no de-skew or registration pass. - Formats with no typed viewer — Word documents, presentations, video — get two independent Quick
Look panes and a caption saying they do not scroll together.
v5.0 — Restructure stops being a report
Restructure stops being a report. It could recognise one thing — a family of folders organised
more than one way — and all it could do was say so. It now recognises eight kinds of structural
drift, turns most of them into a plan you review name by name, applies that plan, and writes the way
back to disk before it starts.
Requires macOS 26, unchanged from the 4.x line. Coming from 3.x or 2.x, read the v4.0 section first.
What Restructure finds
- Eight kinds of finding where there was one: siblings shaped differently; a year with files and
no folders yet; a year hiding inside a name (IRS Docs - 2023); two names for one thing
(Form W-2besideForm W2); a folder in an inbox mirroring a real destination; files parked
above a run of year folders; a leaf sitting beside the folder that owns its concept; and two
branches holding the same documents under parallel names. Each card names what it saw and the
class of change that would fix it, so a rename reads differently from a merge before any sheet opens. - Crowding is counted, not accused. Pass-through folders, single-file folders and empty ones get
three counts above the findings — no badges, no cards, because every real tree has them. Only the
empty count offers to act. - The badge counts what you can drive to zero. Findings that hand off to another surface, and the
crowding counts, stay out of it. - "Nothing is wrong" and "I could not check" never share words. A clean result says how many
folders it checked; a missing survey says it has nothing to read. - The lens says when the tree was last looked at, and offers a Rescan once that stamp is old
enough to matter. It used to report only how many folders it covered.
Planning a new shape
- One mapping, applied to every member. The sheet lists every distinct folder name the family
uses, once, each defaulting to keep — so you answer "what should this be called" a couple of dozen
times instead of dragging hundreds of files. - Nothing is pre-selected. The shapes on offer are the ones actually in use, each naming the
siblings that vouch for it. Where the newest members all disagree, the sheet says outright that
there is no current shape to continue. - The cost of a choice is shown where the choice is made. Point two names at one target and the
row says it is a merge, and in how many members. - Every operation is derived, never typed. The review lists them in run order, each naming its
member and the files it carries, beside a before-and-after of one member's folders. - Nothing is dropped to make the shape fit, and collisions keep both. A folder the target has no
slot for stays where it is and is listed as kept; a file whose name is already taken arrives under
a new one. Never an overwrite. - Optional refinement with Claude, on the names only. It answers row by row against your mapping
and declines where a folder says nothing about itself. Accepting a row edits your mapping and the
plan is re-derived — there is no path from a suggestion to the disk that skips the review. - "Export plan…" is the safe way to stop. It writes the plan as a dated JSON file beside your
survey and keeps it, so the card offers "Review N operations" afterwards, even after you quit.
Applying, and taking it back
- Apply is the only thing here that writes, and you can watch it run. It refuses to start while a
scan or another file operation is running — with a sentence, not a queue. The reversal is written
to disk before the first folder moves. - Every claim is re-probed at the moment of the action. A folder holding a file the plan never
listed is skipped and named while the rest of the plan runs; a destination taken since gets a new
name rather than an overwrite. - The result is checked by a second code path, independent of the code that did the work, with
the verdict on the card. A mismatch is reported and never rolled back automatically. - A finding disappears because the tree was re-read, not because it was marked done. The landing
ends by re-deriving the survey from a fresh walk. If that step fails, the card says so in its own
words rather than borrowing the success sentence. - Removing folders is separate, opt-in, and folders only. No file is deleted by Restructure at
any stage. The sheet prints every path in full and moves what you tick to the Trash. - Two undos, and the card says which is which. ⌘Z takes the whole landing back as one step and
is gone once you quit. "Undo this reorganisation" replays a reversal kept on disk through the
same guards and re-probing, and survives quitting — it can partly fail, and it names what it could
not put back.
Setting up a new year
- "Set up like its siblings" creates the folders and moves nothing — the folders the rest of the
series has, each justified by how many siblings already have it. ⌘Z removes them again. The loose
files go to To File, scoped to that folder alone. - The Organize overview raises it the month it happens rather than waiting for you to go looking,
and remembers being dismissed.
Getting to Organize
- The Organize menu learns the new verbs. "Plan This Folder's Shape…" and "Set Up Like Its
Siblings" join it, aimed at whatever the focused pane has selected. - "Undo This Reorganisation" is deliberately not in Edit. It is not ⌘Z — it replays an inverse
from disk and can partly fail — so putting it beside Undo would have been the most misleading
place available. It is the one item there that needs no selection. - "Check This Folder's Shape" is in a folder's row menu and in ⌘K, aimed at the folder you are
already standing on.
Duplicates
- Name-only matches are gone. A group of same-named, different-content folders was a warning
with no resolution attached, and it crowded out the findings that had one. Folders now join an
overlapping group on their own merits rather than on an average across everything sharing their
name — so a genuine twin is no longer lost to three unrelated folders that happen to share its name. - The pills that name a subset are the filter now. They looked interactive and were inert. The
figures that are not subsets stopped dressing like filters: the reclaimable total is plain text. - The badge says what you need to do, not what the match was. Byte-identical groups carry no
badge at all — their certainty reads in the green reclaim figure, and the space goes to the file's
icon and name. The rest say "needs review". - Picking a different copy to keep no longer reorders the list, so there is still a before and
after to compare, and the row under the pointer is the row you clicked.
On the command line
synccloud restructurereports the whole detector set over a surveyed tree, with--jsonfor
the full report and--profiles-dirto read a survey from elsewhere. It never touches the disk it
describes.
Known limitations
- The document survey is not in this release. The folder half — the tree walk Restructure reads —
ships in setup's Folders step. Reading page one of every document is an hours-long background pass
and is deliberately not here. - The command line stops at report. There is no
--applyand no--plan: Apply's guarantees are
about a person reading a plan before anything moves, and a flag that skips the reading skips the
guarantees. - Two branches under parallel names are reported, not planned. That finding names the pair and
the documents they share; converging them is not something v5.0 offers to do for you. - The structure trend starts empty. It draws the finding counts the survey has recorded, so it
has nothing to show until this release has been running for a while.
Full changelog: v4.6...v5.0
v4.6 — A source is the whole account, not its Documents folder
A source is the whole account now, not its Documents folder. Every cloud source was discovered
one level below where its content actually begins, so anything sitting beside Documents — Teams
Recordings, a shared team folder, whatever you keep at the top of the account — was not reachable in
the app at all, and every source's breadcrumb started on the same word. The account folder is the
root, where a pane opens is a separate setting you can change, and the pane header was rebuilt
around the crumb that now names the source.
On the v4 line, so it requires macOS 26 — coming from 3.x or 2.x, read the v4.0 section first.
Sources
- A source now starts at the account folder. Folders beside Documents are reachable, and the
breadcrumb names the source rather than opening on "Documents" for every account. - Where a pane opens is yours to choose. Each account source has an Open at row in Settings,
with Choose… and Reset; it is measured from the root, so it survives the account folder
moving. If the folder you picked is renamed away, panes open at the root and the row says so. - The root itself is no longer a field, because it is not a preference. An account has one true
root and the app discovers it; the row shows it with Show in Finder. If you had set a custom
Location in an earlier version, that is carried forward and the row offers Reset to go back to
the folder the account is signed in at. A folder source is its own root and keeps the single
editable Location field it has always had. - iCloud deliberately stays rooted at your Documents folder. Its real container is a dead end on
a Mac with Desktop & Documents syncing on — Desktop and Documents appear there as hidden symlinks
that report themselves as non-directories, so every listing that skips hidden files drops them.
Rooting iCloud there would have shown two folders out of four while claiming to cover the cloud. - Everything you had stored moves with the root. Both tab strips, each pane's last folder,
pinned and recent folders, the Favorites order, filing destinations and the per-pair ignore sets
are all measured from a source root, and are rebased on first launch so they name the same folders
as before. - What you authored is left exactly where you put it. An automation's destination, the
loose-files inbox and the taxonomy a filing scan files against stay anchored to the folder a pane
lands in rather than being re-pointed at the account root —TODOnames a real folder at the top
of a OneDrive account as well as one inside its Documents, and moving them silently would have
changed which one they meant.
The pane header
- The provider capsule is gone; the first breadcrumb crumb is the source picker. The two were
the same fact in the same corner, tinted the same hue, and the capsule was the larger of them —
it restated its own second row, and it was what pushed the toolbar off the left edge of the
header. Clicking the crumb opens the source list, with Go to <source> as its first item. - The toolbar starts in the same place on every pane. Measured across the header's sixteen
layout cases: the bar's leading edge is now at 17pt in all sixteen, where it used to land anywhere
between 77pt and 372pt depending on how long the source's name was. At 570pt wide, the same pane
started its toolbar at 223pt for a source called "iCloud Drive" and 372pt for a long custom name — a
149pt swing from the name alone. - Narrow panes keep more of the toolbar. A 250pt pane draws seven controls where it drew five.
All nine are now drawn from 330pt, where it used to take 490pt; and a pane with a long custom
source name at 490pt had room for five and now has room for all nine. - The source crumb is drawn as the control it is — a capsule sized to match the toolbar's own
controls, carrying the source's mark, its name, and its own disclosure arrow. - The trail is bigger. Crumbs were the smallest text in the header; they are a size up now, with
more room between them and more space between the toolbar and the trail beneath it.
The sidebar
- Your home folder and the startup disk are in Favorites on a first run. Five standard places
now, not three. They used to sit in Locations, on the reasoning that home contains the other three
and a disk is hardware — but they are the two places you navigate to from a standing start, and
Locations on a machine with several cloud accounts is where you go to find an account. Removing
either from Favorites returns it to Locations. - "Restore Standard Folders" is now "Restore Standard Places", because it restores a disk.
- A recent no longer carries a second line. A recent's qualifier is its parent folder, and that
parent is a top-level folder often enough that the line came out repeating the source badge on the
row's other end. A recent is somewhere you were minutes ago and recognise; a favorite is one you
chose once and may not, so only favorites carry the second line. Recents still count toward the
collision that makes a favorite need one, and the source and folder are still in the tooltip on
both.
Tabs
- Two tabs that would otherwise read the same are told apart. A tab is titled after its folder's
leaf name, and its brand mark separates a Dropbox tab from a OneDrive one — but not two accounts
of the same brand, which is the collision you are most likely to have. A colliding title now takes
the source's own name, or, for two folders under one source, the parent folder — and only where
that actually separates them. Tabs that already read differently are untouched, and a duplicated
tab is left alone rather than growing two identical suffixes. - The strip reads like the list under it. Every tab sits on a surface of its own now, and the
one you are on takes the same accent tint a selected folder takes in the pane below it — so the
strip and the list answer "which one am I on" in the same colour. Only the active tab had a
surface before, which left the others as bare labels and made a strip of five read as one tab with
some words after it. The live tab quietens in the pane you are not working in, exactly as that
pane's selected rows do; the rule under it does not, so the strip still names the live tab in the
pane you are not in. - The strip follows the app's accent. The rule under the live tab was drawn in the macOS system
accent rather than the one you picked, so it stayed system blue in a Green or Amber window. The
"None" accent is unaffected, because there it is the system accent. - A tab switch could leave the other pane on your previous sort order. Changing the sort
re-orders both panes' trees off the main thread — brief, but not instant on a large one — and a
tab switch landing inside that window threw the result away, on the reasoning that whatever
interrupted it would hand both panes freshly-ordered trees. A tab switch does not: it reloads only
the pane that moved, so the pane you did not move kept the order you had just changed away from,
with nothing on screen saying so, until something else reloaded it. You had to be quick to catch
it, which is most of why it went unnoticed. The re-order now tries again instead of giving up, and
changing a pane's source reaches the same window in this release, so the fix covers that door too.
Moving and copying
- A chosen folder in the Move to… sheet was drawn as two shapes at once. The sheet's shortcut
rail, its folder columns and its search results all draw a rounded-rect row, but handed their
selection and hover styling no shape to match it — and both of those default to a capsule. A
chosen row therefore wore a rounded-rect accent fill under a pill, and at rest the hairline ring
traced that pill around the rectangle. Each row now names its outline once and fills, hit-tests
and rings the same shape.
Speed
- Navigating one pane no longer reloads the other. Switching tabs already reloaded just the pane
that moved, but navigating — the commonest gesture in the app — went through a channel that
carried no pane with it, so it was honoured as "reload both" and the other pane's tree was
re-walked on a source and a folder that had not changed. With the prefetch cache warm that is
wasted work you still see as a flicker; cold, after any file operation, sort change or force
refresh, it is a full second walk of tens of thousands of files for a tree that was already
correct. A refresh now names the pane that moved. Anything that genuinely changes both — a
finished file operation, a date-tolerance change, a sort that needs fresh tags — still reloads
both. - Changing one pane's source leaves the other pane alone. Picking a different account on the
right used to reset the left pane as well — the pane you had not been near dropped its tree and
re-walked behind a spinner, flattened an open Columns stack, cleared its selection, emptied its
Back history, and went back to its own root. Editing a source's Location in Settings dropped and
re-walked both trees for the same reason, though it left the selection and history alone. Only
the pane you retargeted is touched now, on both paths. The comparison itself still refreshes
whole, because a comparison belongs to the pair — but a tree, a column stack, a selection and a
history belong to one pane, and the other pane's are all still correct.
If you go back to v4.5 afterwards
Your Location settings are safe: the old key is read and never rewritten, so an earlier release
finds them exactly as it left them. Your stored positions are not — tabs, pins, recents and
saved folders are rebased onto the new roots, and an older build reading them back will not find
those folders and will re-root them. Tabs and pins degrade the way they already do for a folder that
has gon...
v4.5 — Refinement, plus one freeze and one thing quietly wrong
Refinement, mostly — plus one freeze and one thing quietly wrong. A bulk sync on a large
comparison locked the window for about eleven seconds at each end, doing nothing in that time but
setting a flag. And a file rewritten while it was being hashed could be remembered under a
digest belonging to no version of it. Alongside those, “Text contains” means one thing on every
surface rather than two, the “None” accent finally reads as no accent, and the markers saying
which workspace and which tab you are in travel instead of blinking.
On the v4 line, so it requires macOS 26 — coming from 3.x or 2.x, read the v4.0 section first.
Organize
- “Text contains” now means the exact phrase, everywhere. It had two readings: the loose
word-by-word one on the Organize scan, which is the path that moves files, and the strict one
in the Automations preview. So “tax return” could move a document that said “tax” and “return”
pages apart, after a preview that said it would not. Separate words are still matchable, as
“Mentions the words”.
Duplicates and comparison
- A file rewritten while it was being hashed could be remembered under the wrong digest.
Everything the scan knew about a file came from its path, read before the file was opened, so
none of it was provably about the bytes that followed — and a rewrite of the same byte count
produced a digest of two files spliced together. The file is now stat'd through its own
descriptor before the read and after, where the timestamp catches what a byte count cannot. - Files a duplicate scan could not read are counted now, instead of vanishing from it. A
candidate that was gone, unreadable, or changed while it was being hashed was dropped with
nothing recording it — no pill, no note, no log — while every other skip reason was tallied
and named. They join the “skipped” note now, as “unreadable or changed while being read”. - A duplicate scan does less work to reach the same answer. It read a file's path three
times before opening it; now once, plus one more for a symlink and one for a file it is about
to open. On a repeat scan every digest is cached, so that first read is all the hashing does.
Digest text is now a table lookup, and a long scan publishes progress about a hundred times
instead of several hundred. - Duplicate thumbnails no longer decompress while you scroll. Each was compressed to PNG
purely to satisfy a rule about what may cross between threads, then decompressed again —
lazily, which means at draw time, on the main thread, during the scroll that asked for it. - A comparison with ignore patterns set folds them once per scan rather than once per item
compared, and folds each name once rather than once per pattern it is tested against. - Starting or finishing a bulk sync no longer locks the window while it marks the rows.
Flagging each row as in-flight rewrote the whole difference list and asked for a redraw, once
per row. On a comparison with tens of thousands of differences that cost about eleven seconds
at each end, doing nothing but setting a flag. The rows are marked in one pass now, and drawn
once. - Rebuilding the difference list stops taking every path apart to ask one question of it.
Deciding whether a path is hidden split it into components and built a string for each, once
per difference, on every rebuild — and hiding hidden files is the one filter of five that runs
unless you turn it off. On 29,000 differences that was about 37 ms a pass, now about 2 ms,
with exactly the same files hidden. - Scanning a large tree resolves far fewer paths. Every directory the walk entered had its
whole path resolved so the scan could tell whether it had been there before — a symlink-loop
guard that fires essentially never, and about half the cost of entering a directory. Only a
directory whose last component is a symlink needs it now, and every cycle is still caught.
Appearance
- The “None” accent now reads white in light, not the faintest gray. At low Tint, bare
material and Graphite's neutral wash landed within a couple of points of the same gray, so the
two were told apart by their swatches and nothing else. “None” now lays a white film over the
background in light, titlebar included. Dark is untouched. - The Info inspector's toolbar button moved to the far right. The trailing pill read Go to,
Info, Logs, Settings, which put the control that opens the right-hand rail three glyphs from the
edge it opens against. It now reads Go to, Settings, Logs, Info, mirroring the folder-sidebar
toggle at the far left. Same buttons, same ⌘I. - The selected workspace and the active pane tab now slide between positions. Both markers
were drawn per item, so switching cut one out where it was and cut a new one in where it was
going — two bars, one above the other, both blinking. Reduce Motion takes the destination and
skips the journey. - A count that changes rolls its digits instead of cutting to a new number. Diff totals,
duplicate-group counts and the filing backlog hard-swapped: the old number vanished, a new one
appeared, and nothing said they were the same quantity. Words are left alone — rolling a
word's glyphs reads as a glitch. - The first-run sheet answers the pointer. Seven of its controls drew their own chrome,
which means macOS contributes no hover state at all — so the app's first impression was its
least responsive surface. Each has an affordance now, chosen for what the control does. - One vocabulary for corner radii. Eleven distinct radii were hand-written across the app,
so three chips inside one card could round by different amounts. Four named stops now, each a
value the app already used most, with the strays moved to their nearest by a point. - Twenty-two of the app's animations honour Reduce Motion that did not before. Opting in used
to mean wiring an environment read into whatever view owned the animation, so most motion was
unconditional — friction rather than a decision. What is gated now is anything that travels:
panes collapsing, a workspace switch, the inspector, tabs sliding under a drag, the focus ring
moving between panes, the search field growing out of its magnifier, Browse's folder sidebar.
Motion that reports rather than travels — a hover wash, a rolling count — is left alone. - The small inline spinners are drawn at their size instead of shrunk to it. Three status
rows scaled an already-drawn spinner down to seven-tenths, and scaling resamples, so those
three read softer than identical spinners a few files away. They are framed to occupy exactly
what the old recipe reserved, so no row moves. - Twenty-seven controls that are nothing but an icon now have names. A tooltip is not a name
on macOS, so VoiceOver read them as “button” and Voice Control could not be told to click them
at all. Toolbars, row actions, dismiss glyphs and the new-tab plus now say what they do.
Nothing about this is visible on screen.
v4.4 — Every workspace gets a folder sidebar
Every workspace gets a folder sidebar. SyncCloud has always known which folders you keep
and which you were last in — it just had nowhere to put them, so the only routes were the pane
header's dropdown and the ⌘K field. There is now a column down the left of Browse, Compare,
Organize and Storage that holds all three answers at once: Favorites, the folders and places
you keep; Locations, every account you have signed into plus your home folder, your disks
and the Trash; and Recents, the folders you were last in.
Favorites and Recents span every source. A favorite in Dropbox is removable without visiting
Dropbox first, and Recents is one list ordered by when you were there rather than one list per
account — which is what a folder you were in five minutes ago actually means.
On the v4 line, so it requires macOS 26 — coming from 3.x or 2.x, read the v4.0 section
first.
The sidebar
- Three sections, and View ▸ Sidebar (⌃⌘S) shows or hides the column. Each heading folds,
and a folded one says how many rows are behind it so it does not read as empty. Drag the
column's edge to set its width, between 150 and 280 points. - Favorites is yours. It starts as Desktop, Documents and Downloads — Finder's own three —
and every row in it can be taken out. Right-click any place in Locations to add it, or any
place in Favorites to remove it; a place moves between the two sections rather than appearing
in both. Restore Standard Folders, on the Favorites heading, brings the three back without
disturbing what you have added, and is offered only when one of them is actually missing. - Add a folder to Favorites from the pane you are looking at. Right-click any folder in a
pane. The sidebar's own rows can only manage folders that are already listed, and the pane
header's jump menu acts on the folder the pane is showing rather than the one under the
pointer — neither is where you are standing when you decide a folder is worth keeping. - Each account draws its own mark. Dropbox's folds, Drive's triangle, OneDrive's lobe, all
in one ink rather than five brand colours down a quiet column — and where two rows would read
the same word, the account name is added beside it. Three Google Drive accounts all render
"Google Drive" otherwise. - Drag a row to reorder it — and drag a recent up into Favorites to keep it. Favorites and
Locations both hold your own order, and a recent dropped into Favorites becomes one, which is
the quickest way in for a folder the sidebar already knows. The Locations order is the one
Settings stores, so the sidebar and the pane header's dropdown cannot show the same accounts
in two different sequences. - Right-click a row for Open in New Tab, Add to or Remove from Favorites, and — in Compare —
Open in Left Pane / Open in Right Pane, which sends one folder to one side without changing
where the next click will land. - Show in Enclosing Folder opens the folder a favorite or a recent lives in, rather than the
folder itself. The question you ask when a name has stopped being enough: twoLegalfolders
in one account, or a recent you no longer recognise. - A local folder that is not a source yet says so before it becomes one, and can be taken
back from the row itself. The Trash opens in Finder and is never scanned, hashed, or filed
into.
In Compare, the sidebar says which pane it opens into
- One rule decides which pane, and it is the pane you last clicked in. Anywhere in it — a
row, the tab strip, the source chip, empty chrome. The header above the column reads "Opens on
Left" or "Opens on Right" and describes every row below it. - The focused pane is drawn with a faint accent border along its own card edges, so the
answer is on screen rather than something you have to remember. It is the same pane the file
action bar, ⌘F, and the folder-scoped verbs act on — two separate answers to "which pane"
before this, only one of which survived clicking into empty space.
Very large folders
- A pane pointed at a folder with hundreds of thousands of directories in it no longer
hangs. The deep walk was bounded for depth and not for width, so a home folder or a whole
startup disk was walked to the end however long that took. It now stops at a budget, and a
folder the budget skipped is read on demand when you open a column into it. - A folder the pane has not read yet no longer claims to be empty. The first paint is
deliberately shallow so a pane appears at once, which means every child folder arrives unread
— and the display drew "empty" over the difference. On a large source that state lasts long
enough to look like an answer. A column being read shows that it is, and a folder that
genuinely cannot be listed says "Can't be read" rather than "Empty". - Every whole-tree pass a workspace can start asks before walking a folder that large —
Storage, Find Duplicates, Renames, Filing, and updating folder memory —
instead of starting a pass that will take minutes with nothing on screen
saying so. The prompt says "more than", never a total: the probe that found the folder too big
stopped early, so it does not know how much it did not see. - A comparison that could not read one side in full now says so, above the differences. Two
things put it there. A folder that cannot be listed at all — permission denied — has always made
SyncCloud report nothing on that side as missing, because it cannot tell an absence from
something it never read; what is new there is only that the table admits it instead of looking
complete. The second reason is new in this release: the comparison's own scan now stops at the
same budget the pane does, so a source large enough to reach it is read in part and the same rule
applies to the part that was not. Either way the count is a floor rather than a total. - A source covering the whole startup disk is named after the disk, not
/.
Appearance
- The Tint slider now sets how coloured the whole window is, and Subtle finally means subtle.
It moved only the panes and the Differences area before, and its own bottom end painted nothing
at all — so "less tint" had nothing left to take away, while the window behind those panes
carried the accent at full strength whatever the slider said. That is why the two ends of the
slider looked so alike. Every surface answers to it now: at Subtle the panes' own wash fades
out entirely while the window behind them keeps a quarter of its strength — faint, but still
recognisably the accent you picked, because a slider that ended in grey would
quietly override the accent chosen directly above it. Vivid is unchanged, so a setting you
already liked still paints what it painted. The bottom of the range also moves more slowly than
the top, which is where the choosing actually happens. - The pane's tab strip takes the tint with the rest of the pane. It was the one part of a pane
that never did, so at a strong tint it read as a pale stripe across the top of the pane it
belongs to.
v4.3 — Mostly repair, and one new thing
Mostly repair, and one new thing. v4.2 built the setup form and filled in the menu bar.
v4.3 is what three reviews of the shipped code found underneath, and most of it is one
mistake wearing different clothes: a file that existed but could not be opened was read
as a file that was not there. Nothing was lost on that read. The loss came on the next
write — saving needs permission on the folder, not the file, so the save succeeded exactly
where the read had failed, and replaced what it could not read with a blank start.
Six stores sat behind that mistake, and the rest of the release is the same theme in other
places: undo trusting a folder it had only glanced at, removal gates trusting verdicts that
had gone stale while a dialog was open, and cloud placeholders read as though their contents
were on disk.
On the v4 line, so it requires macOS 26 — coming from 3.x or 2.x, read the v4.0 section
first.
Go to
- Every Settings tab is a ⌘K destination, matched on the words of the controls inside
it. Typing "appearance" used to match nothing: the word lived only in Settings' own
search field, which you cannot reach without already having Settings open. The palette had
a single "Settings…" row, and it opened whichever tab you were last on. There are now ten,
one per tab, in the rail's own order, and each is matched on the folded-down vocabulary of
every control it holds — so "glass", "log level" or "accent" find the page that carries
them.
Files the app could have destroyed
- A file that exists but cannot be read is no longer mistaken for one that isn't there.
Six stores made this mistake, each with a guard that consulted only the decode result and
never the failure to open: your household (people.json), which person a document belongs
to (person-tags.json), Storage's per-root snapshots, the classifications the filing engine
has paid a model for, the log of people you have refused, and the filing corpus. The
consequences differed and were all silent — the first edit to a person replaced the entire
household with a folder-name seed; the first verdict overwrote every verdict already there;
one refusal wiped the record of everyone you had ever declined; the next analysis wrote one
root's snapshot over all twelve. Each store now tells the two apart, moves the bytes it
could not read aside under a name no later rescue can take, and refuses the write until
that has actually landed. The re-survey's write over an unreadablefiling-memory.jsonis
closed the same way. - A setting only a newer build understands survives your next edit of it. Five of the
persisted settings read tolerantly — anything unexpected falls back to the default, which is
right, because the app has to start whatever is on disk — and then wrote the live value back on
the next change. So a value this build could not interpret (a foreign type, or a raw value a
newer build introduced) read as the default and was overwritten by it the first time you touched
that setting. Five disabled providers became one on the next toggle; a sort order chosen in a
newer build vanished on the first edit after going back. The original is now kept beside the
setting before the default is used, and the log says so. The same read-then-overwrite shape is
closed for the pane bar's arrangement, where a control added by a newer build was dropped the first
time you edited the bar on an older one. - A key written on a person survives an edit. Notes and unknown keys sitting beside
peoplein the roster were already carried across a save; keys written on a person were
not. The model reads five fields, drops the rest, and the whole file is rewritten — so a
nickname, or a_whytyped next to the person it explains, was gone the first time
anybody edited anybody, silently, because what is left behind is still a well-formed roster. - An unreadable filing artifact suspends the classification cache instead of quietly
changing its key. Leaving an unreadable artifact out of the cache fingerprint mints a key
that can never occur again once the file is fixed — so every classification already paid
for became unreachable, and the same documents would be sent off and paid for a second
time. The fingerprint now reports itself unavailable and the cache is switched off for that
pass. It is also derived from the folder the artifacts actually came from, rather than a
field inside a file that can disagree with it.
Cloud files that are not on disk
- Offloaded Dropbox, OneDrive, Google Drive and Box files are recognised as placeholders.
The availability check asked iCloud's question —isUbiquitousItem, false for every
non-Apple File Provider — and so answered "the contents are here" for every other
provider's evicted file. Online, a filing survey opened them and made the provider download
your entire offloaded library. Offline, they were recorded as blank against a size and date
that do not change when a file is materialised, so they were written off permanently and
never revisited.
Undo and redo
- ⌘Z after copying a folder no longer destroys the work you did inside the copy. The
copy-undo compared a folder's own modification date and its immediate child count, which an
edit two levels down leaves untouched — so ⌘Z read the copy as pristine and trashed it,
with the edit inside, permanently on a volume with no Trash. It now records a digest of the
whole tree, takes that baseline the moment each copy lands rather than after the whole
batch, and ignores the.DS_Storethat merely opening the copy in Finder leaves behind. - Redoing a delete no longer trashes whatever has taken the path since. The redo
re-trashed by bare path, and being on its list means "the undo put our item back here" —
which stops being true the moment something replaces it. Delete a file, ⌘Z, let a different
file land on that path, ⌘⇧Z, and the replacement went to the Trash with no banner and no
log line. - A "press ⌘Z to undo" stops standing after the step it points at. The banner carries a flag
that retires the offer once anything else registers an undo, and the rename pass and the name
normalizer put the sentence in the text without setting it. So after either of them, running any
other operation left the offer on screen — by then pointing at that operation instead. The merge
banner had the opposite half missing: a merge that folded and trashed nothing registers no undo
at all, and still offered one, which sent ⌘Z at whatever you had done before the merge. - File operations run strictly in the order you asked for them. The serial queue's
prologue hopped off the main actor and back before claiming its slot, so two operations
starting together could chain onto the same predecessor and run concurrently. The worst
reachable form was a merge's own undo pair inverting: the folded files deleted back out of
the keeper before the original was restored.
Duplicates, merging and deleting
- Folder duplicate groups are judged file by file. The check that a folder had not changed
since the scan counted its contents by different rules than the scan used — counting the
.DS_Storethe scan ignored, and measuring a symlink's own bytes where the scan recorded
none. Any group holding either was refused as "changed since it was scanned", permanently,
because a rescan reproduces the same difference. The same constant offset could equally mask
a real loss, and a count-and-bytes rollup can never see a same-length rewrite inside a
folder about to be removed. - The Compare review checks what it is about to trash, and stops promising an undo it
cannot honour. For a folder — and Compare is the folder-only flow — the gate passed on
existence alone, so a file that landed in the right-hand folder while the review sat open
was trashed along with it. Its confirmation also read "Reversible with ⌘Z" unconditionally,
including on volumes with no Trash, where the copy is destroyed outright and nothing reaches
the undo manager. - Merging duplicates is safer to undo and safer to trash after. The merge held an undo
group open across every suspension, and undo grouping is global to the window, so an
unrelated operation finishing in that window was swallowed into the merge's step and came
back with one ⌘Z. The keeper was checked once, before a copy loop that can run for minutes,
and for a folder that check degenerated to "does it exist" — so a keeper emptied mid-merge
still had its redundant copy trashed, with the folded files nowhere. Edit ▸ Undo also
offered to reverse merges whose copies had been destroyed permanently. - The permanent-delete confirmation names what it is about to destroy. The app's one
unrecoverable dialog said "permanently delete these N items?" and discarded the list — and
for a single item showed only the basename, which is no help when the two candidates are
duplicate copies with the same name. - A dangling symlink is deleted instead of reported as already gone. The trash was gated
on an existence check that follows the link, so a symlink whose target had been deleted
answered "not there", and that branch had no else: no error, no banner, no place in the
removed count. You were told the delete succeeded and the link stayed where it was.
Verdicts that had gone stale
- The verified-copy offer re-checks both ends before it writes. Its guards count this
app's own writes and nothing else, and the dialog never expires — so a cloud daemon syncing
down a new version while the offer sat open was invisible, and confirming bulk-overwrote
with bytes that were never the ones hashed. syncre-checks its plan against disk before each write. The plan was drawn once at
scan time and then executed however long the[y/N]prompt sat there,--verifyinclude...