bottleneck
bottleneck copied to clipboard
Code review for AI native teams. Native Electron app for reviewing pull requests dramatically faster than Github web. Specialized for handling reviews for background agents working on multiple concurr...
Bottleneck
Bottleneck is a code review powertool for AI native teams. It's a native Electron app that reproduces the core GitHub PR experience while being dramatically faster and optimized for parallelized background agents like Claude Code, Cursor, Devin, and Codex.
https://github.com/user-attachments/assets/4c71c677-fcf5-4ab8-939c-0b26c579f175
Demo in action: https://screen.studio/share/o6sCO1uS
Features
- ⚡ Lightning Fast - Near-instant navigation, diff rendering, and branch checkout
- 🔄 Smart Sync - Incremental updates via GitHub GraphQL with intelligent caching
- 👥 Bulk Actions - Multi-select PRs for batch operations (merge, close, label, etc.)
- 🏷️ Prefix Grouping - Automatically groups PRs by common prefixes (feat/, fix/, etc.)
- 📝 Monaco Editor - VSCode-powered diff viewer with syntax highlighting
- 💾 Offline Support - SQLite-based local cache for offline access
- ⌨️ Shortcuts for Everything - Comprehensive keyboard shortcuts for power users
Tech Stack
- Electron - Cross-platform desktop app
- React 18 - UI framework with TypeScript
- Monaco Editor - Code diff viewing
- SQLite - Local data persistence
- GitHub API - PR and repository management
- Tailwind CSS - Styling
- Zustand - State management
Getting Started
Prerequisites
- Node.js 18+ and npm
- Git
- GitHub account with appropriate permissions
Installation
- Fork (and star) the repository:
gh repo fork areibman/bottleneck --clone
git remote add upstream https://github.com/areibman/bottleneck.git
cd bottleneck
To fetch updates, run
git fetch upstream
- Install dependencies:
npm install
Important: You must use npm. Bun is known not to work.
- Run in development mode:
npm run dev
- Build for production:
npm run build
npm run dist
Development
Project Structure
bottleneck/
├── src/
│ ├── main/ # Electron main process
│ │ ├── index.ts # Main entry point
│ │ ├── database.ts # SQLite operations
│ │ ├── auth.ts # GitHub OAuth
│ │ └── git.ts # Git operations
│ ├── renderer/ # React app
│ │ ├── components/ # UI components
│ │ ├── views/ # Page views
│ │ ├── stores/ # Zustand stores
│ │ ├── services/ # API services
│ │ └── utils/ # Utilities
│ └── shared/ # Shared types/constants
├── dist/ # Compiled output
└── release/ # Packaged apps
Available Scripts
npm run dev- Start development server with hot reloadnpm run build- Build for productionnpm run dist- Package the app for distributionnpm run electron- Run the built app
React DevTools Profiler
If the React DevTools Profiler tab is missing inside Electron DevTools, walk through the following steps:
-
Update the installer call – In
src/main/index.tsmake sure the React DevTools installation includesallowFileAccess(and optionallyforceDownloadto refresh stale caches):await installExtension(REACT_DEVELOPER_TOOLS, { loadExtensionOptions: { allowFileAccess: true }, forceDownload: true, }); -
Clear the cached extension – Remove the
fmkadmapgofadopljbjfkapdkoienihifolder so Electron downloads the updated bundle on the next run.- macOS:
~/Library/Application Support/Electron/extensions/ - Windows:
%APPDATA%\Electron\extensions\ - Linux:
~/.config/Electron/extensions/
Delete only the React DevTools folder (keep other extensions if you rely on them).
- macOS:
-
Restart the dev environment – Run
npm run dev, open the window, and pressCmd/Ctrl + Option + Ito open DevTools. You should now see both ⚛️ Components and ⚛️ Profiler tabs.
Keyboard Shortcuts
Global
Cmd/Ctrl + B- Toggle sidebarCmd/Ctrl + Shift + B- Toggle right panelCmd/Ctrl + Shift + P- Command paletteCmd/Ctrl + /- Show keyboard shortcuts
Navigation
Cmd/Ctrl + P- Go to PRCmd/Ctrl + T- Go to fileCmd/Ctrl + [- Previous PRCmd/Ctrl + ]- Next PRAlt + Up- Previous fileAlt + Down- Next file
Review
Cmd/Ctrl + Enter- Submit commentCmd/Ctrl + Shift + A- Approve PRCmd/Ctrl + Shift + R- Request changesV- Mark file as viewedD- Toggle diff viewW- Toggle whitespace
Performance
Targets
- PR list render: <300ms from cache, <1.5s cold fetch
- First diff paint: <150ms for typical files
- Handle 1k+ files / 50k+ changed lines smoothly
- 60 FPS scrolling in all views
Optimizations
- Virtualized lists and diff rendering
- Web workers for diff computation
- Incremental syntax highlighting
- Smart caching with ETags
- Concurrent API requests with rate limiting
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
MIT
Acknowledgments
- Built with Electron, React, and Monaco Editor
- Inspired by the need for faster PR reviews
- Optimized for teams using agent-based development