mitai-jinkendo/CLAUDE.md
Lars Stommer 89b6c0b072
Some checks are pending
Deploy to Raspberry Pi / deploy (push) Waiting to run
Build Test / build-frontend (push) Waiting to run
Build Test / lint-backend (push) Waiting to run
feat: initial commit – Mitai Jinkendo v9a
2026-03-16 13:35:11 +01:00

155 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Mitai Jinkendo Entwickler-Kontext für Claude Code
## Projekt-Übersicht
**Mitai Jinkendo** ist eine selbst-gehostete PWA für Körper-Tracking (Gewicht, Körperfett, Umfänge, Ernährung, Aktivität) mit KI-Auswertung. Teil der **Jinkendo**-App-Familie (人拳道 Der menschliche Weg der Kampfkunst).
**Produktfamilie:** body · fight · guard · train · mind (alle unter jinkendo.de)
## Tech-Stack
| Komponente | Technologie | Version |
|-----------|-------------|---------|
| Frontend | React 18 + Vite + PWA | Node 20 |
| Backend | FastAPI (Python) | Python 3.12 |
| Datenbank | PostgreSQL | 16 (Ziel: v9) / SQLite (aktuell: v8) |
| Container | Docker + Docker Compose | - |
| Webserver | nginx (Reverse Proxy + HTTPS) | Alpine |
| Auth | Token-basiert (eigene Impl.) | - |
| KI | OpenRouter API (claude-sonnet-4) | - |
## Ports
| Service | Intern | Extern (Dev) |
|---------|--------|-------------|
| Frontend | 80 (nginx) | 3002 |
| Backend | 8000 (uvicorn) | 8002 |
| PostgreSQL | 5432 | nicht exponiert |
## Verzeichnisstruktur
```
mitai-jinkendo/
├── backend/
│ ├── main.py # FastAPI App, alle Endpoints
│ ├── requirements.txt
│ └── Dockerfile
├── frontend/
│ ├── src/
│ │ ├── App.jsx # Root, Auth-Gates, Navigation
│ │ ├── app.css # Globale Styles, CSS-Variablen
│ │ ├── context/
│ │ │ ├── AuthContext.jsx # Session, Login, Logout
│ │ │ └── ProfileContext.jsx # Aktives Profil
│ │ ├── pages/ # Alle Screens
│ │ ├── utils/
│ │ │ ├── api.js # Alle API-Calls (injiziert Token + ProfileId)
│ │ │ ├── calc.js # Körperfett-Formeln
│ │ │ ├── interpret.js # Regelbasierte Auswertung
│ │ │ ├── Markdown.jsx # Eigener MD-Renderer
│ │ │ └── guideData.js # Messanleitungen
│ │ └── main.jsx
│ ├── public/ # Icons (Jinkendo Ensō-Logo)
│ ├── index.html
│ ├── vite.config.js
│ └── Dockerfile
├── nginx/
│ └── nginx.conf
├── docker-compose.yml # Produktion
├── docker-compose.dev.yml # Entwicklung (Hot-Reload)
├── .env.example
└── CLAUDE.md # Diese Datei
```
## Aktuelle Version: v8
### Was implementiert ist:
- ✅ Multi-User mit PIN/Passwort-Auth + Token-Sessions
- ✅ Admin/User Rollen, KI-Limits, Export-Berechtigungen
- ✅ Gewicht, Umfänge, Caliper (4 Formeln), Ernährung, Aktivität
- ✅ FDDB CSV-Import (Ernährung), Apple Health CSV-Import (Aktivität)
- ✅ KI-Analyse: 6 Einzel-Prompts + 3-stufige Pipeline (parallel)
- ✅ Konfigurierbare Prompts mit Template-Variablen
- ✅ Verlauf mit 5 Tabs + Zeitraumfilter + KI pro Sektion
- ✅ Dashboard mit Kennzahlen, Zielfortschritt, Combo-Chart
- ✅ Assistent-Modus (Schritt-für-Schritt Messung)
- ✅ PWA (iPhone Home Screen), Jinkendo-Icon
- ✅ E-Mail (SMTP) für Password-Recovery
- ✅ Admin-Panel: User verwalten, KI-Limits, E-Mail-Test
### Was in v9 kommt:
- 🔲 PostgreSQL Migration (aktuell: SQLite)
- 🔲 Auth-Middleware auf ALLE Endpoints
- 🔲 bcrypt statt SHA256
- 🔲 Rate Limiting
- 🔲 CORS auf Domain beschränken
- 🔲 Selbst-Registrierung mit E-Mail-Bestätigung
- 🔲 Freemium Tier-System (free/basic/premium/selfhosted)
- 🔲 Login via E-Mail statt Profil-Liste
- 🔲 nginx + Let's Encrypt
## Datenbank-Schema (SQLite, v8)
### Wichtige Tabellen:
- `profiles` Nutzer mit Auth (role, pin_hash, auth_type, ai_enabled, export_enabled)
- `sessions` Auth-Tokens mit Ablaufdatum
- `weight_log` Gewichtseinträge (profile_id, date, weight)
- `circumference_log` 8 Umfangspunkte
- `caliper_log` Hautfaltenmessung, 4 Methoden
- `nutrition_log` Kalorien + Makros (aus FDDB-CSV)
- `activity_log` Training (aus Apple Health oder manuell)
- `ai_insights` KI-Auswertungen (scope = prompt-slug)
- `ai_prompts` Konfigurierbare Prompts mit Templates
- `ai_usage` KI-Calls pro Tag pro Profil
## Auth-Flow (aktuell v8)
```
Login-Screen → Profil-Liste → PIN/Passwort → Token im localStorage
Token → X-Auth-Token Header → Backend require_auth()
Profile-Id → aus Session (nicht aus Header!)
```
## API-Konventionen
- Alle Endpoints: `/api/...`
- Auth-Header: `X-Auth-Token: <token>`
- Profile-Header: `X-Profile-Id: <uuid>` (nur wo noch nicht migriert)
- Responses: immer JSON
- Fehler: `{"detail": "Fehlermeldung"}`
## Umgebungsvariablen (.env)
```
OPENROUTER_API_KEY= # KI-Calls
OPENROUTER_MODEL=anthropic/claude-sonnet-4
ANTHROPIC_API_KEY= # Alternative zu OpenRouter
SMTP_HOST= # E-Mail
SMTP_PORT=587
SMTP_USER=
SMTP_PASS=
SMTP_FROM=
APP_URL= # Für Links in E-Mails
DATA_DIR=/app/data # SQLite-Pfad (v8)
PHOTOS_DIR=/app/photos
# v9 (PostgreSQL):
DATABASE_URL=postgresql://jinkendo:password@db/jinkendo
DB_PASSWORD=
```
## Deployment (aktuell)
```bash
# Heimserver (Raspberry Pi 5, lars@raspberrypi5)
cd /home/lars/docker/bodytrack
docker compose build --no-cache [frontend|backend]
docker compose up -d
docker logs mitai-api --tail 30
```
## Wichtige Hinweise für Claude Code
1. **Ports immer 3002/8002** nie ändern
2. **npm install** (nicht npm ci) kein package-lock.json vorhanden
3. **SQLite safe_alters** neue Spalten immer via _safe_alters() hinzufügen
4. **Pipeline-Prompts** haben slug-Prefix `pipeline_` nie als Einzelanalyse zeigen
5. **dayjs.week()** braucht Plugin stattdessen native JS Wochenberechnung
6. **useNavigate()** nur in React-Komponenten (Großbuchstabe), nicht in Helper-Functions
7. **Bar fill=function** in Recharts nicht unterstützt nur statische Farben
## Code-Style
- React: Functional Components, Hooks
- CSS: Inline-Styles + globale CSS-Variablen (var(--accent), var(--text1), etc.)
- API-Calls: immer über `api.js` (injiziert Token automatisch)
- Kein TypeScript (bewusst, für Einfachheit)
- Python: keine Type-Hints Pflicht, aber bei neuen Funktionen erwünscht