Scan any public GitHub repo and generate a beautiful, embeddable SVG card of its tech stack.
Zero auth. Zero config. Paste a repo, get a badge.
You don't need to touch a line of code to get the perfect look. The Interactive Visual Builder lets you customise your fingerprint in real-time:
- Real-time preview β see changes instantly as you toggle themes and layouts
- 10+ designer themes β from the deep tones of
Obsidianto the vibrantSakura - 5 distinct layouts β choose
Terminalfor dev tools orBannerfor project headers - One-click copy β grab the Markdown or HTML snippet and drop it straight into your README
If you just want to try it without setting up the Action, paste this into your README:
Customise with query parameters (see API reference):
The community reported these most common problems, we have decided to fix all:
| β Problem | β Fix |
|---|---|
| The embed is from an uncontrolled third-party domain | Host it yourself easily with Vercel or just paste .github/workflows/stack-fingerprint.yml in your repo (recommended) |
| Some of the stacks detected are unused/false positive/insignificant | You can choose to show: Top 5 stacks, Core only, Prod only etc; If this isn't enough you can decide to exclude singular stacks with "ignore" in .stackfingerprint.json |
| Full-repo scan surfaces signals from unrelated sub-projects | ?path= query parameter scans a specific sub-directory; |
| Long signal lists discourage contributors and misrepresent the actual stack | categoryFilter=prodonly hides all dev signals; categoryFilter=top shows only lang + framework, capped at 5; dev-only signals visually dimmed even in all mode. You have the FULL CONTROL of WHAT TO SHOW. |
Drop a .stackfingerprint.json file at your repo root (or at the sub-path you are scanning) to tune detection without touching any API parameter:
{
"ignore": ["babel", "webpack", "terraform"],
"pin": ["nextjs", "typescript"],
"labels": { "nextjs": "Next.js 14" },
"path": "apps/web"
}| Key | Type | Description |
|---|---|---|
ignore |
string[] |
Signal IDs to suppress from the card, even if detected |
pin |
string[] |
Signal IDs to always show, even if not auto-detected |
labels |
object |
Override the display label for any signal ID |
path |
string |
Default sub-path for monorepo scans (overridden by the ?path= query param) |
See DOCS.md β Configuration file for the full schema.
β οΈ Self-hosting recommended for production use. See Supply-chain safety below.
Embedding an image from a third-party domain (stackfingerprint.vercel.app) in a high-profile README introduces supply-chain risk: the domain owner can change what the URL serves at any time. The recommended approach is to commit the SVG directly to your repository so it is served from GitHub's own CDN.
The easiest way to do this is with the included GitHub Action.
Drop .github/workflows/stack-fingerprint.yml into your repo:
Then reference the committed file in your README:
The SVG is now served from raw.githubusercontent.com β GitHub's own CDN β with no runtime dependency on stackfingerprint.vercel.app.
For complete control, deploy a private instance in one click:
Point the Action's URL at your own domain and you own the entire pipeline.
For monorepos, add ?path=apps/web to scan a sub-directory instead of the repository root:
The path parameter is also accepted by the GitHub Action as a workflow_dispatch input and as a key in .stackfingerprint.json.
| Parameter | Values | Default | Description |
|---|---|---|---|
repo |
owner/repo |
β | Required. GitHub repository to scan |
theme |
See themes | ocean |
Visual colour theme |
layout |
classic compact minimal terminal banner |
classic |
Card layout |
size |
sm md lg |
md |
Card size |
iconStyle |
color mono outline |
color |
Icon rendering style |
pillShape |
round square |
round |
Shape of tech pills |
categoryFilter |
all prodonly top |
all |
Signal filter (see below) |
path |
apps/web etc. |
(root) | Monorepo sub-path |
| Value | What it shows |
|---|---|
all |
Every detected signal; dev-only signals are dimmed at 55 % opacity |
prodonly |
Production signals only β all devDependencies-sourced signals are hidden |
top |
Only lang + framework categories, capped at 5 signals β the minimal meaningful badge |
This project thrives on community input. Before opening a pull request, please open an issue first so we can discuss the goal and make sure it is a good fit.
Is your favourite framework missing? Adding a new detection signal is as easy as adding a JSON object to src/data/signals.js:
{
id: "astro",
label: "Astro",
category: "framework",
iconSlug: "astro",
color: "#FF5D01",
match: {
files: ["astro.config.mjs", "astro.config.js"],
},
}See DOCS.md β Adding a signal for the full signal schema.
MIT β see LICENSE.
Built by mattqdev Β· If this saved you time, a β goes a long way.