{"id":49308876,"url":"https://github.com/mattqdev/stackfingerprint","last_synced_at":"2026-04-26T11:03:51.689Z","repository":{"id":342700833,"uuid":"1173939619","full_name":"mattqdev/stackfingerprint","owner":"mattqdev","description":"Scan any public GitHub repo and generate a beautiful, embeddable SVG card of its tech stack. Zero auth, zero config.","archived":false,"fork":false,"pushed_at":"2026-04-06T05:57:06.000Z","size":994,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-06T08:14:37.340Z","etag":null,"topics":["card","readme","shield","shieldsio","stack","svg","tech"],"latest_commit_sha":null,"homepage":"https://stackfingerprint.vercel.app","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mattqdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-05T22:52:53.000Z","updated_at":"2026-04-06T05:57:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mattqdev/stackfingerprint","commit_stats":null,"previous_names":["mattqdev/stackfingerprint"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mattqdev/stackfingerprint","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattqdev%2Fstackfingerprint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattqdev%2Fstackfingerprint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattqdev%2Fstackfingerprint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattqdev%2Fstackfingerprint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mattqdev","download_url":"https://codeload.github.com/mattqdev/stackfingerprint/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattqdev%2Fstackfingerprint/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32294592,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["card","readme","shield","shieldsio","stack","svg","tech"],"created_at":"2026-04-26T11:03:49.675Z","updated_at":"2026-04-26T11:03:51.680Z","avatar_url":"https://github.com/mattqdev.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🔍 Stack Fingerprint\n\n**Scan any public GitHub repo and generate a beautiful, embeddable SVG card of its tech stack.**\n\nZero auth. Zero config. Paste a repo, get a badge.\n\n[![Live Demo](https://img.shields.io/badge/try%20it-stackfingerprint.vercel.app-33ff33?\u0026color=00ba10)](https://stackfingerprint.vercel.app)\n[![Stars](https://img.shields.io/github/stars/mattqdev/stackfingerprint?style=social)](https://github.com/mattqdev/stackfingerprint)\n[![License: MIT](https://img.shields.io/badge/license-MIT-33ff33)](https://github.com/mattqdev/stackfingerprint/blob/main/LICENSE)\n\n---\n\n![Stack Fingerprint card for this repo](./assets/stack-fingerprint.svg)\n\n---\n\n## ✨ Design Your Card Visually\n\nYou 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:\n\n- **Real-time preview** — see changes instantly as you toggle themes and layouts\n- **10+ designer themes** — from the deep tones of `Obsidian` to the vibrant `Sakura`\n- **5 distinct layouts** — choose `Terminal` for dev tools or `Banner` for project headers\n- **One-click copy** — grab the Markdown or HTML snippet and drop it straight into your README\n\n[**Try the Visual Builder →**](https://stackfingerprint.vercel.app)\n\n\u003cimg src=\"./public/StackFingerprintThumb.png\"/\u003e\n\u003cimg src=\"./public/StackFingerprintThumb2.png\"/\u003e\n\n---\n\n## 📄 Quick embed (no Action required)\n\nIf you just want to try it without setting up the Action, paste this into your README:\n\n```markdown\n![Stack Fingerprint](https://stackfingerprint.vercel.app/api/card?repo=OWNER/REPO)\n```\n\nCustomise with query parameters (see [API reference](./DOCS.md#api-reference)):\n\n```markdown\n![Stack Fingerprint](https://stackfingerprint.vercel.app/api/card?repo=vercel/next.js\u0026theme=ocean\u0026layout=classic\u0026size=lg\u0026categoryFilter=prodonly)\n```\n\n---\n\n## 🔴 Common Problems\n\nThe community reported these most common problems, we have decided to fix all:\n| ❌ Problem | ✅ Fix |\n| ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 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) |\n| 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` |\n| Full-repo scan surfaces signals from unrelated sub-projects | `?path=` query parameter scans a specific sub-directory; |\n| 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**. |\n\n---\n\n## ⚙️ Configuration file\n\nDrop a `.stackfingerprint.json` file at your repo root (or at the sub-path you are scanning) to tune detection without touching any API parameter:\n\n```json\n{\n  \"ignore\": [\"babel\", \"webpack\", \"terraform\"],\n  \"pin\": [\"nextjs\", \"typescript\"],\n  \"labels\": { \"nextjs\": \"Next.js 14\" },\n  \"path\": \"apps/web\"\n}\n```\n\n| Key      | Type       | Description                                                                  |\n| -------- | ---------- | ---------------------------------------------------------------------------- |\n| `ignore` | `string[]` | Signal IDs to suppress from the card, even if detected                       |\n| `pin`    | `string[]` | Signal IDs to always show, even if not auto-detected                         |\n| `labels` | `object`   | Override the display label for any signal ID                                 |\n| `path`   | `string`   | Default sub-path for monorepo scans (overridden by the `?path=` query param) |\n\nSee [DOCS.md → Configuration file](./DOCS.md#configuration-file-stackfingerprintjson) for the full schema.\n\n---\n\n## 🛡 Supply-chain safety \u0026 self-hosting\n\n\u003e ⚠️ **Self-hosting recommended for production use.** See [Supply-chain safety](#-supply-chain-safety--self-hosting) below.\n\nEmbedding 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.**\n\nThe easiest way to do this is with the included GitHub Action.\n\n### GitHub Action (recommended)\n\nDrop `.github/workflows/stack-fingerprint.yml` into your repo:\n\nThen reference the committed file in your README:\n\n```markdown\n![Stack Fingerprint](./assets/stack-fingerprint.svg)\n```\n\nThe SVG is now served from `raw.githubusercontent.com` — GitHub's own CDN — with no runtime dependency on `stackfingerprint.vercel.app`.\n\n### Deploy your own instance\n\nFor complete control, deploy a private instance in one click:\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/mattqdev/stackfingerprint)\n\nPoint the Action's `URL` at your own domain and you own the entire pipeline.\n\n---\n\n## 🏗 Monorepo support\n\nFor monorepos, add `?path=apps/web` to scan a sub-directory instead of the repository root:\n\n```markdown\n![Stack Fingerprint](https://stackfingerprint.vercel.app/api/card?repo=myorg/monorepo\u0026path=apps/web)\n```\n\nThe `path` parameter is also accepted by the GitHub Action as a `workflow_dispatch` input and as a key in `.stackfingerprint.json`.\n\n---\n\n## 🎨 Card options at a glance\n\n| Parameter        | Values                                            | Default   | Description                             |\n| ---------------- | ------------------------------------------------- | --------- | --------------------------------------- |\n| `repo`           | `owner/repo`                                      | —         | **Required.** GitHub repository to scan |\n| `theme`          | See [themes](./DOCS.md#themes)                    | `ocean`   | Visual colour theme                     |\n| `layout`         | `classic` `compact` `minimal` `terminal` `banner` | `classic` | Card layout                             |\n| `size`           | `sm` `md` `lg`                                    | `md`      | Card size                               |\n| `iconStyle`      | `color` `mono` `outline`                          | `color`   | Icon rendering style                    |\n| `pillShape`      | `round` `square`                                  | `round`   | Shape of tech pills                     |\n| `categoryFilter` | `all` `prodonly` `top`                            | `all`     | Signal filter (see below)               |\n| `path`           | `apps/web` etc.                                   | _(root)_  | Monorepo sub-path                       |\n\n### `categoryFilter` options\n\n| Value      | What it shows                                                                            |\n| ---------- | ---------------------------------------------------------------------------------------- |\n| `all`      | Every detected signal; dev-only signals are dimmed at 55 % opacity                       |\n| `prodonly` | Production signals only — all `devDependencies`-sourced signals are hidden               |\n| `top`      | Only `lang` + `framework` categories, capped at 5 signals — the minimal meaningful badge |\n\n---\n\n## 🛠 Contributing \u0026 support\n\nThis 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.\n\n### Help grow the signal database\n\nIs your favourite framework missing? Adding a new detection signal is as easy as adding a JSON object to `src/data/signals.js`:\n\n```js\n{\n  id: \"astro\",\n  label: \"Astro\",\n  category: \"framework\",\n  iconSlug: \"astro\",\n  color: \"#FF5D01\",\n  match: {\n    files: [\"astro.config.mjs\", \"astro.config.js\"],\n  },\n}\n```\n\nSee [DOCS.md → Adding a signal](./DOCS.md#adding-a-signal) for the full signal schema.\n\n---\n\n## License\n\nMIT — see [LICENSE](./LICENSE).\n\n---\n\nBuilt by [mattqdev](https://github.com/mattqdev) · If this saved you time, a ⭐ goes a long way.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattqdev%2Fstackfingerprint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmattqdev%2Fstackfingerprint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattqdev%2Fstackfingerprint/lists"}