# LinkVault KI-gestützte Link-Sammlung: Links einfügen → automatisch laden, **zusammenfassen**, in **Kategorien / Hersteller** einsortieren und schnell **wiederfinden**. ## Funktionen - 🔗 **Link hinzufügen** – Seite wird geladen und der Textinhalt extrahiert. - 🤖 **Automatische KI-Analyse** (OpenAI) – Titel, Zusammenfassung, Kategorie, Hersteller/Quelle und Tags werden erzeugt. Bestehende Kategorien werden wiederverwendet, damit die Sammlung konsistent bleibt. - 🗂️ **Filtern** nach Kategorie und Hersteller über die Seitenleiste. - 🔍 **Suche** – klassische Textsuche und optionale **semantische KI-Suche** (findet auch sinnverwandte Treffer via Embeddings). - 👥 **Mehrbenutzer** – Registrierung/Login, jeder Nutzer sieht nur seine Links. ## Technik - **Backend:** FastAPI (Python) - **Frontend:** HTML + HTMX (kein Node.js nötig) - **Datenbank:** SQLite (Standard, konfigurierbar über `DATABASE_URL`) - **KI:** OpenAI (`gpt-4o-mini` + `text-embedding-3-small`, konfigurierbar) ## Schnellstart ```bash ./run.sh ``` Das Skript legt eine virtuelle Umgebung an, installiert die Abhängigkeiten, erstellt bei Bedarf eine `.env` und startet den Server auf http://127.0.0.1:8000. Danach in `.env` den `OPENAI_API_KEY` eintragen und den Server neu starten. > Ohne API-Key läuft die App trotzdem – Links werden dann nur ohne KI-Analyse > gespeichert (Kategorie „Sonstiges", keine Zusammenfassung/semantische Suche). ### Manuell ```bash python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt cp .env.example .env # OPENAI_API_KEY eintragen uvicorn app.main:app --reload --port 8000 ``` ## Projektstruktur ``` app/ main.py FastAPI-App, Routen, Auth-Sessions config.py Konfiguration aus .env database.py SQLAlchemy Engine/Session models.py User- und Link-Modelle security.py Passwort-Hashing (bcrypt) scraper.py Seiteninhalt laden & extrahieren ai.py OpenAI: Kategorisierung, Zusammenfassung, Embeddings search.py Semantische Suche (Kosinus-Ähnlichkeit) templates/ Jinja2 + HTMX Oberfläche ``` ## Hinweise für den Produktivbetrieb - Einen zufälligen `SECRET_KEY` in `.env` setzen. - Hinter einem HTTPS-Reverse-Proxy betreiben (Session-Cookies). - Für mehr Last statt SQLite z.B. PostgreSQL via `DATABASE_URL` verwenden.