Currency Converter is an open-source Flutter app for live exchange rates, historical currency charts, and multi-currency tracking in one place.
Use it to quickly convert amounts, compare multiple currencies, and follow exchange-rate trends over time.
- About the App
- What It Does
- Key Features
- How to Use (Non-Technical)
- Open Source
- Frequently Asked Questions
- Build Instructions (For Developers)
Convert currencies instantly with live exchange rates, interactive performance charts, and multi-currency tracking.
- Converts one base currency into many other currencies at once.
- Shows historical exchange-rate trends with easy-to-read charts.
- Remembers your preferences, so the app opens the way you like.
- Live exchange rates from the Frankfurter API.
- Multi-currency conversion in a single screen.
- Historical charts with ranges:
1W,1M,3M,1Y,5Y,10Y. - Swap currencies directly in charts.
- Choose a default base currency.
- Choose which currencies to display.
- Optional currency flags and currency symbols.
- Dark mode.
- Multilingual UI: English, Arabic, French, German, Hindi, Polish, Russian.
- Open the app and choose your base currency (for example:
USD,EUR,GBP). - Enter the amount you want to convert.
- View your converted values instantly across selected currencies.
- Open the Charts tab to see how rates changed over time, then switch the range.
- Open Settings to change language, dark mode, and which currencies you want to see.
This project is open source and built with Flutter.
- Source code: GitHub repository
- Android build: GitHub Releases
Exchange rates come from the public Frankfurter data source and may differ slightly from your bank or payment provider.
Yes. The app is open source and available on GitHub.
Rates come from the Frankfurter API, a public exchange-rate data source.
Banks and payment providers may add fees, margins, or delayed updates, so their final rates can differ from public market rates.
- Install dependencies:
flutter pub get
- Regenerate envied files (after
.envchanges):dart run build_runner build --delete-conflicting-outputs
- Run the app:
flutter run
- (Optional) Build release:
flutter build apkorflutter build ios
- Download Android APK:
- Grab the latest APK from the Releases section.
Run all tests:
flutter test
Run a specific test file:
flutter test test/feature/convert/convert_remote_data_source_test.dart
The app uses a feature-based Clean Architecture with BLoC (Cubit):
- Presentation:
view/+cubit/for UI and state changes. - Domain:
entities/,repositories/,usecases/for business logic. - Data:
datasources/,repositories/for API access (Frankfurter).
Why this pattern
- Keeps the UI thin and testable.
- Isolates API logic behind repositories and usecases.
- Scales cleanly as features grow (Convert, Charts, etc.).
Current choice: Flutter built-in Image.network.
Why
- Flags are small, static assets from a stable CDN.
- Avoids extra dependencies and keeps startup light.
- Easy to replace with caching later if needed.
Current choice: hydrated_bloc storage (local key-value storage under the hood).
Why
- Lightweight persistence for simple state (currency list, selections).
- Minimal setup compared to a full database (e.g., SQLite).
- Fits the app’s current offline needs without extra complexity.