How to Add Full-Text Search to Ghost CMS (Algolia, Typesense, Vellumine)

Ghost's native search is fast and clean — but it only searches post titles, tags, authors, and excerpts. The full body of your posts? Invisible to it. If you run a knowledge-heavy blog or a newsletter archive with hundreds of posts, this limitation frustrates your readers and costs you engagement.

Self-hosted Ghost users have been raising this issue on the forum for years. The most-upvoted recent thread put it plainly: "Why can't my readers search the actual content?" There are solid solutions now. Several are free. One uses Algolia, one uses Typesense (open source), and one uses OpenSearch if you want full control over your infrastructure.

This guide walks through your real options — what each one does, how to set it up, and which makes the most sense for your situation.

Quick answer: Ghost's built-in search only indexes titles, tags, and excerpts — not post body text. To get full-text search, you need a third-party engine: Algolia (managed, generous free tier), Typesense (open source, self-hostable or cloud), or OpenSearch (self-hosted, more complex). Each integrates through Ghost's Content API and a small code injection.

Why doesn't Ghost support full-text search natively?

Ghost's built-in search — called sodo-search — uses a client-side index. When a visitor opens the search bar, Ghost loads a JSON snapshot of your site with titles, slugs, authors, and excerpts. That file stays reasonably small and loads fast. Indexing full post content would balloon that file and slow down every page load, which breaks Ghost's performance-first philosophy.

It's a trade-off that makes sense for small blogs. For anything above 50-100 posts, you notice the gaps. Readers search for "how to configure webhooks" and find nothing because the answer is buried in a post titled something else entirely.

The fix is connecting to an external search engine that indexes your full post content via Ghost's Content API.

OptionHostingFree tierSetup difficulty
AlgoliaCloud (managed)10k records, 10k searches/moMedium
Typesense CloudCloud (managed)$0 trial, then paidMedium
Typesense self-hostedYour serverFree foreverMedium-High
OpenSearchYour serverFree foreverHigh (needs Java)
VellumineCloud (SaaS)Free beta until May 2026Low (script inject)

How do I set up full-text search with Algolia in Ghost?

Algolia is the most-referenced option in the Ghost forum. It gives you typo-tolerance, instant results, and a generous free tier that covers most small-to-medium blogs.

Step 1: Create an Algolia account
Sign up at algolia.com. Create a new app — the free plan includes 10,000 records and 10,000 search requests per month.

Step 2: Index your Ghost content
You need a script that pulls your posts via Ghost's Content API and pushes them to Algolia. The community-maintained approach uses a Node script:

npm install algoliasearch @tryghost/content-api
const GhostContentAPI = require('@tryghost/content-api');
const algoliasearch = require('algoliasearch');

const ghost = new GhostContentAPI({
  url: 'https://yourblog.com',
  key: 'your_content_api_key',
  version: 'v5.0'
});

const client = algoliasearch('YOUR_APP_ID', 'YOUR_ADMIN_KEY');
const index = client.initIndex('ghost_posts');

async function indexPosts() {
  const posts = await ghost.posts.browse({
    limit: 'all',
    fields: 'id,title,slug,excerpt,html,published_at,primary_tag',
    include: 'tags,authors'
  });
  
  const records = posts.map(post => ({
    objectID: post.id,
    title: post.title,
    slug: post.slug,
    excerpt: post.excerpt,
    content: post.html.replace(/<[^>]*>/g, ''),
    publishedAt: post.published_at,
    url: `https://yourblog.com/${post.slug}/`
  }));

  await index.saveObjects(records);
  console.log(`Indexed ${records.length} posts`);
}

indexPosts();

Run this script after any major content update. You can also trigger it via a Ghost webhook on post publish.

Step 3: Add the search UI to Ghost
In Ghost Admin, go to Settings → Code Injection → Site Header. Paste:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@algolia/algoliasearch@5/dist/algoliasearch.umd.min.js">

Then configure InstantSearch.js or DocSearch (Algolia's free tier for documentation sites). The Ghost forum thread Getting full text search working with a paywall has detailed code for handling member-only content.

For tips on how well this integrates with your SEO setup, see Ghost SEO: How To Rank Better with Ghost Blog.

How do I use Typesense for Ghost search (free, open source)?

Typesense is an open-source search engine designed as an Algolia alternative. You can self-host it on any server running Ghost, which brings the cost to zero.

The most polished community tool is ghost-typesense from Magic Pages:

npm install -g @magicpages/ghost-typesense-cli

Create a config file called ghost-typesense.config.js:

module.exports = {
  ghost: {
    url: 'https://yourblog.com',
    key: 'your_content_api_key'
  },
  typesense: {
    host: 'localhost',
    port: 8108,
    protocol: 'http',
    apiKey: 'your_typesense_admin_key',
    collectionName: 'ghost'
  }
}

Then run the initial sync:

ghost-typesense sync --config ghost-typesense.config.js

For the search UI, Magic Pages ships a ready-to-paste script block. Drop it into Ghost's Code Injection under Site Footer. See also How to Optimize Images for SEO on Ghost CMS — fast search and fast images together make a big difference in user experience metrics that Google watches.

The main advantage over Algolia: no record or search limits. You pay only for your server.

What is Vellumine and is it worth using?

Vellumine is a newer SaaS product that surfaced on the Ghost forum in early 2026. It replaces Ghost's native search with a Typesense-powered full-text search engine, adds analytics (what readers search for, zero-hit queries, click-through rates), and supports members-only content in results without exposing gated text.

Setup takes about five minutes:

  1. Sign up at vellumine.com
  2. Enter your Ghost Admin API URL and key
  3. Paste one script tag into Ghost's Code Injection

It's free during the beta period (through May 2026). After that it moves to paid plans. If you want the fastest no-code setup and don't mind a recurring cost later, it's worth trying now while it's free.

Want to know how to handle other Ghost integrations? Ghost Mailchimp Integration: Step-by-Step Guide and Tips covers a similar API-key-based workflow.

How do I add a Ghost webhook to auto-update the search index?

Manual syncing gets old fast. Ghost webhooks let you trigger a re-index automatically every time you publish or update a post.

In Ghost Admin, go to Settings → Integrations → Add custom integration. Name it "Search Index". Then add a webhook:

  • Event: Post published / Post updated
  • Target URL: Your indexing endpoint (a small Express or Next.js server, or a serverless function)

Your webhook handler pulls the changed post from Ghost's Content API and upserts it into Algolia or Typesense. For Algolia:

app.post('/webhook', async (req, res) => {
  const postId = req.body.post.current.id;
  const post = await ghost.posts.read({ id: postId }, { fields: 'id,title,slug,html,excerpt' });
  const record = {
    objectID: post.id,
    title: post.title,
    content: post.html.replace(/<[^>]*>/g, ''),
    excerpt: post.excerpt,
    url: `https://yourblog.com/${post.slug}/`
  };
  await index.saveObject(record);
  res.sendStatus(200);
});

This keeps your search index in sync without any manual work. The XML Sitemaps in Ghost post covers similar automated indexing principles for search engines.

Does full-text search affect Ghost's SEO?

Not directly — search engines crawl your pages, not your internal search index. But it affects engagement metrics that do matter for rankings: time on site, pages per session, and bounce rate. Readers who find what they're looking for stay longer and visit more pages.

If you run a membership or newsletter-based site, good search also reduces unsubscribe rates. Members who can find content stay subscribed. That's a retention signal Ghost's membership system can benefit from. For the full picture on improving your Ghost site's visibility, read Ghost SEO Hacks: Secrets to Supercharge Your Blog's Visibility and How to Optimize Content for Ghost SEO.

Can I search inside members-only or paid posts?

Yes, but carefully. You can index the full content server-side and return only titles/excerpts in search results for gated content. This way a member sees that a relevant paid post exists and gets nudged to subscribe or upgrade — without leaking the content to free visitors.

Both Algolia and Typesense support this pattern. You tag records in the index with a membership level field, then filter results client-side based on the logged-in member's tier. Vellumine handles this automatically.

For more on controlling content access, see How to Restrict Content to Specific Membership Tiers in Ghost CMS.

Frequently Asked Questions

No. Ghost's native search (sodo-search) only indexes post titles, excerpts, tags, and authors — not post body content. Full-text search requires connecting an external engine like Algolia, Typesense, or OpenSearch via Ghost's Content API.

What is the easiest way to add full-text search to Ghost?

Vellumine is currently the lowest-friction option — sign up, provide your Ghost Admin API key, paste one script tag. It's free through May 2026. For a free long-term solution, Typesense self-hosted with the ghost-typesense CLI is the next easiest.

Is Algolia free for Ghost blogs?

Algolia's free tier includes 10,000 indexed records and 10,000 search requests per month. For most blogs, that's plenty. If you exceed the limits, paid plans start around $10/month.

How do I keep my search index up to date automatically?

Set up a Ghost webhook (Settings → Integrations → Add custom integration) that fires on post publish and post update events. Your webhook handler calls your indexing script to upsert the changed post into Algolia or Typesense.

Can Typesense search inside Ghost members-only content?

Yes. Index all content server-side but include a membership-level field on each record. Filter search results client-side based on the logged-in user's tier, so only the post title/excerpt shows for gated content.

Does Ghost's search work with custom themes?

Ghost's native sodo-search works with any theme that includes a #/search navigation link. Third-party solutions like Algolia and Typesense require adding their UI components via Ghost's Code Injection — which works regardless of your theme.

How many posts can Typesense self-hosted handle?

Typesense runs comfortably on a 1 GB RAM server and can handle hundreds of thousands of records. For a typical Ghost blog, resources are not a constraint. See How to Fix Out of Memory Crashes on a 1 GB RAM Linux Server if your server is running lean.

What's the difference between Typesense and Algolia for Ghost?

Algolia is a managed SaaS with a polished dashboard and a free tier. Typesense is open source — free to self-host, with a paid cloud option. Both offer typo-tolerance and instant results. Choose Algolia for zero maintenance; choose Typesense for cost control and data ownership.

The best approach depends on your setup: if you're on Ghost(Pro) or a managed host without server access, use Algolia or Vellumine. If you run a self-hosted Ghost on your own VPS, Typesense gives you full-text search at zero marginal cost — and you already have the server running anyway.

Subscribe to Ghost SEO

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe