An Android-first Flutter app for browsing Ethiopian power outage announcements, in Amharic, backed by the mebrat-backend FastAPI service. Browsing is fully open with no account required; an optional free account lets you subscribe to specific locations and get a push notification.
# መብራት (Mebrat)
An Android-first Flutter app for browsing Ethiopian power outage announcements, in Amharic, backed by the mebrat-backend FastAPI service. Browsing is fully open with no account required; an optional free account lets you subscribe to specific locations and get a push notification when a newly-scraped post mentions one (see Known Limitations for what's still deferred).
## Prerequisites
- Flutter 3.44.6 (stable) / Dart 3.12.2 or newer
- The backend running locally (see `../mebrat-backend/README.md`) -- Postgres via Docker Compose, then `uvicorn app.main:app`
- For a physical Android device: `adb` (ships with Android SDK platform-tools)
## Setup
```bash
flutter pub get
```
Localization code is generated from `lib/l10n/app_am.arb` into `lib/l10n/gen/` automatically as part of `flutter pub get` / `flutter build` / `flutter test` (see `l10n.yaml`) -- it's gitignored, not checked in.
## Pointing at the backend
The API base URL is compiled in via `--dart-define=API_BASE_URL=...` (see `lib/core/api/api_client.dart`), defaulting to `
localhost` if omitted. **Which value you need depends on how you're running the app**, since "localhost" means something different on each target:
| Target | `API_BASE_URL` | Why |
|---|---|---|
| `flutter run -d chrome` / desktop | `
localhost` (or whatever port the backend is on) | Same machine, so `localhost` works directly. |
| Android **emulator** | `
10.0.2.2` | The emulator's own `localhost` refers to the emulator itself; `10.0.2.2` is the special alias Android emulators use for the host machine. |
| Android **physical device, via USB** (recommended) | `
localhost` | Run `adb reverse tcp:8001 tcp:8001` first -- this forwards that port from the phone back to your machine over the USB connection itself, so `localhost` on the phone reaches your backend. Works with no WiFi/network dependency, but needs re-running after every reconnect (unplug, `adb kill-server`, etc). |
| And …