{"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 /v1/search from a loader, with the search key kept on the server.","installCommand":"curl -X POST https://headband.dev/v1/search -H \"Authorization: Bearer $HEADBAND_SEARCH_KEY\" -H \"Content-Type: application/json\" -d '{\"index\":\"products\",\"q\":\"shoes\"}'","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":"Call /v1/search from a server-rendered page, with the search key kept on the server.","installCommand":"curl -X POST https://headband.dev/v1/search -H \"Authorization: Bearer $HEADBAND_SEARCH_KEY\" -H \"Content-Type: application/json\" -d '{\"index\":\"products\",\"q\":\"shoes\"}'","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":"Call /v1/search from a server load function, with the search key kept on the server.","installCommand":"curl -X POST https://headband.dev/v1/search -H \"Authorization: Bearer $HEADBAND_SEARCH_KEY\" -H \"Content-Type: application/json\" -d '{\"index\":\"products\",\"q\":\"shoes\"}'","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":"Send your records with the admin key from a job, and search with the search key from a controller or view.","installCommand":"curl -X POST https://headband.dev/v1/search -H \"Authorization: Bearer $HEADBAND_SEARCH_KEY\" -H \"Content-Type: application/json\" -d '{\"index\":\"products\",\"q\":\"shoes\"}'","docsHref":"/docs#recipe-rails-laravel-django","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","visor"],"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","visor"],"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","visor"],"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","visor"],"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","sourceType":"database","status":"recipe","headline":"Sync BataDB tables into Headband indexes with the bounded backfill script, field projection, and explicit deletes.","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","visor"],"nextPackageMilestone":"BataDB row-event sync package with field mapping, branch-aware index names, and connector run reporting."},"scheduler":{"mode":"self-hosted","recommendedCadence":"Every 5-15 minutes for active tables; nightly reconciliation for low-change tables.","command":"npm run sync:batadb","deploymentTargets":["GitHub Actions cron","Vercel Cron hitting an app-owned job","Render/Coolify cron worker"],"healthChecks":["field projection applied","dead-letter file is empty","optional HEADBAND_RECONCILE count check"]},"docsHref":"/docs#connector-batadb-search","capabilities":["bounded backfill","field projection","explicit tombstone deletes","count reconciliation","search validation"],"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","visor"],"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-connectors","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, Elasticsearch, and Visor indexes for the same corpus.","variants":["meili-products","typesense-products","elastic-products","visor-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-11-07T05:10:59.470Z","note":"Statuses distinguish live SDK support, implementation recipes, and roadmap items. Public catalog omits credential and environment variable names."}