by ProtonLumo
Android application for Proton Lumo
# Add to your Claude Code skills
git clone https://github.com/ProtonLumo/android-lumoLumo is the privacy-first AI assistant created by Proton, the team behind encrypted email, VPN, password manager, and cloud storage trusted by over 100 million people. Lumo helps you stay productive, curious, and informed β without ever compromising your privacy.
This is the native Android application wrapper for the Lumo web application (lumo.proton.me) with addition features e.g. voice entry.
The Lumo Android app follows a clean, modular architecture with clear separation of concerns:
graph TB
subgraph "π± Lumo Android App"
MA["MainActivity
π Single Activity + Compose Navigation"]
LA["LumoApplication
π App Initialization"]
subgraph "ποΈ Manager Layer"
UIM["UIManager
π¨ Edge-to-Edge + Insets"]
WVM["WebViewManager
π WebView Lifecycle"]
PM["PermissionManager
π Runtime Permissions"]
end
subgraph "π§ ViewModels & State"
MAVM["MainActivityViewModel
π UI State + Events
π Network Checks"]
SVM["SubscriptionViewModel
π° Payment State (GMS Only)"]
end
subgraph "π¦ Data Layer"
BDP["BaseDependencyProvider
ποΈ Abstract DI"]
DP_GMS["DependencyProvider (GMS)
π³ With Billing"]
DP_NoGMS["DependencyProvider (NoGMS)
π« No Billing"]
TR["ThemeRepository
π¨ Theme Persistence"]
WAR["WebAppRepository
π Event Flow"]
SR["SubscriptionRepository
π Subscription Data (GMS)"]
end
subgraph "π WebView Integration"
CWV["createWebView()
πΊ WebView Factory"]
LWC["LumoWebClient
π Page Lifecycle + JS Injection"]
LCC["LumoChromeClient
π File Chooser"]
WAI["WebAppInterface
π Base JS Bridge"]
WAPI["WebAppWithPaymentsInterface
π³ Payment Bridge (GMS)"]
JSI["JsInjector
π 10+ Injection Functions
β¨οΈ Keyboard + Payments"]
end
subgraph "π³ Billing System (GMS Only)"
BMW["BillingManagerWrapper
π‘οΈ Graceful Degradation"]
BM["BillingManager
πͺ Google Play Billing
π Cache + Auto-Refresh"]
end
subgraph "π€ Speech Recognition"
SRM["SpeechRecognitionManager
π£οΈ Native Speech API
π RMS Tracking"]
SIS["SpeechInputSheet
ποΈ Voice UI + Waveform"]
end
subgraph "π§ Navigation"
NR["NavRoutes
πΊοΈ Type-Safe Routes"]
CS["ChatScreen
π¬ Main WebView Screen"]
PS["PaymentScreen
π³ Payment Dialog (GMS)"]
PLD["PurchaseLinkDialog
π Web Payment (NoGMS)"]
end
subgraph "π± UI Components"
LS["LoadingScreen
β³ Lottie Animation"]
Theme["LumoTheme
π¨ Material 3 + Sync"]
PPS["PaymentProcessingScreen
βοΈ Payment States (GMS)"]
SC["SubscriptionComponent
π Subscription Info (GMS)"]
FCI["FeatureComparisonItem
π Plan Features"]
end
subgraph "π οΈ Configuration"
Config["LumoConfig
βοΈ Domain Management
π Multi-Env Support"]
Models["Models & Data Classes
π UiText, LumoTheme, etc."]
end
subgraph "ποΈ Build Variants"
V_Env["Environment: production"]
V_Debug["Debugging: standard | noWebViewDebug"]
V_Services["Services: gms | noGms"]
end
end
subgraph "π External Services"
Web["Lumo Web App
π lumo.proton.me"]
GP["Google Play Billing
π³ Payment Processing"]
Android["Android System
π± Speech + Permissions"]
end
%% Main initialization
LA --> BDP
MA --> UIM
MA --> WVM
MA --> PM
MA --> MAVM
MA --> SRM
MA --> NR
%% DI Provider variants
BDP --> DP_GMS
BDP --> DP_NoGMS
DP_GMS --> BMW
DP_GMS --> WAPI
DP_NoGMS --> WAI
%% Manager connections
WVM --> CWV
%% WebView creation chain
CWV --> LWC
CWV --> LCC
CWV --> WAI
LWC --> JSI
%% JS Bridge variants
WAI --> WAPI
WAPI --> BM
%% ViewModel data flow
MAVM --> WAR
MAVM --> TR
SVM --> SR
%% Navigation routes
NR --> CS
NR --> PS
NR --> PLD
CS --> CWV
CS --> SIS
PS --> SVM
%% Billing chain (GMS)
BMW --> BM
BM --> GP
%% Speech chain
SIS --> SRM
SRM --> Android
%% WebView to Web
CWV --> Web
LWC --> Web
%% UI components
CS --> LS
PS --> PPS
PS --> SC
PS --> FCI
%% Theme system
Theme --> TR
MAVM --> Theme
%% Build variant effects
V_Services -.-> DP_GMS
V_Services -.-> DP_NoGMS
V_Debug -.-> CWV
%% Styling
classDef manager fill:#e1f5fe
classDef viewmodel fill:#f3e5f5
classDef data fill:#e8f5e8
classDef webview fill:#fff3e0
classDef billing fill:#fce4ec
classDef speech fill:#f1f8e9
classDef navigation fill:#e8eaf6
classDef ui fill:#e3f2fd
classDef config fill:#fafafa
classDef external fill:#ffebee
classDef variant fill:#e0f2f1
classDef app fill:#f3e5f5
class UIM,WVM,PM manager
class MAVM,SVM viewmodel
class BDP,DP_GMS,DP_NoGMS,TR,WAR,SR data
class CWV,LWC,LCC,WAI,WAPI,JSI webview
class BMW,BM billing
class SRM,SIS speech
class NR,CS,PS,PLD navigation
class LS,Theme,PPS,SC,FCI ui
class Config,Models config
class Web,GP,Android external
class V_Env,V_Debug,V_Services variant
class MA,LA app
WebView componentWebView settings for optimal compatibility and performanceWebAppInterface) for bidirectional communication between web app and native Android codeWebChromeClient.onShowFileChooserandroid.speech.SpeechRecognizer for voice captureRECORD_AUDIOcom.android.billingclient:billing-ktx)BillingManager class handling connection, queries, and purchasesPaymentDialog composable triggered via JavaScript interface for premium feature purchasesThe app supports multiple build variants across three dimensions to accommodate different use cases:
production: Production environment (lumo.proton.me)standard: Full debugging capabilities including WebView debuggingnoWebViewDebug: GrapheneOS-compatible variant with WebView debugging completely disabledgms: With Google Mobile Services (in-app billing enabled)noGms: Without Google Mobile Services (alternative payment dialog)# Standard GMS development build (with WebView debugging)
./gradlew assembleProductionStandardGmsDebug
# NoGMS development build (with WebView debugging)
./gradlew assembleProductionStandardNoGmsDebug
# GrapheneOS-compatible NoGMS build (no WebView debugging)
./gradlew assembleProductionNoWebViewDebugNoGmsDebug
# Production GMS release build
./gradlew assembleProductionStandardGmsRelease
# Production NoGMS release build
./gradlew assembleProductionStandardNoGmsRelease
./hooks/install-hooks.sh
This enables pre-commit checks (detekt) to ensure code quality before committing.# Option 1: Set environment variables directly
export LUMO_KEY_ALIAS="your_key_alias"
export LUMO_KEY_PASSWORD="your_key_password"
export LUMO_KEYSTORE_PATH="/path/to/your/keystore.jks"
export LUMO_STORE_PASSWORD="your_store_password"
# Option 2: Use the .env file (recommended)
cp .env.example .env
# Edit .env with your actual values
source .env
# Debug builds (no signing required)
./gradlew clean assembleProductionStandardDebug
# Release builds (requires environment variables above)
./gradlew clean assembleProductionStandardRelease
For automat
No comments yet. Be the first to share your thoughts!