# Conduit
Get it on Google Play Download on the App Store


Screenshot 1

Conduit is an open-source, cross-platform mobile application for Open-WebUI, providing a native mobile experience for interacting with your self-hosted AI infrastructure. ## Features ### Core Features - **Real-time Chat**: Stream responses from AI models in real-time - **Model Selection**: Choose from available models on your server - **Conversation Management**: Create, search, and manage chat histories - **Markdown Rendering**: Full markdown support with syntax highlighting - **Theme Support**: Light, Dark, and System themes ### Advanced Features - **Voice Input**: Use speech-to-text for hands-free interaction - **File Uploads**: Support for images and documents (RAG) - **Multi-modal Support**: Work with vision models - **Secure Storage**: Credentials stored securely using platform keychains ## Screenshots

Screenshot 2 Screenshot 3 Screenshot 4 Screenshot 5 Screenshot 6

## Requirements - Flutter SDK 3.0.0 or higher - Android 6.0 (API 23) or higher - iOS 12.0 or higher - A running Open-WebUI instance ## Installation 1. Clone the repository: ```bash git clone https://github.com/yourusername/conduit.git cd conduit ``` 2. Install dependencies: ```bash flutter pub get ``` 3. Generate code: ```bash flutter pub run build_runner build --delete-conflicting-outputs ``` 4. Run the app: ```bash # For iOS flutter run -d ios # For Android flutter run -d android ``` ## Building for Release ### Android ```bash flutter build apk --release # or for App Bundle flutter build appbundle --release ``` ### iOS ```bash flutter build ios --release ``` ## Configuration ### Android The app requires the following permissions: - Internet access - Microphone (for voice input) - Camera (for taking photos) - Storage (for file selection) ### iOS The app will request permissions for: - Microphone access (voice input) - Speech recognition - Camera access - Photo library access ## Localization (i18n) - Supported locales: `en`, `de`, `fr`, `it`. - Uses Flutter's `gen_l10n` with ARB files and the `intl` package for date/number formatting. ### Install & Generate - Install packages: - `flutter_localizations` (Flutter SDK) - `intl: ^0.20.2` - Files are under `lib/l10n/*.arb`. The template is `app_en.arb`. - Generate localizations: - `flutter gen-l10n` - or run a full build: `flutter pub get && flutter gen-l10n` ### Usage Examples - Basic text: - `Text(AppLocalizations.of(context)!.appTitle)` - With placeholder: - `Text(AppLocalizations.of(context)!.dynamicContentWithPlaceholder('Alex'))` - Pluralization: - `Text(AppLocalizations.of(context)!.itemsCount(3))` - Date/time formatting: - `final dateText = DateFormat.yMMMMEEEEd(Localizations.localeOf(context).toString()).format(DateTime.now());` - `Text(dateText)` - Number formatting: - `final price = NumberFormat.currency(locale: Localizations.localeOf(context).toString(), symbol: '€').format(1234.56);` - `Text(price)` ### Add a New Language - Create a new ARB file in `lib/l10n/`, e.g. `app_es.arb`. - Copy keys from `app_en.arb` and provide translated values. - Ensure placeholders and plural rules match the template. - Add the locale to `supportedLocales` in `MaterialApp` (see `lib/main.dart`). - Regenerate: `flutter gen-l10n`. ### Best Practices - Key naming: use lowerCamelCase (e.g., `loginButton`, `errorMessage`). - Include `@` metadata with `description` for context and `placeholders` with examples. - Prefer ICU plural/select syntax in ARB for quantities and genders. - Avoid concatenating strings at runtime; use placeholders in ARB. ### In‑App Locale Switching - Open the Profile page → Settings tile → choose `System`, `English`, `Deutsch`, `Français`, or `Italiano`. - Selection persists across app launches. ### Troubleshooting - Build fails with ARB placeholder errors: - Ensure every placeholder has an example string and correct type. - Missing translation at runtime: - Flutter falls back to English; search for hard‑coded strings and replace with `AppLocalizations`. - iOS strings not changing: - Restart the app after changing system language or use the in‑app language selector. ### References - Flutter localization: https://docs.flutter.dev/ui/accessibility-and-localization/internationalization - Intl package: https://pub.dev/packages/intl ## Architecture The app follows a clean architecture pattern with: - **Riverpod** for state management - **Dio** for HTTP networking - **WebSocket** for real-time streaming - **Flutter Secure Storage** for credential management ### Project Structure ``` lib/ ├── core/ │ ├── models/ # Data models │ ├── services/ # API and storage services │ ├── providers/ # Global state providers │ └── utils/ # Utility functions ├── features/ │ ├── auth/ # Authentication feature │ ├── chat/ # Chat interface feature │ ├── server/ # Server connection feature │ └── settings/ # Settings feature └── shared/ ├── theme/ # App theming ├── widgets/ # Shared widgets └── utils/ # Shared utilities ``` ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. 1. Fork the project 2. Create your feature branch (`git checkout -b feature/AmazingFeature`) 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) 4. Push to the branch (`git push origin feature/AmazingFeature`) 5. Open a Pull Request ## License This project is licensed under the GPL3 License - see the LICENSE file for details. ## Acknowledgments - Open-WebUI team for creating an amazing self-hosted AI interface - Flutter team for the excellent mobile framework - All contributors and users of Conduit ## Support For issues and feature requests, please use the [GitHub Issues](https://github.com/cogwheel0/conduit/issues) page.