No description
Find a file
Bruno Deanoz 497f0a82f7 feat: redesign mode pills and dropdowns
Pills: extracted shared ModePill composable — thinner border (0.8dp gradient
instead of 1.2dp solid), subtler inactive background, smaller text (12.5sp),
compact padding (12x7 instead of 13x8). Active state uses accent gradient
border instead of solid color.

Reasoning dropdown: styled container (dark glass bg, 16dp shadow, squircle
shape), check icon on selected preset, cleaner row layout.

Sampling popover: same styled container, custom checkbox (squircle with accent
tint instead of Material Checkbox), disabled state dims labels and track,
wider panel (260dp), more spacing between parameters.
2026-06-23 01:07:57 +02:00
app feat: redesign mode pills and dropdowns 2026-06-23 01:07:57 +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 session 2026-06-23 00:47:01 +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 Initial commit - Kaizen App 2026-06-18 15:08:09 +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
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.