Initial commit: Fabled Android app

Flutter Android client for FabledAssistant with:
- Session-cookie auth via persistent cookie jar (Dio + cookie_jar)
- OAuth/SSO login via in-app WebView (flutter_inappwebview)
- Notes: list, detail (markdown render), create/edit
- Tasks: list with status tabs, create/edit with priority
- Chat: SSE streaming bubbles, conversation management
- Quick Capture FAB for rapid note/task creation
- Settings screen (change server URL, logout)
- Android home screen widget → opens chat
- Riverpod state management, go_router navigation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-28 21:28:53 -05:00
commit 4da36aa31d
64 changed files with 4053 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
# Fabled — Android App
Native Android client for [FabledAssistant](https://github.com/yourusername/fabledassistant), a self-hosted AI productivity assistant.
## Features
- **Notes** — create, edit, and browse markdown notes
- **Tasks** — manage tasks with status (To Do / In Progress / Done) and priority
- **Chat** — streaming AI conversations with real-time SSE response display
- **Quick Capture** — FAB shortcut to create a note or task from anywhere
- **OAuth / SSO** — authenticates via your server's configured OIDC provider; local username/password login also supported if enabled on the server
- **Session persistence** — stays logged in across app restarts via a persistent cookie jar
- **Home screen widget** — tap to open the chat screen directly from the Android launcher
## Requirements
- A running [FabledAssistant](https://github.com/yourusername/fabledassistant) server (self-hosted)
- Android 5.0+ (API 21)
## Getting Started
### Prerequisites
- Flutter 3.x SDK
- Android Studio (for Android SDK and emulator)
- JDK 17
### Setup
```bash
flutter pub get
flutter run
```
On first launch, enter your FabledAssistant server URL (e.g. `https://fabled.example.com`) and sign in.
## Architecture
```
lib/
├── main.dart # Entry point; resolves async deps before runApp
├── app.dart # GoRouter + auth redirect guards + shell nav
├── core/
│ ├── constants.dart # Route name constants
│ └── exceptions.dart # AppException hierarchy
├── data/
│ ├── api/ # Dio HTTP layer (one class per resource)
│ ├── models/ # Plain Dart models with fromJson/toJson
│ └── repositories/ # Thin wrappers over API classes
└── providers/ # Riverpod providers (state + dependency wiring)
screens/ # Flutter UI screens
```
**Key packages:** `flutter_riverpod`, `go_router`, `dio` + `cookie_jar`, `flutter_inappwebview`, `flutter_markdown`
## Building a Release APK
```bash
flutter build apk --release
```
The signed APK will be at `build/app/outputs/flutter-apk/app-release.apk`.