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