Native Android client for Folio — private research, grounded answers. Sources, notes, and citations in one private archive.
Login → Spaces → Home (per space)
↓
Account
| Screen | Description |
|---|---|
| Login | Sign in, sign up |
| Spaces | Browse and manage research spaces |
| Home | Tabbed workspace per space: Sources, Ask, Notes, Notebook |
| Account | Profile and sign-out (navigated from Spaces) |
- Kotlin 2.0 · Jetpack Compose · Material 3
- Clean Architecture —
presentation → domain ← data - Navigation Compose · Coroutines · StateFlow
- Manual DI via
AppContainer+CompositionLocal - Min SDK 24 · Target/Compile SDK 35 · Java 17
- Android Studio (latest stable recommended)
- JDK 17
- Android SDK 35
git clone https://github.com/nustechnology/Folio-Android.git
cd Folio-Android
./gradlew assembleDebugOpen the project in Android Studio and run the app configuration on an emulator or device.
Debug builds use mock auth with prefilled credentials:
| Field | Value |
|---|---|
researcher@folio.app |
|
| Password | folio-debug |
Release builds have no backend wired yet — the login screen shows an unavailable state.
./gradlew assembleDebug # Build debug APK
./gradlew testDebugUnitTest # Unit tests (test/ + testDebug/)
./gradlew lintDebug # Lint
./gradlew connectedAndroidTest # Instrumented tests (device/emulator)CI (GitHub Actions on main): unit tests + lint.
app/src/
├── main/java/com/nus/folio/
│ ├── components/ # Shared UI (sheets, toasts, loading indicators)
│ ├── data/ # DataSources, RepositoryImpl
│ ├── domain/ # Models, repository interfaces, use cases
│ ├── di/ # AppContainer, LocalAppContainer
│ ├── presentation/
│ │ ├── login/ signup/
│ │ ├── space/ # Space list & management
│ │ ├── home/ # Tabbed workspace (Sources, Ask, Notes, Notebook)
│ │ ├── account/ # Account settings
│ │ └── navigation/ # FolioNavHost, FolioDestination
│ └── ui/theme/ # Color, Type, Theme
├── debug/ # Mock AuthDataSource + AuthCapabilities
├── release/ # Auth stubs (backend unavailable)
├── test/ # Shared unit tests + fakes
├── testDebug/ # Auth tests (debug variant)
└── testRelease/ # Auth tests (release variant)
Dependency flows inward — presentation and data both depend on domain:
| Layer | Depends on | Must not depend on |
|---|---|---|
presentation |
domain |
data |
domain |
— | data, presentation, Android |
data |
domain |
presentation |
Key conventions:
- One
*UiState+*ViewModelper screen; state viaStateFlow - Use cases registered in
AppContainer; ViewModels receive them throughViewModel.Factory - Home data is space-scoped (
getSourcesUseCase(spaceId), etc.) - User-facing strings in
res/values/strings.xml - Auth backend code lives in
debug/andrelease/source sets only
- Domain — model → repository interface → use case
- Data — data source → repository impl
- DI — wire in
AppContainer - Presentation — UiState → ViewModel → Screen → nav route (or Home tab/pane)
See CLAUDE.md for detailed conventions, reference files, and design system tokens.
We welcome contributions! Please read CONTRIBUTING.md before opening a PR.
- Report a bug
- Request a feature
- Security policy — report vulnerabilities privately, not via public issues
This project follows the Contributor Covenant.
This project is licensed under the MIT License.
Copyright (c) 2026 NUS Technology