No description
Breaking changes: - 2FA enable changed from GET to POST with OTP verification body - Backup code regeneration now requires OTP verification - Account deletion requires OTP when 2FA is enabled - New shared OtpVerificationDialog component in core/ui - Fix OTP digit box layout (weight-based instead of fixed size) Additive changes: - Add effort (AnthropicEffort) and thinkingLevel (Google) fields to Conversation, Preset, and ChatRequest models - Add tool_options to Agent model and create/update requests - Add artifacts field to EphemeralAgent - Add remoteAgents to InterfaceConfig - Add programmatic_tools and deferred_tools agent capabilities - Add thinkingLevel parameter to EndpointParameterRegistry SSE hardening: - Implement mapSyncEvent() for resume state-snapshot protocol - Preserve partial stream content on disconnect (don't wipe visible text) - Persist conversation to Room on stream creation (not just on Final) - Auto-reconnect SSE stream when network recovers via ConnectivityObserver - Network-aware retries in SseClient (wait for connectivity, don't burn attempts) - Add StreamEvent.Retrying for retry progress UI feedback - Lazy connectivity observation (only when network error occurs) - Clear draft/streaming state on SSE stream expiry - Add isNetworkError flag to StreamEvent.Error for typed detection Code quality: - Remove [Comparison] debug Timber logs (perf overhead on every SSE event) - Replace Log.d with Timber.d across feature modules - Extract hardcoded OTP dialog strings to strings.xml for localization - Parameterize OtpVerificationDialog labels for localizability - Add auto-submit guard with reset on failure for OTP input - Replace fake QR code generator with copyable otpauth:// URI - Replace fragile OTP string matching with HTTP status code checks - Consolidate identical request classes into OtpVerificationRequest - Share isHttpStatus helper across settings module - Remove duplicate verifyTempToken method (identical to verifyTwoFactor) - Remove duplicate 2FA dialog composables from AccountSettingsScreen - Extract shared resume stream logic to reduce duplication - Guard no-op retryInfo state updates - Move ApiException to core:common for cross-module access - Document SseEventMapper single-stream threading constraint Bump SUPPORTED_BACKEND_VERSION to 0.8.4, advance upstream submodule. |
||
|---|---|---|
| .claude/skills/sync-upstream | ||
| .github | ||
| app | ||
| build-logic | ||
| core | ||
| feature | ||
| gradle | ||
| upstream@0736ff2668 | ||
| .gitignore | ||
| .gitmodules | ||
| build.gradle.kts | ||
| CLAUDE.md | ||
| compose-stability.conf | ||
| DISCOVERY.md | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| KNOWN_ISSUES.md | ||
| LICENSE | ||
| README.md | ||
| settings.gradle.kts | ||
| UPSTREAM_VERSION | ||
LibreChat Android
Native Android client for LibreChat. Connects to any self-hosted LibreChat server — no backend modifications required.
Features
- Chat — Real-time streaming (SSE), message branching & sibling navigation, stop/regenerate/continue, markdown with syntax highlighting, LaTeX math rendering, code blocks with copy, image display, file attachments, tool call progress cards
- Model Selection — Searchable bottom sheet grouped by endpoint, model comparison mode
- Agents — Marketplace with search and categories, MCP server configuration
- Conversations — Paginated list with date grouping, tags, search, rename, archive, delete, share, fork, duplicate, export/import
- Presets & Prompts — Save/load chat presets, prompts library with @mention insertion
- Authentication — Login, registration, forgot password, two-factor (TOTP + backup codes), OAuth (Google, GitHub, Discord, Facebook, Apple, OpenID)
- Files — Upload, list, delete, inline image rendering with pinch-to-zoom
- Voice — Speech-to-text input, text-to-speech playback (device and server engines)
- Settings — Theme (system/light/dark), account management, data controls
- Tablet — Adaptive dual-pane layout (600dp+) with persistent sidebar
- Accessibility — Semantic headings, content descriptions, 48dp touch targets, live regions
Server Setup
The app works with any standard LibreChat server. During onboarding, you'll enter your server URL (e.g., https://chat.example.com or http://192.168.1.100:3080).
Required Configuration
Add the following to your LibreChat server's .env file:
# Safety net for native app clients.
# The app sends a browser User-Agent to pass the uaParser middleware,
# but if it ever fails to parse, this prevents ban point accumulation.
NON_BROWSER_VIOLATION_SCORE=0
Without this setting, the server's violation system may accumulate ban points against the Android client if the User-Agent check fails, eventually locking the account out.
Notes
- Registration — The app respects your server's registration settings. If registration is disabled server-side, only the login form is shown.
Building from Source
Requirements: Android Studio, JDK 17+
./gradlew assembleDebug
The debug APK will be at app/build/outputs/apk/debug/app-debug.apk.
For a release build:
./gradlew assembleRelease
Tech Stack
- Jetpack Compose + Compose Navigation
- Hilt (dependency injection)
- Ktor Client with OkHttp engine
- Kotlinx Serialization
- Room (cache), DataStore (preferences), EncryptedSharedPreferences (tokens)
- Kotlin 2.1.0, compileSdk 35, minSdk 26
License
This project is licensed under the MIT License.