Factory Floor
Features
How it works
Changelog
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
show port indicator in sidebar and title bar (
#119
) (
#123
) (
cdb1731
)
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
remove legacy JSON file migration code (
#93
) (
#122
) (
3b5041c
)
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
add Sparkle auto-update (
#39
) (
#80
) (
83acde7
)
website:
mobile screenshot layout and modal viewer (
#74
) (
#78
) (
7cf81e5
)
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
add prek pre-commit hooks (
#82
) (
#83
) (
19f08f3
)
add SwiftFormat hook and update AGENTS.md (
#84
,
#85
) (
#86
) (
8656ea8
)
update versions.json to v0.1.23 (
1f0ef5d
)
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
)