Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
d2d8e9c
chore: refresh bun.lock integrity hash
tskimmett Aug 25, 2026
3e1e0d2
docs: add semantic review spec
tskimmett Aug 25, 2026
90478bb
feat: add hide-test-files toggle to file panel
tskimmett Aug 25, 2026
9145747
feat: add semantic review data model, validation, and coverage reconc…
tskimmett Aug 25, 2026
40c7362
feat: add semantic review local server (providers, jobs, cache, SSE r…
tskimmett Aug 25, 2026
b180404
feat: add semantic review browser state and trigger button
tskimmett Aug 25, 2026
5e1212f
feat: add semantic review mode UI (cohort/layer nav, layer bar, keybo…
tskimmett Aug 25, 2026
9df8a86
feat: add lazy-loaded mermaid diagrams to semantic layers
tskimmett Aug 25, 2026
89078c5
fix: black screen from wrong entry chunk in split builds
tskimmett Aug 25, 2026
656675e
refactor: use @openai/codex-sdk for the Codex provider
tskimmett Aug 25, 2026
2c9ee36
fix: keep semantic analysis prompts inside provider context windows
tskimmett Aug 25, 2026
603ce85
feat: map-reduce analysis for PRs too large for one prompt
tskimmett Aug 25, 2026
c77e852
fix: recognize .unit.* files and .NET Tests/ folders as test files
tskimmett Aug 25, 2026
b4a7edb
fix: surface expired Claude Code login as an actionable error
tskimmett Aug 25, 2026
35a47e3
feat: show which model each provider uses in progress logs
tskimmett Aug 25, 2026
8442510
fix: sync semantic layer selection when navigating files
tskimmett Aug 25, 2026
f556b12
feat: add light mode with light/dark/system theme toggle
tskimmett Aug 25, 2026
a4b7933
feat: collapse and expand inline diff comments
tskimmett Aug 25, 2026
73ab6aa
feat: make the sidebar width resizable by dragging its right edge
tskimmett Aug 26, 2026
6861760
Improve contrast: dark diff line colors, brighter range chips, larger…
tskimmett Aug 26, 2026
3214145
Replace Geist with native system font stacks
tskimmett Aug 26, 2026
1910c20
GitHub-style incremental diff gap expansion
tskimmett Aug 26, 2026
a5699e1
Add expand-entire-file button to the diff header
tskimmett Aug 26, 2026
1af2bfd
Allow expanding the diff below the last change
tskimmett Aug 26, 2026
d2999a6
Show 20 lines of context around each change by default
tskimmett Aug 26, 2026
ebc69ab
Reduce diff font size from 0.8rem to 0.75rem
tskimmett Aug 26, 2026
2c8cd13
Match GitHub's syntax highlighting colors
tskimmett Aug 26, 2026
d8d1379
Use Monaspace Neon for diffs and code
tskimmett Aug 26, 2026
7218288
Match github.com's monospace stack for diffs
tskimmett Aug 26, 2026
3a3eb76
Turn expand-entire-file button into a collapse toggle
tskimmett Aug 26, 2026
6e612ca
Grey the modified-file icon in the file tree
tskimmett Aug 26, 2026
753852c
Add prev/next change navigation within a file's diff
tskimmett Aug 26, 2026
a1269e3
Give folders a blue folder icon in the file tree
tskimmett Aug 26, 2026
8079b00
Darken light-mode greens one notch
tskimmett Aug 26, 2026
8adc80b
Center the viewport when jumping between changes
tskimmett Aug 26, 2026
642c2a1
Darken light-mode greens another notch
tskimmett Aug 26, 2026
502b235
Use VS Code's diff algorithm for change alignment and inline emphasis
tskimmett Aug 26, 2026
f1baad0
Don't highlight the line when jumping between changes
tskimmett Aug 26, 2026
1c65bcc
Ignore leading/trailing whitespace in inner diff emphasis
tskimmett Aug 26, 2026
65a9500
Navigate files in semantic order while in semantic review
tskimmett Aug 26, 2026
5055c53
Drop strikethrough on deleted inline-diff segments
tskimmett Aug 26, 2026
7e0a031
Keep syntax colors on inline-diff emphasis segments
tskimmett Aug 26, 2026
59270b5
Show per-file and per-folder diff stats in the file tree
tskimmett Sep 1, 2026
1b6d8d0
Expand semantic tree, thread resolution, and LEFT-side comments
tskimmett Sep 21, 2026
ec261bf
Pin semantic review models to Opus 5.5 and GPT-6 Luna
tskimmett Sep 24, 2026
e2c3148
Narrow the diff to changes since your last review
tskimmett Sep 24, 2026
d40a609
🤖 feat: add all-files PR diff view
tskimmett Sep 24, 2026
2584850
Bump Codex SDK so semantic review can use gpt-6-luna
tskimmett Sep 24, 2026
4460465
feat: add semantic PR review and diff search
tskimmett Sep 25, 2026
c40a231
fix: honor hide-test-files toggle in all-files diff view
tskimmett Sep 25, 2026
26a8e47
Bump Claude Agent SDK so semantic review can use Opus 5.5
tskimmett Sep 25, 2026
e7e9bb5
fix: show re-requested reviewers alongside submitted reviews in sidebar
tskimmett Sep 25, 2026
ae8f198
feat: use underline style for active tab
tskimmett Sep 25, 2026
abc68ce
fix: highlight diffs in all-files view
tskimmett Sep 25, 2026
6fcf20d
feat: select commit ranges in changes picker
tskimmett Sep 29, 2026
558f350
Merge pull request #1 from tskimmett/semantic-review
tskimmett Sep 29, 2026
7ea13e2
fix: handle Windows paths when rewriting entry script in build
tskimmett Sep 29, 2026
a9e3390
docs: rewrite README for the team fork
tskimmett Sep 29, 2026
0218a5a
docs: README supports PAT sign-in only; drop Caddy and troubleshooting
tskimmett Sep 29, 2026
99a0bd5
feat: hide GitHub OAuth sign-in, PAT only
tskimmett Sep 29, 2026
4afc854
feat: add copy PR link button to header
tskimmett Sep 29, 2026
eff25b4
docs: pare README down to setup
tskimmett Sep 29, 2026
d7890da
Merge branch 'feat/copy-pr-url'
tskimmett Sep 29, 2026
1374553
fix: remove upstream repository metadata
tskimmett Sep 30, 2026
7d0c30f
fix: recover large text diffs omitted by GitHub
tskimmett Sep 30, 2026
9af6165
fix: display wrapped diff lines without clipping
tskimmett Sep 30, 2026
b802d62
fix: document Cognito PAT SSO requirement
tskimmett Sep 30, 2026
332b8b3
feat: persist PR titles in primary tabs
tskimmett Sep 30, 2026
999760b
fix: reset diff scroll position when switching files
tskimmett Sep 30, 2026
91047b7
docs: mark semantic review as experimental
tskimmett Sep 30, 2026
204f44a
fix: skip viewed files when marking current file as viewed
tskimmett Oct 1, 2026
30a60e1
feat: pick diff commits from a list with click, drag and shift-click
tskimmett Oct 1, 2026
48d085b
fix: widen commit picker popover
tskimmett Oct 1, 2026
68eaa5c
feat: comment on diff lines in the All Files view
tskimmett Oct 1, 2026
b94c522
perf: persist GitHub data in IndexedDB and revalidate with ETags
tskimmett Oct 1, 2026
4fed704
feat: add re-request review button to reviewers sidebar
tskimmett Oct 1, 2026
ff949c3
feat: hide base-branch merges from changes since your last review
tskimmett Oct 2, 2026
85afd4b
feat: highlight matched text within lines when finding in diff
tskimmett Oct 2, 2026
211d00b
feat: search PRs by text from the header input, scoped to the feed
tskimmett Oct 2, 2026
a2f017e
feat: two-stage PR search that also finds non-feed PRs in feed repos
tskimmett Oct 2, 2026
0cd1e9f
feat: repeat file header below each diff in All Files view
tskimmett Oct 2, 2026
2b5d1c3
feat: only show diff footer bar for longer diffs
tskimmett Oct 2, 2026
55191d8
fix: re-measure mounted rows so viewed toggles don't overlap files in…
tskimmett Oct 2, 2026
d97c0d0
feat: recursive expand/collapse in file tree folder context menu
tskimmett Oct 2, 2026
8e8500e
fix: stop clearing virtualizer measurements on viewed toggle in All F…
tskimmett Oct 2, 2026
9c155f0
feat: find PRs by pasted branch name in header search
tskimmett Oct 2, 2026
fd8ae05
feat: schedule auto-merge from the PR merge box
tskimmett Oct 2, 2026
1980d7a
fix: only scroll to find match on explicit find navigation
tskimmett Oct 7, 2026
325b4a4
feat: show diff stat of visible files next to hidden test files count
tskimmett Oct 7, 2026
beb3970
refactor: rename to better pr and remove upstream pulldash cruft
tskimmett Oct 7, 2026
4f58608
feat: deploy browser build to Azure Static Web Apps
tskimmett Oct 7, 2026
edcb8e1
fix: harden token handling, local server, and AI agent sandboxing
tskimmett Oct 7, 2026
3184020
fix: responsive layout for mobile and narrow viewports
tskimmett Oct 7, 2026
206b9a9
feat: scroll long diff lines horizontally on mobile instead of wrapping
tskimmett Oct 7, 2026
f7538aa
fix: use chevron icon and equal heights in split buttons
tskimmett Oct 7, 2026
2f23d04
feat: update welcome dialog tagline
tskimmett Oct 7, 2026
76ae17b
fix: separate tab strip from header search box
tskimmett Oct 7, 2026
af5090d
refactor: extract hunk line computation from diff worker
tskimmett Oct 7, 2026
79d4f6c
feat: PR stack navigation; fix commits/checks tabs on mobile
tskimmett Oct 7, 2026
deadfe6
feat: add What's new dialog with changelog
tskimmett Oct 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 0 additions & 38 deletions .github/actions/setup-mux/action.yml

This file was deleted.

11 changes: 7 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,24 @@ on:
pull_request:
branches: [main]

permissions:
contents: read

jobs:
ci:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup Bun
uses: oven-sh/setup-bun@v2
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: latest
bun-version: 1.4.0

- name: Install dependencies
run: bun install
run: bun install --frozen-lockfile

- name: Check formatting
run: bun run fmt:check
Expand Down
104 changes: 0 additions & 104 deletions .github/workflows/release.yml

This file was deleted.

8 changes: 0 additions & 8 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@
# testing
/coverage

# next.js
/.next/
/out/

# production
/build

Expand All @@ -33,12 +29,8 @@ yarn-error.log*
# env files (can opt-in for committing if needed)
.env*

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts

dist/
release/
Expand Down
10 changes: 7 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# pulldash
# better pr

Pulldash is the fastest way to review pull requests.
better pr is the fastest way to review pull requests.

## Development

Expand All @@ -10,9 +10,13 @@ _NEVER_ use browser tools - they will not work with this project.

## Principles

- Performance is P1. If things feel laggy or are not smooth, it is of the utmost importance to fix. Pulldash exists because GitHub's PR review is slow.
- Performance is P1. If things feel laggy or are not smooth, it is of the utmost importance to fix. better pr exists because GitHub's PR review is slow.
- Tests should primarily occur at the data-layer, and the frontend should mostly dummily render the data.

## Changelog

Any user-visible feature or change must add an entry (newest first) to `CHANGELOG` in `src/browser/lib/changelog.ts`. It powers the "What's new" dialog; users see a dot until they open it. Use a unique `id` like `YYYY-MM-DD-slug`.

## Testing

Tests should be minimal, not conflict with each other, and not be race-prone.
Expand Down
66 changes: 20 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,62 +1,36 @@
<h1>
<img src="src/browser/logo.svg" alt="pulldash logo" width="40" height="40" align="center">
Pulldash
</h1>
# better pr

![GitHub Release](https://img.shields.io/github/v/release/coder/pulldash) ![GitHub License](https://img.shields.io/github/license/coder/pulldash) ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/coder/pulldash/ci.yml)
A fast, keyboard-driven PR review UI.

Fast, filterable PR review. Entirely client-side.
## Setup

> [!WARNING]
> Pulldash is WIP. Expect bugs.
Requires [Bun](https://bun.sh).

## 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.

[![Example](./docs/screenshots/overview.png)](https://pulldash.com)

## Features

- **Custom filters**: Add repos and filter by review requests, authored PRs, or all activity.

![Filtering PRs](./docs/screenshots/filtering.png)

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

![Keybinds](./docs/screenshots/keybind-driven.png)

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

![Search](./docs/screenshots/search.png)

## Why
```bash
git clone git@github.com:tskimmett/pulldash.git better-pr
cd better-pr
bun install
bun start
```

- 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
Open http://localhost:3002 (set `PORT` to change it). To update: `git pull && bun install && bun start`.

## How It Works
## Sign in

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.
Use a **personal access token**: GitHub → Settings → Developer settings. It needs `repo` scope. The token stays in your browser's `localStorage`.

- **Web Worker pool**: Diff parsing and syntax highlighting run in workers sized to `navigator.hardwareConcurrency`. The main thread stays free for scrolling.
For Cognito repositories, the PAT must also have SSO configured and authorized for the Cognito organization.

- **Pre-computed navigation**: When a diff loads, we index all navigable lines. Arrow keys are O(1)—no DOM queries.
## Semantic review (optional, experimental)

- **External store**: State lives outside React ([`useSyncExternalStore`](https://react.dev/reference/react/useSyncExternalStore)). Focusing line 5000 doesn't re-render the file tree.
This feature is experimental and the results are hit-or-miss. Treat the walkthrough as a rough starting point, not a reliable summary of the PR.

- **Virtualized rendering**: Diffs, file lists, and the command palette only render visible rows.
The AI walkthrough appears only if an agent is available on the machine running the server: Claude Code logged in (or `ANTHROPIC_API_KEY`), or Codex logged in (or `OPENAI_API_KEY`). Diffs are sent to the provider you pick.

## Development
## Deploy

```bash
bun install
bun dev
```
`bun run deploy` builds the app and uploads `dist/browser` to an Azure Static Web App. It needs `az login` plus `AZURE_SUBSCRIPTION`, `SWA_RESOURCE_GROUP` and `SWA_APP_NAME` (Bun reads them from `.env`). The hosted build has no server, so semantic review is unavailable there.

## License

[AGPL](./LICENSE)
[AGPL-3.0](./LICENSE)
Loading