Know before the lights go out. Push alerts, restoration times, and plain-language answers for power outages in PG&E territory. On iPhone and Android. Free, no account.
The app runs on both iPhone and Android today. iPhone installs through a free TestFlight beta; Android installs as a signed APK that updates itself in place.
Android, right now: grab the latest OutageWatch-x.y.z.apk from the Releases page and open it on your phone. You may need to allow "install from this source" when your browser or files app asks. It updates in place over older versions.
iPhone, through TestFlight: install Apple's free TestFlight app, then open testflight.apple.com/join/YqeVwyat on your phone. OutageWatch ships as a free TestFlight beta rather than an App Store listing, the same spirit as the APK above. The first build is finishing Apple's one-time beta review; if the link says the beta is not accepting testers yet, check back in a day.
About the Play Protect warning: the first time you open the APK, Android may say it "hasn't seen an app from this developer before." That is expected for any app installed outside the Play Store, not a sign of a problem. OutageWatch is signed and asks only for internet, notifications, and approximate location. Tap More details, then Install anyway to continue. The warning goes away if the app lands on the Play Store (still planned, no date yet).
![]() Add an area |
![]() Your areas at a glance |
![]() Outages near you |
![]() Plain-language answer |
![]() Quiet hours & more |
Pick your ZIP code or a precise address, and OutageWatch watches PG&E's public outage map for you.
- Push the moment it matters. A notification when an outage starts at your location, when the restoration estimate moves, when power is back, and when a PSPS safety shutoff is coming.
- See it on a map. Your watched areas, live outage footprints, restoration estimates, and how many customers are affected.
- Plain-language answers. Every outage has a short "what's going on and when is it coming back" written from the real feed data, not marketing copy.
- Quiet hours. No overnight buzzing, except a planned-safety-shutoff warning, which always comes through.
- No account, no sign-up, no ads. Your saved areas stay on your device.
An outage started at your location, the restoration estimate moved by more than 30 minutes, power was restored, or a PSPS warning covers your area. Quiet hours are respected for everything except PSPS. Nothing else, ever.
Outage detail includes a short, calm answer to "why is my power out and when is it coming back," rendered by Claude Haiku from the structured feed data only. The model is not allowed to invent restoration times or causes, and responses are cached per outage update so it stays fast and cheap.
flowchart LR
PGE["PGE ArcGIS<br/>outage feed"]
subgraph cloud ["Google Cloud Run"]
direction TB
Poller["Poller<br/>fetch every 5 min,<br/>diff vs last state"]
API["Public API<br/>reads + subscribe"]
end
FCM["Firebase<br/>Cloud Messaging"]
App["Android / iOS app"]
GCS[("State<br/>GCS")]
FS[("Subscriptions<br/>Firestore")]
PGE -->|poll| Poller
Poller <--> GCS
Poller -->|match changes| FS
Poller -->|push| FCM
FCM --> App
App <-->|subscribe, read outages| API
API --> GCS
API --> FS
A poller on Cloud Run reads PG&E's feed every five minutes, diffs it against the previous snapshot, matches changes to saved areas, and sends pushes through FCM. A separate public API serves reads and subscriptions to the apps and to a small web status page at /. Devices never poll PG&E directly. Raw snapshots are recorded so a real outage day becomes a regression fixture.
| Layer | Built with |
|---|---|
| App | Kotlin, Compose Multiplatform (one shared UI for Android + iOS), MapLibre |
| Backend | Python 3.12, FastAPI, uv, deployed to Google Cloud Run |
| Data | Firestore (subscriptions), Cloud Storage (feed state), Firebase Cloud Messaging |
| AI | Claude Haiku for the explanation card |
| Sources | PG&E public ArcGIS outage services, US Census ZCTA gazetteer |
Backend
cd backend
uv sync --extra server
uv run ruff check .
uv run pytest
uv run python scripts/dev_server.py # local API with fixture data on :8787Android
cd mobile
./gradlew :shared:testAndroidHostTest
./gradlew :androidApp:assembleDebugFirebase config for push goes in mobile/local.properties (see androidApp/build.gradle.kts). Debug builds work without it; push is simply skipped.
iOS builds from mobile/iosApp in Xcode on a Mac; docs/IOS_HANDOFF.md is the technical map and docs/TESTFLIGHT.md covers distribution, including the quarterly TestFlight build refresh.
See CONTRIBUTING.md for the full setup and PR flow.
OutageWatch has no accounts and collects no analytics. Your saved areas and a push token live on your device and in the backend only to deliver alerts. Full details in the Privacy Policy and Terms of Use.
- Found a bug or have an idea? Open an issue.
- Security report? See SECURITY.md.
- Want to help? CONTRIBUTING.md and the Code of Conduct.
Not affiliated with PG&E. Data comes from PG&E's public outage map and can lag behind reality. Do not rely on OutageWatch for safety-critical decisions. For emergencies call 911. Report downed power lines to PG&E at 1-800-743-5000.
MIT © Nic Glazkov




