Guides
Static Search
When the selected theme supports search and site.search is enabled, Build Pages output includes native search artifacts.
_site/_zeropress/search.js
_site/_zeropress/search.json
_site/_zeropress/search_pagefind.js
Generated Artifacts
/_zeropress/search.js: the default native search adapter. Themes import this file and call itssearch()method./_zeropress/search.json: the native search index used bysearch.js./_zeropress/search_pagefind.js: a Pagefind-compatible adapter. It is generated so advanced users can swap the adapter without changing theme UI code.
Themes should import /_zeropress/search.js and keep the search UI separate from the search engine. This lets the same theme work with native ZeroPress search or a postbuild Pagefind index.
Native Search API
search.js exports preload() and search(query, options).
const searchApi = await import('/_zeropress/search.js');
const result = await searchApi.search('deployment');
The result uses a Pagefind-like shape:
{
results: [
{
id: 'page:getting-started',
score: 12.4,
data: async () => ({
url: '/getting-started/',
excerpt: 'Build your first Markdown-source site.',
plain_excerpt: 'Build your first Markdown-source site.',
meta: {
title: 'Getting Started',
type: 'page',
published_at_iso: '',
updated_at_iso: '2026-06-01T00:00:00Z',
categories: [],
tags: []
},
sub_results: []
})
}
]
}
Use result.data() to load the display data for each hit:
const searchApi = await import('/_zeropress/search.js');
const searchResult = await searchApi.search('config');
for (const hit of searchResult.results) {
const data = await hit.data();
console.log(data.meta.title, data.url, data.excerpt);
}
The second parameter accepts options. The native adapter currently supports limit.
const searchApi = await import('/_zeropress/search.js');
const searchResult = await searchApi.search('github action', {
limit: 5
});
If limit is omitted, the native adapter returns up to its default result count.
Pagefind Adapter
For Pagefind, run it after the ZeroPress build, then replace the native adapter:
npx --yes pagefind@1.5.2 --site ./_site --output-subdir _zeropress/pagefind
cp ./_site/_zeropress/search_pagefind.js ./_site/_zeropress/search.js
rm ./_site/_zeropress/search.json
The rm step removes the unused native index. It is not required for Pagefind to work.