first commit

This commit is contained in:
Erik Thiele
2026-07-13 22:02:55 +02:00
commit ff8c9f5141

68
README.md Normal file
View File

@@ -0,0 +1,68 @@
# 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.