Skip to content
Skillv1.0.0

nuxt-swiftsearch

Implement Algolia search UIs in Nuxt 3 apps using @atoms-studio/nuxt-swiftsearch — an SSR-first, fully typed alternative to vue-instantsearch.

by atoms-studio(0) 0 installs
Free
Sign in to install

Free account. Installing gives you the manifest plus copy-paste snippets.

See reviews

About

Imported from atoms-studio/nuxt-swiftsearch (skills/SKILL.md). Install upstream with npx skills add atoms-studio/nuxt-swiftsearch --skill skills. Copyright stays with the author (MIT).

Instructions

Use this skill when building search UIs in Nuxt 3 apps with Algolia via @atoms-studio/nuxt-swiftsearch.

When to Use

  • Adding search functionality to a Nuxt 3 app with Algolia
  • Building search pages with filters, pagination, infinite scroll
  • Implementing SSR-compatible search experiences
  • Migrating from vue-instantsearch to a Nuxt-native approach

Installation

npx nuxi@latest module add swiftsearch
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ["@atoms-studio/nuxt-swiftsearch"],
});

Core Pattern: Dual Registration

Every widget requires both a composable (in <script setup>) AND a component (in <template>). The composable registers the widget with the InstantSearch instance; the component renders it.

<template>
  <AisInstantSearch :widgets :configuration>
    <AisSearchBox />
    <AisHits />
    <AisRefinementList attribute="brand" />
  </AisInstantSearch>
</template>

<script setup lang="ts">
import { algoliasearch } from "algoliasearch";

const client = algoliasearch("APP_ID", "API_KEY");

const widgets = computed(() => [
  useAisSearchBox({}),
  useAisHits({ escapeHTML: true }),
  useAisRefinementList({ attribute: "brand" }),
]);

const configuration = ref({
  indexName: "my_index",
  searchClient: client,
});
</script>

Critical Rules

  1. widgets must be computed — not a plain array. The reactivity is required for SSR hydration.
  2. configuration must be ref — wrap the config object in ref().
  3. Attribute props must match — when using AisRefinementList, AisMenu, etc., the attribute prop on the component must match the attribute in the composable.
  4. All composables and components are auto-imported — no manual imports needed for useAis* composables or Ais* components.

Available Components & Composables

Full props, slots, composable params, and examples for every widget: widgets-reference.md

Component Composable Purpose
<AisInstantSearch> Root wrapper, receives :widgets and :configuration
<AisIndex> useAisIndex() Multi-index scoping
<AisSearchBox> useAisSearchBox() Search input
<AisHits> useAisHits() Paginated results
<AisInfiniteHits> useAisInfiniteHits() Infinite scroll results
<AisRefinementList> useAisRefinementList() Facet filtering
<AisMenu> useAisMenu() Single-select facet menu
<AisMenuSelect> Dropdown facet menu
<AisHierarchicalMenu> useAisHierarchicalMenu() Nested category navigation
<AisNumericMenu> useAisNumericMenu() Numeric range filtering
<AisRangeInput> useAisRangeInput() Min/max range input
<AisRatingMenu> useAisRatingMenu() Star rating filter
<AisToggleRefinement> useAisToggleRefinement() Boolean toggle filter
<AisClearRefinements> useAisClearRefinements() Clear all active filters
<AisCurrentRefinements> useAisCurrentRefinements() Show active filters
<AisSortBy> useAisSortBy() Sort order selector
<AisStats> useAisStats() Results count & timing
<AisPagination> useAisPagination() Page navigation
<AisConfigure> useAisConfigure() Hidden search parameters
<AisHighlight> Highlight matched text
<AisAutocomplete> useAisAutocomplete() Autocomplete suggestions
<AisPanel> Collapsible panel wrapper
<AisQueryRuleCustomData> useAisQueryRuleCustomData() Query rules data
<AisStateResults> Generic state renderer

Widget Categories (Quick Lookup)

Search Input: AisSearchBox, AisAutocomplete Results: AisHits, AisInfiniteHits, AisStateResults Refinements: AisRefinementList, AisMenu, AisMenuSelect, AisHierarchicalMenu, AisNumericMenu, AisRangeInput, AisRatingMenu, AisToggleRefinement Active Filters: AisClearRefinements, AisCurrentRefinements Sorting & Pagination: AisSortBy, AisPagination Display: AisStats, AisHighlight, AisPanel Config: AisConfigure, AisQueryRuleCustomData Structure: AisInstantSearch, AisIndex

URL Routing

To sync search state with the URL:

  1. Set up query string parsing:
// app/router.options.ts
import type { RouterConfig } from "@nuxt/schema";
import qs from "qs";

export default <RouterConfig>{
  parseQuery: qs.parse,
  stringifyQuery: qs.stringify,
};
  1. Add the router to configuration:
<script setup lang="ts">
const algoliaRouter = useAisRouter();

const configuration = ref({
  indexName: "my_index",
  routing: algoliaRouter.value,
  searchClient: client,
});
</script>

Slot Customization

All components expose slots with typed render state:

<AisHits>
  <template #item="{ item }">
    <div>{{ item.name }}</div>
  </template>
</AisHits>

<AisInfiniteHits>
  <template #item="{ item }">
    <div>{{ item.title }}</div>
  </template>
  <template #loadMore="{ refineNext, isLastPage }">
    <button :disabled="isLastPage" @click="refineNext">Load more</button>
  </template>
</AisInfiniteHits>

Caching (Infinite Hits)

For stateful caching across page navigations:

const cache = useAisStatefulCache();
const infiniteCache = useAisInfiniteHitsStatefulCache();

const widgets = computed(() => [useAisInfiniteHits({ cache: infiniteCache })]);

Accessing the Instance

<script setup lang="ts">
const { getInstance } = useAisInstantSearch();
// Access the raw InstantSearch instance for advanced use cases
</script>

Multi-Index Search

<AisInstantSearch :widgets :configuration>
  <AisIndex index="products">
    <AisHits />
  </AisIndex>
  <AisIndex index="articles">
    <AisHits />
  </AisIndex>
</AisInstantSearch>

CSS Classes

Components use BEM convention: ais-WidgetName-element--modifier. Use useSuit("WidgetName") to generate class names programmatically.

Common Mistakes

  • Forgetting to add the composable to widgets array (component renders but doesn't work)
  • Using a plain array instead of computed() for widgets
  • Mismatched attribute between component prop and composable param
  • Importing composables manually (they're auto-imported)

Dependencies

  • Nuxt >= 3.10
  • algoliasearch v5+
  • qs (only if using routing)

Use it

Copy one of these into your project. Installing also returns the manifest and these snippets.

yaml
targets:
  - https://api.opensmartroute.ai/api/v1/registry/atoms-studio-nuxt-swiftsearch-skills/manifest   # or paste the manifest below

Manifest

An Open Capability Manifest: the router reads it to know what this does, what it costs and when to pick it.

atoms-studio-nuxt-swiftsearch-skills.ocm.jsonjson
{
  "ocm": "1",
  "id": "atoms-studio-nuxt-swiftsearch-skills",
  "kind": "skill",
  "name": "nuxt-swiftsearch",
  "description": "Implement Algolia search UIs in Nuxt 3 apps using @atoms-studio/nuxt-swiftsearch — an SSR-first, fully typed alternative to vue-instantsearch.",
  "publisher": "atoms-studio",
  "version": "1.0.0",
  "capabilities": {
    "domains": [
      "general"
    ],
    "tags": [
      "skill-md",
      "nuxt",
      "algolia",
      "search",
      "ssr",
      "vue",
      "github"
    ],
    "languages": [
      "en"
    ]
  },
  "quality_prior": 0.6,
  "examples": [
    "Implement Algolia search UIs in Nuxt 3 apps using @atoms-studio/nuxt-swiftsearch — an SSR-first, fully typed alternative to vue-instantsearch."
  ],
  "primary": false,
  "metadata": {
    "source": {
      "provider": "github",
      "repository": "https://github.com/atoms-studio/nuxt-swiftsearch",
      "path": "skills/SKILL.md",
      "ref": "df27cd43e8310e06eb6461cba7b1eb09e86cc3b5",
      "url": "https://github.com/atoms-studio/nuxt-swiftsearch/blob/df27cd43e8310e06eb6461cba7b1eb09e86cc3b5/skills/SKILL.md",
      "key": "atoms-studio/nuxt-swiftsearch/skills/SKILL.md"
    },
    "license": "MIT"
  },
  "instructions": "## Instructions\n\nUse this skill when building search UIs in Nuxt 3 apps with Algolia via `@atoms-studio/nuxt-swiftsearch`.\n\n### When to Use\n\n- Adding search functionality to a Nuxt 3 app with Algolia\n- Building search pages with filters, pagination, infinite scroll\n- Implementing SSR-compatible search experiences\n- Migrating from vue-instantsearch to a Nuxt-native approach\n\n### Installation\n\n```bash\nnpx nuxi@latest module add swiftsearch\n```\n\n```ts\n// nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: [\"@atoms-studio/nuxt-swiftsearch\"],\n});\n```\n\n### Core Pattern: Dual Registration\n\nEv",
  "cost": {
    "context_tokens": 1968
  }
}

Fetch it by URL: GET /api/v1/registry/atoms-studio-nuxt-swiftsearch-skills/manifest?version=1.0.0

Reviews

Star ratings from people who tried it. One review per account; edit yours any time.

No reviews yet. Install it, try it, and be the first to rate it.