One glance, everything local. Weather, traffic, police, city status, and news for Ottawa.
Scopes pulls together Ottawa's daily civic signals: city service status, weather, traffic, police updates, and curated local news, all in one fast, honest dashboard. Nothing here is fabricated or placeholder. If it's shown, it's real.
The mobile app is React Native and Expo, with MobX-State-Tree for state and React Navigation for routing. The API is a set of TypeScript scrapers running on a schedule, backed by Firestore, with OpenAI generating the summaries, deployed on Vercel. A shared TypeScript package keeps data shapes in sync between the app and the API. It's all one Yarn workspaces monorepo, with GitHub Actions running the scheduled jobs.
apps/
mobile/ # React Native app
services/
api/ # scrapers + summary generation (Firebase-backed)
packages/
shared-types/ # shared TypeScript types
Status: the scheduled pipeline is currently paused, so data in the app may be out of date.
Each scraper lives in services/api/scripts and runs on its own schedule via GitHub Actions (.github/workflows):
| Script | Schedule |
|---|---|
scrape:news |
hourly |
scrape:status |
every 6 hours |
scrape:police |
every 2 hours |
scrape:traffic |
every 30 min |
scrape:weather |
every 30 min |
generate:summaries |
hourly |
All Firestore access goes through a single env-aware repo layer (services/api/lib/firestore-repo.ts) so dev and production data never mix.
yarn install
yarn workspace scopes start # mobile app (Expo)For the API/scrapers, copy services/api/.env.example to services/api/.env.local, fill in FIREBASE_SERVICE_ACCOUNT and OPENAI_API_KEY, then:
yarn workspace api run scrape:news

