
Doppelgangers
https://github.com/badlogic/doppelgangers- Category
- Developer Tools
- Rank
- No. 2004Tools index
- Pricing
- Open Source
- Type
- TOOL
- Builder
- badlogic
- GitHub
- 56 stars
- Latest release
- v0.0.2
- Date
About
Find duplicate pull requests through embedding-based visualization.
What it does
Doppelgangers turns a GitHub repository backlog into an interactive map for human triage. It fetches issues and pull requests, converts their titles, bodies, and sometimes modified-file lists into embeddings, then uses UMAP to arrange related items nearby. The generated HTML viewer supports two-dimensional and three-dimensional exploration, filtering, selection, opening grouped items, copying lists, and optional semantic search.
Why it's ranked here
This is a focused tool with a credible end-to-end workflow: collect repository items, expose topical neighborhoods, and help a maintainer inspect likely overlap. Projection caching, resumable embedding output, date filters, and local-model support make repeated runs practical. The verdict is mixed-positive because clustering only narrows the search. A person still decides which items are duplicates and performs the cleanup.
What's good
It handles issues and pull requests together, while preserving clear visual distinctions for type, state, and selection. Fetching supports open, closed, or all items, plus absolute or relative creation cutoffs. Embedding input can include modified pull-request files, which supplies useful context beyond titles alone. Cached projections avoid needless recomputation when UMAP settings match, and interrupted embedding runs can resume by item URL.
Tradeoffs
The standard workflow requires Node.js 20 or newer, an authenticated GitHub CLI, and an OpenAI API key. Local embeddings are supported, but require a separate package and a compatible GGUF model path. The generated map is exploratory evidence, not duplicate detection with a confirmed verdict. UMAP uses randomness when projections are recomputed, so layouts can vary. Semantic search also embeds vectors into the HTML and increases its size.
How to use it well
Use it when a busy GitHub repository has enough issues or pull requests that manual scanning hides recurring themes. Start with open items or a recent creation window, inspect tight neighborhoods, then open or copy selected groups for deliberate triage. Tune neighborhood and distance settings only when the default map obscures useful structure. It does not replace maintainer judgment, close duplicates itself, or provide a broader issue-management workflow.
Technical notes+
package.json defines an ES module npm package with a global CLI, Node.js 20 minimum, OpenAI and umap-js runtime dependencies, and TypeScript build tooling. src/triage.ts parses repository, state, type, date, embedding, projection, search, force, and local-model options; it streams GitHub CLI output through GraphQL, REST, or search routes and writes collected items as JSON. src/embed.ts batches OpenAI requests with five-attempt retry behavior, resumes from JSONL records keyed by URL, truncates embedding input and display snippets, and dynamically imports node-llama-cpp for local embeddings. src/build.ts reads embedding records, caches two-dimensional and three-dimensional UMAP coordinates with parameter metadata, normalizes coordinates, optionally includes vectors, escapes less-than signs in serialized data, and emits a standalone HTML viewer. tsconfig.json enables strict ES2022 compilation with declarations and source maps, while biome.json configures formatting and recommended lint rules.
Observed
- License
- MIT
- Primary language
- TypeScript
- Install surface
- Global npm package
- Interface
- Command-line tool producing JSON, JSONL, projection cache, and standalone HTML output
- Runtime platform
- Node.js 20 or newer
- Repository integration
- Requires an authenticated GitHub CLI
- Embedding backends
- OpenAI embeddings, or an optional local GGUF model through node-llama-cpp
- Module format
- ECMAScript modules
Read from README.md, package.json, src/build.ts, src/embed.ts, src/triage.ts, src/node-llama-cpp.d.ts, biome.json, tsconfig.json, .husky/pre-commit.
What it can do
Find duplicate pull requests
Pull request data from repository → List of duplicate pull requests
Generate embeddings for pull requests
Pull request metadata and content → Vector embeddings representing pull requests
Create visualization of pull request relationships
Pull request embeddings → Interactive visualization showing pull request similarities
Identify similar pull requests
Pull request embeddings and similarity threshold → Groups of similar pull requests
Analyze pull request content similarity
Multiple pull requests → Similarity scores between pull requests
Tags
Tech Stack
Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.