Skip to main content

Contribute To The App Catalog

This page is for developers adding or correcting an app, a featured skill or a logo. The app catalog is package data in src/row_bot/integrations/; it is validated when Row-Bot loads it, so a bad record fails loudly instead of showing wrong information.

App Records (apps.json)​

apps.json has "schema_version": 2 and one record per line under apps. Each record is one service people recognise, and catalog entries attach to it only through the references it lists. A record with an unknown field is refused.

FieldMeaning and rules
idLowercase [a-z0-9][a-z0-9-]{0,63}, unique. Also the page address, /settings/apps/<id>.
name, publisher, summaryThe display name, who makes the service, and one plain sentence about what it does.
categoryOne of productivity, developer, data, design, communication, finance or local_tools.
synonyms, jobsWords and tasks people search for, such as "wiki" or "send an email". Search matches them.
example_promptsThings to ask, shown on the app's page. At least two for an app that has a connection of its own.
refsThe reviewed references that attach catalog entries: curated:, registry: (an exact server or a namespace), endpoint: (a host), npm:, pypi:, oci:, repo:, hermes:, bundled:, and Row-Bot's own account:, channel: and tool: ways. A reference may belong to one app only.
vendordomains and github_orgs the vendor controls; the verified badge is granted from these.
variantsThe app's ways to connect in its preferred order: hosted_mcp, local_mcp, package, account, channel, api_key_tool, broker.
authoauth, api_key, none, account, mixed or empty.
docs_url, key_urlhttps links: the vendor's documentation and where to get a key.
iconsi:<slug> for a bundled mark, or empty for a letter avatar.
featured_rankOptional. Featured apps are ranked 1 to N with no gaps or repeats.
local_app, local_checkFor an app that works with a program on this computer: its name, and {"port": 9876} (a loopback port from 1024 to 65535) or {"process": "blender"}. The check looks only at this computer.
factschecked (the date you checked) and sources: the vendor pages that support the record.

Unmatched catalog entries stay browsable as Community. Never attach an entry by its name alone.

The Verified Badge​

by Vendor with a check is granted by rule, never by a name or a description:

  • a Registry record is the vendor's when its namespace is a vendor domain reversed (com.notion for notion.com) or io.github.<vendor org>. The Registry checks namespace ownership, so Registry records are judged by namespace alone;
  • a reviewed recipe or your own connection is the vendor's when its endpoint is under a vendor domain, or is an endpoint: the vendor's documentation names exactly.

Shared hosting domains, where anyone can have a subdomain (github.io, vercel.app, netlify.app, pages.dev, amazonaws.com, supabase.co and others in apps.SHARED_HOSTING), are never vendor domains: the catalog refuses to load with one.

Reviewed setup recipes, the Vendor recommendations catalog, live in src/row_bot/mcp_client/recommended_servers.json. Set a recipe's tested_with_row_bot only after its live check passes.

Icons (icons.json)​

Logos are Simple Icons marks, bundled only for the apps that name them. Each mark in icons.json records its title, hex colour, SVG path, license (CC0-1.0 for most marks; others record their own), source and, where the brand has them, guidelines. Rebuild the file from an extracted simple-icons package after changing icon fields:

uv run python scripts/build_app_icons.py path/to/simple-icons/package

An app without a mark gets a letter avatar drawn locally. Registry icons are fetched only during a catalog update, as raster images from the publisher's own domain, re-encoded locally; remote SVG is never accepted, and drawing a card never fetches anything.

skills.json lists references, not copies: each skill is read from its repository at the pinned commit when someone adds it. A record has id, name, publisher, summary, category, synonyms, jobs, repo (github.com/<owner>/<repo>), path, commit (the full 40-character hash), license, license_url, featured_rank, checked and, optionally, app (an apps.json id). Check the licence at that commit. The library takes permissive and weak-copyleft open-source licences (MIT, Apache-2.0, MPL-2.0 so far); proprietary, unlicensed and share-alike skills stay out.

Broker Names (broker_apps.json)​

Composio's own catalog can't be listed without an account, so broker_apps.json is Row-Bot's own list of well-known app names, each 1 to 80 characters. While Composio is turned on, a search naming one of them shows Composio, and that app's page offers "App via Composio". It is a list of names to search by, not a claim that Composio supports each one.

Check Coverage​

scripts/integration_coverage.py computes an install plan for every local catalog entry (the reviewed recipes, the whole shipped Registry mirror, featured skills and examples) in a throwaway data folder. It fetches nothing and reads no user data.

uv run python scripts/integration_coverage.py --output .tmp/integration-coverage

It writes coverage.json (each entry with "complete" or the exact blocker) and coverage.md (counts per source, every blocker, and featured apps without a complete plan). --hermes adds a saved Hermes catalog. Run it before and after a catalog change and explain any featured app that stops connecting.

Tests​

tests/subsystem/integrations/test_app_catalog.py, test_icons.py, test_skill_catalog.py, test_brokers.py and test_apps_and_sources.py check the featured ranks, categories, prompts, sources, icon licences, badge rules and attachment. Run them with uv run python -m pytest tests/subsystem/integrations.