A native iOS app for Mozilla engineers to monitor Firefox CI build status from their phone. Built for sheriffs, on-call engineers, and developers who want real-time build feedback without opening a laptop.
Try Pushes · Push Detail · Settings
- Live push list across mozilla-central, autoland, beta, release, and esr128
- Per-push platform status dots — color coded by worst result (green / red / orange / blue)
- Failure count badge and animated spinner for in-progress builds
- Tree status banner when the tree is closed or restricted
- Pull-to-refresh with last-updated timestamp
- Quick project switcher in the nav bar
- Full commit messages with clickable bug number links
- Jobs grouped by platform (linux64, win64, macos, android-arm64, …)
- Filter by All / Failures / Running
- Swipe left on any job to retrigger it
- Retrigger All Failed with a single tap
- Failure Summary — groups failed jobs by test name, shows affected job counts and raw error lines from TreeHerder log data
- All external links (TreeHerder, Taskcluster, Bugzilla) open in an in-app browser — tap Done to return instantly without leaving the app
- Duration shown for every completed job
- Filtered view of your own pushes via the TreeHerder
?author=API - Set your Mozilla email once in Settings
- LDAP / Mozilla email for the My Pushes tab
- Bugzilla API key for filing bugs directly from a failure
- Push notification opt-in (build failures, tree closures)
- Default repository preference
- Tier 2 job visibility toggle
| Source | Used For |
|---|---|
| TreeHerder | Push list, job results, retrigger actions, text log errors |
| TreeStatus | Tree open / closed / restricted status |
| Taskcluster | Task deep links |
| Bugzilla | Bug links from commit messages, filing new bugs |
BuildWatch/
├── Models/
│ ├── Push.swift — Push + PushRevision
│ ├── Job.swift — Job, JobResult, JobState, PlatformGroup
│ ├── TreeStatus.swift — Tree open/closed state
│ └── FailureLine.swift — TextLogError, FailureGroup
├── Services/
│ ├── TreeHerderService.swift — All TreeHerder + TreeStatus API calls
│ └── BugzillaService.swift — Bug filing
├── ViewModels/
│ └── DashboardViewModel.swift — @Observable state, drives all three tabs
└── Views/
├── DashboardView.swift — Push list
├── PushDetailView.swift — Jobs, quick actions
├── FailureSummaryView.swift — Grouped failure analysis sheet
├── MyPushesView.swift — Filtered to your pushes
└── SettingsView.swift — Preferences
State is managed with Swift's @Observable macro. All networking uses async/await with URLSession. The TreeHerder jobs response uses a compact [[Any]] format that's parsed with JSONSerialization and an index map built from the job_property_names field.
- Xcode 26+
- iOS 26+ device or simulator
- Mozilla network access (or VPN) is not required — all APIs are public
- Clone the repo
- Open
BuildWatch.xcodeproj - Select your team in Signing & Capabilities
- Run on device or simulator
No external dependencies. No package manager.
My Pushes tab — add your @mozilla.com email in Settings → Profile.
Bug filing — generate a Bugzilla API key at bugzilla.mozilla.org → Preferences → API Keys and paste it in Settings → Bugzilla Integration.
Retrigger / Acknowledge — these actions call authenticated TreeHerder endpoints. Full support requires a Taskcluster OIDC session (coming soon).
- Push notifications for build failures via FCM
- Acknowledge / classify failures
- Backout via Lando API
- File bug pre-filled with failure details
- WebSocket live updates from TreeHerder
- Intermittent failure history
- Sheriff mode — tree management quick actions
- Apple Watch complication for tree status
PRs welcome. File issues at bugzilla.mozilla.org under Firefox :: Developer Tools.
Built by @rcurranmoz · Maintained at mozilla-platform-ops/BuildWatch · Powered by TreeHerder


