From algolia-pack
Indexes records into Algolia with saveObjects and searches using searchSingleIndex via algoliasearch v5 client. For new integrations, setup testing, or learning core patterns.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin algolia-packThis skill is limited to using the following tools:
Index records into Algolia and search them back — the two fundamental operations. Uses the `algoliasearch` v5 client where all methods live on the client directly (no `initIndex`).
Provides patterns for Algolia search implementation using React InstantSearch hooks, indexing strategies, relevance tuning, and Next.js SSR integration.
Installs Algolia JavaScript v5 client, configures API keys via env vars, and initializes backend/frontend clients in Node.js/TypeScript projects.
Provides expert patterns for Algolia search implementation, indexing strategies, React InstantSearch, relevance tuning, autocomplete, typeahead, and faceted search.
Share bugs, ideas, or general feedback.
Index records into Algolia and search them back — the two fundamental operations. Uses the algoliasearch v5 client where all methods live on the client directly (no initIndex).
algoliasearch v5 installed (npm install algoliasearch)ALGOLIA_APP_ID and ALGOLIA_ADMIN_KEY environment variables setalgolia-install-auth for setupimport { algoliasearch } from 'algoliasearch';
const client = algoliasearch(
process.env.ALGOLIA_APP_ID!,
process.env.ALGOLIA_ADMIN_KEY!
);
// saveObjects adds or replaces records. Each must have objectID
// (or Algolia auto-generates one).
const { taskID } = await client.saveObjects({
indexName: 'movies',
objects: [
{ objectID: '1', title: 'The Matrix', year: 1999, genre: 'sci-fi' },
{ objectID: '2', title: 'Inception', year: 2010, genre: 'sci-fi' },
{ objectID: '3', title: 'Pulp Fiction', year: 1994, genre: 'crime' },
],
});
// Wait for indexing to complete before searching
await client.waitForTask({ indexName: 'movies', taskID });
console.log('Indexing complete.');
// Basic search — Algolia searches all searchableAttributes by default
const { hits } = await client.searchSingleIndex({
indexName: 'movies',
searchParams: { query: 'matrix' },
});
console.log(`Found ${hits.length} results:`);
hits.forEach(hit => {
// _highlightResult shows which parts matched
console.log(` ${hit.title} (${hit.year})`);
});
// Settings define how Algolia ranks results
await client.setSettings({
indexName: 'movies',
indexSettings: {
searchableAttributes: ['title', 'genre'], // Fields to search
attributesForFaceting: ['genre', 'year'], // Filterable fields
customRanking: ['desc(year)'], // Tie-breaker: newer first
attributesToRetrieve: ['title', 'year', 'genre'],// Fields returned in hits
},
});
Indexing complete.
Found 1 results:
The Matrix (1999)
| Error | Cause | Solution |
|---|---|---|
Invalid Application-ID or API key | Wrong credentials | Verify in dashboard > Settings > API Keys |
Record is too big | Object > 10KB (free) or 100KB (paid) | Reduce record size or split into smaller records |
Index does not exist (on search) | Index not created yet | saveObjects auto-creates the index |
taskID never resolves | Indexing queue backlog | Check dashboard > Indices > Operations |
// Search multiple indices in one API call
const { results } = await client.search({
requests: [
{ indexName: 'movies', query: 'inception' },
{ indexName: 'actors', query: 'inception' },
],
});
results.forEach(result => {
if ('hits' in result) {
console.log(`${result.index}: ${result.hits.length} hits`);
}
});
// browse returns up to 1000 records per call — use for data export
const { hits, cursor } = await client.browse({
indexName: 'movies',
browseParams: { hitsPerPage: 1000 },
});
console.log(`First page: ${hits.length} records`);
// Use cursor to fetch next pages
// Delete by objectID
await client.deleteObject({ indexName: 'movies', objectID: '3' });
// Delete by query match
await client.deleteBy({
indexName: 'movies',
deleteByParams: { filters: 'genre:crime' },
});
Proceed to algolia-local-dev-loop for development workflow setup.