No description
Find a file
Garfie d30988f8b4 Sync upstream to v0.8.4
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.
2026-03-26 17:33:41 -05:00
.claude/skills/sync-upstream Add sync-upstream skill and upstream submodule 2026-03-26 16:50:18 -05:00
.github Initial release 2026-03-09 22:00:00 -05:00
app Initial release 2026-03-09 22:00:00 -05:00
build-logic Initial release 2026-03-09 22:00:00 -05:00
core Sync upstream to v0.8.4 2026-03-26 17:33:41 -05:00
feature Sync upstream to v0.8.4 2026-03-26 17:33:41 -05:00
gradle Initial release 2026-03-09 22:00:00 -05:00
upstream@0736ff2668 Add sync-upstream skill and upstream submodule 2026-03-26 16:50:18 -05:00
.gitignore Initial release 2026-03-09 22:00:00 -05:00
.gitmodules Add sync-upstream skill and upstream submodule 2026-03-26 16:50:18 -05:00
build.gradle.kts Initial release 2026-03-09 22:00:00 -05:00
CLAUDE.md Add sync-upstream skill and upstream submodule 2026-03-26 16:50:18 -05:00
compose-stability.conf Initial release 2026-03-09 22:00:00 -05:00
DISCOVERY.md Initial release 2026-03-09 22:00:00 -05:00
gradle.properties Initial release 2026-03-09 22:00:00 -05:00
gradlew Initial release 2026-03-09 22:00:00 -05:00
gradlew.bat Initial release 2026-03-09 22:00:00 -05:00
KNOWN_ISSUES.md Initial release 2026-03-09 22:00:00 -05:00
LICENSE Initial release 2026-03-09 22:00:00 -05:00
README.md Initial release 2026-03-09 22:00:00 -05:00
settings.gradle.kts Initial release 2026-03-09 22:00:00 -05:00
UPSTREAM_VERSION Add sync-upstream skill and upstream submodule 2026-03-26 16:50:18 -05:00

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.