A powerful macOS menu bar application that monitors and reports user activity, including focused applications, window titles, and media playback information.
- Real-time Activity Monitoring: Track focused applications and window titles
- Media Playback Tracking: Monitor currently playing media across the system
- Multiple Integration Options:
- MixSpace integration
- Amazon S3 storage
- Slack notifications
- Privacy-Focused: Configurable filters and mapping rules to protect sensitive information
- Menu Bar Interface: Lightweight, always-accessible menu bar application
- Activity History: SQLite-based local storage with searchable history
- Customizable Reporting: Set reporting intervals and choose which data to track
- macOS 15.0 (Sequoia) or later
- Accessibility permissions for window title access
- Download the latest release from the Releases page
- Open the downloaded
.dmg
file - Drag ProcessReporter to your Applications folder
- Launch ProcessReporter from Applications
On first launch, ProcessReporter will:
- Request accessibility permissions (required for window title access)
- Add itself to the menu bar
- Open the preferences window for initial configuration
Open preferences from the menu bar icon → Preferences (⌘,)
- Enable/Disable Reporting: Toggle activity tracking on/off
- Reporting Interval: Set how often to send reports (default: 60 seconds)
- Track Window Titles: Enable/disable window title collection
- Track Media Info: Enable/disable media playback tracking
- Idle Timeout: Set inactivity threshold (default: 300 seconds)
- Launch at Login: Configure automatic startup
Configure privacy filters to exclude sensitive applications or window titles:
- Navigate to Preferences → Filters
- Add applications to exclude from tracking
- Set up keyword filters for window titles
- Configure regex patterns for advanced filtering
- Go to Preferences → Integrations → MixSpace
- Enter your MixSpace server URL
- Provide API token
- Test connection
- Go to Preferences → Integrations → S3
- Configure:
- AWS Access Key ID
- AWS Secret Access Key
- S3 Bucket Name
- AWS Region
- Test upload
- Go to Preferences → Integrations → Slack
- Add your Slack webhook URL
- Configure notification settings
- Test notification
Create custom mapping rules to transform application or window data:
- Navigate to Preferences → Mapping
- Add rules to rename applications
- Set up window title transformations
- Use regex for pattern-based mappings
- Xcode 15.0 or later
- macOS 15.0 SDK
- Swift 5.9+
- Clone the repository:
git clone https://github.com/yourusername/ProcessReporter.git
cd ProcessReporter
- Open in Xcode:
open ProcessReporter.xcodeproj
- Build and run:
- Select the ProcessReporter scheme
- Press ⌘R to build and run
The project follows a modular architecture:
ProcessReporter/
├── Core/
│ ├── Reporter/ # Main reporting engine
│ ├── Database/ # SQLite persistence
│ ├── MediaInfoManager/ # Media tracking
│ └── Utilities/ # Application monitoring
├── Preferences/ # Settings UI (MVC)
├── Extensions/ # Reporter extensions
└── Resources/ # Assets and configs
To add a new integration:
- Create a new class conforming to
ReporterExtension
:
import Foundation
class MyCustomExtension: ReporterExtension {
var name: String { "My Custom Integration" }
var requireAsync: Bool { true }
func canRun() -> Bool {
// Check if extension is configured
return UserDefaults.standard.bool(forKey: "MyCustomEnabled")
}
func run(data: ReportModel) async throws {
// Implement your integration logic
// This method has a 30-second timeout
}
func runSync(data: ReportModel) throws {
// Optional synchronous implementation
}
}
- Register the extension in
Reporter.swift
:
extensions.append(MyCustomExtension())
- Add preference UI in the Integrations pane
# Create a release build
xcodebuild -project ProcessReporter.xcodeproj \
-scheme ProcessReporter \
-configuration Release \
-archivePath ./build/ProcessReporter.xcarchive \
archive
# Export for distribution
xcodebuild -exportArchive \
-archivePath ./build/ProcessReporter.xcarchive \
-exportPath ./build \
-exportOptionsPlist ExportOptions.plist
struct ReportModel {
let timestamp: Date
let application: ApplicationInfo?
let windowTitle: String?
let mediaInfo: MediaInfo?
let idleTime: TimeInterval
let isIdle: Bool
}
protocol ReporterExtension {
var name: String { get }
var requireAsync: Bool { get }
func canRun() -> Bool
func run(data: ReportModel) async throws
func runSync(data: ReportModel) throws
}
- Ensure accessibility permissions are granted in System Settings → Privacy & Security → Accessibility
- Restart the application after granting permissions
- Check the menu bar icon color (should be green when active)
- Verify integration settings in Preferences
- Check Console.app for error logs
- Test individual integrations using the "Test" button
- Reduce reporting frequency in General settings
- Disable media tracking if not needed
- Check for runaway regex patterns in filters
We welcome contributions! Please follow these guidelines:
- Check existing issues first
- Include macOS version and ProcessReporter version
- Provide steps to reproduce
- Include relevant logs if possible
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature
- Commit changes:
git commit -am 'Add your feature'
- Push to branch:
git push origin feature/your-feature
- Submit a pull request
- Follow Swift API Design Guidelines
- Use SwiftLint for code consistency
- Add tests for new features
- Update documentation as needed
Run tests before submitting:
xcodebuild test -project ProcessReporter.xcodeproj \
-scheme ProcessReporter \
-destination 'platform=macOS'
ProcessReporter takes privacy seriously:
- All data is processed locally by default
- Network communication only occurs with configured integrations
- Window titles can be filtered or disabled entirely
- No telemetry or analytics are collected
- Source code is open for audit
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with Swift and SwiftUI
- Uses RxSwift for reactive programming
- SQLite for local data persistence
- Inspired by productivity tracking needs
- Documentation: Wiki
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: support@processreporter.app
Made with ❤️ for the macOS community