Releases: akurach/yafm
v0.9.6.1 — Hotfix
v0.9.6 — Sidebar collapse · Settings overlay · Sidebar polish
What's new in v0.9.6
Added
- Collapsible sidebar (icon strip) — press ⌘⌥S or click the toggle button (top-right of the sidebar) to collapse the sidebar to a 44 pt icon-only strip; all items remain tappable. Press again to expand.
- Collapsible sidebar sections — click any section header (Favorites / Locations / Devices / Network / Tags) to fold it; a caret rotates to show state. Tap collapses, drag-and-drop still reorders. Collapsed state persists across launches.
- In-window Settings (⌘,) — Settings opens as a floating card inside the main window with a dimmed backdrop instead of a detachable Preferences window. Mole-style pill switcher with 7 tabs (General / Appearance / Operations / Sidebar / Tags / Plugins / Updates). Dismiss with backdrop click, ✕, or Esc.
Fixed
- Devices and Tags now highlight when active — clicking a mounted volume or a tag now shows the same accent bar + background fill that Favorites / Locations rows have always had.
⚠️ This DMG is not notarized (needs a paid Apple Developer ID). On first launch: right-click → Open, or System Settings ▸ Privacy & Security ▸ Open Anyway.
yafm v0.9.5 — File-type tiles · Sidebar reorder · App handling
File-type tiles · Sidebar reorder · App handling
Added
- File-type tiles — colored extension chips for ~250 known types (code, 3D/CAD, RAW photo, design, audio/video project files, fonts, binaries…). Toggle in Settings ▸ Appearance; folders and unknown types keep their real macOS icon.
- One type→color palette drives both the tile and the optional "tint file names by type" — they can never disagree. Per-category color pickers + a searchable type browser to see/override what's mapped.
- Live sidebar reorder — drag a Favorites item or a whole section; the grabbed block follows the cursor while neighbors spring into place. Order persists.
- Configurable columns (header right-click / path-bar button), quick tags from the row menu (colored dots), Full Disk Access in Settings, and an app right-arrow behavior setting + Show Package Contents.
Fixed
- Big-folder freeze — an unbounded persisted column width sent AppKit's layout engine into infinite recursion. Restored the Name-width clamp + a startup sanitizer that heals corrupt widths.
.appshown as a folder — real app icon, Kind = "Application", launches on double-click (no spurious prompt), enters as a folder on → (configurable).- Sidebar drag no longer moves the window; selecting a row no longer scroll-centers the list; light-mode tile contrast; debounced plugin/EXIF churn.
Changed
- Settings reorganized (General: Theme/Density/Motion; Appearance: the tile system); window enlarged.
xattr -dr com.apple.quarantine /Applications/yafm.app). Notarization lands once an Apple Developer ID cert is set up.
yafm v0.9.4 — Float layout · Visual redesign
Float layout · Visual redesign
Added
- Float layout — unified chrome titlebar; sidebar and panes are floating cards with adaptive light/dark surfaces.
- Phosphor icons + IBM Plex fonts — sidebar/chrome iconography and typography refresh; IBM Plex Mono for file data, IBM Plex Sans for chrome; redesigned settings.
- Accent color picker (Settings ▸ Appearance) and click-to-activate panes.
Fixed
- Column resize cross-pane corruption — both panes wrote the same shared width from their own geometry, resetting columns to default. Now only the left pane drives Name from geometry; first launch fills, later launches clamp instead of stomping; window-shrink overflow spills into Kind.
- Theme appearance single-owner —
NSApp.appearanceapplied through oneAppSettings.applyTheme(). - Chrome color tokens — light/dark surfaces folded into
Theme.Palette. PaneModel.activeinvariant assert; suppressed font/NSAppstartup warnings.
xattr -dr com.apple.quarantine /Applications/yafm.app). Notarization lands once an Apple Developer ID cert is set up.
yafm v0.9.3 — Column resize · Sidebar config · Audit fixes
What's new
Added
- Finder-style column resize — drag handles on the right edge of each column header; name column gets the residual width. Widths persisted across restarts, shared between both panes.
- Sidebar configurability — Settings ▸ General toggles for Favorites, Locations (Computer / Home / iCloud Drive), Devices, Network, Tags sections.
- Adaptive date format — relative ("Yesterday", "2d ago") for recent files, absolute for older; compact on narrow columns.
- Crash-safe last folder — saved on every navigation, not only on scene-phase change.
- Recent server history — Connect to Server (⌘⇧K) remembers last 5 addresses.
- Plugin description field in Settings ▸ Plugins.
- EXIF info plugin expanded: HIF/HEIF multi-image containers, comprehensive field list.
Fixed
readTextbudget isolated per plugin context — one plugin can't exhaust another's quota.iCloudDriveURLrecomputed dynamically — sidebar updates when iCloud is toggled.- Column widths, cursor leak on column disappear, task cancel on navigation, network volume nav history, auto-refresh of bundled plugin JS.
Refactored
AppStateGod Object split intoPluginCoordinator,TagCoordinator,SearchCoordinator(1 467 → 1 062 lines).
Install
Download yafm-0.9.3.dmg, open it, drag yafm to Applications.
Gatekeeper note: the DMG is not notarized (no Apple Developer ID cert yet). On first launch: right-click → Open, then confirm in the dialog — or run
xattr -d com.apple.quarantine /Applications/yafm.app.
v0.9.2 — Plugin API extensions + security hardening
What's new
Plugin API
yafm.openInApp(entry, bundleId)— open any file in a specific app from a plugin. Requirescontribute:actioncapability. Dangerous extensions (.sh,.command,.scpt,.workflow,.pkg, …) prompt the user before opening.yafm.readEXIF(entry)— read EXIF/TIFF metadata (camera, date, dimensions) from image files. Requiresread:exif. GPS intentionally excluded.- Two example plugins seeded on first run (
open-with,exif-info), disabled by default.
UX
- iCloud status indicator — cloud-download icon appears next to files not yet downloaded from iCloud Drive.
- ⌘⇧C → Copy Full Path (was palette/menu only).
- Capability chips in Settings ▸ Plugins now show readable labels (
columns,read EXIF,open apps & clipboard, …).
Security hardening
- C-1:
openInAppguards against executable extensions with a warning alert. - C-2: Plugin file handles scoped per
JSContext— one plugin can't enumerate another's handles. - P1-A: Removed
Trust.signed— no fake "Signed" badge until cryptographic verification ships. - P1-B:
PluginValueCachegeneration token — in-flight async tasks discard stale results on reload. - P2-1: Native
__yafm_*bridges wrapped in IIFE and deleted fromglobalThis. - P2-2:
yafm.readTextcapped at 500 calls per directory view.
Installing
This DMG is unnotarized (no paid Apple Developer account yet). To open on first launch:
- Right-click
yafm.app→ Open → Open, or - System Settings → Privacy & Security → Open Anyway, or
xattr -dr com.apple.quarantine /Applications/yafm.app
Full changelog: CHANGELOG.md
yafm v0.9.1 — Audit pass (perf · security · UX · design)
A sweep through a five-dimension audit — everything actionable, fixed.
Performance
- Per-row work made cheap (cached plugin values / UTType kind / one shared formatter) so cursor moves and sorts don't stutter on big folders.
- O(1) cursor ops (URL→index map) instead of an O(n) scan per keystroke.
Security
- Closed a mid-path symlink escape in the plugin scope; xattr ops use XATTR_NOFOLLOW; Spotlight predicate fully sanitized; archives validate a real local .zip + cap entries; rename rejects path separators / NUL.
UX
- Keyboard multi-select (Insert toggle+advance, ⌘A select-all, Invert) and ⌘-click / ⇧-click mouse multi-select.
- Move to Trash is now the default (F8, recoverable); permanent delete is ⇧F8 / a separate menu item.
- Home / End / PageUp / PageDown cursor jumps; palette lists plugin commands.
Design
- Row icon is density-sized (fixes columns drifting between density modes); columns now line up with the header.
- Removed the stray accent bar that cut across the tab strip; tokenized tag dots, radii, control colors; tag chips wrap.
DMG is unnotarized — first launch: right-click ▸ Open ▸ Open Anyway. 80 Core tests green.
yafm v0.9.0 — 1.0 candidate
Stability + the last extension points. Mostly about making yafm actually live up to its one promise — it never freezes — after real use turned up big folders and drag-and-drop that did exactly that.
Fixed — the never-freeze pillar, for real
- Big folders no longer freeze on open. Listing re-sorted the entire growing partial on every stream batch (O(n²) sort on the main thread). Now it sorts once when complete: measured 1767 ms → 68 ms (26×) for 8 000 files.
- Tag dots no longer cost a syscall per row — they come from the in-memory index in one batch (Downloads opened by reading getxattr for every file before).
- No more beachball on large folders / re-sort — the tag editor was a
.popoveron every row; now one sheet for the table. - Drag between panes is smooth — the drop highlight no longer re-renders the whole list on every hover.
- Delete confirmation keeps focus — Return now confirms instead of opening the file behind the dialog.
Added
- Transformers (bulk-rename rules: lowercase, numbering, space-replace) and custom previewers — the last VISION extension points.
- Plugin API frozen at 1.0 — a 1.x compatibility promise.
- OPS-1 atomic replace — a
.replacecopy now swaps via a temp +replaceItemAt(the original survives a failed copy) and opens outputO_EXCL|O_NOFOLLOW.
Docs
- User Guide now in English and Russian.
Deferred
- Photo Ingest (needs device detection) and a notarized DMG (Developer ID).
DMG is unnotarized — first launch: right-click ▸ Open ▸ Open Anyway. Tests: 80 Core.
yafm v0.8.0 — Make it yours
Extensibility re-opens — safely. Plugins come back with a capability model: declare what you need in a manifest, grant it at enable-time in Settings, get nothing more.
Highlights
- Plugin manifests — a sidecar
<plugin>.jsongives a plugin identity (id/version/apiVersion) and gates every surface beyond a column. A bare.jsstill loads compute-only. - Per-plugin enable/disable in Settings ▸ Plugins, with capabilities listed and a trust badge (Signed / Author / Unsigned).
- Commands & menu items — plugins can add pane-menu commands and row right-click items (capability-gated).
- Scoped file reads (
read:cwd) —yafm.readText(entry, "rel")resolves host-side against the entry's folder, refuses../symlink escape (O_NOFOLLOW), caps at 256 KB, and hands JS an opaque handle, never a path. You consent when enabling — never the plugin. - Flagship Git Branch plugin (reads
.git/HEADvia the capability) ships disabled — enable it to see the flow. - Archive browsing — open a
.zipto browse it read-only like any folder, streamed so a big archive never freezes.
Deferred (with reason)
- Remote marketplace + cryptographic plugin signing — need hosted infra + a signing key/PKI (same blocker class as DMG notarization). The manifest already carries the trust tier + a
signaturefield, so signing slots in later without a format change.
Install
DMG is unnotarized — first launch: right-click ▸ Open ▸ Open Anyway.
Tests: +14 Core → 70 total. Full notes: CHANGELOG.md
yafm v0.7.1 — Russian, in full
Patch: complete Russian localization.
v0.7.0 shipped only a partial ru.lproj, so more than half the interface stayed English when you switched to Русский. This release translates the entire static UI — sidebar sections, every Settings tab, all menus, the command palette, cheat sheet, onboarding, bulk rename, plugin & update panels, and empty/loading states — plus the common interpolated formats. Resolution verified key-by-key.
Set it in Settings ▸ General ▸ Language ▸ Русский (applies after you quit and reopen yafm).
DMG is unnotarized — first launch: right-click ▸ Open ▸ Open Anyway.