# BookmarkBrain ## Was ist das? Lokaler semantischer Bookmark-Manager fuer 591+ chaotische Browser-Bookmarks. Suche per natuerlicher Sprache ("der Bash-Cheatsheet von neulich"), auto-Tagging, und Browser-Extension — alles ohne Cloud, ohne Accounts. ## Architektur & Tech-Stack ``` Browser Extension (WXT, Chrome+Firefox) | HTTP localhost:7471 FastAPI Backend (backend/main.py) | ├── database.py ← SQLite + FTS5 + sqlite-vec (alles 1 Datei) ├── models.py ← Pydantic-Modelle ├── search.py ← FEHLT (noch nicht implementiert) ├── embeddings.py ← FEHLT ├── importer.py ← FEHLT └── tagger.py ← FEHLT ``` | Schicht | Tech | |---------|------| | Backend | FastAPI + SQLite | | Vektor-Suche | sqlite-vec (Extension) + FTS5 | | Embeddings | paraphrase-multilingual-MiniLM-L12-v2 (384 dims, DE+EN) | | Frontend | htmx + Jinja2 | | Browser Extension | WXT Framework (TypeScript) | | Build | uv (Python), pnpm (Extension) | **DB-Schema (in database.py implementiert):** - `bookmarks` — url, title, description, context, folder_path, domain, auto_tags, user_tags, embedding_text - `bookmarks_fts` — FTS5 virtual table - `vec_bookmarks` — sqlite-vec virtual table fuer 384-dim Embeddings **Hybrid-Suche (geplant):** 0.7 * semantic + 0.3 * FTS5-normalized ## Starten / Nutzen ```bash cd ~/Projekte/BookmarkBrain uv venv && source .venv/bin/activate uv pip install -e . uvicorn backend.main:app --reload --port 7471 # → http://localhost:7471 ``` Extension (separat): ```bash cd extension && pnpm install && pnpm dev ``` ## Was funktioniert - **database.py** — Schema komplett implementiert: bookmarks-Tabelle, FTS5 virtual table, sqlite-vec virtual table, Indizes - **models.py** — Pydantic-Modelle fuer Request/Response - **backend/main.py** — FastAPI-App mit Routes (genauen Stand pruefen) - **PLAN.md** — detaillierter Architektur- und Feature-Plan vorhanden - **pyproject.toml** — Projekt-Config mit uv ## Was fehlt - **search.py** — nicht vorhanden (semantische + FTS-Suche) - **embeddings.py** — nicht vorhanden (Model-Loading, Embedding-Generierung) - **importer.py** — nicht vorhanden (Netscape HTML + JSON Import) - **tagger.py** — nicht vorhanden (Auto-Tagging via TF-IDF + Domain-Rules) - **Browser Extension** — Grundstruktur im extension/-Ordner, ob kompilierbar unklar - **Templates** — ob UI-Templates vollstaendig sind, ungeprueft - **Tests** — test_importer.py, test_search.py, test_tagger.py fehlen noch ## Entscheidungen & Lessons Learned - **sqlite-vec statt ChromaDB/FAISS** — Single File, SQL + Vektor kombinierbar, zero dependencies. Richtige Wahl fuer <2000 Bookmarks. - **paraphrase-multilingual-MiniLM-L12-v2** — 384 dims, DE+EN nativ, 450 MB, CPU-tauglich, ONNX-Beschleunigung moeglich - **Localhost HTTP statt Native Messaging** — einfacher, Chrome+Firefox identisch, CORS reicht - **"Was wollte ich damit?"** als First-Class-Feature (context-Feld) — Alleinstellungsmerkmal vs. Raindrop/Linkding/Hoarder - **Port 7471** — Mnemonic: "BRAIN" auf Telefon-Tastatur ## Next Steps (priorisiert) 1. **importer.py** — Netscape HTML Parser fuer bestehende Bookmarks (sofortiger Wert) 2. **embeddings.py** — Model laden, Batch-Embedding bei Import 3. **search.py** — Hybrid-Suche implementieren 4. **tagger.py** — Domain-basierte Tags + TF-IDF 5. **UI-Templates** vervollstaendigen 6. **E2E-Test**: Import aus ~/Downloads/bookmarks_05.03.26.html, dann Suche 7. Browser-Extension nach Phase-1 fertigstellen