Actionist Knowledge Graph
P05 · Experience knowledge node

Living UI component layer

Maintain a continuously refreshed, visually browsable component corpus where people and agents can find structural necessities and contextual inspiration.

What we learned

Current synthesis from the research packet. Exact records and complete source artifacts remain visible below.

Research conclusions

  • The normalized local union is about 8,483 component identities; the source-bearing legacy store has 3,507 real components.
  • Replace inconsistent tags with canonical entities, aliases and measured visual clusters.
  • Own the archetype shell and core app primitives; harvest decorative surfaces. The layer is a snapshot, not yet living.

What it owns

  • Component ingestion and refresh
  • Dedupe and source linkage
  • Visual previews and interaction states
  • Taxonomy, tags and semantic use cases
  • Gallery search, comparison and selection

What research already tells us

  • Two complementary 21st-derived stores join to 8,515 identities
  • 3,506 legacy entries are source-bearing while much of the newer harvest is preview/bundle oriented
  • Components range from universal necessities—navigation, forms, feedback—to contextual patterns

Open first-principles questions

  • What is the canonical component taxonomy?
  • How are near-duplicates clustered visually and structurally?
  • Which components are required for every archetype?
  • How are new 21st.dev releases discovered and re-indexed?
  • What metadata helps a client visually choose without understanding component names?

Inputs

  • 21st stores
  • New component feeds
  • Screenshots
  • Source metadata

Outputs

  • ComponentRecord
  • PreviewSet
  • CategoryGraph
  • Selection

Agent-sized workstream

Design the component ingestion, taxonomy, dedupe, preview and visual-selection system; test it on navigation, hero, footer, table and form families.

Linked research

  • Local corpus joinresearch/actionmodel-builder-research-2026-08-26/phase-8/lanes/02-local-corpus-join/outputs/local-corpus-join-report.md
  • 21st corpus auditresearch/21st-corpus-audit-2026-08-27.md
  • UI component-library requirements[private local source withheld]

Where this beats a generator

Generic visual convergence is the reported outcome when every surface is drawn from the same model prior. Choosing from a browsable corpus of real components makes the visual result a selection the client can see beforehand rather than a sample they have to react to afterwards.

Companies and commercial surfaces

105 mined records. Search and inspect the full agent output; nothing is collapsed into a top-ten headline.

RankIdentityWhat the agent foundEvidenceSource
1C-001—21st.dev: community component marketplace; llms.txt claims 12,000+ catalog; MCP endpoint at POST /api/mcp returns JSON-RPC 401 'Not authenticated - your API key is missing', proving a live authenticated MCP; free tier metered ~2 installs/day; community-submitted refresh; shadcn-format registry.observedprimary_upstream_and_competitorSource ↗
2C-002—shadcn registry.json spec + registry MCP: the de-facto machine-readable interchange for this category. `shadcn mcp init` works against any shadcn-compatible registry. Dynamic Search spec (apps/v4/content/docs/registry/dynamic-search.mdx, read via gh api by this lane) defines GET /r/registry.json?q=&type=&limit=&offset= with a `pagination` object as the opt-in server-side-search signal.observedadopt_as_agent_query_contractSource ↗
3C-003—registry.directory (beta): curated cross-registry aggregator with freshness telemetry. Server-rendered page yielded a 'Just shipped' feed with per-registry new-component deltas dated same-day (Shadcn Blocks +193, Zyeon UI +121, ReUI +93, Shadcn Space +62, UIAble +48), 35 'N items' badges, per-registry updated-recency (6 registries updated same-day; others 4d/6d/21d; some stale 7mo/10mo), capability badges incl. mcp/pro blocks/templates/figma, and human-written editorial groupings.observedclosest_prior_art_study_firstSource ↗
4C-004—The Component Gallery: 60 canonical components each carrying an explicit alias list, across 95 design systems. Aliases observed verbatim incl. Accordion -> Collapse/Disclosure/Expandable/ShowyHideyThing; Badge -> Tag/Label/Chip; Drawer -> Tray/Flyout/Sheet. Design-system facets carry live counts: Platform GitHub 70/Figma 23/Storybook 23; Tech React 50/Sass 22/Web Components 20; Features Code examples 79/Open source 69/Unmaintained 11/Accessibility issues 4. Manual curation via contact form; no API/export/llms.txt.observedadopt_taxonomy_modelSource ↗
5C-005—Mobbin: hand-curated real-app screenshots. Four search dimensions: Screens, UI Elements, Flows, Text in Screenshots. Official hosted MCP at https://api.mobbin.com/mcp returning inline images + metadata, 60 req/min, default 20 screens/call, paid-plan OAuth-enforced, beta. Weekly curation.observedreference_for_visual_agent_retrievalSource ↗
6C-006—Creative Tim UI: llms.txt is 72,531 bytes, claims '435+ blocks'; 418 distinct /ui/r/{name}.json block URLs extracted from it; two fetched (banner-01, hero-01) were valid registry:block items with categories and meta. Ships a CLI and an agent skill (npx skills add creativetimofficial/ui). PRO blocks need an API key.observedproof_legacy_vendor_can_retrofitSource ↗
7C-007—ReactBits registry.json parsed to 672 items (name=@react-bits) — the largest single registry actually parsed in this run. Tailark parsed to 469 (name=Tailark Base UI).observedhighest_yield_single_integrationSource ↗
8C-008—UIverse: 4,456 UI elements extracted from the live /elements page. Community-submitted, continuous refresh. Categories (Buttons/Checkboxes/Cards/Loaders) plus style tag facets (#neumorphism, #3d, #gradient), sort/filter, per-author attribution. Strong visual browse for non-technical users. No agent access found: /llms.txt 404, /api/elements 404.observedmarket_gap_evidenceSource ↗
9C-009—Awwwards: deepest verified multi-facet scheme. Facets include award level, ~27 industry categories, style tags (3D, Minimal, Parallax, Microinteractions), technology (React, GSAP, Three.js, WebGL, Webflow), 100+ countries, font name, and hex colour-swatch filtering.observedadopt_nontechnical_browse_facetsSource ↗
10C-010—Adele (UXPin): ~35-column comparison matrix over design systems in five groups (Basics, Engineering, Design assets, Content & guidance, Documentation & delivery), sortable/filterable, cells deep-linked to source docs. Includes a 'color naming convention' facet with enum natural/abstract/branded/specific.observedadopt_facet_catalogueSource ↗
—C-011—Aceternity UI registry.json parsed to 278 items; /ai-recommendations page self-describes as machine-readable catalog of 111 free + 23 pro components, 17 templates, 167 pro blocks, 1 hooks; llms.txt points there.observedstudy_llm_catalog_patternSource ↗
—C-012—Magic UI registry.json parsed to 247 items; homepage says '150+ components'. MCP (magicuidesign/mcp, MIT) exposes exactly 3 tools: listRegistryItems (kind/query/limit/offset), searchRegistryItems, getRegistryItem, reading the live registry.observedreference_mcp_implementationSource ↗
—C-013—Tailark registry.json parsed to 469 items (name=Tailark Base UI).observedcorpus_candidateSource ↗
—C-014—Fancy Components registry.json parsed to 158 items (name=fancy).observedcorpus_candidateSource ↗
—C-015—HextaUI registry.json parsed to 139 items; llms.txt present.observedcorpus_candidateSource ↗
—C-016—Eldora UI registry.json parsed to 115 items.observedcorpus_candidateSource ↗
—C-017—Kokonut UI registry.json parsed to 51 items; llms.txt present.observedcorpus_candidateSource ↗
—C-018—shadcn/ui core index.json parsed to 63 items, all type registry:ui.observedbaseline_primitive_setSource ↗
—C-019—Design Systems Repo: deliberately flat — no tags, categories, or industry facets; only A-Z and Most Recent sort. ~55 systems visible before truncation. Typeform submission.observednegative_controlSource ↗
—C-020—Collect UI: daily curation from Dribbble shots; nav exposes Designers/Categories/Trending/Favorites.observedlow_prioritySource ↗
—C-021—UI Garage: SHUT DOWN after 8 years; closure notice only.observeddead_removeSource ↗
—C-022—Land-book: could not be assessed. 403 direct; r.jina.ai proxy returned a bot-check/CAPTCHA screen.unknownblockedSource ↗
—C-023—Indie UI: domain does not resolve (DNS failure).observeddead_removeSource ↗
—C-024—Spectrum UI: domain does not resolve (DNS failure).observeddead_removeSource ↗
—C-025—NyxbUI: domain does not resolve (DNS failure).observeddead_removeSource ↗
—C-026—Edil-Ozi: domain does not resolve (DNS failure).observeddead_removeSource ↗
—C-027—Origin UI: Cloudflare-fronted; returns a ~469,957-byte HTML SPA shell for /r/*.json paths to non-browser clients; WebFetch 403. Search results claim an @originui registry endpoint pattern.unknownneeds_browser_probeSource ↗
—C-028—Motion Primitives: persistent HTTP 429 across three attempts.unknownretry_laterSource ↗
—C-029—Cult UI: persistent HTTP 429 across three attempts.unknownretry_laterSource ↗
—C-030—Skiper UI: domain resolves but every registry path probed returned 404.observedlow_prioritySource ↗
—C-031—Luxe: probed for machine-readable agent surface. Result: domain resolves; probed registry paths 404.observeddenominator_no_agent_surface_foundLuxe
—C-032—Syntax UI: probed for machine-readable agent surface. Result: domain resolves; probed registry paths 404.observeddenominator_no_agent_surface_foundSyntax UI
—C-033—Animata: probed for machine-readable agent surface. Result: domain resolves; probed registry paths 404.observeddenominator_no_agent_surface_foundAnimata
—C-034—Tailwind Plus (Tailwind UI): probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundTailwind Plus (Tailwind UI)
—C-035—Untitled UI: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundUntitled UI
—C-036—Preline UI: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundPreline UI
—C-037—Flowbite: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundFlowbite
—C-038—Meraki UI: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundMeraki UI
—C-039—Float UI: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundFloat UI
—C-040—Windstatic: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundWindstatic
—C-041—Cruip: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundCruip
—C-042—Tremor: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundTremor
—C-043—MUI Store / MUI X: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundMUI Store / MUI X
—C-044—Mantine (commercial): probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundMantine (commercial)
—C-045—Plasmic: probed for machine-readable agent surface. Result: llms.txt 404.observeddenominator_no_agent_surface_foundPlasmic
—C-046—Ant Design Pro: probed for machine-readable agent surface. Result: returns SPA HTML shell, not a real llms.txt.observeddenominator_no_agent_surface_foundAnt Design Pro
—C-047—v0 (Vercel): probed for machine-readable agent surface. Result: returns SPA HTML shell, not a real llms.txt.observeddenominator_no_agent_surface_foundv0 (Vercel)
—C-048—Locofy: probed for machine-readable agent surface. Result: returns SPA HTML shell, not a real llms.txt.observeddenominator_no_agent_surface_foundLocofy
—C-049—ThemeForest / Envato: probed for machine-readable agent surface. Result: 403 to probe.observeddenominator_no_agent_surface_foundThemeForest / Envato
—C-050—daisyUI: llms.txt present; ships a full agent skill (200, text/plain).observeddenominator_has_agent_surfacedaisyUI
—C-051—TailGrids: llms.txt present; claims '600+' (200, text/plain).observeddenominator_has_agent_surfaceTailGrids
—C-052—Shuffle.dev: llms.txt present (200, text/plain).observeddenominator_has_agent_surfaceShuffle.dev
—C-053—UI8: llms.txt present; claims '14,000+ premium design resources' (200, text/plain).observeddenominator_has_agent_surfaceUI8
—C-054—Builder.io: llms.txt present (200, text/plain).observeddenominator_has_agent_surfaceBuilder.io
—C-055—Lovable: llms.txt present (200, text/plain).observeddenominator_has_agent_surfaceLovable
—C-056—Framer: llms.txt present (200, text/plain).observeddenominator_has_agent_surfaceFramer
—C-057—Webflow: llms.txt present (200, text/plain).observeddenominator_has_agent_surfaceWebflow
—C-058—Anima: llms.txt present (200, text/plain).observeddenominator_has_agent_surfaceAnima
—C-059—TeleportHQ: llms.txt present (200, text/plain).observeddenominator_has_agent_surfaceTeleportHQ
—C-060—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapFigma Community
—C-061—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapWebflow marketplace
—C-062—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapFramer marketplace
—C-063—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapChakra UI Pro
—C-064—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapRefine
—C-065—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapBolt
—C-066—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapBuilder.io visual editor
—C-067—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapStorybook showcase
—C-068—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapChromatic
—C-069—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapPercy
—C-070—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapApplitools
—C-071—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapBacklight.dev
—C-072—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapSupernova.io
—C-073—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapzeroheight
—C-074—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapKnapsack
—C-075—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapSpecify
—C-076—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapTokens Studio
—C-077—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapFigma Dev Mode / Code Connect
—C-078—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapPenpot
—C-079—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapUXPin Merge
—C-080—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapBit.dev
—C-081—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapMaterial Design catalog
—C-082—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapApple HIG
—C-083—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapFluent UI catalog
—C-084—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapCarbon Design System
—C-085—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapPolaris (Shopify)
—C-086—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapAtlassian Design System
—C-087—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapPrimer (GitHub)
—C-088—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapAdobe Spectrum
—C-089—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapBase Web (Uber)
—C-090—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapLightning Design System
—C-091—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapUI Sources
—C-092—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapScreensdesign
—C-093—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapPage Flows
—C-094—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapSaaS Interface
—C-095—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapGodly.website
—C-096—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapLapa Ninja
—C-097—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapHttpster
—C-098—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapSiteInspire
—C-099—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapDark Mode Design
—C-100—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapRefero.design
—C-101—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapNicelydone
—C-102—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapCalltoidea
—C-103—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapScreenlane
—C-104—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapScrnshts
—C-105—Named in the P05 commercial denominator target list but NOT reached in this run.unknownunreached_denominator_gapMobile Patterns

Repositories and OSS precedents

122 mined records. Search and inspect the full agent output; nothing is collapsed into a top-ten headline.

RankIdentityWhat the agent foundEvidenceSource
1shadcn-ui/ui—The registry spec itself; Dynamic Search contract (GET /r/registry.json?q&type&limit&offset with a `pagination` object as the opt-in server-side-search signal) read directly from apps/v4/content/docs/registry/dynamic-search.mdx by this lane.observedtop10_adopt_or_studySource ↗
2idealo/imagededup—pHash/dHash/wHash/CNN methods PLUS an evaluation harness to measure the near-duplicate rate before choosing a threshold.observedtop10_adopt_or_studySource ↗
3facebookresearch/faiss—ANN/exact vector index; 7,678 vectors is far below its strain point.observedtop10_adopt_or_studySource ↗
4upstash/context7—Versioned, freshness-aware retrieval corpus for LLMs.observedtop10_adopt_or_studySource ↗
5storybookjs/storybook—CSF as the component-description format; Storybook Composition federates many registries into one browsable index.observedtop10_adopt_or_studySource ↗
6openai/CLIP—Image/text embeddings catching semantic near-duplicates that perceptual hashing misses (same component, restyled/recoloured).observedtop10_adopt_or_studySource ↗
7microsoft/playwright—Deterministic-viewport parallel screenshot capture at scale.observedtop10_adopt_or_studySource ↗
8dgtlmoon/changedetection.io—Change-detection loop deciding WHEN a source needs re-capture.observedtop10_adopt_or_studySource ↗
9tajo/ladle—Drop-in CSF-compatible story runner, far lighter than Storybook.observedtop10_adopt_or_studySource ↗
10teambit/bit—Component-as-independently-versioned-unit with a hosted browsable scope.observedtop10_adopt_or_studySource ↗
—ant-design/ant-design—Category taxonomy at scale: General/Layout/Navigation/Data Entry/Data Display/Feedback.observeddenominatorSource ↗
—mui/material-ui—Component API naming consistency across a very large surface.observeddenominatorSource ↗
—tailwindlabs/tailwindcss—Token vocabulary — the substrate our re-theming depends on.observeddenominatorSource ↗
—saadeghi/daisyui—Pure-CSS semantic class layer; re-theming without touching markup.observeddenominatorSource ↗
—chakra-ui/chakra-ui—Recipe/slot pattern for enumerating variants.observeddenominatorSource ↗
—mantinedev/mantine—Dense per-component docs+demo colocation.observeddenominatorSource ↗
—heroui-inc/heroui—Formerly NextUI; nextui-org/nextui redirects here.observeddenominatorSource ↗
—tailwindlabs/headlessui—Behaviour/appearance split — the axis P05 dedupe must respect.observeddenominatorSource ↗
—magicuidesign/magicui—Animated-component registry shipping an MCP alongside.observeddenominatorSource ↗
—microsoft/fluentui—Multi-framework single design language.observeddenominatorSource ↗
—radix-ui/primitives—Anatomy/part naming — a canonical primitive vocabulary candidate.observeddenominatorSource ↗
—adobe/react-spectrum—Behaviour hooks separated from render; strongest a11y contract.observeddenominatorSource ↗
—shuding/nextra—Docs-site generation from a content tree.observeddenominatorSource ↗
—mui/base-ui—Current successor to the Radix/Headless lineage.observeddenominatorSource ↗
—unovue/shadcn-vue—Cross-framework port of one registry — a real near-duplicate generator.observeddenominatorSource ↗
—carbon-design-system/carbon—Enterprise token pipeline.observeddenominatorSource ↗
—themesberg/flowbite—Tailwind-native component catalog.observeddenominatorSource ↗
—huntabyte/shadcn-svelte—Second port of shadcn — same components, different code.observeddenominatorSource ↗
—chakra-ui/ark—State-machine-driven headless across 4 frameworks.observeddenominatorSource ↗
—melt-ui/melt-ui—Builder pattern.observeddenominatorSource ↗
—primer/react—GitHub's own design system.observeddenominatorSource ↗
—tremorlabs/tremor—Dashboard/chart blocks.observeddenominatorSource ↗
—huntabyte/bits-ui—Svelte headless layer.observeddenominatorSource ↗
—spartan-ng/spartan—Angular shadcn analogue.observeddenominatorSource ↗
—chakra-ui/park-ui—Ark+Panda preset layer.observeddenominatorSource ↗
—shadcn-ui/registry-template—Reference third-party registry scaffold.observeddenominatorSource ↗
—Shopify/polaris-react-archive—Shopify Polaris.observedexcluded_rights_or_staleSource ↗
—cosscom/coss—Cal.com design system.observedexcluded_rights_or_staleSource ↗
—styleguidist/react-styleguidist—Living-styleguide generation.observeddenominatorSource ↗
—stackblitz/core—Embed model for live code.observeddenominatorSource ↗
—react-cosmos/react-cosmos—Fixture model — lighter than CSF for auto-generated previews.observeddenominatorSource ↗
—codesandbox/sandpack—In-browser bundling for live preview without our own infra.observeddenominatorSource ↗
—pmndrs/leva—Auto-generated control panel from a prop schema.observeddenominatorSource ↗
—stackblitz/webcontainer-core—Browser-native runtime for zero-backend previews.observeddenominatorSource ↗
—seek-oss/playroom—Simultaneous multi-viewport preview with shareable URL state.observeddenominatorSource ↗
—histoire-dev/histoire—Vite-native story build; faster than Storybook at scale.observeddenominatorSource ↗
—storybookjs/design-system—Storybook dogfooding its own system.observeddenominatorSource ↗
—chromaui/chromatic-cli—Snapshot upload/diff orchestration and TurboSnap change detection.observeddenominatorSource ↗
—storybookjs/test-runner—Stories to executable tests — the harness for automated screenshotting.observeddenominatorSource ↗
—pedronauck/docz—Docs generation.observedexcluded_rights_or_staleSource ↗
—storybookjs/builder-vite—Vite builder.observedexcluded_rights_or_staleSource ↗
—storybookjs/eslint-plugin-storybook—Story lint rules.observedexcluded_rights_or_staleSource ↗
—vercel/geist-font—Font only.observeddenominatorSource ↗
—milvus-io/milvus—Full vector DB if the corpus outgrows a flat index.observeddenominatorSource ↗
—qdrant/qdrant—Payload filtering alongside vector search — taxonomy + visual similarity in one query.observeddenominatorSource ↗
—huggingface/sentence-transformers—Unified text+image embedding API; easiest CLIP on-ramp.observeddenominatorSource ↗
—spotify/annoy—Memory-mapped static index; good if the index rebuilds on refresh.observeddenominatorSource ↗
—pgvector/pgvector—Keeps vectors next to metadata — avoids a second datastore.observeddenominatorSource ↗
—mapbox/pixelmatch—Exact-pixel diff as a cheap first-pass filter before hashing.observeddenominatorSource ↗
—nmslib/hnswlib—Header-only HNSW; minimal dependency.observeddenominatorSource ↗
—unum-cloud/USearch—Single-file ANN with JS bindings — fits a Node pipeline.observeddenominatorSource ↗
—americanexpress/jest-image-snapshot—Threshold tuning for 'visually same' — the parameter P05 must calibrate.observeddenominatorSource ↗
—JohannesBuchner/imagehash—Canonical pHash/aHash/dHash/wHash, actively maintained.observeddenominatorSource ↗
—chroma-core/chroma—Lowest-ceremony local vector store.observeddenominatorSource ↗
—weaviate/weaviate—Built-in multi-modal CLIP module.observeddenominatorSource ↗
—lancedb/lancedb—Embedded multimodal store, no server.observeddenominatorSource ↗
—jenssegers/imagehash—PHP pHash port — reference implementation only.observeddenominatorSource ↗
—kornelski/dssim—Best perceptual SSIM implementation.observedexcluded_rights_or_staleSource ↗
—reg-viz/reg-suit—Screenshot-diff reporting UI.observeddenominatorSource ↗
—lost-pixel/lost-pixel—Visual regression runner.observedexcluded_rights_or_staleSource ↗
—garris/BackstopJS—Visual regression.observeddenominatorSource ↗
—thorn-oss/perception—Benchmarking framework for comparing hash methods head-to-head.observeddenominatorSource ↗
—abonander/img_hash—Rust pHash.observeddenominatorSource ↗
—commonsmachinery/blockhash—Blockhash reference implementation.observeddenominatorSource ↗
—percy/cli—Visual testing CLI.observeddenominatorSource ↗
—jina-ai/clip-as-service—CLIP serving.observeddenominatorSource ↗
—typesense/typesense—Search engine.observedexcluded_rights_or_staleSource ↗
—meilisearch/meilisearch—Search engine.observeddenominatorSource ↗
—valeriansaliou/sonic—Lightweight lexical search.observeddenominatorSource ↗
—unclecode/crawl4ai—LLM-shaped extraction — the AGPL-free Firecrawl alternative.observeddenominatorSource ↗
—puppeteer/puppeteer—Screenshot capture.observeddenominatorSource ↗
—scrapy/scrapy—Mature scheduling and dedup-by-URL frontier.observeddenominatorSource ↗
—apify/crawlee—Request queue + autoscaling + Playwright integration in one.observeddenominatorSource ↗
—semantic-release/semantic-release—Version-event to pipeline trigger.observeddenominatorSource ↗
—changesets/changesets—Per-package change intent in monorepos.observeddenominatorSource ↗
—jina-ai/reader—URL to LLM-friendly text; the r.jina.ai proxy that unblocked 403-walled galleries in this run.observeddenominatorSource ↗
—miniflux/v2—Feed-polling scheduler with sane backoff.observeddenominatorSource ↗
—jsdelivr/jsdelivr—CDN-based source fetch without cloning.observeddenominatorSource ↗
—dependabot/dependabot-core—Version-detection logic — the permissive alternative to Renovate.observeddenominatorSource ↗
—antfu-collective/taze—Lightweight bulk version checking.observeddenominatorSource ↗
—npm/cli—Registry API surface.observeddenominatorSource ↗
—unjs/giget—Subtree fetch without a full clone.observeddenominatorSource ↗
—apify/apify-sdk-js—Actor/run orchestration.observeddenominatorSource ↗
—renovatebot/renovate—Best-in-class refresh scheduling.observedexcluded_rights_or_staleSource ↗
—firecrawl/firecrawl—Crawl-to-LLM extraction.observedexcluded_rights_or_staleSource ↗
—DIYgod/RSSHub—Feed synthesis for sources without feeds.observedexcluded_rights_or_staleSource ↗
—browserless/browserless—Hosted headless browser.observedexcluded_rights_or_staleSource ↗
—punkpeye/awesome-mcp-servers—Denominator of existing agent-facing catalogs.observeddenominatorSource ↗
—modelcontextprotocol/servers—Reference server patterns.observeddenominatorSource ↗
—microsoft/playwright-mcp—Accessibility-tree-over-pixels for agent consumption — a cheaper agent surface than screenshots.observeddenominatorSource ↗
—modelcontextprotocol/python-sdk—Server implementation.observeddenominatorSource ↗
—anthropics/claude-quickstarts—Reference agent patterns.observeddenominatorSource ↗
—modelcontextprotocol/typescript-sdk—TS server implementation.observeddenominatorSource ↗
—modelcontextprotocol/inspector—Debug harness for our own MCP.observeddenominatorSource ↗
—modelcontextprotocol/registry—Registry-of-servers discovery model — directly parallel to a registry-of-components.observeddenominatorSource ↗
—Jpisnice/shadcn-ui-mcp-server—Working proof that component-catalog-over-MCP is viable.observeddenominatorSource ↗
—AnswerDotAI/llms-txt—Cheap static agent-discoverable surface alongside MCP.observeddenominatorSource ↗
—magicuidesign/mcp—Smallest complete registry+MCP pair to read end to end.observeddenominatorSource ↗
—21st-dev/magic-mcp—10k+ component search over MCP.observedexcluded_rights_or_staleSource ↗
—gcsebas99/web-ui-component-spec-mcp—Component-spec-over-MCP experiment.observeddenominatorSource ↗
—Panda-CSS/park-ui—Probed via gh api repos/Panda-CSS/park-ui and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—origin-ui/origin-ui—Probed via gh api repos/origin-ui/origin-ui and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—aaronjackson/img-hash—Probed via gh api repos/aaronjackson/img-hash and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—Nachtalb/imagehash-rs—Probed via gh api repos/Nachtalb/imagehash-rs and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—Zeta611/imagehash—Probed via gh api repos/Zeta611/imagehash and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—lokalise/lokalise—Probed via gh api repos/lokalise/lokalise and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—vercel/geist-ui—Probed via gh api repos/vercel/geist-ui and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—aceternity/ui—Probed via gh api repos/aceternity/ui and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—stevenmiller888/aceternity—Probed via gh api repos/stevenmiller888/aceternity and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—shadcn-ui/registry-template-v2—Probed via gh api repos/shadcn-ui/registry-template-v2 and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—shadcn-ui/registry—Probed via gh api repos/shadcn-ui/registry and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗
—supabase/supabase-mcp—Probed via gh api repos/supabase/supabase-mcp and returned HTTP 404.unknownunconfirmed_do_not_citeSource ↗

Innovation register

108 mined records. Search and inspect the full agent output; nothing is collapsed into a top-ten headline.

RankIdentityWhat the agent foundEvidenceSource
1IN-001—Adopt the shadcn Dynamic Search contract as P05's agent-facing query API verbatimobserved——
2IN-002—Adopt canonical-component + alias-set, NOT a flat tag vocabularyobserved——
3IN-003—Separate the index into two tiers by tag provenance and never let weak tags gate client-facing selectionobserved——
4IN-004—Measure the visual near-duplicate rate with perceptual hash + CLIP before designing dedupeobserved——
5IN-005—Actionist must OWN the archetype shell and the 20 AutoSaaS app primitives; harvest only decorative/marketing surfacesinferred——
6IN-006—Treat the corpus as a dated snapshot, not a living layer, until a timestamp field existsobserved——
7IN-007—Use the existing discovery frontier (urls-union) as the refresh queue; the design is mechanism-ready but legally gatedobserved——
8IN-008—Let clients select by visual attribute (colour, density, style), never by component nameobserved——
9IN-009—Run the theme-eligibility gate over all 7,949 and publish pass/fail as a first-class index fieldinferred——
10IN-010—Do NOT build an industry facet from legacy best_for_industries — it does not discriminateobserved——
—IN-011—Perceptual hash (pHash/dHash/wHash) as the first dedupe passhypothesis——
—IN-012—CLIP embeddings as the second dedupe pass for semantic near-duplicateshypothesis——
—IN-013—Cluster on the DOM/CSS structure of bundle.html rather than the imagehypothesis——
—IN-014—One-per-author cap within a category to break house-style clusteringobserved——
—IN-015—Exclude junk/test fixtures by rule at index timeobserved——
—IN-016—Filter the client-facing picker to tagged components onlyinferred——
—IN-017—Use usage_count as a popularity prior where presentobserved——
—IN-018—Rank by tag confidence first, damped by tag spread, installs as tiebreakobserved——
—IN-019—Serve preview.webp in the grid and the bundle only on demandobserved——
—IN-020—Hover-to-play video preview for components with video_urlobserved——
—IN-021—Virtualised grid; never pre-render cardsobserved——
—IN-022—Progressive disclosure: pick 1 of ~10 per category, not browse 7,949inferred——
—IN-023—Side-by-side comparison of 2-3 candidates under the client's own token packhypothesis——
—IN-024—Show each component in the client's palette BEFORE selection, not afterinferred——
—IN-025—Scope token replacement to :root and .dark separately, never globallyobserved——
—IN-026—Map white/N and black/N literals to color-mix() against theme tokensobserved——
—IN-027—Leave red/green/amber/yellow alone as semantic status coloursobserved——
—IN-028—Exclude WebGL/shader components from theming and present them as fixed-palette effectsobserved——
—IN-029—Detect and route Tailwind v3 builds to a second mapping tableobserved——
—IN-030—Make the eligibility gate a checkable per-component contract, not a corpus-wide assumptioninferred——
—IN-031—Screenshot re-themed bundles headlessly and diff against the original to catch contrast failuresobserved——
—IN-032—Compute WCAG contrast ratios post-theme and fail components below AAhypothesis——
—IN-033—Join the two 21st stores on a NORMALISED canonical key, not raw URL string equalityobserved——
—IN-034—Carry source_available as a first-class index fieldobserved——
—IN-035—Prefer the legacy store's registry-item.json as the dependency recordobserved——
—IN-036—Use the legacy classification.json as the semantic/use-case axisobserved——
—IN-037—Do NOT delete either 21st store as a duplicateobserved——
—IN-038—Record every component with a provenance tier and refuse admission without oneobserved——
—IN-039—Default every third-party record to rights_status: gated, reuse: reference_onlyobserved——
—IN-040—Model the corpus as reference-for-regeneration, not a parts bin to copyhypothesis——
—IN-041—Build the index so the corpus can be swapped for a licensed source without redesignhypothesis——
—IN-042—Treat registry.json-serving vendors as the licensed refresh pathobserved——
—IN-043—Poll registry.json endpoints and diff item lists to detect new releaseshypothesis——
—IN-044—Copy registry.directory's freshness telemetry modelobserved——
—IN-045—Show clients a per-component last-verified datehypothesis——
—IN-046—Re-capture previews on a change-detection trigger, not a fixed scheduleinferred——
—IN-047—Backfill the 271 missing previews with Playwright rather than the vendor CDNobserved——
—IN-048—Close the 276-component discovery backlog before any new discovery sweepobserved——
—IN-049—Keep serve.mjs and find.mjs; rebuild the data layer onlyobserved——
—IN-050—Steal board.html's CSS and interaction model, discard its markup and dataobserved——
—IN-051—Generate one slim picker-index.json rather than shipping three 700KB+ JSON filesobserved——
—IN-052—Adopt the Great Library 11-stage lifecycle rather than inventing an admission ladderobserved——
—IN-053—Schematize KEEPERS.md into structured recordsobserved——
—IN-054—Own navigation as an archetype-level structure, not a harvested componentinferred——
—IN-055—Own forms because validation, error state and submission are contract surfacesinferred——
—IN-056—Own tables because sorting, pagination, selection and empty/loading/error states are behaviouralinferred——
—IN-057—Own the feedback family (toast, alert, empty, loading, error) as one coherent setinferred——
—IN-058—Harvest heroes, testimonials, pricing sections, galleries and marketing surfacesobserved——
—IN-059—Define an owned base set of roughly 20 components matching the AutoSaaS requirement listobserved——
—IN-060—Derive the owned set from archetype demand, not from a generic dashboard listobserved——
—IN-061—Version owned components independently with their own contractsinferred——
—IN-062—Express owned components as a shadcn-compatible registry Actionist publisheshypothesis——
—IN-063—Give every component an a11y contract field with observed evidence, not a claimobserved——
—IN-064—Carry 'unmaintained' and 'has known issues' as first-class facetsobserved——
—IN-065—Store components in an embedded vector store colocated with metadatahypothesis——
—IN-066—Expose an MCP server over the component indexobserved——
—IN-067—Return accessibility-tree summaries rather than images to agents where possibleobserved——
—IN-068—Cap agent responses at a small number of candidates with structured metadataobserved——
—IN-069—Publish an llms.txt describing the corpus and its query surfaceobserved——
—IN-070—Let agents query by archetype role rather than by component namehypothesis——
—IN-071—Return a re-themed preview URL in agent responses so the agent can verify visuallyhypothesis——
—IN-072—Expose the theme-eligibility flag in the agent query so ineligible components are never returnedinferred——
—IN-073—Support text-in-preview search via OCR over the 7,678 previewsobserved——
—IN-074—Extract a dominant-colour palette per preview and allow colour-swatch filteringhypothesis——
—IN-075—Filter by visual density/complexity using the legacy complexity axisobserved——
—IN-076—Filter by visual_style using the legacy 24-value axisobserved——
—IN-077—Show interaction affordances as a facetobserved——
—IN-078—Let clients pick by reference image: upload a screenshot, retrieve visually similar componentshypothesis——
—IN-079—Let clients pick by describing the job in plain words, matched against use_casesobserved——
—IN-080—Present a small curated shelf per archetype rather than the whole corpusinferred——
—IN-081—Record every client selection as training signal for P06hypothesis——
—IN-082—Track which curated candidates are never chosen and retire themhypothesis——
—IN-083—A/B the curated top-10 per category against random draws from the eligible sethypothesis——
—IN-084—Measure time-to-first-selection as the primary UX metrichypothesis——
—IN-085—Let clients reject a whole visual style in one action to prune the space fasthypothesis——
—IN-086—Keep a human greenlight gate for anything client-facingobserved——
—IN-087—Score components on completeness and flag partial onesobserved——
—IN-088—Deprioritise components whose previews are under 2KB unless they are known primitivesobserved——
—IN-089—Treat the 121 bundle-less components as index-only recordsobserved——
—IN-090—Never present a component whose preview is missingobserved——
—IN-091—Build the index incrementally so a partial refresh never invalidates the wholehypothesis——
—IN-092—Store previews content-addressed to make dedupe and cache invalidation trivialobserved——
—IN-093—Keep the 75-tag vocabulary as a retrieval index but not as the client-facing taxonomyinferred——
—IN-094—Map the 75 tags onto a two-level hierarchy for browsinghypothesis——
—IN-095—Distinguish structural role from visual treatment as separate axesinferred——
—IN-096—Add an explicit archetype-role axis absent from both storeshypothesis——
—IN-097—Reclassify a sample directly against the 17 industries to test recoverabilityinferred——
—IN-098—Accept that most UI components ARE industry-agnostic and drop industry from the component layerinferred——
—IN-099—Carry framework/stack as a hard filterobserved——
—IN-100—Flag heavyweight dependencies (three, gsap, @react-three/fiber) at index timeobserved——
—IN-101—Use dependency overlap as a secondary near-duplicate signalhypothesis——
—IN-102—Detect cross-framework ports as a distinct duplicate classobserved——
—IN-103—Publish the corpus join as a reproducible script, not a one-off reportinferred——
—IN-104—Fail the build if index counts diverge from a fresh count of the storesobserved——
—IN-105—Keep a written record of which numbers are sampled vs corpus-wideobserved——
—IN-106—Do not quote registry item counts as component countsobserved——
—IN-107—Prefer r.jina.ai or an equivalent reader proxy for 403-walled research surfacesobserved——
—IN-108—Design the layer so a legal block on 21st material degrades it rather than killing itinferred——

Complete source register

38 mined records. Search and inspect the full agent output; nothing is collapsed into a top-ten headline.

RankIdentityWhat the agent foundEvidenceSource
—S-001—Bundle store holds exactly 7,949 component directories; 7,828 with bundle.html; 7,678 with preview.webp; 7,949 with meta.json. RE-DERIVED BY THIS LANE via `ls harvest | wc -l` and glob counts; matches the inherited receipt exactly.observedconfirmed_inherited_fact[private local source withheld]
—S-002—Legacy source-bearing store: 3,509 entries, of which 3,507 are component dirs (excluding _utils), 3,507 carry registry-item.json AND classification.json, and 3,506 carry real non-demo .tsx source. RE-DERIVED BY THIS LANE.observedconfirmed_inherited_fact[private local source withheld]
—S-003—Canonical join re-run by this lane with case-insensitive author+slug normalisation: bundle keys 7,949, legacy keys 3,479 (28 with unparseable provenance), INTERSECTION 2,945, bundle-only 5,004, legacy-only 534, UNION 8,483.observedrefines_inherited_fact(join across both 21st stores)
—S-004—Tagging re-derived against harvested ground truth: 7,279 tagged, 670 untagged of 7,949 (91.6%). componentToTags holds 7,382 entries (103 not on disk). stats.untagged=3998 and stats.tagged=3951 are BOTH stale fields. 75-tag vocabulary confirmed.observedconfirmed_inherited_fact[private local source withheld]
—S-005—NEW FINDING: tagToComponents holds ONLY page-tier (ground truth) tags while tagCounts includes api+local inference. Worked example: sidebar is 47 in tagToComponents, 143 in tagCounts, decomposing to page=47/api=81/local=15. Any supply figure must state its tier.observednew_finding_this_lane[private local source withheld]
—S-006—NEW FINDING: the 75-tag vocabulary behaves as a single-label scheme, not a facet grid. Mean 2.09 tags/component; 3,885 of 7,382 (52.6%) carry exactly one tag. Page-tier mean is 1.87 with 1,986 of 4,033 single-tagged.observednew_finding_this_lane[private local source withheld]
—S-007—Ground-truth (page-tier, harvested, with preview) supply for all 20 AutoSaaS-required primitives ranges from 32 (onboarding) to 164 (spinner). Every required primitive has a direct tag and non-trivial supply. Sample: table 141/180, form 120/163, sidebar 44/139, timeline 42/133, onboarding 32/73 (page/any-tier).observednew_finding_this_lane(AutoSaaS-20 vs corpus supply, computed by this lane)
—S-008—NEW FINDING: exact byte-identical preview duplicates are only 65 groups covering 167 components, a surplus of 102 of 7,678 (1.3%) — versus a 2,058 name-collision surplus (25.9%). Largest groups are test-fixture clusters from single authors.observednew_finding_this_lane[private local source withheld]
—S-009—NEW FINDING: no meta.json carries a harvest timestamp. Fields across a 3,000-dir sample: url, author, slug, name, description, installCommand, id, bundleUrl, previewUrl, harvested (all 3,000); usage_count, demo_id, video_url (1,125 = 37.5%); preview, previewVia (121). Directory mtimes across a 400-dir sample span 2026-08-18T20:03Z to 2026-08-18T21:10Z — a single 67-minute capture window.observednew_finding_this_lane[private local source withheld]
—S-010—NEW FINDING: the discovery frontier holds 8,225 URLs (union) plus 687 extra, against 7,949 harvested. 276 are discovered-but-not-harvested; 0 harvested items are absent from the union. This delta is a ready-made refresh backlog.observednew_finding_this_lane[private local source withheld]
—S-011—NEW FINDING: the true npm dependency surface is 237 distinct packages across the source-bearing store (lucide-react 1272, class-variance-authority 1031, framer-motion 874, @radix-ui/react-slot 824, motion 294, next 176, three 85, gsap 57, @react-three/fiber 29). Source files: 6,569 totalling 28.4 MB, median 2,524 B.observedcloses_prior_unknown[private local source withheld]
—S-012—Legacy semantic axes measured: 3,507 classified; 3,499 with best_for_industries; 3,507 with use_cases (16,241 total, mean 4.63); 99 distinct category values; complexity composite 2201/atomic 1261/system 44; 24 visual_style values (minimalist 1739, flat 1315, gradient 768); 38 distinct industry values.observednew_finding_this_lane[private local source withheld]
—S-013—NEW FINDING — FALSIFIES THE INDUSTRY AXIS: best_for_industries does not discriminate. Mean 3.93 industries/component; 171 components claim all 10 of the dominant set; 89.6% (3,143/3,507) claim saas. Top exact sets are repeated wholesale (180x creator-tools+e-commerce+media+saas).observednew_finding_this_lane[private local source withheld]
—S-014—NEW FINDING — J-4 IS WEAKER THAN A 36->17 MERGE IMPLIES: only 2 of 17 target industries (real_estate, saas) have a direct legacy name analogue. Under a best-effort synonym crosswalk, 5 of 17 have ZERO reachable supply: construction, logistics_freight, insurance_agencies, mortgage_brokers, property_management. Reachable counts are wildly unbalanced (saas 3,153 vs recruiting_staffing 1, law_firms 2).observednew_finding_this_lane(17-industry crosswalk test by this lane)
—S-015—Junk/test-fixture rate measured with a corrected rule set: 78 of 7,949 (0.98%). Per-rule: localhost-author 38, fixture-string 21, bare-test-name 15, numeric-name 14, char-repeat 11. Author concentration: 848 distinct authors; top-10 hold 1,943 (24.4%); top-50 hold 4,551 (57.3%); 455 authors have exactly one component.observednew_finding_this_lane[private local source withheld]
—S-016—Prior audit (read in full, 569 lines). Key inherited facts: component source absent from the bundle store (demo.tsx median 346 B, 58.1% under 500 B); 86.7% of colour rules already tokenised (SAMPLED n=25); 87.3% carry a shadcn :root block (SAMPLED n=200); 55/60 (91.7%) re-theme with one regex pass; WebGL colour in 4/25 components; no token block in 5/60 (8.3%); 99.0% carry a .dark block; a 12-token swap was performed with JS bit-identical.observedinherited_receiptresearch/21st-corpus-audit-2026-08-27.md
—S-017—Prior join lane (read in full, 173 lines). Inherited: verify-harvest.mjs PASS reconciling 7,949 = 7,828 + 121; two stores complementary not redundant; rights coverage 2 of 11,549 records (0.017%); 21st.dev terms (fetched 2026-07-20) prohibit scraping, prohibit AI training on marketplace content, and prohibit republishing structured metadata; SISO harvest rule 6 makes both stores summarize-only; joins J-1 through J-6 proposed.observedinherited_receiptresearch/actionmodel-builder-research-2026-08-26/phase-8/lanes/02-local-corpus-join/outputs/local-corpus-join-report.md
—S-018—AutoSaaS enumerates 20 required components (app shell, sidebar, topbar, metric card, data table, filter bar, status badge, empty state, loading state, error state, detail drawer, modal, tabs, segmented control, form field, file uploader, activity timeline, report card, pricing table, onboarding checklist) and a per-component metadata contract (name, use case, props, states, accessibility notes, responsive behavior, source path, examples, tests). Outputs ui-component-library.md + component-registry.json.observedinherited_requirement[private local source withheld]
—S-019—P05 owns component ingestion/refresh, dedupe and source linkage, visual previews and interaction states, taxonomy/tags/semantic use cases, and gallery search/comparison/selection. Five open questions recorded. Deps P06, P07, P08, P12. Outputs ComponentRecord, PreviewSet, CategoryGraph, Selection.observedscope_definitionsite/system-map/data/parts.json (id P05)
—S-020—The 17-industry denominator and its archetype mapping. case_workflow is primary for 6 of 17 industries; portal is secondary for 6 of 17; marketplace is primary and secondary for none. Archetypes are defined by data spine and authority model, not UI.observedcross_lane_referenceresearch/actionmodel-builder-research-2026-08-26/phase-8/lanes/03-b2b-template-shelf/outputs/b2b-template-shelf-report.md
—S-021—Sprint depth contract and packet schema; lane S1-L3 owns P05, P06, P08. Research-only boundary; historical research immutable; parent unpromoted until coordinator verification.observedgoverning_contractresearch/workstreams/2026-08-27-sprint-1/SPRINT-1-PROGRAM.md
—S-022—VERIFIED BY THIS LANE via `gh api repos/shadcn-ui/ui/contents/... | base64 -d`. Dynamic Search: CLI appends q/type/limit/offset to GET /r/registry.json; a `pagination` object in the response signals server-side filtering; opt-in and backwards compatible; static registries need no changes.observedadopt_as_contractSource ↗
—S-023—60 canonical components each with an explicit alias list across 95 design systems. Collisions observed: Banner is an alias of both Alert and Hero; Stepper is both an alias of Progress indicator and a standalone canonical; Label is an alias of Badge and standalone. Design-system facets: GitHub 70, Figma 23, Storybook 23; React 50, Sass 22, Web Components 20; Code examples 79, Open source 69, Unmaintained 11, Accessibility issues 4. Manual curation; no API/export/llms.txt.observedprimary_taxonomy_evidenceSource ↗
—S-024—A JSON-RPC initialize POST returned 401 {"jsonrpc":"2.0","error":{"code":-32001,"message":"Not authenticated - your API key is missing or was reset..."}}; GET returns 405. Proves a live authenticated MCP endpoint.observedupstream_capabilitySource ↗
—S-025—Mobbin ships a first-party hosted MCP returning inline images plus metadata; 60 req/min; default 20 screens per call; paid-plan OAuth-enforced; beta. Four search dimensions: Screens, UI Elements, Flows, Text in Screenshots. Weekly hand curation.observedreference_implementationSource ↗
—S-026—Cross-registry aggregator with freshness telemetry: same-day 'Just shipped' deltas (Shadcn Blocks +193, Zyeon UI +121, ReUI +93, Shadcn Space +62, UIAble +48), 35 'N items' badges, updated-recency from same-day to 10 months, capability badges including mcp, and human-written editorial groupings.observedclosest_prior_artSource ↗
—S-027—Item counts parsed live: ReactBits 672, Tailark 469, Aceternity 278, Magic UI 247, Fancy Components 158, HextaUI 139, Eldora UI 115, Kokonut UI 51, shadcn/ui core 63. Claim/reality gaps found: Magic UI homepage says '150+ components' vs 247 registry items; Aceternity homepage says '200+' vs its own AI page stating 111 free + 23 pro.observedlicensed_refresh_candidates(live registry.json endpoints parsed by subagent)
—S-028—91 of 102 GitHub slugs confirmed with full records; 11 returned 404. Licence traps caught by decoding LICENSE bodies rather than trusting the API field: browserless/browserless NOASSERTION is actually SSPL with explicit commercial/CI restriction; meilisearch is partly BSL 1.1; modelcontextprotocol/servers is mid-transition MIT to Apache-2.0; npm/cli is Artistic-2.0 not MIT. 21st-dev/magic-mcp has license null AND no LICENSE file (package.json asserts ISC) — treat as unlicensed. AGPL-3.0 confirmed on renovate, firecrawl, RSSHub, dssim, and cosscom/coss (which the slug origin-space/originui redirects to).observedoss_denominator(gh api sweep over 102 repo slugs)
—S-029—Coverage shortfall recorded honestly: a subagent reached a hard model usage limit after verifying 8 of ~50 assigned gallery/design-system surfaces and declined to characterise the remaining 42 from memory. UI Garage verified SHUT DOWN. Land-book blocked by CAPTCHA even via proxy. Four component-kit domains fail DNS entirely: indie-ui.com, spectrumui.art, nyxbui.design, edilozi.pro.observedcoverage_gap(subagent coverage report, commercial slice B)
—S-030—4,456 UI elements extracted from the live page. Community-submitted continuous refresh, category plus style-tag facets, per-author attribution, strong visual browse. No agent access found: /llms.txt 404, /api/elements 404.observedmarket_gap_evidenceSource ↗
—S-031—Multi-facet scheme including hex colour-swatch filtering and font-name filtering alongside ~27 industry categories, style tags and technology facets.observednontechnical_browse_precedentSource ↗
—S-032—~35-column design-system comparison matrix in five groups, including a 'color naming convention' facet with enum natural/abstract/branded/specific.observedfacet_catalogue_precedentSource ↗
—S-033—Deliberately flat: no tags, categories or industry facets; only A-Z and Most Recent sort, at roughly 55 systems.observednegative_controlSource ↗
—S-034—UNMEASURED. The prior audit proposed perceptual hashing and did not run it; this lane measured only the exact-duplicate floor (102 surplus, 1.3%). The true rate lies between 1.3% and the 25.9% name-collision proxy.unknownopen_question_gated_to_experiment(visual near-duplicate rate over 7,678 previews)
—S-035—UNMEASURED. Inherited rates are SAMPLED n=25/n=60. The corpus-wide figure requires applying a token pack to all 7,949 bundles and scanning output CSS.unknownopen_question_gated_to_experiment(corpus-wide theme-eligibility pass rate)
—S-036—UNMEASURED and flagged by the prior audit as the most likely source of unpleasant surprises. Requires headless before/after screenshots plus contrast measurement.unknownopen_question_gated_to_experiment(whether re-themed bundles look aesthetically correct)
—S-037—UNRESOLVED and explicitly NOT this lane's decision. 21st.dev terms prohibit the acquisition mechanism; SISO harvest rule 6 makes both stores summarize-only; rights coverage is 0.017%.unknownrecorded_legal_gate(rights clearance for both 21st stores)
—S-038—UNRESOLVED. AGENT.md states /r/<author>/<slug> is metered at 2/day free and component_data.code is empty even authenticated. Testing requires a paid key and network calls — out of scope.unknownopen_question_blocked_on_authorization(whether a paid 21st.dev key returns component source)

Source: site/system-map/data/parts.json#P05 · preserved research datasets remain inline below their source-backed synthesis.