SearchJetEngine
Vue & Nuxt Integration

Instant Search for Vue 3 & Nuxt — Composables & SSR Ready

AI-Powered Search for Vue and Nuxt Applications

Add AI-powered search to Vue/Nuxt apps in minutes. Reactive composables, pre-built components, full TypeScript support.

Nuxt 3 SSR
Vue 3 Composables
Pinia Compatible
No Credit Card Required
Works with Any Vue Setup
Free Forever Plan
The Problem

Vue Search is Fragmented

The Vue ecosystem lacks a cohesive search solution. You\'re forced to choose between abandoned libraries, vendor lock-in, or building everything yourself.

Common Vue Pain Point

No Official Vue Search Lib

The Vue ecosystem lacks a first-party search solution. You're left stitching together community libraries or building from scratch.

Common Vue Pain Point

Algolia Vue = Abandoned

The official Vue InstantSearch library is deprecated and barely maintained. Limited to Algolia's ecosystem with no standalone option.

Common Vue Pain Point

Custom Meilisearch = Boilerplate

Manual API integration with Meilisearch requires writing your own reactive composables, state management, and error handling.

The Solution

SearchJet Vue SDK

Reactive composables with Nuxt 3 SSR support, TypeScript inference, and pre-built components.

Reactive Composables

useSearch, useHits, useFacets composables with full Vue 3 reactivity. Automatic state updates when query changes.

Nuxt 3 Server Routes

SSR search with useAsyncData compatibility. Pre-fetch results server-side for SEO-critical pages.

Pre-built Components

SearchBox, Hits, FacetFilter, Pagination components ready to drop in. Customize with slots and props.

TypeScript + Volar

Full type inference in templates with Volar. Autocomplete for composables, component props, and hit objects.

Pinia / Vuex Ready

Works with your state management. Use SearchJet composables inside Pinia stores or Vuex modules.

i18n Compatible

Works with @nuxtjs/i18n and vue-i18n out of the box. Multi-language search UI with locale-aware faceting.

Copy-Paste Integration

Two approaches — Nuxt 3 page or reusable composable

Nuxt 3 Page with useAsyncData

pages/search.vue
// pages/search.vue
<script setup>
import { useSearch, useHits } from '@searchjet/vue';

const { query, isSearching } = useSearch({
  indexName: 'your_index',
  searchApiKey: 'your_search_api_key',
});

const { hits } = useHits();
</script>

<template>
  <div class="max-w-4xl mx-auto py-12 px-6">
    <input
      v-model="query"
      type="text"
      placeholder="Search docs..."
      class="w-full p-4 border-2 border-gray-200 rounded-xl text-lg focus:border-blue-500 focus:outline-none"
    />

    <div v-if="isSearching" class="mt-8 text-center text-gray-500">
      Searching...
    </div>

    <div v-else class="mt-8 space-y-4">
      <article
        v-for="hit in hits"
        :key="hit.objectID"
        class="p-6 border border-gray-200 rounded-xl hover:border-blue-300"
      >
        <h3 class="text-xl font-semibold" v-html="hit._highlightResult?.title?.value || hit.title" />
        <p class="mt-2 text-gray-600" v-html="hit._highlightResult?.content?.value || hit.content" />
      </article>
    </div>
  </div>
</template>

Vue 3 Component with Composables

composables/useProductSearch.ts
// composables/useProductSearch.ts
import { ref, computed } from 'vue';
import { useSearch, useHits, useFacets } from '@searchjet/vue';

export function useProductSearch() {
  const filters = ref({ category: '', priceRange: '' });

  const { query, setQuery, isSearching } = useSearch({
    indexName: 'products',
    searchApiKey: 'your_search_api_key',
    filters: computed(() => buildFilterString(filters.value)),
  });

  const { hits, totalHits } = useHits();
  const { facets } = useFacets();

  const filteredProducts = computed(() =>
    hits.value.map(hit => ({
      ...hit,
      formattedPrice: new Intl.NumberFormat('en-US', {
        style: 'currency',
        currency: 'USD',
      }).format(hit.price),
    }))
  );

  function applyFilter(facet, value) {
    filters.value = { ...filters.value, [facet]: value };
  }

  return {
    query, setQuery, isSearching,
    filteredProducts, totalHits,
    facets, filters, applyFilter,
  };
}

Need a complete starter project?

View GitHub Examples

Frequently Asked Questions

Everything you need to know about SearchJet for Vue/Nuxt

Does SearchJet work with Nuxt 3?
Yes, SearchJet provides full SSR support with Nuxt 3, including server routes, useAsyncData compatibility, and pre-rendered search results for SEO.
What Vue versions are supported?
Vue 3 with Composition API is required. Vue 2 is not supported — we recommend upgrading to Vue 3 for the best experience.
Are there Vue composables?
Yes, SearchJet provides useSearch, useHits, and useFacets composables for full reactivity and custom search implementations.
Does it work with Pinia?
Yes, SearchJet composables are fully compatible with Pinia and Vuex. Use them inside stores or directly in components.
Is there a pre-built component library?
Yes, SearchBox, Hits, FacetFilter, and Pagination components are included. Each supports slots for full UI customization.
How does it handle i18n?
SearchJet works with @nuxtjs/i18n and vue-i18n for multi-language search. Locale-aware faceting and placeholder text included.

Still have questions?

Contact our support team

Ready to Add Search to Your Vue/Nuxt App?

Join developers building exceptional search experiences with SearchJet

Free Forever Plan
No Credit Card
5-Min Setup

Already have an account? Log in

Related Use Cases