- macOS 14.0+ (Sonoma)
- Xcode 15+ with Swift 5.9
- No additional tools or package managers required
# Clone the repository
git clone https://github.com/umutkeltek/OpenShot.git
cd OpenShot
# Open in Xcode
open OpenShot.xcodeproj
# Or build from command line
make build- Build and run (Cmd+R in Xcode)
- macOS will prompt for Screen Recording permission — grant it
- The app appears in the menu bar (camera icon) — there is no dock icon
- If you don't see the menu bar icon, check System Settings > Privacy & Security > Screen Recording
OpenShot/
├── OpenShot/ # Main app source
│ ├── App/ # Entry point, menu bar, permissions
│ ├── Capture/ # Screenshot engine and modes
│ ├── Annotation/ # Drawing canvas and tools
│ ├── Recording/ # Screen recording, GIF, webcam
│ ├── Overlay/ # Quick access overlay, floating pins
│ ├── OCR/ # Vision text recognition
│ ├── History/ # SwiftData capture log
│ ├── Settings/ # Preferences and hotkeys
│ ├── Utilities/ # Shared helpers and extensions
│ └── Resources/ # Plist, entitlements, assets
├── OpenShotTests/ # Unit tests
├── OpenShot.xcodeproj/ # Xcode project
├── project.yml # XcodeGen config (optional)
└── docs/ # Documentation
See ARCHITECTURE.md for detailed module descriptions.
Open OpenShot.xcodeproj, select the OpenShot scheme, and press Cmd+R.
# Build debug
make build
# Build release
make release
# Clean build artifacts
make cleanThe project.yml file can regenerate the Xcode project if needed:
brew install xcodegen
xcodegen generate# Run all tests
make test
# Run tests in Xcode
# Cmd+U or Product > TestTests use the Swift Testing framework (not XCTest). Test files are in OpenShotTests/.
- Place tests in
OpenShotTests/following the naming pattern*Tests.swift - Use
@Testand#expect()from Swift Testing - Focus on testable logic (preferences, file naming, image processing)
- UI and capture code requires Screen Recording permission and is harder to unit test
OpenShot uses os.Logger for structured logging. View logs in:
- Console.app — Filter by process "OpenShot" or subsystem
- Xcode console — Logs appear during debug sessions
"Screen Recording permission not granted"
- System Settings > Privacy & Security > Screen Recording > Enable OpenShot
- You may need to restart the app after granting permission
"Menu bar icon doesn't appear"
- The app is an
LSUIElementagent — it only shows in the menu bar, not the dock - Check if another menu bar app is hiding it (Bartender, Hidden Bar, etc.)
"Hotkeys don't work"
- System Settings > Privacy & Security > Accessibility > Enable OpenShot
- Check for conflicts with other apps using the same shortcuts
"Build fails with signing errors"
- Open Xcode project settings, set Team to your Apple Developer account
- For local development, "Sign to Run Locally" works fine
- Swift naming — Follow standard Swift API Design Guidelines
@MainActor— All UI and capture codeasync/await— Preferred over completion handlers- No external dependencies — Use only Apple frameworks
- Modules are self-contained — Each directory handles one concern
- Create a feature branch:
git checkout -b feature/my-change - Make focused changes — one concern per branch
- Test on macOS 14+
- Follow Conventional Commits for messages
- Open a PR against
main
See CONTRIBUTING.md for full contribution guidelines.