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

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.

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.
  • Optionale Admin-2FA mit Authenticator-App und Wiederherstellungscodes; SMTP-Einstellungen, Testmail und zuschaltbare Login-Mails mit Zeitpunkt, gemeldeter IP und Browser/Gerät.

Rezepte mit ChatGPT erstellen

  1. Wiederverwendbaren Prompt und JSON Schema 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, Pljeskavica XML, drei Kochbuchrezepte. Letztere enthalten lokale Bilder und sind ausdrücklich zum optionalen Import gedacht.

Format, Mengenreferenzen und XML-Struktur: Importanleitung.

Entwicklung und Prüfung

Node.js 24 und PostgreSQL 17:

npm ci
cp .env.example .env
# DATABASE_URL und APP_ORIGIN eintragen
npm run db:migrate
npm run admin:create -- deinname
npm run dev
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, Prüfnachweise und Grenzen.

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.

S
Description
No description provided
Readme
31 MiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 79.3%
CSS 18.5%
JavaScript 1.3%
HTML 0.6%
Dockerfile 0.3%