Canada's Parliament, in your pocket — an iPhone app for tracking MPs, bills, votes, debates, expenses, and lobbying activity from official Canadian government sources.
epac turns the House of Commons record into something more readable than a feed of PDFs, XML, and committee pages. The app lets Canadians follow what MPs actually do between elections: how they vote, what bills they sponsor, what gets said in debate, and which topics are active in Parliament.
One of its core ideas is Hansard as chat. Instead of treating parliamentary debate as a wall of transcript text, epac presents speeches in a conversational format that is faster to scan on a phone while still staying grounded in the official record. The goal is not commentary or partisanship; it is a civic tool that makes primary-source parliamentary data easier to browse, search, and verify.
This repository is intentionally polyglot because each part of the product does a different job:
- SwiftUI + SwiftData (
ios/) — the iPhone app, widgets, app clip, local persistence, and product UI. - Go services (
backend/) — API endpoints, ingestion workers, and backend jobs that fetch, normalize, and serve parliamentary data. - Python tools (
backend/andscripts/) — focused ingestion utilities, release helpers, localization checks, and evidence/marketing tooling. - HTML/CSS/JS (
website/) — the public website, landing pages, topic pages, and App Store support web surfaces. - Data snapshots (
data/and bundled app assets) — source-derived files that help feed the app experience.
Together, those layers support the same product loop: gather authoritative public data, structure it, and deliver it in a mobile experience that makes Parliament easier to follow.
Requirements:
- Xcode with iOS 17+ simulator support
- macOS
Open the project in Xcode:
open ios/epac.xcodeprojThen select the epac scheme and run it in the simulator.
Alternatively, build from the command line using the provided ios/Makefile. This path is recommended for first-time contributors as it automatically finds an available simulator.
First, install xcbeautify:
brew install xcbeautifyThen build and run:
cd ios
make build # Build the app
make simulator # Build and deploy to an available simulatormake simulator automatically targets an available iPhone simulator. To target a specific one, you can override SIM_NAME:
cd ios && make simulator SIM_NAME='iPhone 16'If you prefer to use xcodebuild directly, you can list available simulators with xcrun simctl list devices available and then specify one:
cd ios
xcodebuild -project epac.xcodeproj -scheme epac -destination 'platform=iOS Simulator,name=YOUR_SIMULATOR_NAME' buildRequirements:
- Go 1.24+
- Python 3
Install the repo's Python dev dependency:
pip install -r requirements-dev.txtUseful local checks:
cd backend/search && go test ./...
cd backend/hansard-backfill && go test ./...
python3 backend/cabinet/cabinet_ingest.py --dry-runThe iOS app is the main product surface; the backend services and scripts exist to ingest, shape, and publish the public parliamentary data that the app depends on.
Issues and pull requests are welcome. Start with CONTRIBUTING, then read the Code of Conduct and Security Policy.
PRs may receive an automated first-pass review; humans review and merge.
Distributed under the MIT License.