Show "works with" app logos and filter by app
@slashclone/integration-logos
Add a "works with" feature to a catalog or marketplace: each item shows logos of the apps it integrates with, and people can browse and filter search by app. Tags are detected from strong signals like env vars, hosts, and MCP servers before mentions, owners can override them, and logos come from simple-icons with a lettered fallback, an SVG safety check, and a dry-run retag job.
- Activity
- New: be the first to try it
- Installs
- 0 installs
- Likes
- 0 likes
- Clones
- 0 clones
What it makes
Real output from this kit
Preview with scripts turned off. Download it to see it run.
- Sample file105 bytes, download to openIntegrationsFrom the kit's tests
- Sample file146 bytes, download to openIntegrationsFrom the kit's tests
- Sample file186 bytes, download to openSvg checkFrom the kit's tests
How this works
- It is a skill: written instructions Claude reads when your request matches what the skill is for. You do not call it by name; just ask for the task.
- While it works, it reads and changes files in the places it lists, nowhere else.
- It runs these commands on your computer: node scripts/detect-integrations.mjs, node scripts/check-svg.mjs.
- Nothing runs until you choose to use it, and you can remove it any time.
SKILL.md
Integration logos
Goal: every item shows the apps it works with, found automatically, fixable by its owner, with real logos where the license allows and a clean fallback where it does not.
Steps
Write the catalog first. One entry per app, in code or a JSON file, never in the database. See
examples/catalog.json. Each entry has:id: lowercase kebab, permanent. Never rename or reuse one. Retire it instead.nameandgroup(chat, docs, payments, and so on). Groups drive the browse page.- Strong signals:
domains,envPrefixes(likeSTRIPE_),mcpserver names,workflowNodes(node type names in workflow JSON). aliases: other spellings and product names.rule:name(match the name, any case),case(the name only with its capitals, for names that are also words in lowercase), oraliases(never the bare name, for common words like Make, Linear, Box, or Square).icon: the simple-icons slug, when one exists.
Detect from strong signals, then mentions. Run
node scripts/detect-integrations.mjs --catalog examples/catalog.json --item examples/item.jsonto see the reference logic, then port it to your stack.- Strong signals first: declared integrations, MCP servers, network hosts (exact or subdomain), env var names by prefix, workflow node types.
- Mentions second: one in the name or description, or at least two across files. Strip links first. Skip lock files and binaries.
- Cap it: about 6 tags from mentions and 12 in all. Strong signals fill first.
- Store ids only, never the text that matched. Record which signal found each id only if you need it for debugging, and keep that out of logs.
- Store tags on the item. An array of ids with an index that supports "contains". Add a flag or nullable column for the owner's list. Run detection when a new version is published, inside the same publish step, so tags never lag.
- Let the owner override. One endpoint: set a list of ids (validated against the catalog, deduped, capped), or send
nullto go back to automatic. While an owner list exists, new versions do not change the tags. Write an audit event for every change, with ids only. Build the logo pipeline. A script that writes one SVG per catalog id:
- Hand-supplied file in a logos folder wins. Check it with
node scripts/check-svg.mjs <folder>and fail the build if it fails. - Otherwise take the path from the
simple-iconsnpm package and fill it with the brand hex. Pin an exact version. Its icon data is CC0, but the marks are still trademarks: read each brand's guidelines, and note that some brands asked to be removed. - Brand colors too light to read on the chip get drawn in near-black.
- Otherwise no file. Write the list of missing ids into the logos folder README so someone can supply them.
- Generate a small list of ids that have a logo, so the UI never requests a file that is not there.
- Hand-supplied file in a logos folder wins. Check it with
Show it. Same chip everywhere: a neutral light background in both themes, the mark in brand color.
- Cards: a row of small logos, capped with "+N".
- Detail page: named chips that link to the filtered search.
- Browse page: every app by group with item counts, apps with zero items hidden or dimmed.
- Search: an app filter, a heading like "Items for Slack", and a query that names an app also matches items tagged with it.
- Missing logo: a lettered chip. Use one letter, or two (like "Sl" and "Sa") when the first letter is shared by other apps in the catalog.
- Logos are decorative next to a visible name; otherwise give them alt text with the app name.
- Retag what already exists. A job that recomputes tags for every item from its latest version, skips owner-set items, and has
--dry-run. Print counts only: checked, changed, skipped, failed. Run the dry run first and check the counts match the database you meant to reach. Test it. Use fixtures, not live data:
- Each strong signal alone tags the app.
- Common-word names tag only through aliases; case-rule names ignore lowercase.
- Links and lock files never count; one file mention is not enough, two are.
- Caps hold.
- The owner list survives a new version, and
nullreturns to automatic. - The filter returns tagged items only and combines with the text query.
- The SVG check rejects scripts, handlers, and outside links.
Rules
- Ids are a public contract. Changing one breaks saved links and filters.
- Never store or log the file content or the text that matched. Ids and counts only.
- Add a new dependency (like
simple-icons) only with the owner's yes, and pin it. - Logos are served from your own origin, so never ship an SVG that fails the check.
- Do not guess a brand color or redraw a mark by hand. Use the official one or the lettered chip.
- Tune with real items: after the first retag, read a sample of tags and fix the catalog, not the item.
Files
- SKILL.md
- examples/catalog.json
- examples/item.json
- examples/logos/sample.svg
- kit.json
- scripts/check-svg.mjs
- scripts/detect-integrations.mjs
Did it work?
0worked for them0did not work
Sign in to say whether it worked for you.
Nobody has said yet. Tried it? Tell the next person.
