A native macOS application for managing GitHub PR reviews with menu bar integration. Built with Swift and SwiftUI.
- macOS menu bar integration
- View your open PRs across all repositories
- Track review requests assigned to you
- Display days since PRs were marked ready for review
- Display days waiting for review requests
- Dismiss PRs to hide them from the list
- Automatic GitHub authentication via
ghCLI or environment variable - Clean, modern native UI
- macOS 12.0 or later
- Swift toolchain (included with macOS, or install from swift.org)
- Command Line Tools (if not using full Xcode):
xcode-select --install
The easiest way to build and run:
make runThis will build the app, remove quarantine attributes, and launch it automatically.
Build the application:
make buildOr use the build script directly:
cd GitHubReviewManager && ./build.shThe build process:
- Compiles all Swift files using
swiftc - Creates the
.appbundle structure - Copies Info.plist and resources
- Code signs with ad-hoc signature
- Outputs to
GitHubReviewManager/.build/GitHubReviewManager.app
Run the app (builds first if needed):
make runOr open the already-built app:
make openInstall to /Applications:
make installThe app will be available in Applications and Spotlight.
For development, ad-hoc signing is done automatically. For distribution, sign with your Developer ID:
make sign-dist SIGNING_IDENTITY="Developer ID Application: Your Name (TEAM_ID)"Create a distributable DMG:
make dmgThis creates GitHubReviewManager.dmg in the project root. Alternatively, you can distribute the .app bundle directly.
make clean- Remove build artifactsmake check- Check if build existsmake help- Show all available commands
On first launch, macOS may show a security warning. If you see "GitHubReviewManager.app cannot be opened because the developer cannot be verified":
- Right-click the app
- Select "Open"
- Confirm in the dialog that you want to open it
This is normal for apps that aren't notarized by Apple. For distribution, consider using Developer ID signing and notarization.
The app supports two methods for GitHub authentication (in order of preference):
-
GitHub CLI (
gh) - If you have GitHub CLI installed and authenticated:gh auth login
-
Environment Variable - Set a GitHub Personal Access Token:
export GITHUB_TOKEN=your_token_hereOr add it to a
.envfile (make sure it's in.gitignore).
If neither method is available, the app will not be able to fetch PR data.
If using a Personal Access Token, it needs the following scopes:
repo(for private repositories)public_repo(for public repositories)
You can dismiss PRs from the list by clicking the dismiss button. Dismissed PRs are stored locally using UserDefaults and will remain hidden until they are closed or you clear the dismissed list. The dismissed state persists across app launches.
GitHubReviewManager/
├── GitHubReviewManager/ # Swift source code
│ ├── Models/ # Data models (PRSummary, ReviewRequest, etc.)
│ ├── Services/ # Business logic (GitHubService, AuthService, etc.)
│ ├── Views/ # SwiftUI views
│ │ └── Components/ # Reusable UI components
│ ├── Utilities/ # Helper utilities
│ ├── App.swift # App entry point
│ └── AppDelegate.swift # App delegate
├── build.sh # Build script
├── Package.swift # Swift Package Manager manifest
└── README.md # Detailed project documentation
See GitHubReviewManager/README.md for detailed development documentation and GitHubReviewManager/BUILD_WITHOUT_XCODE.md for advanced build options.
MIT