An offline-first, bilingual (Amharic/English) mobile civic directory for Addis Ababa, built with Flutter. Features a zero-latency local database for instant access to city services.
Addis 360 🇪🇹
Your City, One Tap Away. A 100% Offline, Open-Source Directory for Addis Ababa.
## The Story
Addis 360 started from a simple physical notebook filled with vital city information. It was incredibly useful but impossible to search or carry around efficiently. I decided to digitize that notebook into a high-performance, fully offline mobile app. Today, it serves as a powerful utility for anyone living in or visiting Addis Ababa.
By making this open-source, I hope to inspire other developers to turn simple everyday problems into practical tech solutions.
## Key Features
* **100% Offline-First:** Contains data for over 300+ locations (Hospitals, Banks, Ministries, Police) stored locally. Zero latency, zero data cost.
* **Bilingual (Amharic & English):** Seamlessly switch the entire UI and data language on the fly.
* **Amharic Voice Search:** Integrated speech-to-text natively understands Amharic, allowing for hands-free navigation.
* **Interactive Offline Maps:** Powered by Leaflet (`flutter_map`), rendering GPS coordinates directly within the app.
* **Community Feedback Loop:** A built-in "Suggest an Edit" feature utilizing `url_launcher` to generate pre-formatted emails for database corrections.
* **Premium UI/UX:** Built with a modern design language, featuring custom typography, micro-animations, and a sleek dark mode.
---
## Technical Architecture
If you're a developer exploring the codebase, here is how the app is structured under the hood:
### 1. State Management (`flutter_riverpod`)
We use **Riverpod** to strictly separate business logic from the UI.
* **`searchQueryProvider`**: Reactively filters the offline database in real-time.
* **`localeProvider`**: Listens for language changes and immediately rebuilds the UI without app restarts.
* **`recentlyViewedProvider`**: Interacts with `SharedPreferences` to persist user history.
### 2. Local Data Layer (`sqflite`)
To achieve zero-latency searches, the app does not rely …