https://github.com/coder/pulldash
Review pull requests in a high-performance UI, driven by keybinds.
https://github.com/coder/pulldash
code-review performance pr-review
Last synced: 10 days ago
JSON representation
Review pull requests in a high-performance UI, driven by keybinds.
- Host: GitHub
- URL: https://github.com/coder/pulldash
- Owner: coder
- License: agpl-3.0
- Created: 2025-12-02T00:52:35.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2026-01-05T13:52:41.000Z (7 months ago)
- Last Synced: 2026-06-02T14:07:41.317Z (about 2 months ago)
- Topics: code-review, performance, pr-review
- Language: TypeScript
- Homepage: https://pulldash.com
- Size: 1.6 MB
- Stars: 110
- Watchers: 0
- Forks: 5
- Open Issues: 14
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Agents: AGENTS.md
Awesome Lists containing this project
README
Pulldash
  
Fast, filterable PR review. Entirely client-side.
> [!WARNING]
> Pulldash is WIP. Expect bugs.
## Try It
**Browser**: [pulldash.com](https://pulldash.com). Replace `github.com` with `pulldash.com` in any PR URL.
**Desktop**: [Latest release](https://github.com/coder/pulldash/releases) for Linux, macOS, Windows.
[](https://pulldash.com)
## Features
- **Custom filters**: Add repos and filter by review requests, authored PRs, or all activity.

- **Keyboard-driven**: `j`/`k` to navigate files, arrows for lines, `c` to comment, `s` to submit.

- **Fast file search**: `Ctrl+K` to fuzzy-find across hundreds of changed files.

## Why
- GitHub's review UI is slow (especially for large diffs)
- No central view to filter PRs you care about
- AI tooling has produced more PRs than ever before—making a snappy review UI essential
## How It Works
GitHub's API supports [CORS](https://docs.github.com/en/rest/using-the-rest-api/using-cors-and-jsonp-to-make-cross-origin-requests), so Pulldash runs entirely client-side. No backend proxying your requests.
- **Web Worker pool**: Diff parsing and syntax highlighting run in workers sized to `navigator.hardwareConcurrency`. The main thread stays free for scrolling.
- **Pre-computed navigation**: When a diff loads, we index all navigable lines. Arrow keys are O(1)—no DOM queries.
- **External store**: State lives outside React ([`useSyncExternalStore`](https://react.dev/reference/react/useSyncExternalStore)). Focusing line 5000 doesn't re-render the file tree.
- **Virtualized rendering**: Diffs, file lists, and the command palette only render visible rows.
## Development
```bash
bun install
bun dev
```
## License
[AGPL](./LICENSE)