{"data":{"frameworks":[{"slug":"nextjs-react","name":"Next.js + React","ecosystem":"React","status":"live","headline":"Use @headband/react in App Router or Pages Router search surfaces.","installCommand":"npm i @headband/react","docsHref":"/docs#react-sdk","examplePaths":["examples/nextjs-app-router/components/product-search.tsx"],"setupFiles":["examples/nextjs-app-router/package.json","examples/nextjs-app-router/.env.example","examples/nextjs-app-router/app/page.tsx"],"tags":["server components","client search","facets"]},{"slug":"remix-react-router","name":"Remix / React Router","ecosystem":"React","status":"recipe","headline":"Call the REST API from loaders/actions and hydrate client-side refinements.","installCommand":"fetch('/v1/search', { method: 'POST' })","docsHref":"/docs#recipe-remix-react-router","examplePaths":["examples/remix/app/routes/products.tsx"],"setupFiles":["examples/remix/package.json","examples/remix/.env.example","examples/remix/app/root.tsx"],"tags":["loaders","actions","edge-ready"]},{"slug":"astro","name":"Astro","ecosystem":"Islands","status":"recipe","headline":"Render static catalog shells and hydrate Headband search islands only where needed.","installCommand":"fetch('/v1/search', { method: 'POST' })","docsHref":"/docs#recipe-astro","examplePaths":["examples/astro/src/components/SearchIsland.astro"],"setupFiles":["examples/astro/package.json","examples/astro/.env.example","examples/astro/src/pages/index.astro"],"tags":["islands","static","commerce"]},{"slug":"sveltekit","name":"SvelteKit","ecosystem":"Svelte","status":"recipe","headline":"Use fetch against /v1/search from load functions or progressive-enhanced forms.","installCommand":"fetch('/v1/search', { method: 'POST' })","docsHref":"/docs#recipe-sveltekit","examplePaths":["examples/sveltekit/package.json","examples/sveltekit/src/routes/api/search/+server.ts"],"setupFiles":["examples/sveltekit/svelte.config.js","examples/sveltekit/src/routes/+page.svelte"],"tags":["load","forms","typescript"]},{"slug":"rails-laravel-django","name":"Rails / Laravel / Django","ecosystem":"Server-rendered","status":"recipe","headline":"Index relational records with sync scripts, then render server-owned search pages.","installCommand":"curl https://headband.dev/v1/search","docsHref":"/docs#recipe-server-rendered","examplePaths":["examples/rails/app/controllers/search_controller.rb","examples/django/search/views.py","examples/laravel/app/Http/Controllers/SearchController.php","examples/laravel/routes/web.php"],"setupFiles":["examples/rails/Gemfile","examples/rails/.env.example","examples/rails/config/routes.rb","examples/django/requirements.txt","examples/django/.env.example","examples/django/search/urls.py","examples/laravel/composer.json","examples/laravel/.env.example","examples/laravel/config/services.php"],"tags":["server-rendered","postgres","mysql"]}],"connectors":[{"slug":"postgres","name":"Postgres / Neon / Supabase","sourceType":"database","status":"recipe","headline":"Run a scheduled SQL export into /v1/bulk, then validate with /v1/search.","syncModel":"script","syncPlan":{"priority":1,"packageStatus":"package-roadmap","autoSyncCoverage":{"create":"recipe-now via scheduled backfill; package-roadmap via trigger/logical-replication event handler","update":"recipe-now via scheduled backfill; package-roadmap via trigger/logical-replication event handler","delete":"recipe-now via HEADBAND_DELETE_IDS tombstones; package-roadmap via delete-event capture and durable replay log"},"manualReplay":"npm run sync:postgres","customMapping":"Map rows to any document shape before /v1/bulk; default recipes are starter projections, not a locked schema.","engineTestOrder":["meilisearch","typesense","elasticsearch"],"nextPackageMilestone":"@headband/postgres with backfill(), handleInsert(), handleUpdate(), handleDelete(), reconcile(), and reportRun()."},"scheduler":{"mode":"self-hosted","recommendedCadence":"Every 15 minutes for active catalogs; hourly or nightly for slower back-office data.","command":"npm run sync:postgres","deploymentTargets":["GitHub Actions cron","Vercel Cron hitting an app-owned job","Render/Coolify cron worker"],"healthChecks":["sync log success event","dead-letter file is empty","optional HEADBAND_RECONCILE count check"]},"docsHref":"/docs#connector-postgres","capabilities":["bounded backfill","field projection","explicit tombstone deletes","count reconciliation","search validation"],"validationCommand":"npm run sync:postgres","requiresConfiguration":true},{"slug":"mysql","name":"MySQL / PlanetScale","sourceType":"database","status":"recipe","headline":"Export MySQL rows through the mysql CLI and batch them into Headband.","syncModel":"script","syncPlan":{"priority":2,"packageStatus":"package-roadmap","autoSyncCoverage":{"create":"recipe-now via scheduled CLI backfill; package-roadmap via binlog/deploy-request webhook or polling worker","update":"recipe-now via scheduled CLI backfill; package-roadmap via binlog/deploy-request webhook or polling worker","delete":"recipe-now via MYSQL_DELETE_IDS tombstones; package-roadmap via delete-event capture where source exposes binlog/webhook events"},"manualReplay":"npm run sync:mysql","customMapping":"Project MySQL rows into stable Headband documents with include/exclude fields or package-level mapRow().","engineTestOrder":["typesense","meilisearch","elasticsearch"],"nextPackageMilestone":"@headband/mysql with CLI backfill first, then optional PlanetScale/binlog delta adapters."},"scheduler":{"mode":"self-hosted","recommendedCadence":"Every 15-60 minutes for product/search tables; nightly for low-change operational data.","command":"npm run sync:mysql","deploymentTargets":["GitHub Actions cron","Railway/Render worker","PlanetScale deploy-request workflow"],"healthChecks":["mysql CLI exits 0","sync log success event","optional HEADBAND_RECONCILE count check"]},"docsHref":"/docs#connector-mysql","capabilities":["bounded CLI backfill","field projection","explicit tombstone deletes","count reconciliation","search validation","PlanetScale-compatible SSL mode"],"validationCommand":"npm run sync:mysql","requiresConfiguration":true},{"slug":"shopify","name":"Shopify","sourceType":"commerce","status":"recipe","headline":"Mirror Shopify products/variants into a searchable catalog index.","syncModel":"script","syncPlan":{"priority":4,"packageStatus":"package-roadmap","autoSyncCoverage":{"create":"recipe-now via scheduled Admin GraphQL backfill; package-roadmap via app-owned product webhook handler","update":"recipe-now via scheduled Admin GraphQL backfill; package-roadmap via app-owned product webhook handler plus reconciliation","delete":"recipe-now via SHOPIFY_DELETE_PRODUCT_IDS tombstones; package-roadmap via product delete webhook handler"},"manualReplay":"npm run sync:shopify","customMapping":"Map products/variants into catalog documents and exclude customer/order/payment data by default.","engineTestOrder":["meilisearch","typesense","elasticsearch"],"nextPackageMilestone":"@headband/shopify with webhook verification, product delta queue, replay, and reconciliation helpers."},"scheduler":{"mode":"self-hosted","recommendedCadence":"Every 5-15 minutes for product catalogs; combine with app-owned webhooks for hot product deltas.","command":"npm run sync:shopify","deploymentTargets":["GitHub Actions cron","Shopify app background worker","Vercel Cron hitting a server route"],"healthChecks":["Admin API page completed","dead-letter file is empty","sample search validation passes"]},"docsHref":"/docs#connector-shopify","capabilities":["bounded GraphQL catalog backfill","variant metadata projection","explicit product deletes","raw-body webhook HMAC helper","count reconciliation","search validation"],"validationCommand":"npm run sync:shopify","requiresConfiguration":true},{"slug":"stripe","name":"Stripe catalog","sourceType":"commerce","status":"recipe","headline":"Mirror products/prices into an index for account portals, docs, and internal tools.","syncModel":"script","syncPlan":{"priority":4,"packageStatus":"package-roadmap","autoSyncCoverage":{"create":"recipe-now via scheduled catalog backfill; package-roadmap via product/price webhook handler","update":"recipe-now via scheduled catalog backfill; package-roadmap via product/price webhook handler plus nightly reconciliation","delete":"recipe-now via STRIPE_DELETE_PRODUCT_IDS tombstones; package-roadmap via product deleted webhook handler"},"manualReplay":"npm run sync:stripe","customMapping":"Map products/prices into public catalog/search documents; never index payment/customer secrets.","engineTestOrder":["meilisearch","typesense","elasticsearch"],"nextPackageMilestone":"@headband/stripe with webhook verification, catalog delta queue, replay, and reconciliation helpers."},"scheduler":{"mode":"self-hosted","recommendedCadence":"Hourly for active catalogs; nightly when products/prices only change through release workflows.","command":"npm run sync:stripe","deploymentTargets":["GitHub Actions cron","Stripe webhook worker plus nightly reconciliation","Vercel Cron"],"healthChecks":["Stripe list completed","explicit deletes applied","optional HEADBAND_RECONCILE count check"]},"docsHref":"/docs#connector-stripe","capabilities":["bounded catalog backfill","stable Stripe product IDs","price metadata projection","explicit product deletes","count reconciliation","account portal search"],"validationCommand":"npm run sync:stripe","requiresConfiguration":true},{"slug":"batadb-search","name":"BataDB Search add-on","sourceType":"zvn","status":"recipe","headline":"Blueprint for a paid BataDB add-on: BataDB owns billing and product UX; Headband owns retrieval, indexing, and analytics.","syncModel":"script","syncPlan":{"priority":5,"packageStatus":"package-roadmap","autoSyncCoverage":{"create":"recipe-now via bounded Postgres-style backfill; package-roadmap via BataDB row create event worker","update":"recipe-now via bounded Postgres-style backfill; package-roadmap via BataDB row update event worker","delete":"recipe-now via BATADB_DELETE_IDS tombstones; package-roadmap via BataDB row delete event worker and branch-aware delete log"},"manualReplay":"npm run sync:batadb","customMapping":"BataDB table fields map to flexible Headband documents with include/exclude projections before any index write.","engineTestOrder":["meilisearch","typesense","elasticsearch"],"nextPackageMilestone":"BataDB Search add-on pilot with field mapping UI, branch-aware indexes, run reporting, and usage reconciliation."},"scheduler":{"mode":"self-hosted","recommendedCadence":"Every 5-15 minutes for paid add-on tenants; nightly reconciliation for low-change tables.","command":"npm run sync:batadb","deploymentTargets":["BataDB job runner","tenant-scoped cron worker","GitHub Actions cron for pilot installs"],"healthChecks":["field projection applied","dead-letter file is empty","tenant usage/count reconciliation passes"]},"docsHref":"/docs#connector-batadb-search","capabilities":["paid add-on blueprint","bounded backfill","field projection","explicit tombstone deletes","count reconciliation","usage mapping"],"validationCommand":"npm run sync:batadb","requiresConfiguration":true},{"slug":"managed-connectors","name":"Hosted connector scheduler","sourceType":"webhook","status":"roadmap","headline":"Managed scheduling, retries, logs, and secret storage belong in the connector runtime roadmap.","syncModel":"managed-roadmap","syncPlan":{"priority":6,"packageStatus":"managed-roadmap","autoSyncCoverage":{"create":"managed-roadmap via hosted scheduler/webhook runtime","update":"managed-roadmap via hosted scheduler/webhook runtime","delete":"managed-roadmap via hosted delete logs, replay, and dead-letter handling"},"manualReplay":"Use source-specific npm run sync:* recipes until hosted scheduling ships.","customMapping":"Hosted connectors must preserve package-level mapRow()/shouldIndex() flexibility instead of forcing one schema.","engineTestOrder":["meilisearch","typesense","elasticsearch"],"nextPackageMilestone":"Managed scheduler with encrypted secrets, retry queues, dead-letter replay, and dashboard health."},"scheduler":{"mode":"managed-roadmap","recommendedCadence":"Tenant-configurable once hosted connector scheduling ships.","deploymentTargets":["Headband-managed scheduler"],"healthChecks":["managed run history","managed retry/dead-letter queue","connector health alerts"]},"docsHref":"/docs#connector-managed-scheduler","capabilities":["hosted schedules","secret storage","retry logs","dead-letter queue"],"requiresConfiguration":false}],"experiments":[{"slug":"engine-ab-test","name":"Engine A/B/C test","status":"recipe","headline":"Split traffic across Meilisearch, Typesense, and Elasticsearch indexes for the same corpus.","variants":["meili-products","typesense-products","elastic-products"],"metrics":["conversion","zero_result_rate","p95_latency_ms","reformulation_rate"],"docsHref":"/docs#experiment-engine-ab-test"},{"slug":"ranking-rules-test","name":"Ranking rules test","status":"recipe","headline":"Compare synonyms, typo tolerance, filters, and boosts without changing client code.","variants":["baseline","synonym-heavy","recency-boost"],"metrics":["click_through_rate","add_to_cart_rate","search_exit_rate"],"docsHref":"/docs#experiment-ranking-rules-test"},{"slug":"hybrid-rag-test","name":"Hybrid/RAG quality test","status":"recipe","headline":"Compare lexical, vector, and hybrid retrieval before rolling a RAG flow to everyone.","variants":["lexical","hybrid_50_50","semantic"],"metrics":["answer_acceptance","grounding_failure","latency_ms"],"docsHref":"/docs#experiment-hybrid-rag-test"}]},"generatedAt":"2026-08-15T07:05:08.424Z","note":"Statuses distinguish live SDK support, implementation recipes, and roadmap items. Public catalog omits credential and environment variable names."}