You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
v5.2 — A workspace that writes, and one that moves in
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 viewer used to be a right-click, which meant that if
you did not already know it existed you would not find it.
Two files selected together still compare in one press, where you can select two — the button
reads plain "Compare" then, because that click finishes the job.
"Compare with…" is on every file's right-click menu, always. Pick it, then click the other
file — in either pane, in any folder, after navigating as far as you like. The mode stands until
you complete it, press esc, or click the armed file again; a bar across the foot of the window — a
few points from the action bar you pressed — says which file is waiting, and the armed row wears a
mark.
The cross-pane comparison works with a left-click now. It always worked with a right-click and
only a right-click — a left-click in the other pane silently discarded the file you had lined up,
because selecting in one pane clears the other. The armed file no longer lives in a selection, so
the click that used to lose it is the one that completes it.
Two scans of one page, lined up
The pixel difference aligns the two pages before comparing them, best effort. Two scans of the
same sheet, fed in a degree apart, used to glow all over and the view said so. It now estimates
the skew and offset between them, corrects it, and captions what it corrected — "aligned before
comparing — a 1.00° skew and an offset corrected, best effort".
It refuses more readily than it aligns. The estimate is judged on the sharpness of its match,
not on how much error it removed: two genuinely different pages always have a best candidate,
and scoring by improvement alone accepted them. Where the match is not sharp the pages are
compared as they are and the original caveat stands, so the view never claims an alignment it did
not achieve.
Only the page you are looking at is aligned. The strip's dots answer "did anything change", which
a skew does not change the answer to.
Less waiting
Switching into Organize was costing a couple of seconds, and now does not. The structure
detectors' vocabulary pass walked every folder in the profile once per child of every family with
four or more members — squared in the number of folders — on the main thread, inside a redraw. On a
real 5,020-folder profile synccloud restructure --json returns byte-identical output before and
after and drops from 1.78 s to 0.15 s. It was never confined to Organize, either: the same
answer was read on every window redraw whenever a single folder was selected, so the sweep could
stall the app from anywhere in it.
The text diff's cost cap is measured now, not estimated. The old estimate read zero for two
files holding the same lines in a different order — a re-sorted CSV, two exports sorted
differently, a log interleaved by two writers — so those sailed past the cap into a comparison
that could not be stopped: 5,000 lines a side took 0.96 s, 10,000 took 3.86 s, 20,000 took 16.5 s,
and a 100,000-line log ran to minutes of a pinned core with no way out. The walk now counts its own
steps against a real ceiling and can be cancelled. Shuffled 15,000 lines a side: 13.89 s becomes
1.83 s. The change loosens as well as tightens — two all-different 20,000-line files are now
diffed in 1.75 s where they used to be refused outright — and a pair that is still refused is
refused after about 1.9 s, because reaching a ceiling means spending it first.
The compare surface stops redoing work you already waited for. The text diff was keyed on the
display mode, so every toggle between modes re-read both files and diffed them again; entering a
pixel mode re-decoded both images before comparing. Neither the diff nor the page walk could be
stopped when the surface closed, and a page walk could leave fifty PDF opens queued on the same
lane a running scan uses. All of that is keyed, cancelled and cached now.
Changing workspace no longer walks the filesystem several times over. The folder sidebar
refreshed two to four times per switch, each refresh doing its whole disk half synchronously on the
main thread — a stat per source root, per pin and per recent, a volume enumeration with a read per
volume, a stat per standard place and device. With eleven sources that is a hundred-odd stat chains
and a volume walk, repeatedly, for one click. On a local disk it was milliseconds; on a sleeping
external drive or a stalled network mount any one of them blocks for seconds — and this app is
pointed at Google Drive and Dropbox. The walk is coalesced to one per switch, moved off the main
thread, and the volume list is cached between mount, unmount and rename.
Smaller repeats, all on paths you were already using: the Storage report was re-read and
re-decoded on each of six triggers and, where the current folder had no saved report, on every pane
move; the pane-override map was parsed from JSON on every one of three dozen reads, several per
redraw; and Organize's rail measured every label afresh on each pass instead of asking the cache
the rest of the app measures through.