Skip to content

Releases: akurach/yafm

v0.9.6.1 — Hotfix

16 Jun 15:16

Choose a tag to compare

Fixed: right-click and drag-drop in empty folders were silently blocked by the "Empty folder" placeholder. Both now work as in non-empty folders.

v0.9.6 — Sidebar collapse · Settings overlay · Sidebar polish

16 Jun 14:45

Choose a tag to compare

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

16 Jun 09:11

Choose a tag to compare

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.
  • .app shown 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.

⚠️ Unnotarized DMG. Gatekeeper blocks it on first open: right-click the app → Open, then Open Anyway (or 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

15 Jun 11:58

Choose a tag to compare

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-ownerNSApp.appearance applied through one AppSettings.applyTheme().
  • Chrome color tokens — light/dark surfaces folded into Theme.Palette.
  • PaneModel.active invariant assert; suppressed font/NSApp startup warnings.

⚠️ Unnotarized DMG. Gatekeeper will block it on first open. Right-click the app → Open, then Open Anyway (or 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

08 Jun 11:53

Choose a tag to compare

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

  • readText budget isolated per plugin context — one plugin can't exhaust another's quota.
  • iCloudDriveURL recomputed 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

  • AppState God Object split into PluginCoordinator, 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

08 Jun 07:10

Choose a tag to compare

What's new

Plugin API

  • yafm.openInApp(entry, bundleId) — open any file in a specific app from a plugin. Requires contribute:action capability. 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. Requires read: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: openInApp guards 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: PluginValueCache generation token — in-flight async tasks discard stale results on reload.
  • P2-1: Native __yafm_* bridges wrapped in IIFE and deleted from globalThis.
  • P2-2: yafm.readText capped 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.appOpenOpen, 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)

05 Jun 19:06

Choose a tag to compare

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

05 Jun 18:19

Choose a tag to compare

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 .popover on 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 .replace copy now swaps via a temp + replaceItemAt (the original survives a failed copy) and opens output O_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

05 Jun 17:51

Choose a tag to compare

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>.json gives a plugin identity (id/version/apiVersion) and gates every surface beyond a column. A bare .js still 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/HEAD via the capability) ships disabled — enable it to see the flow.
  • Archive browsing — open a .zip to 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 signature field, 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

05 Jun 17:34

Choose a tag to compare

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.