No description
Find a file
Bruno Deanoz 68721d8ddf feat: KaizenIcons system — Lucide base, full Material Icons migration
Introduces a centralized icon registry (ui/icon/KaizenIcons.kt) that
decouples every UI component from the underlying icon library. All 10
source files migrated from Material Icons Rounded to KaizenIcons backed
by Lucide (1.5px stroke, same library as the web frontend).

Architecture:
- KaizenIcons object with semantic getters (Send, Lock, Brain, etc.)
- Grouped by function (Navigation, Chat, Modes, Files, Settings, etc.)
- Custom brand section ready for hand-drawn SVG overrides
- One-line swap: change the getter, every usage updates
- Zero Material Icon imports remaining in app source

Dependency: com.composables:icons-lucide-android:1.0.0
2026-06-22 14:11:34 +02:00
app feat: KaizenIcons system — Lucide base, full Material Icons migration 2026-06-22 14:11:34 +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 feat: security settings — devices, password change, biometric toggle 2026-06-22 13:44: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.