Thank you for your interest in contributing to Factory Floor! This document covers the basics of how to get started.
- macOS 14.0+
- Xcode 16+
- XcodeGen (
brew install xcodegen) - Ghostty submodule initialized (
git submodule update --init)
xcodegen generate # Generate the Xcode project from project.yml
./scripts/dev.sh build # Debug build
./scripts/dev.sh br # Build and run
./scripts/dev.sh test # Run testsDo not edit FactoryFloor.xcodeproj directly. It is generated from project.yml.
Sources/Models/- Data models, git operations, tmux, app constantsSources/Terminal/- Ghostty integration (TerminalApp singleton, TerminalView)Sources/Views/- SwiftUI views (sidebar, settings, workspace, browser)Localization/- Localized strings (en, ca, es, sv)Resources/- Entitlements, assets, bridging headerwebsite/- Hugo + Tailwind CSS site for factory-floor.com
Open an issue with:
- Steps to reproduce
- Expected vs actual behavior
- macOS version and app version
Open an issue describing the use case, not just the solution. Context about why helps us evaluate and prioritize.
- Fork the repository and create a feature branch (
feat/description,fix/description) - Follow the existing code style and conventions (see
CLAUDE.mdfor details) - Use Conventional Commits for commit messages
- Add localized strings in all 4 languages (en, ca, es, sv) for any new user-facing text
- Make sure
./scripts/dev.sh buildand./scripts/dev.sh testpass - Open a PR against
main
Factory Floor is localized in English, Catalan, Spanish, and Swedish. You can contribute translations for both the app and the website.
See docs/TRANSLATING.md for the full guide, including how to improve existing translations, add new languages, and avoid common pitfalls.
The website uses Hugo with Tailwind CSS. To build locally:
cd website
hugo server- Use
AppConstants.appIDandAppConstants.appName, not hardcoded strings - Use "directory" not "folder" in all user-facing text
- Use "Coding Agent" for the Claude terminal tab
- Use "workstream" for sub-units of a project
- All code files start with a 2-line
// ABOUTME:comment explaining what the file does
See CLAUDE.md for the full set of project conventions.
By contributing, you agree that your contributions will be licensed under the MIT License.