Skip to content

Releases: agirish/sync-cloud

v5.5 — Edit becomes a place to write Markdown

Choose a tag to compare

@agirish agirish released this 17 Oct 06:30

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 ⌘Z takes 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 http or https address 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
    Images folder beside the note as <note>-1.png and so on, and linked on a line of its own. An
    existing file is never replaced, and ⌘Z takes 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 ⌘Z took 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 ⌘Z undoes it, a run of typing at a time, as in Source. The format bar, the Markup
    menu and ⌘F work 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 or line: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 ⌘Z gives back the file exactly as it was opened. A file you only
    read is never touched.
  • ⌘Z in Edit undoes your typing, never a file operation. In the find field, or right after
    switching between Source, Split and Preview, ⌘Z could undo your last file move, copy or rename
    instead. Now, whenever the document, Preview or the find bar was the last thing used, ⌘Z takes
    back text; file operations are undone from the file pane.
  • ⌘Z is 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,
    ⌘Z could 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 to open -a lands 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.
  • ⌘N makes 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...
Read more

v5.4 — Setup that shows its reading, and six ways into Edit

Choose a tag to compare

@agirish agirish released this 27 Sep 14:41

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...
Read more

v5.3 — The menus Edit never had, and a pass that reads every document

Choose a tag to compare

@agirish agirish released this 09 Sep 12:11

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 one lstat per 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...
Read more

v5.2 — A workspace that writes, and one that moves in

Choose a tag to compare

@agirish agirish released this 03 Sep 14:11

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 #heading link 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 — ⌘S when autosave is off for this file, a stop when it has stopped, read only when
    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...
Read more

v5.1 — Compare copies works on files

Choose a tag to compare

@agirish agirish released this 31 Aug 21:55

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, so 1–4 open 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–4 or the segments — 1 is 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

Choose a tag to compare

@agirish agirish released this 30 Aug 01:05

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-2 beside Form 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 restructure reports the whole detector set over a surveyed tree, with --json for
    the full report and --profiles-dir to 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 --apply and 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

Choose a tag to compare

@agirish agirish released this 28 Aug 04:39

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 — TODO names 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...

Read more

v4.5 — Refinement, plus one freeze and one thing quietly wrong

Choose a tag to compare

@agirish agirish released this 26 Aug 21:15

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

Choose a tag to compare

@agirish agirish released this 25 Aug 20:44

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: two Legal folders
    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

Choose a tag to compare

@agirish agirish released this 24 Aug 14:39

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 unreadable filing-memory.json is
    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
    people in 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 _why typed 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_Store that 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_Store the 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.
  • sync re-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, --verify include...
Read more