AutoCua
macOS·Windows·Linux·브라우저·iOS·Android용 컴퓨터 사용 에이전트(CUA)로 자동화
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기NotebookLM-Klon: Fragen an eigene Quellen, Antworten mit klickbaren Belegen. Next.js, Supabase, OpenAI.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Faden ist eine Web-App nach dem Vorbild von NotebookLM. Du lädst Quellen hoch (PDF, Webseite, Text) und stellst Fragen. Faden antwortet nur aus diesen Quellen. Jede Aussage hat einen Beleg wie [1]. Ein Klick auf den Beleg zeigt die markierte Stelle in der Quelle. Live: · Demo-Zugang mit fertigem Notebook „Bauhaus“ auf Anfrage (es gibt keine offene Registrierung).README 전문 보기 ↗
Faden ist eine Web-App nach dem Vorbild von NotebookLM. Du lädst Quellen hoch (PDF, Webseite, Text) und stellst Fragen.
Faden antwortet nur aus diesen Quellen. Jede Aussage hat einen Beleg wie [1]. Ein Klick auf den Beleg zeigt die markierte Stelle in der Quelle.
Live: https://faden-one.vercel.app · Demo-Zugang mit fertigem Notebook „Bauhaus“ auf Anfrage (es gibt keine offene Registrierung).
[1], [2] sind klickbar. Die Beleg-Ansicht zeigt den Text der Quelle mit der markierten Stelle, bei PDFs auf der richtigen Seite.flowchart LR
B[Browser] -->|Seiten, Server Actions, /api/chat| N[Next.js auf Vercel<br/>Region fra1]
B -->|PDF direkt per signierter URL| S[(Supabase Storage)]
N -->|SQL mit RLS| P[(Supabase Postgres<br/>+ pgvector)]
N --> S
N -->|Embeddings, Chat, Skripte| O[OpenAI]
N -->|Sprache| E[ElevenLabs]
N -->|Rate Limit| U[(Upstash Redis)]
Alles mit Daten liegt in Frankfurt: Vercel-Region fra1, Supabase eu-central-1.
after(): Text extrahieren (unpdf für PDF, Readability für Webseiten) → in Abschnitte teilen → Embeddings in Bündeln von 100 berechnen → in chunks speichern, mit Seite und Position.cl100k_base, demselben Tokenizer wie text-embedding-3-small.sources. Die Oberfläche fragt ihn regelmäßig ab./api/chat)text-embedding-3-small, 1.536 Dimensionen).match_chunks): Vektorsuche (Kosinus, <=>) und Volltextsuche (websearch_to_tsquery('german', …)), je Top 20. Beide Listen führt Reciprocal Rank Fusion (k = 60) zu den besten 8 zusammen.<quelle nr="1"> bis <quelle nr="8">. Der Text der Quellen ist Daten, keine Anweisung.Abschnitte aus allen ausgewählten Quellen wählen (höchstens 16, gleichmäßig verteilt) → Skript mit Belegen schreiben (20 bis 24 Redebeiträge) → jeden Redebeitrag einzeln vertonen (ElevenLabs eleven_v3, 3 Aufrufe gleichzeitig) → die MP3-Frames zu einer Datei zusammenfügen → in Storage speichern. Dauer: ca. 40–60 s für 3–4 Minuten Audio.
| Entscheidung | Warum | Alternative |
|---|---|---|
| Upload direkt in Storage | Vercel begrenzt den Request auf ca. 4,5 MB. PDFs dürfen 20 MB groß sein. | Upload über die API-Route, mit kleinem Größenlimit |
Hintergrund mit after() | Einfach, keine weitere Infrastruktur. Reicht für Einlesen (Sekunden) und Podcast (ca. 1 Min.). | Echte Warteschlange (siehe „Nächste Schritte“) |
| Suche in einer SQL-Funktion | Eine Abfrage statt zwei. RRF direkt in Postgres. Läuft als security invoker, also gilt RLS. | Zwei Abfragen und RRF in TypeScript |
| Volltextsuche mit ODER | websearch_to_tsquery verbindet alle Wörter mit UND. Bei echten Fragen („Wann ist …“) fand sie deshalb fast nie etwas. | Nur Vektorsuche |
| Belege serverseitig prüfen | Das Modell kann [9] schreiben, obwohl es nur 8 Abschnitte gab. Solche Nummern fallen weg. | Dem Modell vertrauen |
| Ein Modell an einer Stelle | src/lib/ai/models.ts. Chat mit gpt-6-luna (Reasoning „low“, schnelle erste Wörter), Studio mit „medium“. | Modellnamen verteilt im Code |
| ElevenLabs für die Stimmen | Deutsche Muttersprachler-Stimmen und Audio-Tags wie [laughs]. | OpenAI TTS (amerikanischer Akzent im Deutschen) |
| Echte APIs im E2E-Test | Mocks würden Suche, Streaming und Belegprüfung überspringen. Ein Lauf kostet ca. 0,001 $. | Gemockte API-Antworten |
Mehr Details, Fehler und echte Messwerte stehen in NOTIZEN.md.
(select auth.uid()). Die Rolle anon hat gar keine Rechte auf die Tabellen.src/lib/supabase/admin.ts mit server-only). Er steht nie im Client und nie im Repo.<quelle>-Blöcken. Ein </quelle> im Text wird unschädlich gemacht. Die Regeln sagen dem Modell, dass Quellen Daten sind.dangerouslySetInnerHTML.| Was | Womit | Umfang |
|---|---|---|
| Kernlogik | Vitest (src/**/*.test.ts) | 193 Tests in 20 Dateien: Abschnitte, Belege, Prompt, PDF-Erkennung, Lesetext, URL-Schutz, Podcast-Skript, MP3-Zusammenfügen, Karteikarten, Status |
| Ganze App im Browser | Playwright (e2e/) | 6 Tests, siehe unten |
| Datenbank | SQL-Skripte (supabase/checks/) | RLS mit zwei Testnutzern, hybride Suche. Beide enden mit rollback. |
Die Playwright-Tests laufen gegen den lokalen Server mit echten Diensten:
/api/chat antwortet ohne Login mit 401.npm test # Vitest, unter 1 s
npm run e2e # Playwright, ca. 30 s
npm run e2e braucht einen Testnutzer in Supabase und dessen Zugangsdaten in .env.local (siehe .env.example). Die Test-PDFs entstehen im Speicher (src/test/make-pdf.ts). Jeder Test räumt seine Daten selbst wieder auf.
Voraussetzung: Node 24 (siehe .nvmrc) und ein Supabase-Projekt mit den Migrationen aus supabase/migrations/.
nvm use
npm install
cp .env.example .env.local # Werte eintragen
npm run dev
Dann http://localhost:3000 öffnen.
| Variable | Wofür |
|---|---|
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Supabase im Browser und auf dem Server |
SUPABASE_SECRET_KEY | Nur Server: Hintergrund-Jobs und E2E-Prüfungen |
OPENAI_API_KEY | Embeddings, Chat, Podcast-Skript, Karteikarten |
ELEVENLABS_API_KEY | Stimmen für den Podcast |
UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN | Rate Limits |
TEST_USER_EMAIL, TEST_USER_PASSWORD | Testnutzer für Playwright, nie ein echtes Konto |
| Befehl | Was er tut |
|---|---|
npm run dev | Entwicklungsserver starten |
npm run build | Produktions-Build erstellen |
npm run lint | ESLint ausführen |
npm run typecheck | Routen-Typen erzeugen und TypeScript prüfen |
npm test | Unit-Tests mit Vitest |
npm run e2e | End-to-End-Tests mit Playwright (braucht den Testnutzer und SUPABASE_SECRET_KEY in .env.local, startet den Dev-Server bei Bedarf selbst) |
npm run db:types | TypeScript-Typen aus dem Datenbankschema neu erzeugen (braucht supabase login). Achtung: Schlägt der Befehl fehl, ist die Typdatei trotzdem leer. Dann git checkout src/lib/supabase/database.types.ts |
src/
app/
api/chat/ Chat: Suche, Prompt, Streaming, Belege
api/sources/[id]/text/ Text einer Quelle für die Beleg-Ansicht
login/ Anmeldung
notebooks/ Übersicht, Notebook mit drei Spalten, Studio-Seiten
lib/
ai/ Modelle (eine Stelle) und Quellen-Blöcke für Prompts
chat/ Suche, Prompt, Belege, Nachrichten
ingest/ PDF, Webseite, Abschnitte, Embeddings, Verarbeitung
studio/ Podcast, Karteikarten, MP3
supabase/ Clients für Browser, Server und Admin, Typen
e2e/ Playwright-Tests
supabase/migrations/ Das komplette Schema als SQL
supabase/checks/ SQL-Prüfungen für RLS und Suche
docs/erklaerungen/ Eine Erklärseite pro Bauschritt
docs/screenshots/ Bilder für dieses README
after() für Einlesen und Studio, mit Wiederholung bei Fehlern.docs/erklaerungen/: eine interaktive Erklärseite zu jedem Bauschritt (im Browser öffnen).NOTIZEN.md: Fehler, falsche Annahmen, Entscheidungen und echte Messwerte während der Entwicklung.