Sloppy tools for sloppy times.
Google.Chrome_compressed.mp4
Explore all the slop issues and PRs of your GitHub repos visually. Triage them manually or give clusters to your clanker to clean things up.
Fetches issues/PRs, generates embeddings, projects them to 2D/3D via UMAP. Similar items cluster together. Select a cluster, open all, close the dupes.
Demos: openai/codex | sst/opencode | openclaw/openclaw
npm install -g doppelgangersexport OPENAI_API_KEY=... doppelgangers --repo facebook/reactThis will:
- Fetch all open issues and PRs from the repo
- Generate embeddings using OpenAI
- Project to 2D/3D using UMAP
- Output
triage.htmlwith an interactive viewer
| Option | Description | Default |
|---|---|---|
--repo <url|owner/repo> | GitHub repository (required) | |
--state <state> | open, closed, or all | open |
--type <type> | pr, issue, or all | all |
--since <value> | Created-date cutoff: YYYY-MM-DD or <days>d (e.g. 14d) | |
--output <path> | Items JSON path | prs.json |
--embeddings <path> | Embeddings path | embeddings.jsonl |
--html <path> | HTML viewer path | triage.html |
--model <model> | OpenAI embedding model | text-embedding-3-small |
--batch <n> | Batch size for embeddings | 100 |
--max-chars <n> | Max chars for embedding input | 4000 |
--body-chars <n> | Max chars for body snippet | 2000 |
--neighbors <n> | UMAP neighbors | 15 |
--min-dist <n> | UMAP min distance | 0.1 |
--search | Include embeddings for semantic search | false |
Date filtering examples:
# from a specific day onward (inclusive) doppelgangers --repo facebook/react --since 2026-02-01 # last 14 days (local time, starting at local midnight) doppelgangers --repo facebook/react --since 14dControls:
- 2D: Drag to pan, scroll to zoom
- 3D: Drag to rotate, Ctrl/Cmd+drag to pan, scroll to zoom
- Select: Shift+drag (Ctrl/Cmd+Shift to add to selection)
- Deselect: Click empty space
Sidebar:
- "Open All" opens selected items in new tabs (allow popups)
- "Copy" copies selection as formatted list
Visual Encoding:
- Filled circles = PRs, Hollow rings = Issues
- Green = Open, Purple = Closed, Orange = Selected
Filters: Toggle PRs/Issues and Open/Closed visibility
- Node.js 20+
ghCLI (authenticated)OPENAI_API_KEYenvironment variable
MIT