CasaDePrompt

Dein privates Zuhause für gute Prompts. Ein Python-Prozess, eine SQLite-Datei, ein Container. Kein PostgreSQL, Redis oder externer Suchdienst. Dunkle, responsive Weboberfläche ohne CDN oder Build-Schritt.

Eine optionale Sammlung mit sechs Beispielen liegt in beispiel-prompts.json und lässt sich über die Einstellungen importieren. Neue Installationen starten leer.

Was drin ist

  • Prompt-Bibliothek mit Kategorien, Tags, Favoriten, Papierkorb und Duplikaten.
  • Versionierung des vollständigen Prompts, Versionsvorschau und Wiederherstellung als neue Version. Gleichzeitige Änderungen werden erkannt.
  • Textsuche und Bedeutungssuche mit Embeddings. „Auto“ kombiniert beide; ähnliche Ergebnisse sind Vorschläge, keine garantierten Treffer.
  • OpenAI-kompatible API-Basis-URL, optionaler API-Key, Modellscan über /models, getrennte Chat- und Embedding-Modelle. Optional separater Embedding-Endpoint.
  • KI-Vorschläge für Kategorie, Tags und Kurzbeschreibung; vor dem Speichern manuell übernehmen.
  • Zweiter Modellaufruf prüft die Bedeutungstreue. Bei Abweichungen folgen höchstens eine Korrektur und eine erneute Prüfung (2–4 Aufrufe). Befunde und Fehler erscheinen am Entwurf; Modellprüfung ist keine Garantie. Manuelle Änderungen am Vorschlag setzen den Prüfstatus zurück.
  • KI-Überarbeitung als bearbeitbarer Vorschlag neben dem Original. Erst Übernehmen und Speichern ändert den Prompt.
  • Privater MCP-Server über Streamable HTTP, nur lesend: search_prompts, get_prompt, list_categories, get_prompt_versions.
  • JSON-Export und Import inklusive Versionen, ohne Modell-API-Keys.
  • Zugangsschlüssel für die Weboberfläche, separater MCP-Schlüssel. Keine Registrierung, keine öffentlichen Profile, keine Telemetrie.

Unraid: normaler Python-Alpine-Container

1. Dateien auf dem NAS ablegen

/mnt/user/appdata/CasaDePrompt/
├── bootstrap/
│   └── Startpunkt.sh
└── data/                  # wird dauerhaft gespeichert

Startpunkt.sh aus diesem Repository nach bootstrap/ kopieren. Der Download erfolgt ausschließlich über HTTPS aus dem öffentlich lesbaren Repository. Keine SSH-Keys oder anderen Git-Zugangsdaten mounten oder kopieren.

2. Unraid-Vorlage einspielen

unraid/CasaDePrompt.xml nach

/boot/config/plugins/dockerMan/templates-user/my-CasaDePrompt.xml

kopieren. In Docker → Container hinzufügen → Vorlage CasaDePrompt auswählen. Falls die Auswahl noch nicht aktualisiert ist, die Seite neu laden.

Vorbelegt sind:

Einstellung Wert
Image python:3.13-alpine
Netzwerk bridge (normales Unraid-Netz über Portfreigabe)
Web-Port Host 8765 → Container 8000
Repository https://git.casaderoll.de/michael/CasaDePrompt.git
Branch main
Startbefehl / Post Arguments /bin/sh /bootstrap/Startpunkt.sh
App-Benutzer 99:100

Beim Start installiert das Skript Git und Python-Pakete, lädt den gewählten Branch bzw. Tag und startet die Anwendung ohne root-Rechte. Dafür benötigt es Zugriff auf dein Git, Alpine-Paketserver und PyPI. Ein Neustart lädt den aktuellen Stand erneut. Bei Download-/Installationsfehlern stoppt es mit einer Meldung, statt eine halb installierte App zu starten. Für reproduzierbare Updates einen Release-Tag in APP_REF verwenden.

3. Anmelden

Öffnen: http://UNRAID-IP:8765

Den automatisch erzeugten Zugangsschlüssel in der Unraid-Konsole auslesen:

docker exec CasaDePrompt cat /data/admin-token

In der Anmeldemaske eingeben. Der Browser erhält ein HttpOnly-Sitzungscookie (24 Stunden). Der Schlüssel wird nicht im Browser-LocalStorage gespeichert. Sitzungen enden auch bei einem Serverneustart.

4. Modelle verbinden

Unter Einstellungen beispielsweise http://192.168.1.20:1234/v1 eintragen. Aus dem Container bedeutet localhost der Container selbst; für einen anderen Server dessen LAN-IP verwenden.

Optional API-Key eingeben → Modelle scannen → Modell-ID auswählen. Alternativ direkt eintippen. Der Scan speichert zunächst die Verbindungsfelder. Leere Schlüssel-Felder behalten gespeicherte Keys; zum Löschen gibt es eine eigene Checkbox.

  • Chatmodell: für „Mit KI verfeinern“, verwendet /chat/completions.
  • Embedding-Modell: für Bedeutungssuche, verwendet /embeddings. Ein Chatmodell kann diese Aufgabe nicht automatisch ersetzen.

Danach Index ergänzen. Neue/geänderte Prompts werden beim Speichern indexiert. Bei einem Fehler bleibt der Prompt gespeichert und die Oberfläche zeigt einen Hinweis. Nach Wechsel von Embedding-Modell oder URL sind alte Vektoren nicht mehr gültig. Wenn hinter derselben Modell-ID ein anderes Modell läuft, Komplett neu aufbauen wählen.

Ohne Embeddings funktioniert die Textsuche. Es gibt keine versteckte Behauptung von Bedeutungssuche: Der verwendete Suchmodus und Fehler werden angezeigt. Die Embedding-Suche erfolgt im Python-Prozess, die Vektoren liegen in SQLite; gedacht für ein persönliches Archiv, nicht Millionen Dokumente.

MCP / OpenClaw

Einstellungen → MCP → Verbindungsdaten anzeigen liefert URL und separaten Bearer-Token.

Transport: Streamable HTTP
URL: http://UNRAID-IP:8765/mcp/
Header: Authorization: Bearer DEIN_MCP_TOKEN

Diese Angaben in einem MCP-fähigen Client bzw. dessen MCP-Bridge eintragen. Die konkrete OpenClaw-Konfiguration hängt von dessen installierter Version und MCP-Anbindung ab; das angezeigte JSON beschreibt die Verbindung und ist keine zugesicherte OpenClaw-Konfigurationsdatei.

Beispielauftrag: „Suche in CasaDePrompt nach einem Prompt, um einem Kunden höflich abzusagen.“

search_prompts akzeptiert query, limit und mode (auto, text, semantic). Ergebnisse enthalten Titel, vollständigen Prompt, Kategorie, Tags, Version und gegebenenfalls Ähnlichkeit sowie Suchhinweise. get_prompt kann gezielt eine frühere Version abrufen. Papierkorb-Inhalte werden nicht über MCP ausgegeben. MCP darf keine Prompts ändern und verwendet weder deinen Web-Zugangsschlüssel noch deinen Modell-API-Key.

Alternative: fest gebautes Image

docker compose up -d --build
docker compose exec casadeprompt cat /data/admin-token

Das beiliegende Dockerfile nutzt ebenfalls python:3.13-alpine; der App-Code wird beim Build eingebaut. Es braucht beim Start keinen Git-Key und keine Paketdownloads. Daten liegen in einem Docker-Volume. Dieser Weg ist unabhängig vom gewünschten Unraid-Bootstrap nutzbar.

Lokal entwickeln

Python 3.13 oder neuer:

python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
DATA_DIR=./data uvicorn atelier.app:create_app --factory --host 127.0.0.1 --port 8765

Tests:

pip install pytest
python -m pytest tests -q

Der interne Python-Paketname atelier ist nur ein Implementierungsdetail.

Daten, Backup und Betrieb

  • /data/atelier.sqlite3: Prompts, Versionen und Vektoren.
  • /data/settings.json: Endpoint-Einstellungen und API-Keys. Nur serverseitig; in Exporten nicht enthalten.
  • /data/admin-token, /data/mcp-token: Zugangsschlüssel.
  • Gesamten Datenordner bei gestopptem Container sichern; bei laufender SQLite-WAL-Datenbank nicht nur die Hauptdatei kopieren. JSON-Export ist jederzeit für Prompts/Versionen nutzbar.
  • Import legt neue IDs an, erhält Versionen, löscht nichts. Danach Index ergänzen.
  • API-Keys sind durch Dateirechte geschützt, nicht separat verschlüsselt. Wer Host-/Root-Zugriff hat, kann sie lesen.
  • Für Zugriff außerhalb eines vertrauenswürdigen LANs HTTPS über einen Reverse Proxy nutzen. Bei HTTPS COOKIE_SECURE=1 setzen. Keine CORS-Freigabe; Weboberfläche und API verwenden denselben Origin.
  • Ein uvicorn-Prozess; keine zusätzlichen Worker verwenden, da Sitzungen im Arbeitsspeicher liegen.
  • GET /health ist ein öffentlicher einfacher Healthcheck.
  • Schlüssel rotieren: Container stoppen, entsprechende Token-Datei löschen, starten. Bestehende Clients müssen den neuen Schlüssel erhalten. Alternativ ADMIN_TOKEN/MCP_TOKEN als Umgebungsvariablen setzen; dann gelten diese statt der Dateien.

Stand und Grenzen

Erste eigenständige Version. Die KI-Überarbeitung ist absichtlich ein manueller Entwurf; ein grafischer Wort-für-Wort-Diff ist noch nicht enthalten. Versionsvorschau und Wiederherstellung sind vorhanden. Die Tests nutzen einen simulierten OpenAI-kompatiblen Modellserver; ein konkretes lokales Modell muss beim Einrichten noch geprüft werden. Docker/Unraid wird über die beiliegenden Dateien vorbereitet, ein echter Container-Test muss auf einer Maschine mit Docker erfolgen.

KI-Selbstprüfung und Diagnose

Die Prüfung stammt vom selben Modell und ist keine unabhängige Verifikation. Historische Befunde zum ersten Entwurf sind getrennt von Befunden zum aktuellen Vorschlag. Bei Fehlern bleibt der Entwurf erhalten; die Meldung benennt den fehlgeschlagenen Schritt und eine Diagnose-ID. „Aktuellen Vorschlag erneut prüfen“ führt genau einen Prüfanruf ohne automatische Textänderung aus.

Zusätzlich vergleicht Code erkennbare {{Platzhalter}}, explizite Portangaben und Pfadmuster. Unterschiede sind Hinweise, keine sicheren Fehler: Auch gewünschte Änderungen können markiert werden; nicht jedes mögliche Pfadformat wird erkannt. Ein Bearbeiten der Vergleichstexte setzt die Anzeige auf ungeprüft zurück.

Containerlogs enthalten für Modellaufrufe ausschließlich Diagnose-ID, Verarbeitungsschritt, Dauer, HTTP-Status und Fehlerklasse. Prompt-/Antwortinhalte, API-Keys und Endpoint-URLs werden nicht durch diese Diagnose protokolliert. Drittanbieter-HTTP-Info-Logs sind deaktiviert. Der bisherige 90-Sekunden-Timeout bleibt unverändert.

S
Description
No description provided
Readme
1.4 MiB
Languages
Python 82.2%
HTML 14.7%
Shell 2.3%
Dockerfile 0.8%