Changelog
All notable changes to SoundAssist. Newest first. We follow loose Keep a Changelog conventions but without strict semver yet; beta means everything is in flux.
Tags map to git tags. Commit hashes are short SHAs.
The Vault: folder zips survive a missing file (2026-06-24)
Fixed
- A missing storage object no longer breaks a whole backup. If a synced file's upload had silently failed (so its record pointed at nothing), the background zip builder used to crash mid-run; the job hung until a cleanup pass marked it failed with a vague message. Now the builder checks every file exists first and simply skips any that are missing (the rest still zip), and a file that vanishes mid-stream fails the job cleanly with a friendly message. As prevention, finishing an upload now verifies the bytes actually landed before recording the file; so no new "ghost" records get created in the first place.
The Vault: cold-load skeleton + tidy long names (2026-06-24)
Changed
- A cold load now shows a skeleton; a calm pulse of the project-card and file-row shapes that are about to appear; instead of a bare spinner on black, so the wait reads as "loading your stuff" rather than "is this broken?".
Fixed
- Long folder names no longer overflow the backup confirm dialog or the "saved" toast; they're middle-ellipsized (start + tail kept) so the message and its buttons stay tidy.
The Vault: browsing polish (2026-06-24)
Changed
- The Vault landing is an overview again. The root now shows your projects as
cards plus any loose files; a project's contents live one click into its card,
instead of the whole tree flattened into a wall of
.asd/.als/Desktop.inibelow the cards.
Fixed
- Searching "Recent" now finds older files; it used to cap to the 20 newest before applying the search, so older matches were invisible.
- Project-card dates show the year once it isn't the current year, so you can tell "this June" from "last June" at a glance.
- "Play all audio" is now in the right-click folder menu too (it was only on the card's ⋯ button).
- "Snapshots…" is now "Snapshots (restore points)…" so it reads as the versioned restore feature, distinct from the one-off "Download folder (.zip)".
- A small project no longer hides its lone project file behind a closed fold; the "Project files" section opens by default when only a few files sit under it.
- The folder-card ⋯ menu now carries proper menu / menuitem roles for screen readers, matching the right-click menu.
Fixed
- Snapshots panel is now keyboard-accessible; Escape closes it, Tab stays trapped inside, and focus returns where it was on close, matching every other modal in the app.
- Failed builds no longer leak internals to you; a failed snapshot/download used to show the raw error (internal storage paths and all); it now shows a clean message, with the real cause kept in the server logs for debugging.
- The Download button can't silently do nothing; a network hiccup now surfaces an error toast instead of a dead click.
- Double-clicking "Make a snapshot now" won't spawn duplicate builds; if a snapshot is already building for that project, the request joins it instead of kicking off a second multi-GB job.
- "Download folder" can't latch onto a snapshot build; the reuse check is now scoped so a download right after a snapshot still produces a fresh zip.
- No more infinite "Preparing…" spinner; if a build stalls, the panel stops polling after a few minutes and says so rather than spinning forever.
The Vault: folder zips build for large projects (2026-06-24)
Fixed
- "Download folder" and project snapshots failed on any archive bigger than a single ~16 MB part; i.e. virtually every real Ableton project. The cause: Cloudflare R2 requires every part of a multipart upload except the last to be exactly the same length (stricter than S3's "≥ 5 MiB" rule), and the zip streamer was flushing whole accumulated buffers that overshot by the last chunk, so the parts came out unequal and R2 rejected the upload at the final step. The streamer now emits fixed-size parts and lets only the trailing part be short. Found by dogfooding on production; a unit test now exercises the part boundaries (the existing tests mocked R2, so they never enforced the rule). Build failures also now record the real underlying error instead of a generic "couldn't build", so the next one is debuggable at a glance.
Added
- Freeze a project as a dated, downloadable snapshot. A folder's menu gains
"Snapshots…", opening a panel where you can make a point-in-time
.zipof the whole project (files + nested sub-folders) and download any past one; your "restore last week" safety net, distinct from the throwaway "Download folder" zip. The Vault keeps the last few snapshots per project automatically (older ones are reclaimed), so it's a bounded cost, and snapshots build in the background like the folder download. Manual-trigger only for now; nothing snapshots on its own, so there are no surprise storage bills.
The Vault: your projects, as projects (2026-06-24)
Added
- Your work folders now show up as project cards at the top of the Vault. Until now your own (private) folders only appeared as quiet rows in the side column; the main area was a flat list of every file. The Vault root now leads with a "Your projects" grid of cards (size, last-synced, the same open/rename/share/download/move actions), so the page reads as your projects, not a file dump.
- Play all audio from a card. A project card's menu gets "Play all audio" when the folder holds any; it queues every render/stem/bounce in the whole subtree into the mini-player, no opening required. Pure presentation over the existing mirror; no new storage.
The Vault: richer project cards (2026-06-24)
Changed
- Folder cards now show size and when they were last synced. A shared project card reads "12 files; 1.4 GB" and dates itself by its newest file ("last synced") instead of the day it was created, so a card says what's actually in the project at a glance. Computed in one subtree pass (a folder reflects its nested Samples/Renders/… too). Groundwork for the projects grid + play-from-card coming next; no new storage.
The Vault: audio-first folder view (2026-06-24)
Changed
- Open a synced project and you see the music, not the mess. Inside a folder,
The Vault now surfaces the playable audio (wav/flac/aiff/mp3; renders, stems,
bounces) up top, and tucks everything else; DAW project files, samples, and the
.asd/Desktop.inisidecars a backup faithfully keeps; under a single collapsed "Project files" row. Nothing is hidden from the backup; it's just out of the way until you want it. Folders that are all-audio or all-files render flat as before, and searching inside a folder shows everything so a hit is never buried. First, cheapest slice of the backup+workhorse direction; pure presentation over the existing mirror, no new storage.
Added
- Download a whole folder as one .zip. Right-click a folder (or use its ⋯ menu) → "Download folder (.zip)" to pull the entire subtree; every file and nested sub-folder, structure preserved; for example to restore a lost Ableton project. The archive builds in the background (streamed straight to storage, so multi-GB folders don't blow up memory), downloads automatically when it's ready, and also fires a "your folder is ready" push so you can close the tab. Very large folders are declined up front with guidance to grab the big sub-folders separately, rather than starting a build that can't finish.
Changed
- "Move to" shows only your main folders now. Moving a folder previously listed the entire flattened tree (every nested Samples/Recorded/… sub-folder), which buried the choice. It now lists just the top-level folders; deeper nesting is still available by dragging a folder onto any target.
Work-folder backup: stop dropping DAW + OS files (2026-06-23)
Fixed
- The Vault work-folder sync now backs up everything it scans. The Connect
"work folder" promises a faithful backup ("sub-folders and all"), but the
authenticated attachment upload gate enforced a positive extension allowlist,
so DAW sidecars (
.asd,.amxd), OS cruft (Desktop.ini,.ico), and any other non-whitelisted extension failed with a generic "Couldn't complete that." The authenticated/api/r2/attachment-url+/api/r2/attachment-completeroutes now gate onBLOCKED_EXTSonly (executables + active web content like.exe/.html/.svgstay blocked); everything else is accepted and served asapplication/octet-stream(downloads, never executes). The public, leakable/api/upload/[token]routes keep the strict allowlist. Failed files re-sync automatically on the next pass (they never entered the sync manifest).