Stashium v0.8.0
Stashium v0.8.0 — macOS universal build (Apple Silicon + Intel).
- Signed with Apple Developer ID
- Notarized by Apple
- Requires macOS 11 (Big Sur) or later
What's new
0.8.0 ships the headline feature: cloud sync via any folder you already trust — iCloud Drive, Google Drive, Dropbox, OneDrive, Syncthing. No new account, no Stashium-hosted server, no Apple App Store entitlement. The OS-level sync engine you already use does the upload; Stashium just reads and writes a folder.
Cloud sync — your stash, on every Mac
Settings → Sync turns it on. Pick a folder, point your other Macs at the same folder, and clips, folders, file blobs, and og:image previews flow between them.
- Multi-cloud by design — works with iCloud Drive, Google Drive, Dropbox, OneDrive, Syncthing, any provider that mounts as a folder on disk
- Snapshot + per-row LWW merge — two Macs with different clip histories actually converge (not just "last writer wipes everyone"); per-row last-write-wins on
updated_at - Stable cross-device identity — every clip and folder gets a 128-bit
sync_idthat never reuses, so AUTOINCREMENT id collisions across devices stop being a problem - Fresh-install restore — install Stashium on a new Mac, point at your sync folder, your stash materializes from the newest peer snapshot
- Conflict log — when two Macs edit the same clip during the same interval, the losing version is appended to
sync_folder/conflicts/{device}-{ts}.jsonl. Nothing is silently lost - Blob sync, transparently — file clips (screenshots, dropped PDFs, EPUBs, etc.) and URL clips' og:image previews are SHA-256-hashed and copied into
sync_folder/blobs/. Peer devices'file_pathandog_imageare auto-rewritten to point at the blob folder, so opening a clip on Mac B Just Works the moment your cloud sync engine has materialized the file - Garbage collection — when you permanently delete a clip, its blob gets swept from the sync folder on a later cycle (kept for trashed-but-recoverable clips)
- Folder deletes propagate too (with the v0.8 caveat that v1.1 snapshot mode can't replicate every edge case yet — see "Known limitations")
- No encryption in v1, by design — your cloud provider can read clip content. Trade-off chosen to keep onboarding to two clicks. v2 may add E2E
Sync settings UI
Settings → Sync gives you:
- One-click toggle, status banner showing next sync ETA + last sync result
- Native folder picker with suggested paths for iCloud / Google Drive / Dropbox
- Sync interval picker — 1 / 5 / 15 / 30 / 60 minutes (default 5)
- Editable device name (shown to peers)
- Manual "Sync now" button
- Other devices list — every Mac that's ever written into the sync folder shows up with its name + last seen
- Per-clip diagnostic (advanced):
sync_diagnosecommand surfaces every clip's sync-readiness so "why isn't my PDF syncing" has a concrete answer
Sync performance optimizations
So the 5-minute heartbeat doesn't quietly thrash your cloud quota:
- Skip snapshot when DB unchanged — idle devices with no edits since last cycle don't re-upload the same DB
- Single-flight cycle — spamming "Sync now" or scheduler-coinciding-with-manual-fire can no longer stack concurrent SQLite backup + zstd + upload passes
- Throttled blob GC — orphan-blob sweep runs every ~hour instead of every cycle (deletion is eventually-consistent regardless)
- Hash caching —
content_hashandog_image_hashcached on first compute, never re-hashed - Atomic snapshot writes — staging
.tmprename, peer scanners ignore in-flight writes - Bounded by
MAX_CONCURRENT_FETCHES = 3— already in place from Discover, also caps any concurrent peer-snapshot merges
Other fixes
- Stale detail pane when current view is empty — opening the app on All (now = unfiled only) used to render the previously-selected clip in the right pane even though the list was empty. The detail pane now strictly derives its clip from the currently-visible list, so anything that's filtered out of the middle pane is also gone from the right pane
- AI Summary / Smart Folder / Generate ToC race — clicking AI on clip A, then switching to clip B before the stream finished, used to: (a) show A's streaming content on B, AND (b) silently save A's result into B's DB. Fixed with per-request clip-id capture and full local-state reset on clip switch
- Jump to existing — toast → Jump now correctly navigates to the clip's folder (or Archive) instead of leaving you on All; race in
loadClipsthat was clobbering selected clip via stale closure also fixed unminimizepermission — was missing from capabilities, made toast's Jump fail silently- Folder browser
+button — now creates a new folder even when the list is empty - Folders → Discover navigation — switching between sidebar sections no longer gets stuck on the folder pane
- Archive ↔ folder drag — archived clips can now be dragged to folders (archive is a state, not a category); dragging an archived clip to All un-archives it
- All view = unfiled inbox — once a clip lives in a folder, it stops showing in All. Stops accidental bulk-delete of curated content
- Sidebar feed groups — collapsible with persisted state
- Feed article font — Discover feed article body now respects the same typography settings as clips (font family, size, line height, content width)
Known limitations
- Folder deletions don't propagate across devices in v1.0 — a deleted folder may resurrect after syncing with a peer that still has it. Fixed properly in Phase 2 (event log)
- Article inline images embedded in URL clips' article body don't sync yet — only the og:image preview does. v1.2
- No encryption — cloud provider can read clip content. v2
Install
- Download
Stashium.dmg - Open the DMG and drag
Stashium.appintoApplications - Launch from Launchpad or Spotlight
Existing 0.4.0+ installs will auto-update on next launch.
Issues
Email mombuartworks@gmail.com.