Releases

v0.1.0-alpha.12 recap: smaller polish, bigger trust

alpha.12 is the build that put 'native' through the polish grinder — icon glass rim trimmed, tab close hit-target widened, schema rev'd safely. None of these matter individually. All of them matter together.

Honam Kang5 min read

Most alpha releases don't deserve a blog post. alpha.12 doesn't, individually — it's a dozen small fixes. Together they're the build that quietly tipped mq-dir from "promising but rough" to "I forget I'm using a 0.x." Here's what changed and why each one mattered.

App icon — trimmed the outer glass rim

In Dock and Stage Manager, the previous icon read as a band: the outer edge had a barely-visible glass-rim that, at 32px, looked like a gradient stripe. You wouldn't notice it standalone, but next to other icons in a Dock, it made mq-dir look slightly off.

Trimmed the rim. The icon now reads cleanly at all rendering sizes from 16 to 1024.

Tab close-button hit target

The close × on each tab was a 14×14 px target. We're not 12, but everyone misses it occasionally — especially with trackpad acceleration. Widened the hit target to 22×22 px while keeping the visible glyph the same.

If you don't notice this change, that's the goal.

Column widths persist correctly

A regression introduced in alpha.10: the file-list column widths reset on tab swap. Tracked it down to a @StateObject ownership confusion — when a tab was duplicated, the new tab pulled column widths from the duplicate's source rather than the persisted state.

Fix: column widths now live on TabState (persisted), not on the view model. The view model reads from TabState and writes back on resize. Round-trip stable.

Test: testColumnWidths_persistedAcrossTabDuplicate. Now in CI; won't regress.

You couldn't ⬆/⬇ through the Projects list. Functional but felt unfinished compared to Favorites (which always supported it).

Wired up. Arrow keys in the sidebar now traverse Favorites → Projects → CMUX continuously. ↩ to activate, ⌘↩ to open in a new tab.

Reduce Motion respect for layout transitions

When switching 1 → 4 panes, the new panes used to slide in. With Reduce Motion, the slide stayed; we just made it instant via withAnimation(nil). Bug: that didn't suppress the opacity fade applied by SwiftUI's default transition. Reduce Motion users got an instant-position-but-fading-in pane.

Fix: explicit transition(.identity) when reduce-motion is on. Now genuinely zero motion in that path.

Markdown preview — code-block scroll hijack

GFM code blocks rendered with overflow-x-auto. On trackpad scroll, momentum hit the code block and got captured — the page scroll froze for a second every time you scrolled past code.

Fix: code blocks now have overflow: hidden by default with a "Show all" affordance for genuinely-too-wide content. The overflow case is rare; the scroll hijack was happening to everyone.

Schema bump — added per-tab recursiveSearchHistory

We're keeping recursive-search history per tab. New field. Standard pattern: decodeIfPresent with default [], migration test, version bump. No existing workspaces affected.

What we didn't ship in alpha.12

A backlog snapshot, for honesty:

  • Global search. Still in design. The hard part is the index location — we don't want a stray spotlight-like index file in your home folder. Probably 0.2.
  • Batch rename with preview. Spec'd, not started. 0.2 candidate.
  • Plugin API. Deferred until we ship 0.2 features. We don't want to commit to an API surface while the app is still moving.
  • iCloud preset. No.

Bug fixes (full list)

  • Fix: dock icon glass-rim band (#a3c4d)
  • Fix: tab close hit target widened (#cd9ec9c)
  • Fix: column width regression on tab duplicate (#5d38ba9)
  • Fix: sidebar arrow navigation through Projects (#e39dbc8)
  • Fix: reduce-motion suppresses opacity transition on layout change
  • Fix: markdown code-block scroll capture
  • Fix: leak of URL.startAccessingSecurityScopedResource on tab close
  • Fix: cmux session list refresh after rename
  • Fix: search field clears on Escape (was: cleared on focus loss)
  • Fix: project switch flicker on layout=four
  • Fix: rare crash on initial bookmark resolution with Sandboxed empty container

Performance

Cold launch on M3 MacBook Air: 142 ms (was 168 ms). Saved by deferring the cmux session-list query until the sidebar first paints.

Idle memory on a 4-pane layout with three tabs each: 81 MB resident (was 87 MB). Saved by retiring an internal @Published cache that was holding stale results.

What we learned shipping alpha.12

A retrospective worth recording for the next ship cycle:

  • Polish releases need their own CHANGELOG voice. alpha.10 and alpha.11 wrote up changes the way we'd write them in a code review — terse, technical. alpha.12's changelog explicitly explains why each change matters to a user. The release-notes-as-marketing-collateral framing pulled forward; we'll keep doing it.
  • Reduce-Motion was easy to miss until we tested with it on. Every macOS dev should toggle System Settings → Accessibility → Display → Reduce Motion on for an hour a week. Bugs surface that no automated test catches. This is in our team handbook now.
  • Schema bumps aren't scary if the test pattern is rigid. alpha.12 introduced recursiveSearchHistory per tab. The migration test took longer to write than the field itself — and that's exactly right. The test is the contract; the field is just data.
  • Trackpad scroll behavior is a hidden quality bar. The code-block scroll-hijack bug was reported by exactly one user, but cost us about 4 days of low-grade user friction across testers. The fix shipped in <30 minutes. Lesson: respond to "scroll feels off" reports immediately; they often hide structural problems.

How to upgrade

If you have Sparkle enabled (default), you'll get a sidebar update button within 24 hours. Click to update.

Or:

brew upgrade --cask mq-dir

Or download the DMG from the release page.

What's next

alpha.13 is shaping up to be the last alpha before beta. Themes:

  • Polish on cmux integration: status filtering, session naming.
  • Two more accessibility wins: VoiceOver row-order test pass, larger-text mode improvements.
  • Search backend prep: not the search UI yet, but the indexing layer.

If you found a bug in alpha.12, file it. The early-fix loop is what makes alpha builds work.

Try mq-dir

A native quad-pane macOS file manager — free, no telemetry.

v0.1.0-beta.11 · Universal Binary · 5.3 MB · macOS 14.0+

Download for Mac

Frequently asked questions

alpha.12 is what the maintainers run on their primary Macs daily. We don't ship a build to alpha that we don't trust. That said, 'alpha' means we still expect surprises and reserve the right to do schema migrations that need testing — back up your state.json before each upgrade if you have non-trivial workspace setups.

References

  1. [1]

Ready to try mq-dir?

A native quad-pane file manager built for AI multi-tasking on macOS. Free, MIT licensed, zero telemetry.

v0.1.0-beta.11 · MIT · macOS 14.0+ · download