Modell / Datensatz
kantord/SeaGOAT avatar
kantord/SeaGOAT

SeaGOAT: semantische Codesuche, die lokal bleibt

local-first semantic code search engine

1.308 Sterne92 ForksPythonMIT

Auf einen Blick

Was ist das?
SeaGOAT kombiniert einen lokalen Vektorindex mit ripgrep, um Code per Bedeutung statt per Zeichenkette zu finden. Ein Blick auf Mechanik, Startbefehle und die Grenzen des Ansatzes.
Für wen ist es gedacht?
SeaGOAT passt zu Entwicklerinnen und Entwicklern, die eine überschaubare Codebasis in einer der dreizehn unterstützten Dateiendungen durchsuchen und dabei keine Daten an fremde APIs geben wollen. Wer ausschließlich grep-Geschwindigkeit braucht oder in einer Sprache arbeitet, die nicht in der fest verdrahteten Liste steht, sollte zuerst prüfen, ob ein reiner Textsuchlauf nicht ausreicht.
Darf ich es kommerziell nutzen?
Ja. MIT ist eine freizügige Lizenz: Sie dürfen darauf aufbauende Software nutzen, verändern und verkaufen, solange Sie die Urheberrechts- und Lizenzhinweise beibehalten.
Wird es noch gepflegt?
Ja. Die letzten Commits kamen vor 4 Tagen.
In welcher Sprache ist es geschrieben?
Hauptsächlich Python, laut der Sprachstatistik von GitHub.

Die Antworten beruhen auf den GitHub-Daten des Projekts (zuletzt abgeglichen am 15. September 2026) und auf unserer Analyse. Sie sind keine Rechtsberatung.

TIEFGEHENDE OPEN-SOURCE-ANALYSE

Welches Problem SeaGOAT adressiert

Wer eine Codebasis nicht selbst geschrieben hat, kennt das Problem: Man weiß, dass irgendwo Zahlen gerundet werden, aber nicht, ob die Funktion round, toFixed, quantize oder setScale heißt. grep liefert nur Treffer, wenn der Suchbegriff exakt im Quelltext steht. SeaGOAT setzt genau dort an und erlaubt Anfragen wie "Where are the numbers rounded", also Beschreibungen statt Bezeichner. Die Zielgruppe sind laut README Entwickler, die in einem lokalen Repository arbeiten und dabei weder einen Cloud-Dienst noch einen externen API-Schlüssel einsetzen möchten. Das Werkzeug richtet sich an Einzelpersonen und kleine Teams, nicht an Organisationen, die eine zentrale Suchinfrastruktur über viele Repositories hinweg benötigen.

Vektorindex plus ripgrep: die zwei Suchpfade

SeaGOAT betreibt zwei getrennte Mechanismen parallel. Der erste ist ein Vektorindex auf Basis von ChromaDB mit einem lokalen Embedding-Modell, das laut FAQ ChromaDBs Standardmodell ist. Der zweite ist ripgrep, der reguläre Ausdrücke und reine Textsuche abdeckt. Beide Ergebnisarten werden gemeinsam ausgegeben. Das erklärt, warum SeaGOAT reguläre Ausdrücke in natürlichsprachlichen Anfragen akzeptiert: Der Ausdruck "function calc_.* that deals with taxes" wird als Muster an ripgrep weitergereicht, während der beschreibende Rest über den Vektorindex läuft. Der Datenfluss bleibt vollständig auf dem Rechner. Es gibt keinen Aufruf an einen entfernten Dienst, und laut README funktioniert das Werkzeug auch ohne Internetverbindung. Telemetrie ist standardmäßig deaktiviert.

Warum ein Serverprozess nötig ist

Der auffälligste Architekturentscheid ist der Serverzwang. SeaGOAT lässt sich nicht als einzelnes Kommando aufrufen, das die Dateien bei jeder Anfrage neu einliest. Stattdessen startet man mit seagoat-server start /path/to/your/repo einen Prozess, der den Index hält und Anfragen beantwortet. Die FAQ begründet das offen: Embeddings und Vektordatenbank ließen sich derzeit nicht durch eine Architektur ersetzen, die Dateien im Vorbeigehen verarbeitet. Wer den Server beendet, beendet auch die Suchmöglichkeit. Für die Nutzung bedeutet das einen zusätzlichen Schritt im Arbeitsablauf, verglichen mit grep, das ohne Vorlauf auskommt. Der Vorteil ist die Antwortzeit nach dem ersten Indexaufbau.

Installation und erste Abfrage

Vorausgesetzt werden Python 3.11 oder neuer und ripgrep. bat ist optional, wird aber ausdrücklich empfohlen, weil es die Ergebnisausgabe farbig formatiert. Fehlt bat bei aktivierter Farbausgabe, greift SeaGOAT auf pygments zurück. Die Installation erfolgt über pipx install seagoat. Danach startet man den Server mit seagoat-server start /path/to/your/repo und sucht mit gt "Where are the numbers rounded" oder alternativ mit dem Befehl seagoat. Gestoppt wird der Prozess mit seagoat-server stop /path/to/your/repo. Konfiguriert wird über YAML, global oder pro Projekt in einer Datei .seagoat.yml. Das README zeigt als Beispiel den Schlüssel server.port mit dem Wert 31134. Wird SeaGOAT in einer Pipeline verwendet, wechselt die Ausgabe in ein grep-Zeilenformat.

Die fest verdrahtete Dateitypliste

SeaGOAT indiziert nicht alles. Die unterstützten Formate sind im Code fest hinterlegt und umfassen .txt, .md, .py, .c, .h, .cpp, .cc, .cxx, .hpp, .ts, .tsx, .js, .jsx, .html, .go, .java, .php und .rb. Wer in Rust, Kotlin, Swift, Scala oder einer Konfigurationssprache wie HCL arbeitet, findet diese Dateien nicht im semantischen Index. Das ist keine Einstellung, die man in .seagoat.yml umlegt, sondern eine Einschränkung der aktuellen Version. Binärdateien werden ignoriert, und UTF-8 ist die bevorzugte Kodierung, wobei laut README die meisten anderen Kodierungen ebenfalls funktionieren sollten. Für gemischte Repositories mit vielen Sprachen ist das ein relevantes Ausschlusskriterium.

Langsame Indizierung als bewusste Entscheidung

Die FAQ behandelt eine naheliegende Beobachtung direkt: SeaGOAT verarbeitet Dateien langsam und lastet die CPU kaum aus. Die Begründung im README ist, dass das Werkzeug den Rechner während der Verarbeitung nutzbar halten soll. Diese Drosselung betrifft laut Dokumentation nicht die Geschwindigkeit späterer Abfragen. Praktisch heißt das, dass ein großes Repository nach dem Start nicht sofort vollständig durchsuchbar ist. SeaGOAT erlaubt Abfragen während der Indizierung und zeigt dann einen Hinweis mit einer Einschätzung zur Ergebnisgenauigkeit. ripgrep-Treffer erscheinen dagegen von Anfang an. Wer nach dem Start sofort präzise semantische Ergebnisse braucht, muss den Abschluss der Verarbeitung abwarten.

Plattformlage und Wartungsaufwand

Die Plattformunterstützung ist ungleich. Linux gilt laut README als getestet, macOS als teilweise getestet, Windows als ungetestet, wobei für beide letzteren Plattformen in verlinkten Issues um Hilfe gebeten wird. Wer unter Windows oder macOS produktiv arbeiten will, trägt hier ein reales Risiko. Die Veröffentlichungsfrequenz ist hoch: Zwischen dem 9. und 14. Mai 2025 erschienen drei Patch-Versionen (v0.54.15 bis v0.54.17). Das deutet auf aktive Pflege hin, bedeutet aber auch, dass sich Details zwischen Versionen ändern können. SeaGOAT steht unter der MIT-Lizenz, einer permissiven Lizenz, die kommerzielle Nutzung und Modifikation erlaubt. Das README weist selbst darauf hin, dass die FAQ-Aussagen keine rechtliche Zusage sind und man den Quelltext prüfen sollte, wenn man Unsicherheiten bei Datenschutz oder Sicherheit hat. Eine verbindliche rechtliche Bewertung kann dieser Artikel nicht liefern.

Alternative: ripgrep allein

Die naheliegende Alternative ist ripgrep ohne SeaGOAT. Der Unterschied liegt im Suchmodell: ripgrep vergleicht Zeichenketten und reguläre Ausdrücke, SeaGOAT ergänzt einen Vergleich über Bedeutungsnähe. Für bekannte Bezeichner, Dateinamen oder Muster ist ripgrep schneller, weil kein Index aufgebaut und kein Server betrieben werden muss. SeaGOAT gewinnt dort, wo der Suchbegriff unbekannt ist und die Beschreibung das einzige ist, was man hat. Interessant ist, dass SeaGOAT ripgrep ohnehin im Hintergrund einsetzt, die beiden Werkzeuge also nicht konkurrieren, sondern sich ergänzen. Wer bereits eine gut funktionierende grep-basierte Suche mit vertrauten Mustern hat, wird durch SeaGOAT keinen grundlegenden Wechsel erleben, sondern eine zusätzliche Abfrageform.

Redaktionelles Fazit

SeaGOAT passt zu Entwicklerinnen und Entwicklern, die eine überschaubare Codebasis in einer der dreizehn unterstützten Dateiendungen durchsuchen und dabei keine Daten an fremde APIs geben wollen. Wer ausschließlich grep-Geschwindigkeit braucht oder in einer Sprache arbeitet, die nicht in der fest verdrahteten Liste steht, sollte zuerst prüfen, ob ein reiner Textsuchlauf nicht ausreicht. Vor dem produktiven Einsatz lohnt ein Test mit der eigenen Repository-Größe: Der Server muss dauerhaft laufen, und die Indizierung erfolgt absichtlich im Hintergrund mit niedriger Priorität.

Offizielle Quellen

  1. kantord/SeaGOAT on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
Community-Notizen

Community-Notizen