No description
Find a file
Bruno Deanoz fb8f21dfd8 style: compact capsule input like Gemini
Tighter row: 36dp icons, 6dp padding, 15sp text, capsule shape.
Higher opacity (0.90/0.96) for solid feel against background.
All action buttons (Send/Call/Stop) matched to 36dp.
2026-06-23 14:02:37 +02:00
app style: compact capsule input like Gemini 2026-06-23 14:02:37 +02:00
gradle feat: KaizenIcons system — Lucide base, full Material Icons migration 2026-06-22 14:11:34 +02:00
.gitignore Initial commit - Kaizen App 2026-06-18 15:08:09 +02:00
build.gradle.kts feat: offline-first cache layer with Room 2026-06-21 12:50:46 +02:00
CLAUDE.md docs: comprehensive CLAUDE.md update for 2026-06-23 design session 2026-06-23 01:39:44 +02:00
DESIGN.md feat: design system v2 — P3 colors, squircle shapes, glass surfaces, multi-theme, motion tokens 2026-06-21 14:32:25 +02:00
gradle.properties feat: offline-first cache layer with Room 2026-06-21 12:50:46 +02:00
gradlew fix: set gradlew execute permission 2026-06-23 07:15:17 +02:00
gradlew.bat Initial commit - Kaizen App 2026-06-18 15:08:09 +02:00
LATER.md feat: wire chat to the real Kaizen backend (in-app login + streaming) 2026-06-19 01:04:55 +02:00
OFFLINE_CACHE_ADD.md feat: offline-first cache layer with Room 2026-06-21 12:50:46 +02:00
PASSKEY_PLAN.md docs: passkey registration plan (WebAuthn/FIDO2 via Credential Manager) 2026-06-23 01:53:04 +02:00
README.md feat: wire chat to the real Kaizen backend (in-app login + streaming) 2026-06-19 01:04:55 +02:00
settings.gradle.kts Initial commit - Kaizen App 2026-06-18 15:08:09 +02:00

Kaizen — Android

Native Android-App für Kaizen (Jetpack Compose + Kotlin). Kein WebView, kein Tauri.

Phase 1 — echtes Backend (aktiv)

Der Feel-Prototyp redet jetzt mit dem echten Kaizen-Backend — echte, gestreamte Antworten statt fakeReply. Die App ist deployment-agnostisch: ein Binary, das auf die offizielle Instanz ODER jeden Self-Host zeigt, über einen einheitlichen Authorization: Bearer-Contract. SaaS vs. Self-Host ist nur „welche Base-URL".

Drin:

  • In-App-Login (auth/LoginScreen.kt): Server-URL (Default = offizielle Instanz, editierbar = die „offiziell/Self-Host"-Adresse) + E-Mail + Passwort → POST {baseUrl}/api/v1/auth/tokenkzn_-Token. Kein Token-Copy-Paste.
  • Sichere Token-Ablage (net/SecureStore.kt): EncryptedSharedPreferences (AES-256-GCM, Schlüssel im Android-KeyStore/StrongBox) — der Token liegt nie im Klartext, auch nicht auf gerooteten Geräten.
  • Modell vom Server (net/SessionViewModel.kt): nach dem Login holt die App per GET /api/v1/me das vom Nutzer unter /settings/models gewählte Default-Modell — kein hartgecodetes Modell.
  • Echtes Streaming (net/KaizenApi.kt + net/StreamConsumer.kt): POST /api/v1/chat, liest den text/plain-Chunked-Stream inkrementell und strippt die Sentinels (Port von lib/chat/stream-consumer.ts aus dem Backend, JVM-unit-getestet).
  • Design + Haptik + Orb unverändert — nur die Datenquelle hat sich geändert.

Bewusst noch nicht drin (siehe LATER.md): Conversation-History vom Server, Passkey-Login nativ, Bild/Video, Biometric-Lock, WebSocket-Streaming.

Bauen & laufen

Wichtig: Auf dem echten S25 Ultra laufen lassen, nicht im Emulator — der Emulator kann keine echte Haptik, und genau die wollen wir fühlen.

  1. Projekt in Android Studio öffnen, Gradle syncen (neue Deps: OkHttp, kotlinx-serialization, security-crypto + INTERNET-Permission).
  2. S25 Ultra per Wireless Debugging oder USB verbinden.
  3. Run ▶ auf das Gerät → Login-Screen erscheint. Server-URL prüfen, einloggen.

DEFAULT_BASE_URL (net/ServerConfig.kt) ist die vorausgefüllte Instanz-Adresse — bei Domainwechsel hier anpassen.

Der Test

Eine Woche nutzen. Geht der Finger anfangen hierher statt zu Gemini → wir bauen voll aus (History, Passkey, Medien = Phase 2). Wenn nicht → wir wissen billig, woran's liegt.