Thanks for considering a contribution! SimulatorCamera is small and opinionated — we keep it that way.
- No private APIs. Ever. Every symbol we import must be public and documented in Apple's SDK.
- Zero SDK. Consuming iOS apps must never need to import, link, or configure anything. If a change would require app-side code, it's the wrong change.
- The extension is the product.
SimulatorCameraExtensionmust keep serving frames when the container app quits. Don't move state into the app that the extension needs. - XPC contract is a contract. Changes to
Shared/XPCContract.swiftaffect the app, the extension, andsimcamctlsimultaneously — update all three and note it in the CHANGELOG.
Requires macOS 14+, Xcode 16+, and XcodeGen
(brew install xcodegen).
git clone https://github.com/dautovri/SimulatorCamera.git
cd SimulatorCamera
xcodegen generate # regenerate .xcodeproj from project.yml
open SimulatorCamera.xcodeprojThere is no Swift Package — swift build / swift test do not work
here. System extensions cannot be built by SwiftPM, so the project is
Xcode-managed via project.yml. Edit project.yml, not the .xcodeproj.
Testing a locally-built extension requires it to be signed and run from
/Applications — macOS refuses to activate system extensions from
arbitrary locations. See scripts/build-signed-dev.sh
and enable developer mode:
systemextensionsctl developer on- Branch off
main. - Keep PRs small and focused. One feature / bug per PR.
- Run
swiftformat .andswiftlintbefore pushing (configs in the repo root). - Update CHANGELOG.md under
[Unreleased].
Use the issue templates. For bugs, include:
- macOS + Xcode + iOS Simulator versions
- Output of
simcamctl statusandsystemextensionsctl list - Whether the extension was approved in System Settings → General → Login Items & Extensions
- Console /
os_logoutput from both the app and the extension
Be decent. We follow the Contributor Covenant.