siteway

// stack · search

Pagefind.

Pagefind ist eine Suchbibliothek, die den Index beim Build erzeugt und die Suche danach als WebAssembly im Browser ausführt. Kein Suchserver, keine externe Abfrage, kein Tracking — und geladen wird nur der Teil des Index, den die Eingabe wirklich braucht. Bei siteway läuft genau das hinter der Command-Palette dieser Website: ⌘K drücken, tippen, springen.

stack stack: pagefind · rust → wasm einsatz: ⌘k-suche dieser website seit: 2022

// definition

Was ist Pagefind?

open source · mit-lizenz

Pagefind ist eine quelloffene Bibliothek für Volltextsuche auf statisch ausgelieferten Websites. Sie besteht aus einem Kommandozeilen-Werkzeug, das nach dem Build das fertig gerenderte HTML indexiert, und einer Suchlaufzeit in WebAssembly, die im Browser läuft. Zwischen Tastendruck und Ergebnis liegt damit kein Netzweg zu einem Dienst.

Der Kern ist in Rust geschrieben und zu WebAssembly kompiliert. Liam Bigelow hat Pagefind im Juli 2022 bei CloudCannon veröffentlicht — als Antwort auf das Problem, dass ältere clientseitige Suchen den kompletten Index als eine Datei laden mussten und bei großen Websites in den Megabyte-Bereich kippten. Heute wird Pagefind als eigenständiges Projekt unter der MIT-Lizenz entwickelt: frei verwendbar, auch kommerziell, ohne Abo und ohne Anfragekontingent.

// praxis

Wie wir Pagefind einsetzen.

eigene ui · nicht die fertige

Wir hängen Pagefind als festen Schritt in die Build-Kette, nicht als nachträgliches Skript. Auf dieser Website ist es Schritt drei von sechs: erst wird das CSS kompiliert, dann bekommt jede h2 und h3 eine stabile ID, und erst danach läuft pagefind --site dist über die fertigen Seiten. Die Reihenfolge ist kein Detail: Ohne die Anker vorher kennt der Index keine Sprungziele, und die Suche könnte nur auf ganze Seiten verlinken.

Indexiert wird nur, was zählt. Der durchsuchbare Bereich ist mit data-pagefind-body am Hauptinhalt ausgezeichnet — Topbar, Footer und die Palette selbst bleiben draußen, sonst meldet jede Seite denselben Rahmen als Treffer. Die Runtime liegt auf demselben Host wie die Website. Das ist der Grund, warum unsere Content-Security-Policy ohne Ausnahme für einen Fremdhost auskommt und die Suche keine Einwilligung braucht.

Die Oberfläche bauen wir selbst. Pagefind bringt fertige UI-Komponenten mit; wir nutzen stattdessen die JavaScript-API und rendern die Treffer in unsere Command-Palette. Sie mischt Navigationsziele und Volltexttreffer in einer Liste, zeigt den Textausschnitt mit hervorgehobenem Suchbegriff und springt beim Auswählen direkt in den passenden Abschnitt. Getippt wird mit 120 Millisekunden Verzögerung gesucht, angezeigt werden die sechs besten Treffer, und veraltete Antworten werden verworfen, wenn die nächste Eingabe schneller war.

Geladen wird die Bibliothek erst, wenn jemand die Palette öffnet — beim normalen Seitenaufruf kostet die Suche null Byte. Das ist Absicht: Die Startseite steht bei PageSpeed Insights mobil auf 100/100/100/100, und eine Suche, die immer mitlädt, würde genau daran knabbern. Fällt der Import aus, läuft die Palette ohne Volltext weiter — die Navigation bleibt bedienbar.

// bausteine · 6 details

Die Teile von Pagefind.

cli · index · api

Pagefind ist kein Monolith, sondern eine Handvoll klar getrennter Teile. Wer sie kennt, weiß auch, an welcher Schraube man dreht, wenn ein Treffer falsch gewichtet ist oder etwas im Index landet, das dort nichts zu suchen hat.

// d-01build

Das CLI.

Ein Befehl auf das Ausgabeverzeichnis, mehr braucht es nicht. Pagefind liest gerendertes HTML — ob es aus einem Generator, einem CMS-Export oder von Hand kommt, ist ihm egal. Kein Datenbankzugriff, kein Plugin, keine Konfigurationsdatei für den Start.

eingabe: fertige html-dateien

// d-02ausgabe

Index & Fragmente.

Zwei getrennte Ablagen: der gechunkte Suchindex und die Fragmente mit Text und Metadaten je Seite. Erst wird ein passender Index-Chunk geholt, dann nur das Fragment der Treffer. Deshalb bleibt die Netzlast klein, auch wenn die Website wächst.

aufbau: chunks + fragmente

// d-03markup

Steuerung im HTML.

Gesteuert wird über data-Attribute direkt im Markup: body setzt den durchsuchbaren Bereich, ignore nimmt Blöcke raus, weight gewichtet Überschriften höher als Fließtext, filter und meta liefern Facetten und Trefferdaten.

regie: data-pagefind-*

// d-04runtime

JS-API & UI.

Zwei Wege zur selben Suche: die fertigen UI-Komponenten für den schnellen Einbau oder die JavaScript-API für eine eigene Oberfläche — Modul importieren, initialisieren, suchen, Treffer auslesen. Wir gehen den zweiten Weg, weil die Suche bei uns Teil der Palette ist.

wahl: komponente oder api

// d-05treffer

Sub-Results.

Ein Treffer ist nicht nur eine Seite, sondern der Abschnitt darin: Pagefind gibt zu jedem Ergebnis die passenden Unterergebnisse mit Titel, Ausschnitt und Anker-URL zurück. Voraussetzung sind IDs an den Überschriften — die vergeben wir automatisch im Build.

ziel: seite#abschnitt

// d-06sprache

Sprachindizes.

Pagefind liest das lang-Attribut und legt je Sprache einen eigenen Index mit passender Wortstammerkennung an — deutsche Beugungsformen werden anders zusammengeführt als englische. Geladen wird nur der Index der Sprache, in der jemand gerade unterwegs ist.

basis: lang-attribut

// beleg

Diese Website als Beleg.

nachrechenbar · ⌘k drücken

Die ehrlichste Referenz ist die Seite, auf der du gerade bist. Der deutsche Index umfasst rund 100 Seiten — Leistungen, Stack, Cases, Artikel, Tools. Die Runtime, also das WebAssembly-Modul plus das ladende Skript, liegt bei etwa 115 kB unkomprimiert. Dazu kommt pro Anfrage ein Index-Chunk in der Größenordnung von 40 kB und je Treffer ein Fragment von etwa 5 kB. Beides erst dann, wenn jemand tatsächlich sucht.

Probe aufs Exempel: ⌘K drücken und „Migrations" tippen. Der Treffer führt nicht auf die Startseite von PHP & Laravel, sondern direkt auf den Abschnitt, in dem das Wort steht. Genau dafür laufen die Überschriften-Anker vor dem Index.

Dass wir Pagefind nicht überall einsetzen, gehört zur selben Ehrlichkeit: Beim Konzern-Auftritt von Spelsberg — TYPO3, 13 Sprachen, angebundenes PIM — läuft die Produktsuche über Algolia, weil dort ein Katalog mit Facetten durchsucht wird und nicht ein Textbestand. Beide Wege liegen im Werkzeugkasten; die Auswahl steht im Hub Suche, die Projekte unter Cases.

// entscheidung

Wann Pagefind passt — und wann nicht.

text oder katalog

Die nützlichste Frage ist nicht „welche Suche ist die beste", sondern „was wird eigentlich durchsucht". Bei Text und Seiten spielt Pagefind seine Stärken aus. Bei Katalogen, Facetten und Daten, die sich stündlich ändern, ist ein Suchdienst das ehrlichere Werkzeug — und der Wechsel kostet dann keine Diskussion mehr, sondern ist eine Rechenaufgabe.

// e-01regelfall

Inhalte & Wissen.

Unternehmensseiten, Magazine, Blogs, Dokumentation, Handbücher: Bestände, die aus Text bestehen und sich mit dem Deploy ändern. Hier ist Pagefind schnell, kostet im Betrieb nichts und hat keine Teile, die ausfallen können.

pagefind

// e-02machbar

Viele Seiten, viele Sprachen.

Auch im vier- bis fünfstelligen Seitenbereich trägt der gechunkte Index — Pagefind nennt selbst unter 300 kB Gesamtlast bei 10.000 Seiten. Zu planen sind dann die Build-Dauer und ein sauberer Index je Sprache statt eines Sammeltopfs.

pagefind + planung

// e-03grenze

Katalog, Facetten, Echtzeit.

Zehntausende Produkte mit Attributen, Filter über mehrere Achsen, Preise und Bestände im Minutentakt, Ranking nach Geschäftslogik: Dafür braucht es einen Suchdienst — Algolia gehostet oder Meilisearch selbst betrieben, sauber angebunden.

algolia · meilisearch

faustregel text & seiten: pagefind katalog & echtzeit: suchdienst die auswahl im hub suche →

// faq

Häufige Fragen.

Was ist Pagefind?

Pagefind ist eine quelloffene Bibliothek für Volltextsuche auf statisch ausgelieferten Websites. Sie besteht aus zwei Teilen: einem Kommandozeilen-Werkzeug, das nach dem Build das fertig gerenderte HTML indexiert, und einer Suchlaufzeit, die in Rust geschrieben und zu WebAssembly kompiliert ist und im Browser läuft. Pagefind erschien im Juli 2022 bei CloudCannon, steht unter der MIT-Lizenz und wird heute als eigenständiges Projekt entwickelt. siteway setzt Pagefind als Standardsuche für inhaltsgetriebene Websites ein.

Wie kommt Pagefind auf eine Website?

Über einen einzigen Build-Schritt. Nachdem alle Seiten als HTML vorliegen, läuft das Pagefind-CLI über das Ausgabeverzeichnis und legt daneben einen Ordner mit Index, Fragmenten und WebAssembly-Modul ab. Es braucht keinen Zugriff auf Datenbank oder CMS und kein Plugin — nur die fertigen Seiten. Bei siteway ist das Schritt drei im Update-Skript: erst CSS, dann Überschriften-Anker, dann der Suchindex. Deshalb funktioniert derselbe Ablauf bei einem TYPO3-Export genauso wie bei Statamic oder handgebautem HTML.

Welche Daten schickt Pagefind an Dritte?

Keine. Suchbegriffe werden im Browser ausgewertet, geladen werden ausschließlich statische Dateien vom selben Host wie die Website — es gibt keinen Suchdienst, der eine Anfrage entgegennimmt. Damit entsteht kein Auftragsverarbeitungsverhältnis für die Suche, keine Einwilligung ist nötig und die Content-Security-Policy braucht keine Ausnahme für einen Fremdhost. Für siteway ist das der Hauptgrund, warum Pagefind zur trackingfreien Auslieferung passt.

Kann man mit Pagefind eine eigene Suchoberfläche bauen?

Ja. Pagefind liefert fertige UI-Komponenten mit, die ohne Konfiguration funktionieren — und darunter eine schlanke JavaScript-API: Modul laden, init aufrufen, search abfragen, Treffer auslesen. siteway nutzt auf dieser Website die API und rendert die Treffer in der eigenen Command-Palette, die mit Befehl-K oder Strg-K aufgeht. Die fertige Komponente ist der schnelle Weg, die API der freie — beide führen zum selben Index.

Springt Pagefind direkt zur passenden Stelle einer Seite?

Ja, wenn die Überschriften IDs haben. Pagefind ordnet Treffer den Abschnitten einer Seite zu und liefert sie als Sub-Results mit eigener URL, eigenem Titel und Textausschnitt. siteway vergibt deshalb im Build automatisch stabile IDs für jede h2 und h3; die Suche verlinkt dann auf Seite plus Anker, und die Command-Palette scrollt die Stelle an und hebt sie kurz hervor. Aus einem Treffer wird so eine Antwort statt einer Seite, auf der man weitersuchen muss.

Wann stößt Pagefind an Grenzen?

An drei Stellen. Erstens Aktualität: Der Index ist der Stand des letzten Builds, für sekundenaktuelle Preise oder Lagerbestände reicht das nicht. Zweitens Facetten über sehr große Datenmengen: Filter über Zehntausende Produkte mit vielen Attributen gehören in einen Suchdienst. Drittens Sortierung und Ranking nach Geschäftslogik, etwa Marge oder Klickverhalten. Für diese Fälle bindet siteway Algolia oder das selbst hostbare Meilisearch an — die Einordnung dazu steht im Stack unter Suche.

Was kostet Pagefind?

Die Bibliothek selbst nichts: Pagefind steht unter der MIT-Lizenz und darf auch kommerziell frei verwendet werden. Es gibt kein Abo, keine Anfragekontingente und keinen Dienst, der abgerechnet wird — im Betrieb entstehen nur die Kosten für das Ausliefern statischer Dateien. Bezahlt wird die Einrichtung: Index in die Deploy-Kette hängen, durchsuchbaren Bereich auszeichnen, Gewichtung und Oberfläche bauen. Als Leistung liegt das bei siteway unter der Komponente Suche.

// Suche, die niemanden mitliest?

Projekt anfragen