{"service":"discovery.broberg.ai","tagline":"Discover everything reusable across broberg.ai — query this BEFORE you build. Reuse > re-roll.","version":"0.3.0","start_here":"New here and don't know what to search for? GET /llms.txt — the whole map in one markdown file (every @broberg/* package by category + all fleet tips), the web-standard AI onboarding file (llmstxt.org). Humans: /onboarding. Otherwise, every endpoint and every value you can filter by is listed below. Typical flow: GET /api/search?q=<what-you-need> → if nothing fits, you're clear to build (then tell components so it's added for everyone). Search is tokenized and alias-aware: 'send email' and 'mail' both find @broberg/mail, 'dark mode' finds @broberg/theme, 'postgres' finds Supabase.","stats":{"components":61,"shipped":43,"backlog":17,"moved":1,"packages":43,"fleetSessions":11,"infraPlatforms":14,"infraTips":109,"layers":6},"endpoints":[{"method":"GET","path":"/llms.txt","description":"START HERE — the whole inventory as one markdown map (packages by category + tips), the standard AI onboarding file. /ai aliases it; /llms-full.txt inlines every tip.","example":"/llms.txt"},{"method":"GET","path":"/onboarding","description":"the human-browsable onboarding page — same map, rendered","example":"/onboarding"},{"method":"GET","path":"/api","description":"this self-describing manifest — all endpoints + searchable vocabularies","example":"/api"},{"method":"GET","path":"/api/components","description":"all components; filter with ?q= &layer= &status= &model=","example":"/api/components?q=mail&status=shipped"},{"method":"GET","path":"/api/components/:id","description":"one component by F-number or slug","example":"/api/components/F005"},{"method":"GET","path":"/api/packages","description":"installable packages with version + install string (npm or SwiftPM)","example":"/api/packages?q=lens"},{"method":"GET","path":"/api/infra","description":"infra platforms we run on + best-practice tips & gotchas","example":"/api/infra"},{"method":"GET","path":"/api/infra/:id","description":"one platform with its full tips + long-form notes","example":"/api/infra/fly"},{"method":"GET","path":"/api/fleet","description":"the fleet roster — who builds & consumes the shared library","example":"/api/fleet"},{"method":"GET","path":"/api/layers","description":"the inventory layers (L0 Rails … L4 Capstone, SDK)","example":"/api/layers"},{"method":"GET","path":"/api/stats","description":"totals","example":"/api/stats"},{"method":"GET","path":"/api/search","description":"search components + packages + fleet + infra in one call","example":"/api/search?q=deploy"},{"method":"GET","path":"/api/enrollments","description":"live enrollment roster — who has adopted which package@version (F039 auto-enrollment)","example":"/api/enrollments"},{"method":"GET","path":"/api/sessions/:session","description":"a session's enrollment status: enrolled + newest versions + the gap (shipped packages not yet adopted)","example":"/api/sessions/trail"},{"method":"POST","path":"/api/enroll","description":"self-report an enrollment. Auth = trust-on-first-use: generate your OWN key (openssl rand -hex 32) into your repo's .env, send it as header x-enroll-key — the first enroll binds it to your session, later enrolls must match. Body {session,pkg,version,role?,commit?,notes?}","example":"/api/enroll"},{"method":"GET","path":"/api/speech-dictionary","description":"@broberg/speech-dictionary's current terms + corrections, always the latest committed state (F044.1)","example":"/api/speech-dictionary"},{"method":"POST","path":"/api/speech-dictionary/edit","description":"edit the speech dictionary via a diff. Auth = trust-on-first-use: generate your OWN key (openssl rand -hex 32), send it as header x-speech-dict-key + body.session — first call binds it, no pre-shared secret ever changes hands. Commits + auto-publishes a new patch version. Body {session,addTerms?,removeTerms?,addCorrections?,removeCorrections?}","example":"/api/speech-dictionary/edit"}],"vocabularies":{"layers":[{"id":"L0","name":"Rails"},{"id":"L1","name":"Identity"},{"id":"L2","name":"Shell"},{"id":"L3","name":"Domain"},{"id":"L4","name":"Capstone"},{"id":"SDK","name":"Fleet SDKs"}],"statuses":["shipped","backlog","moved"],"models":["runtime","copy","scaffold","hybrid"],"infra":[{"id":"fly","name":"Fly.io"},{"id":"cloudflare","name":"Cloudflare"},{"id":"resend","name":"Resend"},{"id":"stripe","name":"Stripe"},{"id":"supabase","name":"Supabase"},{"id":"turso","name":"Turso / libSQL"},{"id":"npm","name":"npm / OIDC publishing"},{"id":"pitch","name":"Pitch Vault"},{"id":"image-processing","name":"Image processing (sharp / HEIC)"},{"id":"github-actions","name":"GitHub Actions / CI-CD"},{"id":"frontend","name":"Frontend (Preact / Next / PWA / web)"},{"id":"ai-providers","name":"AI / LLM providers (@broberg/ai-sdk)"},{"id":"fleet-ops","name":"Fleet ops (cc-session auth · edge · inter-session comms)"},{"id":"macos-native","name":"Native macOS/iOS apps (Swift — codesign, entitlements, TCC)"}],"packages":["@broberg/theme","@broberg/config","@broberg/mail","@broberg/media","@broberg/mail-core","@broberg/media-transform","@broberg/cron","@broberg/webpush","@broberg/mcp","@broberg/secret-scan","@broberg/lens","@broberg/auth","@broberg/apikey","@broberg/event-log","@broberg/gravatar","@broberg/consent-cookie","@broberg/theme","@broberg/ui-controls-core","@broberg/cmdk","@broberg/i18n","@broberg/mail-core","@broberg/speech-dictionary","@broberg/notify","@broberg/lens-engine","@broberg/lens-client","@broberg/bodymap","@broberg/stripe","@broberg/pwa","@broberg/forms-turnstile","@broberg/http","@broberg/seti-client","@broberg/seti-server","@broberg/soundkit","@broberg/deploy-core","@broberg/db-sdk","@broberg/ai-sdk","@upmetrics/sdk","upmetrics-swift","@broberg/fleet-client","@broberg/fleet-contracts","@broberg/complimenta-sdk","@broberg/cms-inline-edit","@broberg/cms-chat-client"]}}