Projekte sind benannte Thema-Bündel die voice-gesteuert via Brain-Tools
geöffnet/verlassen werden. Default-Mode bleibt der Hauptthread — Projekte
sind eine optionale Bühne. Anchored-not-replaced: App-Open landet immer
im Hauptchat, Projekte sind nur sichtbar wenn aktiv betreten.
Brain:
- projects.py: CRUD + Fuzzy-Find + Active-State-Pointer
(/shared/config/projects.json + active_project.txt).
- conversation.py: Turn.project_id-Feld + window(project_id) Filter.
- agent.py: 6 Meta-Tools — project_create / _enter / _exit / _list /
_summary / _end. chat() liest aktive Projekt-ID, taggt User+Assistant-
Turns damit, filtert das LLM-Window auf Projekt-Kontext und ergaenzt
den System-Prompt um den aktiven Projekt-Hinweis. touch_project pflegt
last_activity_at + turn_count.
- main.py: REST-Endpoints /projects/{status,list,create,switch,
{id}/end,{id}/archive, PATCH /{id}}.
Bridge + RVS:
- aria_bridge.py: project_changed Event-Propagation Brain → RVS-Broadcast
damit App + Diagnostic ihre Banner refreshen.
- rvs/server.js: project_changed in ALLOWED_TYPES.
App:
- brainApi.ts: Project-Type + 6 API-Methoden.
- ProjectsBrowser.tsx (neue Komponente, ~340 Zeilen): Status-Header,
Hauptchat als Erster-Eintrag, Projekt-Liste mit Aktiv-Marker, Long-Press
zum Editieren, Modals fuer Neu/Edit/End/Archiv.
- ChatScreen.tsx: Banner unterhalb des Status-Bars zeigt aktives Projekt
oder „Hauptchat" — Tap öffnet ProjectsBrowser als Modal. Aktive Projekt-
Info wird bei Mount + bei project_changed-Events refreshed.
- SettingsScreen.tsx: Neue Section 📁 „Projekte" zeigt ProjectsBrowser inline.
Diagnostic:
- Neue Sektion im Brain-Tab mit Liste, Aktiv-Marker, Beenden/Archivieren
pro Zeile, Modal fuer Neu. Lädt automatisch bei Brain-Tab + bei
project_changed-Event-Broadcast.
Was bewusst NICHT drin ist (Folgeschritte):
- Per-Message Filter im Chat-Verlauf (zeigt aktuell alle Bubbles, Banner
zeigt Kontext) — App müsste Chat-History per project_id filtern.
- Files-by-Project Tagging.
- Inline-Collapse-Bloecke im Chat-Verlauf.
- Sub-Projekte (Stefan-Entscheidung: weglassen, „Mama-tauglich").
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ARIA Cockpit — Android App
Stefans primäre Schnittstelle zu ARIA. Gebaut mit React Native + TypeScript.
Schnellstart
# 1. Abhängigkeiten installieren (einmalig)
./setup.sh
# 2. Release-APK bauen (standalone, kein Dev-Server nötig)
./build.sh
# 3. APK aufs Handy kopieren und installieren
adb install ARIA-Cockpit-release.apk
Fertig. APK liegt als ARIA-Cockpit-release.apk im Verzeichnis.
Debug vs Release — was ist der Unterschied?
| Debug | Release | |
|---|---|---|
| JS-Bundle | Wird von Metro Dev-Server geladen (localhost:8081) | In die APK eingebaut — läuft standalone |
| Verwendung | Entwicklung am PC mit Hot-Reload | Installation aufs Handy |
| Dev-Server nötig? | Ja — npx react-native start muss laufen |
Nein — App startet sofort |
| Größe | Kleiner (Code wird live geladen) | Größer (alles eingebaut) |
Für aufs Handy installieren immer Release bauen:
./build.sh release # oder einfach: ./build.sh
Debug nur zum Entwickeln am PC:
# Terminal 1: Metro Dev-Server starten
npx react-native start
# Terminal 2: Debug-APK bauen und auf verbundenes Gerät/Emulator deployen
./build.sh debug
Wenn du eine Debug-APK aufs Handy kopierst ohne Metro-Server, siehst du den roten "Could not connect to development server" Fehler. Das ist normal — Debug braucht den Server.
Scripts
setup.sh — Entwicklungsumgebung einrichten
Installiert automatisch alles was zum Bauen nötig ist:
| Was | Version | Details |
|---|---|---|
| Basis-Tools | — | curl, unzip, git |
| Node.js | >= 18 | Via NodeSource (falls nicht vorhanden) |
| JDK | 17 (vollständig) | OpenJDK mit jlink (nicht nur JRE!) |
| Android SDK | API 34 | Command Line Tools + Build Tools + Platform Tools |
| Metro-Config | — | metro.config.js, babel.config.js, .watchmanconfig (falls fehlend) |
| Node Packages | — | Räumt alte node_modules auf + npm install |
| Natives Android-Projekt | — | React Native Gradle-Projekt generieren |
| Gradle Config | — | compileSdk-Warning unterdrücken, Build-Cache aufräumen |
Das Script erkennt automatisch dein OS (Debian, Fedora, Arch, macOS) und benutzt den passenden Paketmanager.
ANDROID_HOME wird automatisch gesetzt und in dein Shell-Profil (.bashrc/.zshrc) eingetragen.
JDK-Hinweis: React Native 0.73 + Android Gradle Plugin 8.1 braucht exakt JDK 17 — nicht 21 oder neuer. Falls du JDK 21 als Standard hast, ist das kein Problem: build.sh setzt JAVA_HOME automatisch auf JDK 17 (wenn installiert).
./setup.sh
Nach dem Setup einmalig Shell neu starten oder
source ~/.bashrcausführen.
build.sh — APK bauen
Baut die Android APK in einem Schritt:
./build.sh # Release-APK (Standard) — fürs Handy
./build.sh release # Release-APK (explizit)
./build.sh debug # Debug-APK (nur mit Metro Dev-Server)
Was das Script macht:
- Prüft ob Node, npm, Java vorhanden sind (sonst Fehler mit Hinweis auf
setup.sh) - Erkennt automatisch JDK 21 und wechselt auf JDK 17 (inkl. jlink-Prüfung)
- Sucht automatisch nach dem Android SDK (typische Pfade)
- Prüft ob das native Android-Projekt existiert (sonst Hinweis auf
setup.sh) - Installiert/updated Node Dependencies falls nötig
- Baut die APK via Gradle
- Kopiert die fertige APK als
ARIA-Cockpit-<modus>.apkins Hauptverzeichnis
Ausgabe-Dateien:
ARIA-Cockpit-release.apk— fertige APK (Hauptverzeichnis)android/app/build/outputs/apk/release/app-release.apk— Original-Pfad
Auf dem Handy installieren
# Via ADB (USB-Kabel oder WiFi)
adb install ARIA-Cockpit-release.apk
# Oder: APK aufs Handy kopieren und dort öffnen
# Oder: Via Gitea Release herunterladen (siehe release.sh im Root)
Erstverbindung (Pairing)
- App starten
- Tab Einstellungen öffnen
- QR-Code scannen (vom RVS generiert) oder Token manuell eingeben
- Verbindungsstatus prüfen (grüner Punkt = verbunden)
Der QR-Code enthält alles was die App braucht:
{
"host": "rvs.hackersoft.de",
"port": 443,
"token": "a3f8b2c9d1e4..."
}
Einmal scannen, nie wieder manuell tippen.
Projektstruktur
android/
├── setup.sh ← Dev-Umgebung einrichten (einmalig)
├── build.sh ← APK bauen
├── index.js ← React Native Entry Point
├── app.json ← App-Name Konfiguration
├── App.tsx ← Haupt-Komponente, Navigation
├── package.json ← Dependencies
├── tsconfig.json ← TypeScript Config
├── metro.config.js ← Metro Bundler Config
├── babel.config.js ← Babel Transpiler Config
├── .watchmanconfig ← Watchman Config
│
├── src/
│ ├── services/
│ │ ├── rvs.ts ← WebSocket-Verbindung zum Rendezvous Server
│ │ └── audio.ts ← Mikrofon-Aufnahme und TTS-Wiedergabe
│ │
│ ├── screens/
│ │ ├── ChatScreen.tsx ← Hauptchat mit ARIA
│ │ └── SettingsScreen.tsx ← Verbindung, Modus, Logs
│ │
│ └── components/
│ ├── VoiceButton.tsx ← Push-to-Talk Button
│ ├── ModeSelector.tsx ← Betriebsmodus-Auswahl
│ ├── FileUpload.tsx ← Datei-Versand
│ └── CameraUpload.tsx ← Foto-Aufnahme / Galerie
│
└── android/ ← Generiertes Gradle-Projekt (nach setup)
├── gradlew ← Gradle Wrapper
├── gradle.properties ← Gradle Config (compileSdk etc.)
└── app/build.gradle ← App Build Config
Fehlerbehebung
| Problem | Lösung |
|---|---|
| "Could not connect to development server" | Das ist eine Debug-APK. Für standalone: ./build.sh release |
ANDROID_HOME nicht gesetzt |
./setup.sh ausführen, Shell neu starten |
gradlew: Permission denied |
chmod +x android/gradlew |
SDK not found |
./setup.sh — installiert Android SDK automatisch |
JDK nicht gefunden |
./setup.sh — installiert OpenJDK 17 |
jlink does not exist |
Nur JRE installiert, nicht voller JDK: sudo apt install openjdk-17-jdk |
JdkImageTransform Fehler |
JDK 21 aktiv, aber JDK 17 nötig — build.sh löst das automatisch |
BaseReactPackage Fehler |
react-native-screens Version zu neu — auf 3.27.0 pinnen |
react-native-camera Flavor-Fehler |
Paket entfernt (deprecated), wird nicht gebraucht |
EMFILE: too many open files |
build.sh setzt CI=true automatisch — Metro startet keinen File-Watcher |
No Metro config found |
./setup.sh erstellt metro.config.js, babel.config.js, .watchmanconfig automatisch |
Build hängt bei assembleRelease |
Signing Config prüfen (siehe React Native Docs) |
node_modules Probleme |
./setup.sh — räumt alles auf und installiert frisch |