ProjekteQuellen-Chat
Quellen-Chat nach dem Vorbild von NotebookLM
Eigene Quellen hochladen, sie im Chat befragen und jede Aussage der Antwort bis zu der Textstelle zurückverfolgen, aus der sie stammt.
Demo-Zugang: demo@notebook.local
Passwort demo-citations-2026

Eckdaten
Stand
- Tests
- 102 in 15 Spec-Dateien, davon 11 gegen eine echte Datenbank
- Demo
- ohne Registrierung, schreibgeschütztes Konto
- Verfügbarkeit der letzten 30 Tage
- 100,00 %
Jede Aussage hat eine Quelle
Die Antworten stützen sich nur auf die Quellen, die im Notebook liegen. Jede Aussage bekommt ein nummeriertes Zitat, und ein Klick darauf führt zu der Passage, aus der sie stammt.
So lässt sich eine Antwort nachprüfen, statt ihr einfach glauben zu müssen.
Von der Quelle zur Antwort
- Quelle als PDF, DOCX, Website oder Text hinzufügen
- Index macht die Quelle durchsuchbar
- Frage im Chat stellen
- Antwort kommt mit nummerierten Zitaten
- Klick auf eine Nummer öffnet die Passage

Suche in Postgres
Beim Hochladen wird der Text einer Quelle in Abschnitte von höchstens 3000 Zeichen zerlegt, die sich um bis zu 450 Zeichen überlappen. Jeder Abschnitt liegt mit seinem Vektor aus 768 Dimensionen und einem Volltextindex in derselben Tabelle.
Eine Frage sucht auf beiden Wegen: nach den Wörtern im Volltext, deutsch und englisch, und nach ähnlicher Bedeutung über den Vektor. Beide Ranglisten werden per Reciprocal Rank Fusion mit k = 60 zusammengeführt. Es zählt nur der Platz in jeder Liste, keine von Hand gewählte Gewichtung, und wer in beiden Listen auftaucht, rückt nach oben.
Das Modell bekommt die acht besten Abschnitte nummeriert und belegt jede Aussage mit einer Nummer. Nummern ohne passenden Abschnitt fallen weg, die übrigen werden neu durchgezählt und führen im Chat zur Textstelle.
Auszüge aus dem echten Code, gekürzt.
Echter Code aus dem Quellen-Chat
apps/api/src/sources/chunker.ts
const MAX_CHARS = 3000;const OVERLAP_CHARS = 450;const MIN_CHARS = 120;export function chunk(text: string): Chunk[] { const blocks = paragraphs(text); if (blocks.length === 0) return []; …
supabase/migrations/20260804090000_init.sql
create table chunks ( … lang regconfig not null default 'german', fts tsvector generated always as (to_tsvector(lang, content)) stored, embedding vector(768));create index on chunks using hnsw (embedding vector_cosine_ops);
supabase/migrations/20260804090100_match_chunks.sql
k constant int := 60;…select … (coalesce(1.0 / (k + v.rank), 0) + coalesce(1.0 / (k + w.rank), 0))::float as score…left join vec v on v.id = candidates.idleft join kw w on w.id = candidates.id
apps/api/src/chat/citations.ts
const citations: Citation[] = [...renumbered.entries()] .map(([original, n]) => { const block = blocks[original - 1]; return { n, chunkId: block.chunkId, … charStart: block.charStart,
Studio
Aus denselben Quellen erzeugt das Studio weitere Formate. Es steht rechts neben dem Chat.
- Briefing
- FAQ
- Study guide
- Mind map
- Audioüberblick als Gespräch zweier Stimmen
- Notizen aus Antworten im Chat speichern

Technik
- Frontend
- Next.js
- Backend
- NestJS
- Daten
- Supabase mit PostgreSQL und pgvector
- Suche
- Vektor und Volltext, zusammengeführt per Reciprocal Rank Fusion
- Zugriff
- Row Level Security, Anfragen laufen mit dem Token des Nutzers
- Betrieb
- eigener Server, Supabase selbst gehostet, Caddy davor
Ausprobieren
- Live notebook.dmn-software.com
-
Mail
demo@notebook.local -
Passwort
demo-citations-2026
Das Konto ist schreibgeschützt. Chat und Studio sind auf wenige Anfragen pro Stunde begrenzt.