d6f96ff5c558d2d840d1736c11d7ae568420df65
Conduit
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
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
- Clone the repository:
git clone https://github.com/yourusername/conduit.git
cd conduit
- Install dependencies:
flutter pub get
- Generate code:
flutter pub run build_runner build --delete-conflicting-outputs
- Run the app:
# For iOS
flutter run -d ios
# For Android
flutter run -d android
Building for Release
Android
flutter build apk --release
# or for App Bundle
flutter build appbundle --release
iOS
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_l10nwith ARB files and theintlpackage for date/number formatting.
Install & Generate
- Install packages:
flutter_localizations(Flutter SDK)intl: ^0.20.2
- Files are under
lib/l10n/*.arb. The template isapp_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.arband provide translated values. - Ensure placeholders and plural rules match the template.
- Add the locale to
supportedLocalesinMaterialApp(seelib/main.dart). - Regenerate:
flutter gen-l10n.
Best Practices
- Key naming: use lowerCamelCase (e.g.,
loginButton,errorMessage). - Include
@metadata withdescriptionfor context andplaceholderswith 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, orItaliano. - 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.
- Flutter falls back to English; search for hard‑coded strings and replace with
- 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.
- Fork the project
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - 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 page.
Description
Languages
Dart
95.5%
Kotlin
2%
Swift
1.3%
CMake
0.4%
Shell
0.3%
Other
0.5%





