A macOS desktop app that captures photos from your Mac's camera and uploads them to a configurable HTTP endpoint. Perfect for automated photo capture workflows, time-lapse photography with remote storage, and webhook-based photo integrations.
- Configure HTTP verb (GET, POST, PUT, PATCH, DELETE), URL, and optional note
- Reuse previously configured endpoints from a dropdown
- Live camera preview with real-time feed
- One-click photo capture and upload
- Photos uploaded as multipart/form-data file attachments
- Built-in Mac camera support
- Continuity Camera - use your iPhone as a wireless camera
- Switch between multiple cameras when available
- Automatic camera detection when devices connect/disconnect
- Automated photo capture at configurable intervals
- Supports seconds, minutes, hours, or days
- Live thumbnail preview of latest captured photo
- Upload status tracking with success/failure counts
- Upload history window showing last 100 attempts with full request/response details
- Detailed success/failure reporting
- Full HTTP request and response details for debugging
- Persistent configuration storage across app launches
- macOS 15.5+
- Xcode 26.1+ (with Swift 6) for building
make buildmake testmake ui-testUI tests launch the app in a separate automation runner and require camera permission to be granted in an interactive desktop session.
make qualityPushes and pull requests against main automatically run make build and make test on GitHub Actions (macOS runners) via .github/workflows/macos-ci.yml. The iOS project ships with its own workflow defined in .github/workflows/ios-ci.yml.
- Open
camera2url.xcodeprojin Xcode - Select the
camera2urlscheme - Press ⌘B to build or ⌘R to run
- Press ⌘U to run all tests
camera2url/
├── Models/
│ ├── RequestConfig.swift # HTTP verb, URL, note configuration
│ ├── UploadModels.swift # Upload result types
│ ├── TimerConfig.swift # Timer interval configuration
│ └── TimerUploadRecord.swift # Timer upload history tracking
├── Services/
│ ├── CameraService.swift # AVFoundation camera handling
│ └── UploadService.swift # HTTP multipart upload
├── Stores/
│ └── ConfigStore.swift # UserDefaults persistence
├── ViewModels/
│ └── AppViewModel.swift # Main app state coordination
├── Views/
│ ├── CameraPreviewView.swift # NSViewRepresentable camera preview
│ └── ConfigDialogView.swift # Configuration dialog
├── ContentView.swift # Main app view
└── camera2urlApp.swift # App entry point
The app requires the following permissions (configured in entitlements):
- Camera access (
com.apple.security.device.camera) - to capture photos - Network access (
com.apple.security.network.client) - to upload photos to configured endpoints
Copyright © 2025 Manuel Kießling. All rights reserved.
