Scout's third surface — the Android companion to the Scout engine (scheduled brain) and Scout.app (macOS daily driver).
What it does (v1):
- Action Items — today's vault list on your phone, sectioned 💡🔴🟡🟢✅, with mark-done
and snooze write-back through
scoutctl(the markdown stays canonical; this app is another wrapper around it, same as Scout.app). - Notification capture —
NotificationListenerServicepersists every system notification to a local Room DB, then forwards batches to the Mac-side bridge, which appends them to~/Scout/.scout-inbox/phone-notifications-YYYY-MM-DD.jsonlfor scheduled Scout sessions to consume. This is the phone-as-connector path that replaces the Google-Messages WebView bridge. - FCM push (dormant) — code-complete receiver + deep links; lights up when you add a Firebase config (below). Until then the Settings screen shows "Not configured".
Deferred to v2 (per the vault spec): SMS/Telephony.Sms ingestion, Health Connect,
QR-pairing, the ConnectorModule framework. RCS messages already arrive via notification
capture of com.google.android.apps.messaging.
bridge/run-bridge.sh # listens on :8787, prints the pairing secretThe secret auto-generates to ~/.scout-secrets/scout-bridge.secret (0600). The bridge wraps
scoutctl — make sure it's on PATH (~/.local/bin/scoutctl).
export JAVA_HOME=~/.jdks/temurin-21/Contents/Home
./gradlew :app:assembleDebug
adb install app/build/outputs/apk/debug/app-debug.apk # USB debugging onQR (recommended): the bridge prints a QR code on startup (brew install qrencode for the
nice rendering; otherwise it prints the pairing link as text). In the app: Settings →
Scan QR to pair — URL + secret fill themselves and the connection is tested automatically.
Scanning with the stock camera app also works: the scout://pair link opens Scout and pairs.
Manual fallback: Settings → Bridge URL http://<mac-lan-ip>:8787 + the printed secret →
Test connection. Either way, grant Notification Access afterwards and pick which apps Scout
may monitor (Settings → "Choose apps to monitor" — capture is opt-in, nothing is captured
until you select apps).
Transport is plain HTTP on the LAN, authenticated by the bearer secret. For off-LAN access, put both devices on a Tailscale tailnet and use the Mac's tailnet IP — no code changes needed.
- console.firebase.google.com → create project →
add Android app with package
com.jordanrburger.scout. - Download
google-services.jsonintoapp/(gitignored) and rebuild. The build applies the google-services plugin only when that file exists, and the app subscribes to topicscout-defaulton next launch. - Engine-side sender (follow-up work in
~/scout-plugin): POST to the FCM HTTP v1 API with a service account, data payload{"title","body","prefix"?,"urgency":"high"|"normal"}.
The Control Center tab is a remote mirror of the macOS Scout.app Control Center, served by the
bridge's GET /status (parsed from .scout-logs/ + schedule.yaml + connector-health.md):
- Now — is Scout running, and which session type; next scheduled run; today's token spend; connector health (ok / dark / unknown dots); a recent-runs list with outcome chips.
- Run a session now — pick consolidation / briefing / research / dreaming → a confirm dialog
(it spawns a real run on the Mac and spends tokens) → the bridge launches the matching
run-*.shdetached. Budget is pre-checked; if over budget you get a "Run anyway" prompt. One run at a time (guarded by the runner's existing lock). - Retry — a failed run's detail view has a Retry button (re-runs with
SCOUT_RETRY_OF).
The Control Center polls /status every ~15s while open (5s briefly after you launch a run).
./gradlew test # JVM unit tests (no emulator needed)
(cd bridge && python3 -m unittest discover tests) # bridge tests
bridge/tests/e2e-smoke.sh # end-to-end against a fixture-copy vaultDesign specs + implementation plans are maintained privately (they reference the author's personal Scout vault); this public repo carries the app + bridge code, its tests, and synthetic test fixtures.