-
-
Follower acknowledgement moves the deployed cockpit to FOLLOWING ACTIVE while Cloud SQL keeps route and mission authority.
-
Reload restores the same follower room, acknowledgement, and both messages—coordination only, with no route authority.
-
Cloud Run and ADK/Gemini assemble evidence; the pilot and deterministic policy commit to Cloud SQL; Firestore coordinates only.
Inspiration
Remote lakes often have no destination identifier or weather station, but aviation briefing tools are identifier-keyed. Waterline starts from the route geometry instead: it narrows live FIR-wide hazards to the corridor, infers a bounded destination read from nearby observations, and keeps the pilot - not the model - in authority.
What it does
Waterline runs an eight-agent ADK briefing fleet over live NAV CANADA inputs. PostGIS performs exact corridor intersection, Cloud SQL/pgvector recalls owner-scoped acknowledgements, Gemini extracts a typed synthetic condition card, and deterministic checks reject east-cove plan v1 before proposing west-cove v2 for pilot review.
The run stops at ATTESTATION REQUIRED. One authenticated pilot action atomically commits a Cloud SQL handoff receipt and displays a signed one-hour QR invitation. The responsible person scans it, acknowledges flight following, and exchanges bounded realtime text with the pilot through Firestore. The cockpit changes to FOLLOWING ACTIVE · LIVE VIA FIRESTORE. Replaying the command returns the same receipt, QR, token, and expiry.
Firestore is deliberately not authoritative: its messages cannot change route, attestation, or mission state.
How we built it
- Google ADK and Vertex AI Gemini for the private briefing fleet
gemini-embedding-001for owner-scoped destination recall and advisorygoogle/gemma-4-26b-a4b-it-maasfor cardinality-preserving NOTAM ranking- Cloud Run public Next.js edge and private FastAPI agent
- Cloud SQL PostgreSQL/PostGIS/pgvector for spatial queries, durable missions, owner memory, and duplicate suppression
- Firebase Anonymous Auth plus a Cloud Run authorization bridge
- Cloud Firestore realtime listeners with strict Security Rules and one-hour TTL
- Secret Manager, keyless service accounts, Cloud Build, and Artifact Registry
Challenges
The hard part was separating four kinds of power: models may read and propose; deterministic code validates and writes; the authenticated pilot authorizes; Firestore coordinates without acquiring route authority. The signed invitation also had to be reproducible after refresh without storing the raw capability, so Waterline persists only expiry and SHA-256 and reconstructs the exact token from durable mission state.
Accomplishments
- Exact geometry-keyed NOTAM reduction instead of identifier lookup
- Typed visual extraction with digest-bound validation and hash-only hostile-text quarantine
- Owner-scoped source-digest memory with changed hazards resurfacing
- One durable handoff receipt under replay/concurrency
- One-hour, two-member Firestore room with fixed acknowledgement and bounded direct chat
- Emulator tests for unauthenticated, cross-room, expired, spoofed, oversized, extra-field, update, and delete denial
What we learned
The safest architecture was also the clearest demo: Cloud SQL remains the source of truth, Firestore is labelled ephemeral coordination, and a prominent boundary states that messages cannot mutate aviation authority. Realtime UX does not require realtime authority.
What's next
Expand only with cited, versioned water-aerodrome data and operator-reviewed escalation workflows without broadening model authority.
Upstream contribution
Building Waterline surfaced an import-time Google ADK defect: importing the supported programmatic LlmAgent API emits a deprecation warning from ADK's own internal BaseAgentConfig subclass. We reported a clean reproduction across ADK 2.7.1, 2.8.0, and current upstream main, with a narrow regression-test proposal. Issue: google/adk-python#6968.
Built With
- cloud-firestore
- cloud-run
- cloud-sql
- fastapi
- firebase-anonymous-auth
- gemini-3.5-flash
- gemini-3.6-flash
- gemini-3.7-flash
- gemma-4-26b-maas
- google-adk
- maplibre
- next.js
- pgvector
- postgis
- postgresql
- secret-manager
- vertex-ai
Log in or sign up for Devpost to join the conversation.