82 lines
4.8 KiB
Markdown
82 lines
4.8 KiB
Markdown
# HamHam
|
|
|
|
**Dein persönliches Kochbuch. Selbst gehostet. Für die echte Küche.**
|
|
|
|
Eine deutschsprachige Rezeptplattform mit öffentlicher Sammlung, geschützter Verwaltung, präziser Mengenberechnung und einem geführten Kochmodus. Alle Daten, Bilder und Schriften bleiben auf deinem Server. Favoriten, Einkaufslisten, Editorentwürfe und Kochfortschritt werden im jeweiligen Browser gespeichert.
|
|
|
|
## Start mit Docker
|
|
|
|
```sh
|
|
cp .env.example .env
|
|
# POSTGRES_PASSWORD durch einen zufälligen URL-sicheren Wert ersetzen.
|
|
# APP_ORIGIN auf die tatsächlich verwendete Adresse setzen.
|
|
docker compose up -d --build
|
|
docker compose exec app npm run admin:create -- deinname
|
|
```
|
|
|
|
Das CLI fragt das Passwort verborgen ab (mindestens 12 Zeichen). Es gibt **keine Standardzugangsdaten**. Anschließend `http://localhost:3000/admin` öffnen. Der erste Start legt eine leere Sammlung an; Rezepte werden nicht automatisch veröffentlicht.
|
|
|
|
Für HTTPS: `APP_ORIGIN=https://kochen.example.org` und `COOKIE_SECURE=true`. Details zu Proxy, Backup, Restore und Updates: [Deployment](docs/DEPLOYMENT.md).
|
|
|
|
## Funktionen
|
|
|
|
- Öffentliche Rezeptbibliothek mit Zutaten-/Titelsuche, Kategorien, Tags, Zeit- und Schwierigkeitsfiltern sowie teilbaren URLs.
|
|
- Rezepteditor mit strukturierten Zutaten, Abschnitten, optionalen Mengen, sortierbaren Schritten, Zutatenreferenzen, mehreren Timern, lokaler Entwurfssicherung und Live-Vorschau.
|
|
- Veröffentlichung mit serverseitiger Autorisierung und optimistischer Versionskontrolle gegen gleichzeitiges Überschreiben.
|
|
- Mengenberechnung mit `decimal.js`: Portionen oder vorhandene Zutatenmenge als Ausgangspunkt, kompatible Einheiten, keine kumulative Rundung.
|
|
- Kochmodus mit großen Bedienelementen, Zutaten zum Abhaken, persistenten Zeitstempel-Timern, Wake Lock, optionalem Signalton und Abschlussansicht.
|
|
- JSON/XML-Import mit Vorschau, Duplikaterkennung, atomarer Übernahme; Einzel- und Gesamtexport.
|
|
- Lokale Bilder inklusive Re-Encoding, Einkaufsliste mit Mengenzusammenführung, Favoriten und Drucklayout.
|
|
- Helles/dunkles Design, lokale Schriftdateien, installierbare PWA und ehrliches Offline-Fallback.
|
|
- Argon2id, zufällige serverseitige Sessions, HTTP-only-Cookies, Origin-CSRF-Prüfung, persistente Loginlimits und Sicherheitsheader.
|
|
|
|
## Rezepte mit ChatGPT erstellen
|
|
|
|
1. [Wiederverwendbaren Prompt](docs/CHATGPT-PROMPT.md) und [JSON Schema](public/examples/hamham.schema.json) an ChatGPT geben.
|
|
2. Gewünschtes Rezept beschreiben.
|
|
3. Ergebnis als JSON speichern oder kopieren.
|
|
4. Unter **Administration → Importieren** Vorschau prüfen und anschließend übernehmen.
|
|
|
|
Vollständige Beispiele: [Pljeskavica JSON](public/examples/pljeskavica.json), [Pljeskavica XML](public/examples/pljeskavica.xml), [drei Kochbuchrezepte](public/examples/kochbuch.json). Letztere enthalten lokale Bilder und sind ausdrücklich zum optionalen Import gedacht.
|
|
|
|
Format, Mengenreferenzen und XML-Struktur: [Importanleitung](docs/IMPORT.md).
|
|
|
|
## Entwicklung und Prüfung
|
|
|
|
Node.js 24 und PostgreSQL 17:
|
|
|
|
```sh
|
|
npm ci
|
|
cp .env.example .env
|
|
# DATABASE_URL und APP_ORIGIN eintragen
|
|
npm run db:migrate
|
|
npm run admin:create -- deinname
|
|
npm run dev
|
|
```
|
|
|
|
```sh
|
|
npm run typecheck
|
|
npm test
|
|
npm run build
|
|
npx playwright install chromium
|
|
createdb hamham_test
|
|
TEST_DATABASE_URL=postgres://localhost/hamham_test npm run test:e2e
|
|
npm run test:docker
|
|
```
|
|
|
|
Die E2E-Suite verwendet einen Produktionsserver auf Port 3100 und leert ausschließlich die ausdrücklich konfigurierte, auf `_test` endende Testdatenbank. Zugangsdaten werden für jeden Lauf zufällig erzeugt. Screenshots liegen unter `docs/screenshots/`, Traces und HTML-Bericht unter den ignorierten Testverzeichnissen.
|
|
|
|
Der Docker-Test erstellt ein eigenes zufällig benanntes Compose-Projekt auf Port 3200, prüft Bootstrap, Import, Upload, Neustart-Persistenz und Datenbank-Restore und entfernt anschließend ausschließlich seine eigenen Testcontainer und Testvolumes.
|
|
|
|
Weitere Informationen: [Architektur und Entwicklung](docs/DEVELOPMENT.md), [Prüfnachweise und Grenzen](docs/VERIFICATION.md).
|
|
|
|
## Datenschutz und lokale Daten
|
|
|
|
Kein Tracking, keine Cloudkonten, keine extern geladenen Schriftarten. Bilder sind lokale Dateien. Öffentliche Rezeptbilder sind über ihre URL öffentlich abrufbar. Lokale Favoriten, Entwürfe und Einkaufslisten synchronisieren nicht automatisch zwischen Geräten. Browserdaten-Löschen entfernt diese persönlichen Daten. Rezept- und Bildbestände auf dem Server werden davon nicht beeinflusst.
|
|
|
|
Die Offline-Funktion ersetzt kein Serverbackup. Hintergrundtimer verwenden absolute Endzeitpunkte; mobile Betriebssysteme können Webseiten anhalten. Der angezeigte Timerstand wird bei Rückkehr korrigiert. Ein akustischer Alarm bei gesperrtem Bildschirm ist browserbedingt nicht garantiert.
|
|
|
|
## Bildnachweise
|
|
|
|
Mitgelieferte Food-Fotos stammen von Unsplash und liegen vollständig lokal im Repository. Original-IDs und Hinweise: [ASSETS.md](docs/ASSETS.md).
|