About Night Desk
Night Desk stamps a hold receipt. Why. Present. Missing. It never closes money.
A wallet can dump a review pile overnight — refunds, loyalty farms, card testing, a traveler. The failure mode is closing that pile because a model felt sure.
Gemini writes the note. A deterministic decide() stamps HOLD or ESCALATE. That is the whole vocabulary. There is no close path. If Gemini, Vertex, or Pub/Sub is down, everything holds. No silent deny.
Receipts are write-once: why, present, missing. First-open stamps persist even after rails come back. The public desk shows seeded hold receipts and does not call Vertex. A live shift is a token-gated POST. Without the token it is rejected. Shifts stay off.
Built during this hackathon on Gemini 3.5 Flash, Google ADK, Cloud Run, Firestore, and Pub/Sub. Project night-desk-507002. Live service: nightdesk on Cloud Run, us-central1.
Features and functionality
Technologies used
- Gemini 3.5 Flash (Vertex AI + ADC)
- Google Agent Development Kit (ADK)
- Google Cloud Run, Cloud Firestore, Cloud Pub/Sub
- FastAPI, Next.js, TypeScript
- Python 3.12
Other data sources used
Synthetic wallet cases in sample_data/cases.json. No production customer data.
Findings and learnings
- The valuable overnight move is stamping a hold receipt the desk can still see.
- A write-once receipt is how fail-closed stays honest when rails come back.
- The public demo must not call Vertex. Seeded receipts plus a token-gated shift is the proof.
Google SDK used
Google ADK (google-adk) + Gemini via Vertex (google-genai). Firestore and Pub/Sub clients.
Date started
29 August 2026
Architecture
Architecture diagram: https://github.com/pamu512/night-desk/blob/main/docs/architecture.svg
Pre-existing / third-party code
Google ADK, google-cloud-firestore, google-cloud-pubsub, FastAPI, Next.js. New repo. No copied product source.
Team
Anoop Pamu ([email protected], GitHub pamu512)
- Two-way decide() only: HOLD or ESCALATE. Close verbs remap to HOLD.
- Fail-closed when Gemini, Vertex, or Pub/Sub is missing.
- Write-once receipts (why / present / missing). GET does not restamp.
- Gemini drafts the note; policy disposition wins.
- Public Cloud Run desk with seeded HOLD receipts. Live shifts off. POST /api/shifts is 403 without SHIFT_TOKEN.
- Sample 10-case queue. First-open: HOLD 10, ESCALATE 0. Nobody disappears.
- Cloud Run + Firestore + Pub/Sub. Min instances zero.
Built With
- cloud-run
- fastapi
- firestore
- gemini
- google-adk
- next.js
- pub-sub
- python
- typescript
- vertex-ai

Log in or sign up for Devpost to join the conversation.