[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-algolia-algolia-crawler":3,"mdc--7dzbkt-key":41,"related-repo-algolia-algolia-crawler":1268,"related-org-algolia-algolia-crawler":1361},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":36,"sourceUrl":39,"mdContent":40},"algolia-crawler","crawl websites into Algolia indices","Use this skill whenever a user wants to crawl one or more web pages or a whole site and turn them into an Algolia index using the Algolia CLI — especially for RAG, AI search, semantic search, or Agent Studio retrieval. Triggers: \"index my website\u002Fdocs with Algolia\", \"set up the Algolia Crawler\", \"crawl this page for RAG\", \"scrape my site into Algolia\", \"build a knowledge base for my AI agent from these URLs\", writing or debugging a crawler recordExtractor, or handling JavaScript-rendered pages that won't index. It guides ingestion end-to-end with `algolia crawler` commands: inspect the page, write a RAG-optimized recordExtractor, validate with `algolia crawler test` BEFORE indexing, apply index settings explicitly, then reindex. Do NOT use for building the chatbot\u002Fagent layer itself (use algobot-cli), raw record\u002Fsynonym\u002Fsettings ops on an existing index (use algolia-cli), frontend search UI (use instantsearch), or read-only search\u002Fanalytics (use algolia-mcp).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"algolia","Algolia","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Falgolia.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Data Engineering","data-engineering","tag",{"name":17,"slug":18,"type":15},"Automation","automation",{"name":20,"slug":21,"type":15},"Web Scraping","web-scraping",{"name":23,"slug":24,"type":15},"Search","search",8,"https:\u002F\u002Fgithub.com\u002Falgolia\u002Fskills","2026-07-12T08:27:40.981109","MIT",2,[31,32,8,33,34,24,35],"agent","ai-assistant","mcp","recommendations","skills",{"repoUrl":26,"stars":25,"forks":29,"topics":37,"description":38},[31,32,8,33,34,24,35],"Algolia skills for AI Agents","https:\u002F\u002Fgithub.com\u002Falgolia\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Falgolia-crawler","---\nname: algolia-crawler\ndescription: >-\n  Use this skill whenever a user wants to crawl one or more web pages or a\n  whole site and turn them into an Algolia index using the Algolia CLI —\n  especially for RAG, AI search, semantic search, or Agent Studio retrieval.\n  Triggers: \"index my website\u002Fdocs with Algolia\", \"set up the Algolia Crawler\",\n  \"crawl this page for RAG\", \"scrape my site into Algolia\", \"build a knowledge\n  base for my AI agent from these URLs\", writing or debugging a crawler\n  recordExtractor, or handling JavaScript-rendered pages that won't index. It\n  guides ingestion end-to-end with `algolia crawler` commands: inspect the\n  page, write a RAG-optimized recordExtractor, validate with `algolia crawler\n  test` BEFORE indexing, apply index settings explicitly, then reindex. Do NOT\n  use for building the chatbot\u002Fagent layer itself (use algobot-cli), raw\n  record\u002Fsynonym\u002Fsettings ops on an existing index (use algolia-cli), frontend\n  search UI (use instantsearch), or read-only search\u002Fanalytics (use\n  algolia-mcp).\nlicense: MIT\nmetadata:\n  author: algolia\n  version: \"1.0\"\n---\n\n# Algolia Crawler\n\nTurn web pages into a **RAG-optimized Algolia index** with the [Algolia Crawler](https:\u002F\u002Fwww.algolia.com\u002Fdoc\u002Ftools\u002Fcrawler\u002Fgetting-started\u002Foverview), driven entirely by the **Algolia CLI** (`algolia crawler …`). The Crawler visits URLs, extracts content with a JavaScript `recordExtractor`, and writes Algolia records on a schedule — no scraping code to maintain.\n\nThe single most important idea: **crawling for RAG is not the same as crawling for site search.** A RAG record is a chunk of text that will be dropped into an LLM's context window *in isolation*. That changes how you shape every record (see [The RAG record mental model](#the-rag-record-mental-model)).\n\n## When to use this skill vs. the others\n\n| Need | Skill |\n|------|-------|\n| Crawl\u002Fingest web pages into an index (this workflow) | **algolia-crawler** |\n| Build the chatbot \u002F agent \u002F RAG app on top of the index | **algobot-cli** |\n| Raw record\u002Fsettings\u002Fsynonym\u002Frule ops on an existing index | **algolia-cli** |\n| Read-only search, analytics, recommendations | **algolia-mcp** |\n| Frontend search UI (autocomplete, results, facets) | **instantsearch** |\n\n**Rule of thumb:** if the user wants to *get web content into Algolia*, you're in the right skill. Once the index exists and they want to *ask questions over it*, hand off to **algobot-cli**.\n\n## The RAG record mental model\n\nEach record is retrieved and shown to an LLM alone, without the surrounding page. So optimize for that:\n\n1. **Small and single-topic.** One idea, one fact, one Q&A per record — not a whole page. Granular records retrieve precisely and waste less of the context window.\n2. **Self-contained.** Every record carries the context needed to stand alone: the entity it's about, the page title, the section heading. The LLM won't see the rest of the page.\n3. **Natural-language `content`, even for structured data.** This is the highest-leverage move. Don't store only `{model: \"X\", score: 0.87}` — also synthesize a sentence: *\"Model X scores 0.87 on relevance…\"*. Both keyword and vector retrieval, and the LLM itself, want prose.\n4. **Structured attributes for filtering.** Alongside `content`, keep clean fields (`category`, `type`, `date`, numeric values) so retrieval can be scoped with `filters` and facets.\n\nIf you internalize only one thing from this skill, make it this list. Everything else is mechanics.\n\n## The workflow\n\nFollow these steps in order. Full commands, config, and code live in the references — read them as you reach each step.\n\n1. **Set up the CLI and credentials.** Install the CLI and export your Crawler credentials (a Crawler *user ID* + *API key*, distinct from your app keys), plus an Algolia **write** API key for the target index and your **App ID**. See [cli.md](references\u002Fcli.md#setup-and-credentials).\n2. **Inspect the page first — is it JavaScript-rendered?** Many modern pages load their real content via XHR after load, so a naive crawl indexes empty shells. Detect this and enable rendering. See [javascript-rendering.md](references\u002Fjavascript-rendering.md).\n3. **Write a `recordExtractor` that emits RAG records** following the mental model above — one record per unit, a prose `content` field, structured attributes, and chunking for long prose. See [record-extractor.md](references\u002Frecord-extractor.md).\n4. **Validate with `algolia crawler test` BEFORE indexing.** It runs your config against a live URL and returns the records it *would* create, without writing anything. Use it as your feedback loop — and as a DOM inspector to fix selectors against the real rendered markup. See [workflow.md](references\u002Fworkflow.md#validate-before-you-index).\n5. **Apply index settings explicitly.** Do not rely on `initialIndexSettings` to configure the index — in practice it frequently does not apply. Set `searchableAttributes`, `attributesForFaceting`, etc. yourself with `algolia settings import` after the first crawl. See [rag-index-settings.md](references\u002Frag-index-settings.md).\n6. **Reindex, then verify** by searching the index (`algolia search`) for a few realistic RAG questions before trusting it.\n7. **Schedule** a recurring crawl so the index stays fresh as the source pages change.\n\n**Crawling a whole site or section (one URL → all its sub-pages)?** The crawler discovers sub-pages via `startUrls`\u002F`sitemaps`\u002F`discoveryPatterns` — but the config must be shaped from *all* the page types it will hit, not just the start page. A config fitted to the landing page produces junk on the article\u002Freference\u002Fblog templates it never saw. Discover the URL set, group it into templates, sample a representative page per template, and validate the extractor against **each**. See [site-crawls.md](references\u002Fsite-crawls.md).\n\nThe complete, copy-adaptable end-to-end run (create → test → settings → reindex → verify) is in [workflow.md](references\u002Fworkflow.md).\n\n## Two things that will bite you\n\nThese are the non-obvious failures. Both references cover them, but they're worth stating up front:\n\n- **JavaScript-rendered data.** If the page shows `Loading…` placeholders in its initial HTML, or the numbers\u002Ftable appear only after load, you must enable `renderJavaScript`. A crawl without it indexes nothing useful. ([javascript-rendering.md](references\u002Fjavascript-rendering.md))\n- **Values hidden in attributes.** Rendered pages often keep the real value in an attribute (e.g. `data-tip=\"Score: 79.8%\"`) while the visible cell shows only a bar or a delta. Extract from the attribute, not the visible text. ([record-extractor.md](references\u002Frecord-extractor.md#reading-values-from-attributes))\n\n## Driving it with the CLI\n\nEverything runs through `algolia crawler …` (and `algolia settings` \u002F `algolia search` for the index side). Full cheatsheet and the gotchas below are in [cli.md](references\u002Fcli.md).\n\n```bash\nalgolia crawler create \u003Cname> -F config.json     # create (prints nothing on success)\nalgolia crawler test   \u003Cid> --url \u003Curl> [-F cfg] # extract records WITHOUT indexing\nalgolia crawler reindex \u003Cid>                      # start a crawl that writes records\nalgolia crawler get    \u003Cid>                        # inspect crawler + config\u002Fstatus\nalgolia crawler stats  \u003Cid>                        # crawl status summary\n```\n\nTwo CLI realities to plan around (details in [cli.md](references\u002Fcli.md#gotchas)):\n\n- **Set `renderJavaScript: true` (boolean).** The CLI only accepts the boolean form; the object form (`{ enabled, patterns, waitTime }`) makes `get`\u002F`list`\u002F`create -F` fail to parse. Boolean `true` uses the default render wait, which is enough for most pages — confirm with `crawler test` (empty values mean the page needs more render time).\n- **`create` prints nothing and there's no config-update or delete command.** After `create`, recover the id from `algolia crawler list` (`get` needs a UUID — it doesn't accept a name). If `list` errors because another crawler in the account uses a non-boolean `renderJavaScript`, there's no pure-CLI recovery — look the id up via the Crawler REST list endpoint (`GET \u002F1\u002Fcrawlers?name=\u003Cname>`). To change a config, re-create; to delete, use the dashboard or REST `DELETE`.\n\n## References\n\n- [workflow.md](references\u002Fworkflow.md) — the full end-to-end CLI run: config, test-before-index loop, settings, reindex, verify, schedule.\n- [site-crawls.md](references\u002Fsite-crawls.md) — crawling a whole site\u002Fsection: discover sub-pages, group page templates, sample and validate each, cover them with a branching extractor or multiple actions.\n- [record-extractor.md](references\u002Frecord-extractor.md) — RAG record patterns, helpers, reading values from attributes, chunking long prose.\n- [rag-index-settings.md](references\u002Frag-index-settings.md) — index settings tuned for retrieval, NeuralSearch\u002Fvector, query-time filtering for RAG.\n- [javascript-rendering.md](references\u002Fjavascript-rendering.md) — detecting and handling JavaScript-rendered pages.\n- [cli.md](references\u002Fcli.md) — setup, credentials, the `algolia crawler` command cheatsheet, and the CLI gotchas in detail.\n",{"data":42,"body":45},{"name":4,"description":6,"license":28,"metadata":43},{"author":8,"version":44},"1.0",{"type":46,"children":47},"root",[48,56,104,132,139,246,276,281,286,392,397,403,408,612,665,676,682,687,747,753,786,1046,1058,1191,1197,1262],{"type":49,"tag":50,"props":51,"children":52},"element","h1",{"id":4},[53],{"type":54,"value":55},"text","Algolia Crawler",{"type":49,"tag":57,"props":58,"children":59},"p",{},[60,62,68,70,78,80,85,87,94,96,102],{"type":54,"value":61},"Turn web pages into a ",{"type":49,"tag":63,"props":64,"children":65},"strong",{},[66],{"type":54,"value":67},"RAG-optimized Algolia index",{"type":54,"value":69}," with the ",{"type":49,"tag":71,"props":72,"children":76},"a",{"href":73,"rel":74},"https:\u002F\u002Fwww.algolia.com\u002Fdoc\u002Ftools\u002Fcrawler\u002Fgetting-started\u002Foverview",[75],"nofollow",[77],{"type":54,"value":55},{"type":54,"value":79},", driven entirely by the ",{"type":49,"tag":63,"props":81,"children":82},{},[83],{"type":54,"value":84},"Algolia CLI",{"type":54,"value":86}," (",{"type":49,"tag":88,"props":89,"children":91},"code",{"className":90},[],[92],{"type":54,"value":93},"algolia crawler …",{"type":54,"value":95},"). The Crawler visits URLs, extracts content with a JavaScript ",{"type":49,"tag":88,"props":97,"children":99},{"className":98},[],[100],{"type":54,"value":101},"recordExtractor",{"type":54,"value":103},", and writes Algolia records on a schedule — no scraping code to maintain.",{"type":49,"tag":57,"props":105,"children":106},{},[107,109,114,116,122,124,130],{"type":54,"value":108},"The single most important idea: ",{"type":49,"tag":63,"props":110,"children":111},{},[112],{"type":54,"value":113},"crawling for RAG is not the same as crawling for site search.",{"type":54,"value":115}," A RAG record is a chunk of text that will be dropped into an LLM's context window ",{"type":49,"tag":117,"props":118,"children":119},"em",{},[120],{"type":54,"value":121},"in isolation",{"type":54,"value":123},". That changes how you shape every record (see ",{"type":49,"tag":71,"props":125,"children":127},{"href":126},"#the-rag-record-mental-model",[128],{"type":54,"value":129},"The RAG record mental model",{"type":54,"value":131},").",{"type":49,"tag":133,"props":134,"children":136},"h2",{"id":135},"when-to-use-this-skill-vs-the-others",[137],{"type":54,"value":138},"When to use this skill vs. the others",{"type":49,"tag":140,"props":141,"children":142},"table",{},[143,162],{"type":49,"tag":144,"props":145,"children":146},"thead",{},[147],{"type":49,"tag":148,"props":149,"children":150},"tr",{},[151,157],{"type":49,"tag":152,"props":153,"children":154},"th",{},[155],{"type":54,"value":156},"Need",{"type":49,"tag":152,"props":158,"children":159},{},[160],{"type":54,"value":161},"Skill",{"type":49,"tag":163,"props":164,"children":165},"tbody",{},[166,182,198,214,230],{"type":49,"tag":148,"props":167,"children":168},{},[169,175],{"type":49,"tag":170,"props":171,"children":172},"td",{},[173],{"type":54,"value":174},"Crawl\u002Fingest web pages into an index (this workflow)",{"type":49,"tag":170,"props":176,"children":177},{},[178],{"type":49,"tag":63,"props":179,"children":180},{},[181],{"type":54,"value":4},{"type":49,"tag":148,"props":183,"children":184},{},[185,190],{"type":49,"tag":170,"props":186,"children":187},{},[188],{"type":54,"value":189},"Build the chatbot \u002F agent \u002F RAG app on top of the index",{"type":49,"tag":170,"props":191,"children":192},{},[193],{"type":49,"tag":63,"props":194,"children":195},{},[196],{"type":54,"value":197},"algobot-cli",{"type":49,"tag":148,"props":199,"children":200},{},[201,206],{"type":49,"tag":170,"props":202,"children":203},{},[204],{"type":54,"value":205},"Raw record\u002Fsettings\u002Fsynonym\u002Frule ops on an existing index",{"type":49,"tag":170,"props":207,"children":208},{},[209],{"type":49,"tag":63,"props":210,"children":211},{},[212],{"type":54,"value":213},"algolia-cli",{"type":49,"tag":148,"props":215,"children":216},{},[217,222],{"type":49,"tag":170,"props":218,"children":219},{},[220],{"type":54,"value":221},"Read-only search, analytics, recommendations",{"type":49,"tag":170,"props":223,"children":224},{},[225],{"type":49,"tag":63,"props":226,"children":227},{},[228],{"type":54,"value":229},"algolia-mcp",{"type":49,"tag":148,"props":231,"children":232},{},[233,238],{"type":49,"tag":170,"props":234,"children":235},{},[236],{"type":54,"value":237},"Frontend search UI (autocomplete, results, facets)",{"type":49,"tag":170,"props":239,"children":240},{},[241],{"type":49,"tag":63,"props":242,"children":243},{},[244],{"type":54,"value":245},"instantsearch",{"type":49,"tag":57,"props":247,"children":248},{},[249,254,256,261,263,268,270,274],{"type":49,"tag":63,"props":250,"children":251},{},[252],{"type":54,"value":253},"Rule of thumb:",{"type":54,"value":255}," if the user wants to ",{"type":49,"tag":117,"props":257,"children":258},{},[259],{"type":54,"value":260},"get web content into Algolia",{"type":54,"value":262},", you're in the right skill. Once the index exists and they want to ",{"type":49,"tag":117,"props":264,"children":265},{},[266],{"type":54,"value":267},"ask questions over it",{"type":54,"value":269},", hand off to ",{"type":49,"tag":63,"props":271,"children":272},{},[273],{"type":54,"value":197},{"type":54,"value":275},".",{"type":49,"tag":133,"props":277,"children":279},{"id":278},"the-rag-record-mental-model",[280],{"type":54,"value":129},{"type":49,"tag":57,"props":282,"children":283},{},[284],{"type":54,"value":285},"Each record is retrieved and shown to an LLM alone, without the surrounding page. So optimize for that:",{"type":49,"tag":287,"props":288,"children":289},"ol",{},[290,301,311,344],{"type":49,"tag":291,"props":292,"children":293},"li",{},[294,299],{"type":49,"tag":63,"props":295,"children":296},{},[297],{"type":54,"value":298},"Small and single-topic.",{"type":54,"value":300}," One idea, one fact, one Q&A per record — not a whole page. Granular records retrieve precisely and waste less of the context window.",{"type":49,"tag":291,"props":302,"children":303},{},[304,309],{"type":49,"tag":63,"props":305,"children":306},{},[307],{"type":54,"value":308},"Self-contained.",{"type":54,"value":310}," Every record carries the context needed to stand alone: the entity it's about, the page title, the section heading. The LLM won't see the rest of the page.",{"type":49,"tag":291,"props":312,"children":313},{},[314,327,329,335,337,342],{"type":49,"tag":63,"props":315,"children":316},{},[317,319,325],{"type":54,"value":318},"Natural-language ",{"type":49,"tag":88,"props":320,"children":322},{"className":321},[],[323],{"type":54,"value":324},"content",{"type":54,"value":326},", even for structured data.",{"type":54,"value":328}," This is the highest-leverage move. Don't store only ",{"type":49,"tag":88,"props":330,"children":332},{"className":331},[],[333],{"type":54,"value":334},"{model: \"X\", score: 0.87}",{"type":54,"value":336}," — also synthesize a sentence: ",{"type":49,"tag":117,"props":338,"children":339},{},[340],{"type":54,"value":341},"\"Model X scores 0.87 on relevance…\"",{"type":54,"value":343},". Both keyword and vector retrieval, and the LLM itself, want prose.",{"type":49,"tag":291,"props":345,"children":346},{},[347,352,354,359,361,367,369,375,376,382,384,390],{"type":49,"tag":63,"props":348,"children":349},{},[350],{"type":54,"value":351},"Structured attributes for filtering.",{"type":54,"value":353}," Alongside ",{"type":49,"tag":88,"props":355,"children":357},{"className":356},[],[358],{"type":54,"value":324},{"type":54,"value":360},", keep clean fields (",{"type":49,"tag":88,"props":362,"children":364},{"className":363},[],[365],{"type":54,"value":366},"category",{"type":54,"value":368},", ",{"type":49,"tag":88,"props":370,"children":372},{"className":371},[],[373],{"type":54,"value":374},"type",{"type":54,"value":368},{"type":49,"tag":88,"props":377,"children":379},{"className":378},[],[380],{"type":54,"value":381},"date",{"type":54,"value":383},", numeric values) so retrieval can be scoped with ",{"type":49,"tag":88,"props":385,"children":387},{"className":386},[],[388],{"type":54,"value":389},"filters",{"type":54,"value":391}," and facets.",{"type":49,"tag":57,"props":393,"children":394},{},[395],{"type":54,"value":396},"If you internalize only one thing from this skill, make it this list. Everything else is mechanics.",{"type":49,"tag":133,"props":398,"children":400},{"id":399},"the-workflow",[401],{"type":54,"value":402},"The workflow",{"type":49,"tag":57,"props":404,"children":405},{},[406],{"type":54,"value":407},"Follow these steps in order. Full commands, config, and code live in the references — read them as you reach each step.",{"type":49,"tag":287,"props":409,"children":410},{},[411,456,473,504,536,584,602],{"type":49,"tag":291,"props":412,"children":413},{},[414,419,421,426,428,433,435,440,442,447,449,455],{"type":49,"tag":63,"props":415,"children":416},{},[417],{"type":54,"value":418},"Set up the CLI and credentials.",{"type":54,"value":420}," Install the CLI and export your Crawler credentials (a Crawler ",{"type":49,"tag":117,"props":422,"children":423},{},[424],{"type":54,"value":425},"user ID",{"type":54,"value":427}," + ",{"type":49,"tag":117,"props":429,"children":430},{},[431],{"type":54,"value":432},"API key",{"type":54,"value":434},", distinct from your app keys), plus an Algolia ",{"type":49,"tag":63,"props":436,"children":437},{},[438],{"type":54,"value":439},"write",{"type":54,"value":441}," API key for the target index and your ",{"type":49,"tag":63,"props":443,"children":444},{},[445],{"type":54,"value":446},"App ID",{"type":54,"value":448},". See ",{"type":49,"tag":71,"props":450,"children":452},{"href":451},"references\u002Fcli.md#setup-and-credentials",[453],{"type":54,"value":454},"cli.md",{"type":54,"value":275},{"type":49,"tag":291,"props":457,"children":458},{},[459,464,466,472],{"type":49,"tag":63,"props":460,"children":461},{},[462],{"type":54,"value":463},"Inspect the page first — is it JavaScript-rendered?",{"type":54,"value":465}," Many modern pages load their real content via XHR after load, so a naive crawl indexes empty shells. Detect this and enable rendering. See ",{"type":49,"tag":71,"props":467,"children":469},{"href":468},"references\u002Fjavascript-rendering.md",[470],{"type":54,"value":471},"javascript-rendering.md",{"type":54,"value":275},{"type":49,"tag":291,"props":474,"children":475},{},[476,488,490,495,497,503],{"type":49,"tag":63,"props":477,"children":478},{},[479,481,486],{"type":54,"value":480},"Write a ",{"type":49,"tag":88,"props":482,"children":484},{"className":483},[],[485],{"type":54,"value":101},{"type":54,"value":487}," that emits RAG records",{"type":54,"value":489}," following the mental model above — one record per unit, a prose ",{"type":49,"tag":88,"props":491,"children":493},{"className":492},[],[494],{"type":54,"value":324},{"type":54,"value":496}," field, structured attributes, and chunking for long prose. See ",{"type":49,"tag":71,"props":498,"children":500},{"href":499},"references\u002Frecord-extractor.md",[501],{"type":54,"value":502},"record-extractor.md",{"type":54,"value":275},{"type":49,"tag":291,"props":505,"children":506},{},[507,520,522,527,529,535],{"type":49,"tag":63,"props":508,"children":509},{},[510,512,518],{"type":54,"value":511},"Validate with ",{"type":49,"tag":88,"props":513,"children":515},{"className":514},[],[516],{"type":54,"value":517},"algolia crawler test",{"type":54,"value":519}," BEFORE indexing.",{"type":54,"value":521}," It runs your config against a live URL and returns the records it ",{"type":49,"tag":117,"props":523,"children":524},{},[525],{"type":54,"value":526},"would",{"type":54,"value":528}," create, without writing anything. Use it as your feedback loop — and as a DOM inspector to fix selectors against the real rendered markup. See ",{"type":49,"tag":71,"props":530,"children":532},{"href":531},"references\u002Fworkflow.md#validate-before-you-index",[533],{"type":54,"value":534},"workflow.md",{"type":54,"value":275},{"type":49,"tag":291,"props":537,"children":538},{},[539,544,546,552,554,560,561,567,569,575,577,583],{"type":49,"tag":63,"props":540,"children":541},{},[542],{"type":54,"value":543},"Apply index settings explicitly.",{"type":54,"value":545}," Do not rely on ",{"type":49,"tag":88,"props":547,"children":549},{"className":548},[],[550],{"type":54,"value":551},"initialIndexSettings",{"type":54,"value":553}," to configure the index — in practice it frequently does not apply. Set ",{"type":49,"tag":88,"props":555,"children":557},{"className":556},[],[558],{"type":54,"value":559},"searchableAttributes",{"type":54,"value":368},{"type":49,"tag":88,"props":562,"children":564},{"className":563},[],[565],{"type":54,"value":566},"attributesForFaceting",{"type":54,"value":568},", etc. yourself with ",{"type":49,"tag":88,"props":570,"children":572},{"className":571},[],[573],{"type":54,"value":574},"algolia settings import",{"type":54,"value":576}," after the first crawl. See ",{"type":49,"tag":71,"props":578,"children":580},{"href":579},"references\u002Frag-index-settings.md",[581],{"type":54,"value":582},"rag-index-settings.md",{"type":54,"value":275},{"type":49,"tag":291,"props":585,"children":586},{},[587,592,594,600],{"type":49,"tag":63,"props":588,"children":589},{},[590],{"type":54,"value":591},"Reindex, then verify",{"type":54,"value":593}," by searching the index (",{"type":49,"tag":88,"props":595,"children":597},{"className":596},[],[598],{"type":54,"value":599},"algolia search",{"type":54,"value":601},") for a few realistic RAG questions before trusting it.",{"type":49,"tag":291,"props":603,"children":604},{},[605,610],{"type":49,"tag":63,"props":606,"children":607},{},[608],{"type":54,"value":609},"Schedule",{"type":54,"value":611}," a recurring crawl so the index stays fresh as the source pages change.",{"type":49,"tag":57,"props":613,"children":614},{},[615,620,622,628,630,636,637,643,645,650,652,657,658,664],{"type":49,"tag":63,"props":616,"children":617},{},[618],{"type":54,"value":619},"Crawling a whole site or section (one URL → all its sub-pages)?",{"type":54,"value":621}," The crawler discovers sub-pages via ",{"type":49,"tag":88,"props":623,"children":625},{"className":624},[],[626],{"type":54,"value":627},"startUrls",{"type":54,"value":629},"\u002F",{"type":49,"tag":88,"props":631,"children":633},{"className":632},[],[634],{"type":54,"value":635},"sitemaps",{"type":54,"value":629},{"type":49,"tag":88,"props":638,"children":640},{"className":639},[],[641],{"type":54,"value":642},"discoveryPatterns",{"type":54,"value":644}," — but the config must be shaped from ",{"type":49,"tag":117,"props":646,"children":647},{},[648],{"type":54,"value":649},"all",{"type":54,"value":651}," the page types it will hit, not just the start page. A config fitted to the landing page produces junk on the article\u002Freference\u002Fblog templates it never saw. Discover the URL set, group it into templates, sample a representative page per template, and validate the extractor against ",{"type":49,"tag":63,"props":653,"children":654},{},[655],{"type":54,"value":656},"each",{"type":54,"value":448},{"type":49,"tag":71,"props":659,"children":661},{"href":660},"references\u002Fsite-crawls.md",[662],{"type":54,"value":663},"site-crawls.md",{"type":54,"value":275},{"type":49,"tag":57,"props":666,"children":667},{},[668,670,675],{"type":54,"value":669},"The complete, copy-adaptable end-to-end run (create → test → settings → reindex → verify) is in ",{"type":49,"tag":71,"props":671,"children":673},{"href":672},"references\u002Fworkflow.md",[674],{"type":54,"value":534},{"type":54,"value":275},{"type":49,"tag":133,"props":677,"children":679},{"id":678},"two-things-that-will-bite-you",[680],{"type":54,"value":681},"Two things that will bite you",{"type":49,"tag":57,"props":683,"children":684},{},[685],{"type":54,"value":686},"These are the non-obvious failures. Both references cover them, but they're worth stating up front:",{"type":49,"tag":688,"props":689,"children":690},"ul",{},[691,723],{"type":49,"tag":291,"props":692,"children":693},{},[694,699,701,707,709,715,717,721],{"type":49,"tag":63,"props":695,"children":696},{},[697],{"type":54,"value":698},"JavaScript-rendered data.",{"type":54,"value":700}," If the page shows ",{"type":49,"tag":88,"props":702,"children":704},{"className":703},[],[705],{"type":54,"value":706},"Loading…",{"type":54,"value":708}," placeholders in its initial HTML, or the numbers\u002Ftable appear only after load, you must enable ",{"type":49,"tag":88,"props":710,"children":712},{"className":711},[],[713],{"type":54,"value":714},"renderJavaScript",{"type":54,"value":716},". A crawl without it indexes nothing useful. (",{"type":49,"tag":71,"props":718,"children":719},{"href":468},[720],{"type":54,"value":471},{"type":54,"value":722},")",{"type":49,"tag":291,"props":724,"children":725},{},[726,731,733,739,741,746],{"type":49,"tag":63,"props":727,"children":728},{},[729],{"type":54,"value":730},"Values hidden in attributes.",{"type":54,"value":732}," Rendered pages often keep the real value in an attribute (e.g. ",{"type":49,"tag":88,"props":734,"children":736},{"className":735},[],[737],{"type":54,"value":738},"data-tip=\"Score: 79.8%\"",{"type":54,"value":740},") while the visible cell shows only a bar or a delta. Extract from the attribute, not the visible text. (",{"type":49,"tag":71,"props":742,"children":744},{"href":743},"references\u002Frecord-extractor.md#reading-values-from-attributes",[745],{"type":54,"value":502},{"type":54,"value":722},{"type":49,"tag":133,"props":748,"children":750},{"id":749},"driving-it-with-the-cli",[751],{"type":54,"value":752},"Driving it with the CLI",{"type":49,"tag":57,"props":754,"children":755},{},[756,758,763,765,771,773,778,780,785],{"type":54,"value":757},"Everything runs through ",{"type":49,"tag":88,"props":759,"children":761},{"className":760},[],[762],{"type":54,"value":93},{"type":54,"value":764}," (and ",{"type":49,"tag":88,"props":766,"children":768},{"className":767},[],[769],{"type":54,"value":770},"algolia settings",{"type":54,"value":772}," \u002F ",{"type":49,"tag":88,"props":774,"children":776},{"className":775},[],[777],{"type":54,"value":599},{"type":54,"value":779}," for the index side). Full cheatsheet and the gotchas below are in ",{"type":49,"tag":71,"props":781,"children":783},{"href":782},"references\u002Fcli.md",[784],{"type":54,"value":454},{"type":54,"value":275},{"type":49,"tag":787,"props":788,"children":793},"pre",{"className":789,"code":790,"language":791,"meta":792,"style":792},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","algolia crawler create \u003Cname> -F config.json     # create (prints nothing on success)\nalgolia crawler test   \u003Cid> --url \u003Curl> [-F cfg] # extract records WITHOUT indexing\nalgolia crawler reindex \u003Cid>                      # start a crawl that writes records\nalgolia crawler get    \u003Cid>                        # inspect crawler + config\u002Fstatus\nalgolia crawler stats  \u003Cid>                        # crawl status summary\n","bash","",[794],{"type":49,"tag":88,"props":795,"children":796},{"__ignoreMap":792},[797,857,930,968,1007],{"type":49,"tag":798,"props":799,"children":802},"span",{"class":800,"line":801},"line",1,[803,808,814,819,825,830,836,841,846,851],{"type":49,"tag":798,"props":804,"children":806},{"style":805},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[807],{"type":54,"value":8},{"type":49,"tag":798,"props":809,"children":811},{"style":810},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[812],{"type":54,"value":813}," crawler",{"type":49,"tag":798,"props":815,"children":816},{"style":810},[817],{"type":54,"value":818}," create",{"type":49,"tag":798,"props":820,"children":822},{"style":821},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[823],{"type":54,"value":824}," \u003C",{"type":49,"tag":798,"props":826,"children":827},{"style":810},[828],{"type":54,"value":829},"nam",{"type":49,"tag":798,"props":831,"children":833},{"style":832},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[834],{"type":54,"value":835},"e",{"type":49,"tag":798,"props":837,"children":838},{"style":821},[839],{"type":54,"value":840},">",{"type":49,"tag":798,"props":842,"children":843},{"style":810},[844],{"type":54,"value":845}," -F",{"type":49,"tag":798,"props":847,"children":848},{"style":810},[849],{"type":54,"value":850}," config.json",{"type":49,"tag":798,"props":852,"children":854},{"style":853},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[855],{"type":54,"value":856},"     # create (prints nothing on success)\n",{"type":49,"tag":798,"props":858,"children":859},{"class":800,"line":29},[860,864,868,873,878,883,888,892,897,901,906,911,915,920,925],{"type":49,"tag":798,"props":861,"children":862},{"style":805},[863],{"type":54,"value":8},{"type":49,"tag":798,"props":865,"children":866},{"style":810},[867],{"type":54,"value":813},{"type":49,"tag":798,"props":869,"children":870},{"style":810},[871],{"type":54,"value":872}," test",{"type":49,"tag":798,"props":874,"children":875},{"style":821},[876],{"type":54,"value":877},"   \u003C",{"type":49,"tag":798,"props":879,"children":880},{"style":810},[881],{"type":54,"value":882},"i",{"type":49,"tag":798,"props":884,"children":885},{"style":832},[886],{"type":54,"value":887},"d",{"type":49,"tag":798,"props":889,"children":890},{"style":821},[891],{"type":54,"value":840},{"type":49,"tag":798,"props":893,"children":894},{"style":810},[895],{"type":54,"value":896}," --url",{"type":49,"tag":798,"props":898,"children":899},{"style":821},[900],{"type":54,"value":824},{"type":49,"tag":798,"props":902,"children":903},{"style":810},[904],{"type":54,"value":905},"ur",{"type":49,"tag":798,"props":907,"children":908},{"style":832},[909],{"type":54,"value":910},"l",{"type":49,"tag":798,"props":912,"children":913},{"style":821},[914],{"type":54,"value":840},{"type":49,"tag":798,"props":916,"children":917},{"style":832},[918],{"type":54,"value":919}," [-F ",{"type":49,"tag":798,"props":921,"children":922},{"style":810},[923],{"type":54,"value":924},"cfg]",{"type":49,"tag":798,"props":926,"children":927},{"style":853},[928],{"type":54,"value":929}," # extract records WITHOUT indexing\n",{"type":49,"tag":798,"props":931,"children":933},{"class":800,"line":932},3,[934,938,942,947,951,955,959,963],{"type":49,"tag":798,"props":935,"children":936},{"style":805},[937],{"type":54,"value":8},{"type":49,"tag":798,"props":939,"children":940},{"style":810},[941],{"type":54,"value":813},{"type":49,"tag":798,"props":943,"children":944},{"style":810},[945],{"type":54,"value":946}," reindex",{"type":49,"tag":798,"props":948,"children":949},{"style":821},[950],{"type":54,"value":824},{"type":49,"tag":798,"props":952,"children":953},{"style":810},[954],{"type":54,"value":882},{"type":49,"tag":798,"props":956,"children":957},{"style":832},[958],{"type":54,"value":887},{"type":49,"tag":798,"props":960,"children":961},{"style":821},[962],{"type":54,"value":840},{"type":49,"tag":798,"props":964,"children":965},{"style":853},[966],{"type":54,"value":967},"                      # start a crawl that writes records\n",{"type":49,"tag":798,"props":969,"children":971},{"class":800,"line":970},4,[972,976,980,985,990,994,998,1002],{"type":49,"tag":798,"props":973,"children":974},{"style":805},[975],{"type":54,"value":8},{"type":49,"tag":798,"props":977,"children":978},{"style":810},[979],{"type":54,"value":813},{"type":49,"tag":798,"props":981,"children":982},{"style":810},[983],{"type":54,"value":984}," get",{"type":49,"tag":798,"props":986,"children":987},{"style":821},[988],{"type":54,"value":989},"    \u003C",{"type":49,"tag":798,"props":991,"children":992},{"style":810},[993],{"type":54,"value":882},{"type":49,"tag":798,"props":995,"children":996},{"style":832},[997],{"type":54,"value":887},{"type":49,"tag":798,"props":999,"children":1000},{"style":821},[1001],{"type":54,"value":840},{"type":49,"tag":798,"props":1003,"children":1004},{"style":853},[1005],{"type":54,"value":1006},"                        # inspect crawler + config\u002Fstatus\n",{"type":49,"tag":798,"props":1008,"children":1010},{"class":800,"line":1009},5,[1011,1015,1019,1024,1029,1033,1037,1041],{"type":49,"tag":798,"props":1012,"children":1013},{"style":805},[1014],{"type":54,"value":8},{"type":49,"tag":798,"props":1016,"children":1017},{"style":810},[1018],{"type":54,"value":813},{"type":49,"tag":798,"props":1020,"children":1021},{"style":810},[1022],{"type":54,"value":1023}," stats",{"type":49,"tag":798,"props":1025,"children":1026},{"style":821},[1027],{"type":54,"value":1028},"  \u003C",{"type":49,"tag":798,"props":1030,"children":1031},{"style":810},[1032],{"type":54,"value":882},{"type":49,"tag":798,"props":1034,"children":1035},{"style":832},[1036],{"type":54,"value":887},{"type":49,"tag":798,"props":1038,"children":1039},{"style":821},[1040],{"type":54,"value":840},{"type":49,"tag":798,"props":1042,"children":1043},{"style":853},[1044],{"type":54,"value":1045},"                        # crawl status summary\n",{"type":49,"tag":57,"props":1047,"children":1048},{},[1049,1051,1056],{"type":54,"value":1050},"Two CLI realities to plan around (details in ",{"type":49,"tag":71,"props":1052,"children":1054},{"href":1053},"references\u002Fcli.md#gotchas",[1055],{"type":54,"value":454},{"type":54,"value":1057},"):",{"type":49,"tag":688,"props":1059,"children":1060},{},[1061,1125],{"type":49,"tag":291,"props":1062,"children":1063},{},[1064,1077,1079,1085,1087,1093,1094,1100,1101,1107,1109,1115,1117,1123],{"type":49,"tag":63,"props":1065,"children":1066},{},[1067,1069,1075],{"type":54,"value":1068},"Set ",{"type":49,"tag":88,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":54,"value":1074},"renderJavaScript: true",{"type":54,"value":1076}," (boolean).",{"type":54,"value":1078}," The CLI only accepts the boolean form; the object form (",{"type":49,"tag":88,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":54,"value":1084},"{ enabled, patterns, waitTime }",{"type":54,"value":1086},") makes ",{"type":49,"tag":88,"props":1088,"children":1090},{"className":1089},[],[1091],{"type":54,"value":1092},"get",{"type":54,"value":629},{"type":49,"tag":88,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":54,"value":1099},"list",{"type":54,"value":629},{"type":49,"tag":88,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":54,"value":1106},"create -F",{"type":54,"value":1108}," fail to parse. Boolean ",{"type":49,"tag":88,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":54,"value":1114},"true",{"type":54,"value":1116}," uses the default render wait, which is enough for most pages — confirm with ",{"type":49,"tag":88,"props":1118,"children":1120},{"className":1119},[],[1121],{"type":54,"value":1122},"crawler test",{"type":54,"value":1124}," (empty values mean the page needs more render time).",{"type":49,"tag":291,"props":1126,"children":1127},{},[1128,1139,1141,1146,1148,1154,1155,1160,1162,1167,1169,1174,1176,1182,1184,1190],{"type":49,"tag":63,"props":1129,"children":1130},{},[1131,1137],{"type":49,"tag":88,"props":1132,"children":1134},{"className":1133},[],[1135],{"type":54,"value":1136},"create",{"type":54,"value":1138}," prints nothing and there's no config-update or delete command.",{"type":54,"value":1140}," After ",{"type":49,"tag":88,"props":1142,"children":1144},{"className":1143},[],[1145],{"type":54,"value":1136},{"type":54,"value":1147},", recover the id from ",{"type":49,"tag":88,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":54,"value":1153},"algolia crawler list",{"type":54,"value":86},{"type":49,"tag":88,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":54,"value":1092},{"type":54,"value":1161}," needs a UUID — it doesn't accept a name). If ",{"type":49,"tag":88,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":54,"value":1099},{"type":54,"value":1168}," errors because another crawler in the account uses a non-boolean ",{"type":49,"tag":88,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":54,"value":714},{"type":54,"value":1175},", there's no pure-CLI recovery — look the id up via the Crawler REST list endpoint (",{"type":49,"tag":88,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":54,"value":1181},"GET \u002F1\u002Fcrawlers?name=\u003Cname>",{"type":54,"value":1183},"). To change a config, re-create; to delete, use the dashboard or REST ",{"type":49,"tag":88,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":54,"value":1189},"DELETE",{"type":54,"value":275},{"type":49,"tag":133,"props":1192,"children":1194},{"id":1193},"references",[1195],{"type":54,"value":1196},"References",{"type":49,"tag":688,"props":1198,"children":1199},{},[1200,1209,1218,1227,1236,1245],{"type":49,"tag":291,"props":1201,"children":1202},{},[1203,1207],{"type":49,"tag":71,"props":1204,"children":1205},{"href":672},[1206],{"type":54,"value":534},{"type":54,"value":1208}," — the full end-to-end CLI run: config, test-before-index loop, settings, reindex, verify, schedule.",{"type":49,"tag":291,"props":1210,"children":1211},{},[1212,1216],{"type":49,"tag":71,"props":1213,"children":1214},{"href":660},[1215],{"type":54,"value":663},{"type":54,"value":1217}," — crawling a whole site\u002Fsection: discover sub-pages, group page templates, sample and validate each, cover them with a branching extractor or multiple actions.",{"type":49,"tag":291,"props":1219,"children":1220},{},[1221,1225],{"type":49,"tag":71,"props":1222,"children":1223},{"href":499},[1224],{"type":54,"value":502},{"type":54,"value":1226}," — RAG record patterns, helpers, reading values from attributes, chunking long prose.",{"type":49,"tag":291,"props":1228,"children":1229},{},[1230,1234],{"type":49,"tag":71,"props":1231,"children":1232},{"href":579},[1233],{"type":54,"value":582},{"type":54,"value":1235}," — index settings tuned for retrieval, NeuralSearch\u002Fvector, query-time filtering for RAG.",{"type":49,"tag":291,"props":1237,"children":1238},{},[1239,1243],{"type":49,"tag":71,"props":1240,"children":1241},{"href":468},[1242],{"type":54,"value":471},{"type":54,"value":1244}," — detecting and handling JavaScript-rendered pages.",{"type":49,"tag":291,"props":1246,"children":1247},{},[1248,1252,1254,1260],{"type":49,"tag":71,"props":1249,"children":1250},{"href":782},[1251],{"type":54,"value":454},{"type":54,"value":1253}," — setup, credentials, the ",{"type":49,"tag":88,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":54,"value":1259},"algolia crawler",{"type":54,"value":1261}," command cheatsheet, and the CLI gotchas in detail.",{"type":49,"tag":1263,"props":1264,"children":1265},"style",{},[1266],{"type":54,"value":1267},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1269,"total":1360},[1270,1284,1297,1312,1323,1330,1342],{"slug":197,"name":197,"fn":1271,"description":1272,"org":1273,"tags":1274,"stars":25,"repoUrl":26,"updatedAt":1283},"build conversational AI with Algolia","Use for anything AI\u002Fagent\u002Fconversational built on Algolia: algobot CLI, Agent Studio, RAG systems, conversational product discovery, genAI content generation from search results (carousels, descriptions, headers), chatbots or recommendation agents using Algolia as retrieval, config-as-code workflows, multi-environment deploy (dev\u002Fstaging\u002Fprod), memory and personalization, MCP tool integrations, conversation history \u002F GDPR retention, or adding a chat widget alongside InstantSearch. Trigger on: \"algobot\", \"Agent Studio\", \"RAG with Algolia\", \"conversational experience\", \"AI agent\" + Algolia, \"genAI carousel\", \"chat widget\", or building AI features on top of Algolia search. Do NOT use for raw index ops (records, synonyms, settings) — use algolia-cli. Do NOT use for pure frontend search UI (InstantSearch, autocomplete) with no AI\u002Fagent layer.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1275,1278,1279,1282],{"name":1276,"slug":1277,"type":15},"Agents","agents",{"name":17,"slug":18,"type":15},{"name":1280,"slug":1281,"type":15},"LLM","llm",{"name":23,"slug":24,"type":15},"2026-07-12T08:27:37.649724",{"slug":1285,"name":1285,"fn":1286,"description":1287,"org":1288,"tags":1289,"stars":25,"repoUrl":26,"updatedAt":1296},"algolia-agent-studio","build conversational agents with Algolia Agent Studio","Product-specific Algolia Agent Studio implementation, validation, and optimization guidance. Use when planning, building, integrating, or auditing Agent Studio agents, AI-powered conversational experiences, LLM provider setup, Algolia Search tools, client-side tools, MCP tools, memory, prompting, conversations, turn context, caching, analytics, feedback, authentication, approved domains, guardrails, or tool security. Do NOT use for live Agent Studio configuration, dry runs, publish\u002Fdeploy actions, or config-as-code operations; use the official algobot-cli skill instead. Do NOT use for generic non-Algolia RAG or chatbot architecture unless Agent Studio is the target product.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1290,1291,1294,1295],{"name":1276,"slug":1277,"type":15},{"name":1292,"slug":1293,"type":15},"AI","ai",{"name":9,"slug":8,"type":15},{"name":23,"slug":24,"type":15},"2026-08-01T06:06:28.033767",{"slug":1298,"name":1298,"fn":1299,"description":1300,"org":1301,"tags":1302,"stars":25,"repoUrl":26,"updatedAt":1311},"algolia-autocomplete","build Algolia autocomplete and query suggestions","Build and review Algolia Autocomplete and query suggestion experiences. Use when planning or implementing typeahead, query suggestions, recent searches, popular searches, federated autocomplete panels, product\u002Fcontent suggestions, detached mobile mode, plugins, keyboard navigation, insights events, or Autocomplete integration with InstantSearch. For net-new search or ecommerce builds, start with algolia-discovery-planning, which loads algolia-search-implementation so source strategy, data contract, and event taxonomy decisions are visible before autocomplete is marked ready. Do NOT use for full search results pages, browse pages, filters, pagination, or current refinements; use algolia-instantsearch-ui instead. Do NOT use for choosing between Algolia UI libraries; use algolia-ui-libraries. Do NOT use as the source of truth for current Autocomplete package APIs; use the official instantsearch skill and current docs alongside this customer-readiness skill.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1303,1304,1307,1308],{"name":9,"slug":8,"type":15},{"name":1305,"slug":1306,"type":15},"Frontend","frontend",{"name":23,"slug":24,"type":15},{"name":1309,"slug":1310,"type":15},"UI Components","ui-components","2026-08-01T06:06:29.968123",{"slug":213,"name":213,"fn":1313,"description":1314,"org":1315,"tags":1316,"stars":25,"repoUrl":26,"updatedAt":1322},"manage Algolia indices and accounts","Use this skill whenever a user wants to execute operations against Algolia indices or accounts — deleting records, copying\u002Fmigrating indices, backing up data, importing\u002Fexporting records, managing API keys, editing synonyms, configuring rules, changing settings like facets, clearing indices, or automating Algolia in CI\u002FCD pipelines. The key signal is that the user wants to *act on* their Algolia data or configuration (server-side \u002F backend \u002F admin operations), regardless of whether they mention \"CLI\" or \"command line.\" If someone names a specific Algolia index and wants to change, move, query, or manage it, use this skill. Do NOT use for frontend search UI work (InstantSearch, React components, autocomplete widgets), Algolia dashboard GUI questions, or evaluating Algolia vs. other providers.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1317,1320,1321],{"name":1318,"slug":1319,"type":15},"CLI","cli",{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},"2026-07-12T08:27:35.085246",{"slug":4,"name":4,"fn":5,"description":6,"org":1324,"tags":1325,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1326,1327,1328,1329],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"slug":1331,"name":1331,"fn":1332,"description":1333,"org":1334,"tags":1335,"stars":25,"repoUrl":26,"updatedAt":1341},"algolia-data-modeling","design Algolia data models and indices","Algolia data modeling and indexing guidance. Use before or alongside indexing records or building Algolia search UI for net-new search, browse, autocomplete, ecommerce, personalization, Dynamic Re-Ranking, recommendations, or analytics-aware implementations. Makes record shape, objectID, display fields, facets, ranking fields, and event attribution explicit decisions. Use for records, variants, SKUs, indices, replicas, searchable and faceting attributes, denormalization, merchandising fields, timestamps, inventory, event attribution, indexing pipelines, partial updates, secured data, multi-language or multi-region strategies, and migrations. Do NOT use for live imports, exports, record mutations, settings changes, or account actions; use algolia-cli or algolia-mcp. Do NOT use for frontend UI implementation; use algolia-instantsearch-ui, algolia-autocomplete, algolia-ui-libraries, or the official instantsearch skill.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1336,1337,1340],{"name":9,"slug":8,"type":15},{"name":1338,"slug":1339,"type":15},"Data Modeling","data-modeling",{"name":23,"slug":24,"type":15},"2026-08-01T06:06:01.500756",{"slug":1343,"name":1343,"fn":1344,"description":1345,"org":1346,"tags":1347,"stars":25,"repoUrl":26,"updatedAt":1359},"algolia-discovery-planning","plan and audit Algolia search implementations","START HERE for any non-trivial Algolia work — building, adding, migrating, redesigning, auditing, or configuring search, browse, autocomplete, indexing, relevance, recommendations, personalization, merchandising, events, or analytics. Invoke this FIRST even when the task already seems scoped or the user names one specific feature (e.g. \"add InstantSearch\", \"build a storefront search\"): its job is to map the request to the full Algolia implementation lifecycle and load every companion skill each in-scope phase needs (algolia-search-implementation, algolia-data-modeling, algolia-index-configuration, algolia-ui-libraries, algolia-instantsearch-ui, algolia-autocomplete, algolia-events-insights, algolia-neuralsearch, algolia-agent-studio, algolia-release-qa) rather than jumping straight into a single skill. This skill plans and orchestrates; the focused companion skills and the official Algolia skills execute. Do NOT use for live account inspection or write actions; use algolia-mcp or algolia-cli for those.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1348,1349,1352,1355,1358],{"name":9,"slug":8,"type":15},{"name":1350,"slug":1351,"type":15},"Analytics","analytics",{"name":1353,"slug":1354,"type":15},"Configuration","configuration",{"name":1356,"slug":1357,"type":15},"Personalization","personalization",{"name":23,"slug":24,"type":15},"2026-08-01T06:06:03.021452",18,{"items":1362,"total":1483},[1363,1379,1386,1393,1400,1406,1413,1419,1427,1438,1449,1471],{"slug":1364,"name":1364,"fn":1365,"description":1366,"org":1367,"tags":1368,"stars":1376,"repoUrl":1377,"updatedAt":1378},"algolia-docsearch-mcp","search developer documentation with Algolia","Use this skill when the user asks about public developer documentation, SDKs, APIs, libraries, frameworks, setup, configuration, or code examples. Fetch current docs from Algolia DocSearch MCP and cite source URLs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1369,1370,1373,1375],{"name":9,"slug":8,"type":15},{"name":1371,"slug":1372,"type":15},"Documentation","documentation",{"name":1374,"slug":33,"type":15},"MCP",{"name":23,"slug":24,"type":15},4365,"https:\u002F\u002Fgithub.com\u002Falgolia\u002Fdocsearch","2026-08-01T06:06:11.572314",{"slug":197,"name":197,"fn":1271,"description":1272,"org":1380,"tags":1381,"stars":25,"repoUrl":26,"updatedAt":1283},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1382,1383,1384,1385],{"name":1276,"slug":1277,"type":15},{"name":17,"slug":18,"type":15},{"name":1280,"slug":1281,"type":15},{"name":23,"slug":24,"type":15},{"slug":1285,"name":1285,"fn":1286,"description":1287,"org":1387,"tags":1388,"stars":25,"repoUrl":26,"updatedAt":1296},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1389,1390,1391,1392],{"name":1276,"slug":1277,"type":15},{"name":1292,"slug":1293,"type":15},{"name":9,"slug":8,"type":15},{"name":23,"slug":24,"type":15},{"slug":1298,"name":1298,"fn":1299,"description":1300,"org":1394,"tags":1395,"stars":25,"repoUrl":26,"updatedAt":1311},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1396,1397,1398,1399],{"name":9,"slug":8,"type":15},{"name":1305,"slug":1306,"type":15},{"name":23,"slug":24,"type":15},{"name":1309,"slug":1310,"type":15},{"slug":213,"name":213,"fn":1313,"description":1314,"org":1401,"tags":1402,"stars":25,"repoUrl":26,"updatedAt":1322},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1403,1404,1405],{"name":1318,"slug":1319,"type":15},{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1407,"tags":1408,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1409,1410,1411,1412],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"slug":1331,"name":1331,"fn":1332,"description":1333,"org":1414,"tags":1415,"stars":25,"repoUrl":26,"updatedAt":1341},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1416,1417,1418],{"name":9,"slug":8,"type":15},{"name":1338,"slug":1339,"type":15},{"name":23,"slug":24,"type":15},{"slug":1343,"name":1343,"fn":1344,"description":1345,"org":1420,"tags":1421,"stars":25,"repoUrl":26,"updatedAt":1359},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1422,1423,1424,1425,1426],{"name":9,"slug":8,"type":15},{"name":1350,"slug":1351,"type":15},{"name":1353,"slug":1354,"type":15},{"name":1356,"slug":1357,"type":15},{"name":23,"slug":24,"type":15},{"slug":1428,"name":1428,"fn":1429,"description":1430,"org":1431,"tags":1432,"stars":25,"repoUrl":26,"updatedAt":1437},"algolia-events-insights","instrument Algolia events for analytics","Algolia event instrumentation guidance for Insights, analytics, personalization, Dynamic Re-Ranking, Recommend, and merchandising feedback loops. Use for search, autocomplete, browse, ecommerce, personalization, recommendations, or analytics instrumentation. Makes event decisions explicit before an Algolia UI is considered ready. Use when implementing or auditing clickedObjectIDsAfterSearch, convertedObjectIDsAfterSearch, viewedObjectIDs, addedToCartObjectIDsAfterSearch, purchasedObjectIDsAfterSearch, userToken, queryID, eventName, eventSubtype, or frontend\u002Fbackend event pipelines. Do NOT use for live analytics retrieval, top-query inspection, or account-aware diagnostics; use algolia-mcp. Do NOT use for framework-specific InstantSearch or Autocomplete APIs; use the official instantsearch skill alongside this planning and validation skill.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1433,1434,1435,1436],{"name":9,"slug":8,"type":15},{"name":1350,"slug":1351,"type":15},{"name":1356,"slug":1357,"type":15},{"name":23,"slug":24,"type":15},"2026-08-01T06:06:02.009712",{"slug":1439,"name":1439,"fn":1440,"description":1441,"org":1442,"tags":1443,"stars":25,"repoUrl":26,"updatedAt":1448},"algolia-index-configuration","configure Algolia index settings and relevance","Algolia index settings and relevance configuration guidance. Use when configuring searchableAttributes, attributesForFaceting, customRanking, ranking, replicas, virtual replicas, rules, synonyms, typo tolerance, distinct, filters, optional filters, merchandising, browse\u002Fcategory relevance, or A\u002FB-testable relevance changes. Do NOT use for live settings writes, backups, copies, or operational account tasks; use algolia-cli or algolia-mcp instead. Do NOT use for record-shape or variant strategy; use algolia-data-modeling instead.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1444,1445,1446,1447],{"name":9,"slug":8,"type":15},{"name":1353,"slug":1354,"type":15},{"name":1338,"slug":1339,"type":15},{"name":23,"slug":24,"type":15},"2026-08-01T06:06:34.19163",{"slug":1450,"name":1450,"fn":1451,"description":1452,"org":1453,"tags":1454,"stars":25,"repoUrl":26,"updatedAt":1470},"algolia-instantsearch-ui","build Algolia InstantSearch frontend experiences","Build and review Algolia InstantSearch experiences in JavaScript, React, Vue, Angular (via InstantSearch.js; Angular InstantSearch is deprecated), or compatible frontend stacks. Use when planning or reviewing search results pages, browse\u002Fcategory pages, routing, widgets, filters, facets, sort-by, pagination, infinite hits, current refinements, insights middleware, SSR, or UI-state synchronization. For net-new search UI builds, start with algolia-discovery-planning, which loads algolia-search-implementation so data contract and event taxonomy decisions are visible before UI is marked ready. Do NOT use for autocomplete\u002Ftypeahead experiences before the user commits to a results page; use algolia-autocomplete instead. Do NOT use for choosing between Algolia UI libraries; use algolia-ui-libraries. Do NOT use as the source of truth for current framework APIs or code-level implementation details; use the official instantsearch skill and current docs alongside this customer-readiness skill.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1455,1456,1459,1460,1463,1466,1467],{"name":9,"slug":8,"type":15},{"name":1457,"slug":1458,"type":15},"Angular","angular",{"name":1305,"slug":1306,"type":15},{"name":1461,"slug":1462,"type":15},"JavaScript","javascript",{"name":1464,"slug":1465,"type":15},"React","react",{"name":23,"slug":24,"type":15},{"name":1468,"slug":1469,"type":15},"Vue","vue","2026-08-01T06:06:33.66513",{"slug":229,"name":229,"fn":1472,"description":1473,"org":1474,"tags":1475,"stars":25,"repoUrl":26,"updatedAt":1482},"search Algolia indices and retrieve analytics","Search Algolia indices via the Algolia MCP server, retrieve analytics (top searches, no-result rates, click positions, user counts), and get product recommendations (bought-together, related, trending). Triggers on search, indexing, analytics, Algolia, recommendations, MCP.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1476,1477,1480,1481],{"name":1350,"slug":1351,"type":15},{"name":1478,"slug":1479,"type":15},"API Development","api-development",{"name":1374,"slug":33,"type":15},{"name":23,"slug":24,"type":15},"2026-07-12T08:27:36.376387",19]