Changelog

Release history for Factory Floor

0.1.40 (2026-03-19)

Features

  • website: add llms.txt for AI crawler discovery (#156) (1e4fcc2)

Bug Fixes

  • use heap-allocated C strings for ghostty env vars (#159) (3c66311)

Performance

  • share SPM package cache across worktrees (#158) (e531a5a)

0.1.39 (2026-03-19)

CI/CD

  • fix build warnings and improve CI caching (#154) (1c2db0b)

0.1.38 (2026-03-19)

Bug Fixes

  • ci: prevent premature website deploy during releases (#145) (dd2967c)
  • host appcast on website to avoid Sparkle update race condition (#149) (5984c50)
  • replace blocking runModal calls with async alternatives (#148) (a0d7e73)

Refactoring

  • ci: embed Sparkle public key in project.yml (#147) (6465fb7)
  • ci: embed Sparkle public key in project.yml (#147) (f7870fa)

0.1.37 (2026-03-19)

Bug Fixes

  • wrap preloaded setup script in login shell (#143) (a263d35)

0.1.36 (2026-03-19)

Refactoring

  • generate Info.plist via XcodeGen and versions.json at deploy time (#141) (c1d624b)

Miscellaneous

  • update versions.json to v0.1.35 (4e0a3ac)

0.1.35 (2026-03-19)

Bug Fixes

  • correct TmuxSessionTests assertions to match actual output (#138) (76dbb87), closes #137

Miscellaneous

  • update versions.json to v0.1.34 (4b58179)

0.1.34 (2026-03-19)

Bug Fixes

  • run setup/run/teardown scripts in user’s login shell (#135) (b9d8340)

Miscellaneous

  • update versions.json to v0.1.33 (27ea914)

0.1.33 (2026-03-19)

Bug Fixes

  • ci: make dSYM upload non-blocking for releases (#133) (e73b829)

0.1.32 (2026-03-19)

Bug Fixes

  • upload dSYMs to Sentry so crash reports are symbolicated (#131) (7f4f2b9)

Miscellaneous

  • update versions.json to v0.1.31 (5b0cbbe)

0.1.31 (2026-03-19)

Bug Fixes

  • align CFBundleVersion with semver so Sparkle detects updates (#129) (0bcb0aa)

Miscellaneous

  • update versions.json to v0.1.30 (a319936)

0.1.30 (2026-03-19)

Features

  • display app version on welcome screen and centralize version access (#125) (85d8856)
  • resolve git worktree paths to main repository when adding projects (#127) (780f26d)

Miscellaneous

  • update versions.json to v0.1.29 (4649027)

0.1.29 (2026-03-18)

Features

Bug Fixes

  • set run-state files to 0600 and directories to 0700 (#97) (#121) (8009d0d)
  • show spinner when environment pane is restarting (#89) (#120) (7bc3fc3)

Refactoring

Miscellaneous

  • update versions.json to v0.1.28 (1507e37)

0.1.28 (2026-03-18)

Bug Fixes

  • don’t double-escape tmux command argument (#115) (91aad5e)

Miscellaneous

  • update versions.json to v0.1.27 (2daee40)

0.1.27 (2026-03-18)

Bug Fixes

  • flatten tmux command to single sh -c level, eliminate nested escaping (#114) (c42631f)

Miscellaneous

  • update versions.json to v0.1.26 (0776e67)

Documentation

  • add hybrid adoption strategy to SwiftGitX analysis (#112) (668b3cd)
  • add SwiftGitX feasibility analysis (#110) (2970473)

0.1.26 (2026-03-18)

Bug Fixes

  • ci: add –options=runtime to framework re-signing step (#108) (5dcb866)

0.1.25 (2026-03-18)

Bug Fixes

  • remove stale baseDirectory argument from MarkdownContentView call (#106) (1758aba)

0.1.24 (2026-03-18)

Features

Bug Fixes

  • async worktree creation with loading spinner (#92, #87) (#101) (a0d8580)
  • double-quote tmux -e values to handle spaces and special chars (#94) (#104) (a31a676)
  • localize all user-facing strings in alerts and prune UI (#88) (#103) (4fabdb0)
  • require user consent for factoryfloor:// URL scheme (#98) (#102) (cfb2e77)
  • strip raw HTML from markdown rendering, remove file:// base URL (#95) (#99) (5c4dce5)

Refactoring

  • move run-state and tmux.conf to ~/Library/Caches/factoryfloor/ (#75) (#76) (a1de232)

Miscellaneous

Documentation

  • add SwiftGit2 feasibility analysis (recommendation: don’t adopt) (#105) (38fce35)
  • document ProjectList ObservableObject audit results (#91) (#100) (b38e2b7)

0.1.23 (2026-03-18)

Bug Fixes

  • migrate project storage from JSON files to UserDefaults (#70) (9a86fa5), closes #46
  • migrate project storage from JSON files to UserDefaults (#72) (4a88ebe), closes #46

Miscellaneous

  • update versions.json to v0.1.22 (51075bb)

Documentation

  • add Sparkle scoping doc; fix(website): native changelog rendering (#41) (#73) (ee9805b)

0.1.22 (2026-03-18)

Bug Fixes

  • remove double shell-escaping of tmux -e env flags (#64) (be08aa4)

Miscellaneous

  • update versions.json to v0.1.21 (db0a820)

0.1.21 (2026-03-18)

Bug Fixes

  • ci: match local and CI build environments (#59), add SPM cache path (#38) (#60) (771dc21)
  • use ObservableObject for projects to fix Release @State timing (#43) (#63) (c0568c8)

Miscellaneous

  • update versions.json to v0.1.20 (88939d1)

Documentation

  • add release command to build instructions (#62) (4ed8099)

0.1.20 (2026-03-18)

Bug Fixes

  • use notifications for project/workstream creation (#43) (#57) (75ed058)

Miscellaneous

  • update versions.json to v0.1.19 (0aed24f)

0.1.19 (2026-03-18)

Bug Fixes

  • delay selection after projects mutation to ensure SwiftUI commits (#43) (#55) (ef451ff)

Miscellaneous

  • update versions.json to v0.1.18 (5297fc7)

0.1.18 (2026-03-18)

Bug Fixes

  • use atomic callbacks for project and workstream creation (#43) (#53) (080bcb2)

Miscellaneous

  • update versions.json to v0.1.17 (65042c2)

0.1.17 (2026-03-18)

Bug Fixes

  • ci: add actions:write permission for website deploy trigger (#50) (272903b)
  • defer workstream selection to let @Binding propagate (#43) (#52) (d687430)

Miscellaneous

  • update versions.json to v0.1.16 (ff602af)

0.1.16 (2026-03-17)

Bug Fixes

  • use os_log Logger with public privacy for debug logging (#43) (#49) (467d749)
  • website: add brew update to upgrade instructions, trigger deploy after release (#47) (385f085), closes #40 #42

Miscellaneous

  • update versions.json to v0.1.15 (e898537)

0.1.15 (2026-03-17)

Bug Fixes

  • add comprehensive debug logging for workspace creation (#43) (#44) (9e52aa1)

Miscellaneous

  • update versions.json to v0.1.14 (b4c06bc)

0.1.14 (2026-03-17)

Bug Fixes

  • ci: use correct xcodegen-action version tag (1.2.4, no v prefix) (#36) (70e79a6)

0.1.13 (2026-03-17)

Bug Fixes

  • ci: use correct xcodegen action (xavierLowmiller/xcodegen-action) (#34) (abfcac3)

0.1.12 (2026-03-17)

Bug Fixes

  • ci: correct xcodegen setup action name (#32) (a70ef8a)

0.1.11 (2026-03-17)

Performance

  • ci: replace brew with dedicated setup actions for zig and xcodegen (#30) (d438aaf)

0.1.10 (2026-03-17)

Performance

  • ci: cache ghostty xcframework between builds (#26) (1d51987)
  • ci: cache SPM packages between builds (#29) (960b037)

Miscellaneous

  • deps: update actions/cache action to v5 (#27) (c506297)

0.1.9 (2026-03-17)

Bug Fixes

  • pass env vars to tmux sessions via -e flags (#24) (596f731)

0.1.8 (2026-03-17)

Features

  • website: add changelog page with timeline layout (#20) (d0b38e5)

Bug Fixes

  • ci: remove –deep from app re-signing, add debug logging (#23) (d298fb8)
  • let release-please bump version in Info.plist (#22) (1624a40)

Miscellaneous

  • update versions.json to v0.1.7 (7a67bf2)

0.1.7 (2026-03-17)

Bug Fixes

  • resolve workspace creation failure in production builds (#18) (ece00ab)

Miscellaneous

  • update versions.json to v0.1.6 (b0acea2)

0.1.6 (2026-03-17)

Bug Fixes

  • ci: enable hardened runtime and secure timestamps for notarization (#16) (5f52d57)

0.1.5 (2026-03-17)

Bug Fixes

  • ci: fetch Apple notarization log on failure (#14) (7fc381e)

0.1.4 (2026-03-17)

Bug Fixes

  • ci: skip ghostty app bundle build, only emit xcframework (#12) (c5844b3)

0.1.3 (2026-03-17)

Bug Fixes

  • ci: build ghostty xcframework before release build (#10) (f7be824)

0.1.2 (2026-03-17)

Bug Fixes

  • resolve CI build failure and ff-run notarization (#8) (4e74409)

0.1.1 (2026-03-17)

Features

  • add accessibility labels to all interactive elements (8fc8b9e)
  • add copy-branch-name button in workstream info header (017ea45)
  • add doc tabs (README, CLAUDE, AGENTS) to project overview page (41513e3)
  • add Environment tab with setup/run script terminals (da14cfa)
  • add GitHub Sponsors and Buy Me a Coffee funding options (3da86a5)
  • add keyboard shortcuts for Rebuild (⌃⇧S) and Start/Rerun (⌃⇧R) (9d04703)
  • add onboarding view with prerequisites and getting started guide (6b5b09c)
  • add run-script port detection (360e453)
  • add scripts/dev.sh for development workflow (c0be015)
  • add Sentry crash reporting, update privacy policy (5a2f954)
  • add setting to disable quit confirmation (9fb2579)
  • add sponsor message to ff CLI (~1 in 5 runs) (2cf4428)
  • add update checker with sidebar notification badge (21df890)
  • automate versions.json update in release workflow (a5bfb02)
  • bundle ff CLI script in app resources (c03257b)
  • change workstream navigation to Cmd+Shift+1-9 (eae8d6a)
  • confirm before quit when workstreams are active (ab43577)
  • debug builds use separate identity from release (23b0d22)
  • debug icon with orange band, tmux config in .config dir (cd5d0e7)
  • notify user when project directories are removed from disk (e5e6238)
  • preload agent and environment terminals in background on workstream open (ff8dd2e)
  • replace MarkdownView with cmark-gfm WKWebView renderer (3eb7380)
  • restore workspace tab state (493facb)
  • separate URL scheme and CLI for debug builds (ed97fc6)
  • show “Run gh auth login” hint when gh is installed but not authenticated (a224535)
  • show install prompt when Claude Code is not found (49be786)
  • show page title in browser tab label (f1f954d)
  • show project icon in workstream info header if found (5ad1966)
  • show running command in terminal tab label (895b6b6)
  • website: add favicon, OG image, and SEO meta tags (eb71e2a)
  • website: add privacy policy page in 4 languages (6c60735)
  • website: add versions.json and /get page for update notifications (0e9889d)
  • website: replace OG image with branded banner (4c45058)
  • website: replace terminal simulation with real app screenshots (93cef2f)

Bug Fixes

  • add Cmd+E to help view, align Claude install URLs, remove dead code (ba61ffa)
  • add missing localization strings for Settings, HelpView, BrowserView, ProjectOverview (489a7b8)
  • address security audit findings (13e846f)
  • avoid worktree path collision for / vs - in names (36ec6d5)
  • browser retry hint, dead retryBrowser notification, settings persistence (0e2e439)
  • change workstream shortcuts to Ctrl+1-9 (Cmd+Shift collides with screenshots) (c90bb91)
  • correct embedded terminal selection coordinates (80a72db)
  • disable wait-after-command, fix restart, add favicon sizes (a0ecbb9)
  • dispatch surfaceRegistry deinit removal to main thread (e09edd3)
  • drop redundant .atomic option in FilePersistence (e95b36b)
  • eliminate AppleScript command injection in openInTerminal (82df6f2)
  • explicitly free ghostty surface on restart to prevent launch failures (a489892)
  • hide CLI install when already correctly installed (1b1c7a1)
  • improve worktree creation error message clarity (3db0f24)
  • improve worktree creation error message with specific failure reasons (b85d39a)
  • isolate test config storage from app roster (e95916c)
  • localize all remaining hardcoded strings (a611245)
  • make wait_after_command per-surface, restore agent respawn (14689b3)
  • mention all config formats in environment tab instructions (743ac36)
  • move ghostty callbacks out of main actor init (a0ec131)
  • normalize detached HEAD branch name to nil (339917f)
  • pin third-party CI actions to commit SHAs (aebdb70)
  • pretty-print JSON config files for readability (72092b2)
  • prevent env scripts from respawning, add help view links (6001cec)
  • prevent git flag injection via names starting with dash (8804fab)
  • prevent shell injection in TmuxSession.wrapCommand (b9a26c2)
  • prevent surfaceRegistry use-after-free and Cmd+W monitor accumulation (b681cd4)
  • proc_listchildpids returns count not bytes, add Stop button (70f24b3)
  • propagate errors from FilePersistence.writeAtomically instead of swallowing (7bbea7f)
  • rebuild cached claude command when workstreamName changes (b0be7e0)
  • remove .factoryfloor/config.json, fix website i18n and nav (79d9776)
  • remove cat workaround, fix env script restart timing (e98cd5b)
  • remove hard cap on surface cleanup in removeWorkstreamSurfaces (5ea7ea2)
  • remove redundant codesign –deep –force on .app bundle (f44028c)
  • remove wait_after_command override, let ghostty use its default (3610a86)
  • rename “Projects Removed” alert to “Projects Not Found” and use comma-separated list (0d09a84)
  • replace favicon PNGs with alltuner icons, kill tmux on restart (af7adc9)
  • replace predictable /tmp filenames with shell variables in CI (102b3fc)
  • resolve relative image paths in markdown info view (21807de)
  • restore keyboard focus rings on browser nav buttons (e22b4b9)
  • restore native mouse behavior in tmux terminals (a455855)
  • restore tmux environment sessions (d606c1d)
  • revert CI action SHA pinning to version tags, fix deinit deadlock (5027aa2)
  • rewrite website translations as native copywriting (c3af758)
  • scope CI permissions per job for least privilege (2711fae)
  • show alert when adding workstream to non-git directory (b3356dd)
  • show error dialog when ghostty fails to initialize (991214b)
  • show error when worktree creation fails (1af1cce)
  • show pointer cursor on sidebar bottom buttons (a185708)
  • sidebar bottom bar always visible, not clipped by drop zone (13c057b)
  • sign bundled ff-run and stabilize project identity (aa2d863)
  • skip doc tabs for markdown files smaller than 20 bytes (4e406c6)
  • sleep after env script exits instead of returning to shell (bb147b2)
  • split tmux/non-tmux env terminal approach, fix rebuild loop (cc5ee14)
  • stop swallowing Gatekeeper failures in release script (7c8b5e5)
  • surface cleanup now covers all prefixes and generation numbers (eeb3dba)
  • swap env shortcuts (Rebuild ⌃⇧R, Start/Rerun ⌃⇧S) (8efc198)
  • translation audit across all 4 languages (0c8c10c)
  • update Buy Me a Coffee URL to alltuner account (856b7fb)
  • use cat to keep env terminals open, add Rebuild/Rerun/Start labels (32286f5)
  • use initialInput for all env terminals, fix tmux restart loop (1e3b3cf)
  • use initialInput instead of command for env scripts (d7c70c9)
  • use keychain profile for CI notarization instead of CLI password (115050a)
  • use smaller font and colon in gh auth login hint (9dfde67)
  • validate .env symlink source and fix derivedUUID comment (4a79d74)
  • website: add –cask to brew install commands (efed35e)
  • website: add Claude Code link in features, enable HTML in descriptions (8cdbdee)
  • website: add Claude Code link in hero text, add tmux to credits (822e712)
  • website: add copy-to-clipboard visual feedback on /get page (6fef3b6)
  • website: add upgrade command to /get page (1da011a)
  • website: adjust skyline spacing (more top margin, less bottom gap) (77f0a19)
  • website: clarify that Claude Code sends code to Anthropic’s API (ae8d649)
  • website: compact footer and add sponsor link (7cc5961)
  • website: fix hreflang x-default, add privacy link, localize sponsor link (781f0ac)
  • website: localize page titles, simplify config section (e5e673e)
  • website: regenerate favicons from hi-res 1024x1024 source (bab5c34)
  • website: reorder sponsor page, financial support first (ddd02d1)
  • website: sponsor page sections, ghostty URL, remove duplicate credit (9966a76)
  • website: tighten skyline viewBox to match terminal preview width (5fb9fb5)
  • website: translate sponsor page to all 4 languages (9b906f3)
  • website: translate sponsor page to all 4 languages (2573ebd)
  • website: update built CSS (f4a0153)
  • website: update favicons from alltuner.com (cec8a2d)
  • website: update OG image to correct dimensions (1669x630) (72c3caf)
  • website: update OG image to standard 1200x630 dimensions (e9100dc)
  • website: update stylesheet (4b75d80)
  • website: use descriptive homepage title for SEO (77088bb)
  • website: use proper hero title for CA/ES (e8e3ea5)

Refactoring

  • consolidate duplicated performArchive into shared function (68b6885)
  • extract abbreviatePath into shared String extension (5dcf9a4)
  • move derivedUUID to PathUtilities (7035f33)
  • move persistence from UserDefaults to JSON files (d79a80b)
  • move retroactive Identifiable conformances to PathUtilities (12f47a7)
  • remove dead code and misleading async (089ab29)
  • remove emdash/conductor/superset config compatibility (ddcb924)
  • remove emdash/conductor/superset, make run script on-demand (c2272c7)
  • remove redundant objectWillChange handler for cachedClaudeCommand (6a41461)
  • rename bridging header, pin ghostty v1.3.1, modernize project (c78270c)
  • website: remove dead HTML content from homepage (5e8f015)

Performance

  • cache projectIndex/workstreamIndex in ProjectSidebar (b275ffa)
  • consolidate polling timers (4e816e1)
  • occlude non-visible terminal surfaces to save GPU (e1cf600)
  • parallelize git subprocess calls in refreshPathValidity (63671ba)

Miscellaneous

  • add OG banner design to future TODO (07fea3c)
  • clean up TODO list (7caf9ad)
  • clean up TODO, deduplicate, record terminal lifecycle fixes (c1ab179)
  • consolidate TODO list, mark completed items (ff0a2b2)
  • deps: update actions/checkout action to v6 (#6) (c9ea157)
  • deps: update dependency macos to v15 (#7) (67754f9)
  • enable strict concurrency checks (4b95cbe)
  • flip project to swift 6 (bf0c227)
  • increase CLI sponsor message frequency to 1 in 2 runs (9740718)
  • mark CI scoping, onboarding, and persistence migration as done (5923068)
  • mark completed items in TODO (e3fbc45)
  • mark completed TODO items from latest parallel batch (e467b93)
  • mark completed TODO items from parallel agent work (689a334)
  • mark Homebrew tap as done in TODO (a10ff74)
  • mark port detection as implemented, update TODO (7f530be)
  • mark projectIndex caching as done (b911cb7)
  • mark round 2 fixes done, add release routine documentation task (9b6457e)
  • mark round 2/3 UX and website fixes as done (2435d54)
  • move distribution and release docs to pre-release (6658477)
  • remove node_modules from repo, add to .gitignore (6753168)
  • triage TODO for pre-release push (eda0c40)
  • update style (3b1b9fa)
  • update todo (77bbdcf)
  • update TODO with round 2 fixes and new planning tasks (94514db)
  • update TODO, remove stale config.json reference (805e3f1)

Documentation

  • add CONTRIBUTING.md and CODE_OF_CONDUCT.md (ae5694f)
  • add credits section to README and update TODO (24aa040)
  • add distribution and auto-update strategy (1e33fdf)
  • add remaining audit findings to TODO (e8381bb)
  • add round 2 audit findings to TODO (7e5d8e2)
  • add slow background polling fallback for port detection (37a9cec)
  • add support section to README (f75de3d)
  • add Swift 6 strict concurrency migration plan (97193fd)
  • clarify ff-run crash recovery (user hits Rerun, no special handling) (78cffae)
  • comprehensive TODO from security and architecture audit (a2032da)
  • comprehensive TODO rewrite, add missing items (275f839)
  • consolidate distribution docs (9678046)
  • consolidate port detection into final implementation plan (3f351c4)
  • fix README install/upgrade instructions, update CLAUDE.md (8286c99)
  • recommend public_repo scope for HOMEBREW_TAP_TOKEN (36fc5c5)
  • remove port detection disable setting question (not needed) (3f1757b)
  • rename CLAUDE.md to AGENTS.md, update README and TODO (26dd2ad)
  • scope crash reporting options and implementation plan (e19d437)
  • scope port detection for run scripts (bd49c43)
  • update distribution.md with current CI workflow and release routine (a7bb738)
  • update README, AGENTS.md, website, TODO for port detection (5e63d17)
  • update shortcuts in README and CLAUDE.md (c92817e)
  • use FSEvents instead of polling for port detection state (2510b6f)

CI/CD

  • add weekly Ghostty compatibility test workflow (6ab12f6)
  • automate build, sign, notarize, DMG, and release upload (ac60ae1)