Thanks for wanting to help out. Here's what you need to know.
You'll need macOS 15+ and Xcode with Swift 6. Clone the repo and run:
make buildThat's it. Dependencies are managed through SPM and resolve automatically.
To build and launch in one step:
make dev- Fork the repo and create a branch from
main. - Make your changes.
- Run
make formatto format your code. - Run
make buildand fix any warnings or errors. - Open a pull request against
main.
- No code comments. No inline comments, no doc comments. The code should speak for itself.
- Reuse existing UI components from
Reframed/UI/before creating new ones. The project has its own button styles (OutlineButtonStyle,PrimaryButtonStyle,SecondaryButtonStyle) -- never use.borderless,.plain, or other stock SwiftUI button styles. - Reuse utility functions from
Reframed/Utilities/when they exist. - If a view goes past 200 lines, split it into separate files using Swift extensions.
- Fix root causes. No band-aid fixes or temporary workarounds.
The codebase is organized by concern:
App/-- entry point, permissions, window managementRecording/-- capture pipeline and writersEditor/-- timeline, properties, previewCompositor/-- video composition and exportState/-- app state, config, servicesUI/-- reusable components, toolbar, settingsUtilities/-- extensions and helpers
See CLAUDE.md for a more detailed breakdown.
Everything uses Swift 6 strict concurrency. SessionState lives on @MainActor. Recording coordinators and writers are actors. If you're passing data across isolation boundaries, look at how existing code handles it before inventing a new pattern.
Open an issue with:
- What you did
- What happened
- What you expected
- macOS version and any relevant system info
Screenshots or screen recordings help a lot, especially for UI issues.
Open an issue describing what you want and why. Keep it concrete -- "I want X so I can do Y" is more useful than a vague suggestion.
By contributing, you agree that your contributions will be licensed under the MIT License.