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.
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.
Sidebar — keyboard navigation in Projects
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.startAccessingSecurityScopedResourceon 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
recursiveSearchHistoryper 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.
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 MacFrequently asked questions
References
- [1]
Ready to try mq-dir?
A native quad-pane file manager built for AI multi-tasking on macOS. Free, MIT licensed, zero telemetry.
Related posts
The road to v0.2.0: search, batch ops, and a careful step toward plugins
v0.1 shipped. Here's what we're working on for v0.2 — and why we're deliberately not shipping AI features inside the app, despite the obvious temptation.
mq-dir v0.1.0: launch notes
First public release of mq-dir — what's in it, what isn't, and the design decisions behind both.