Inspiration
Neighbourhood shops do not have agency retainers. They have a Google listing, a courtyard, and a phone.
For a decade, “AI for business” meant a chatbot on a homepage or a slide in a Fortune-500 deck. The models that could actually shoot a film sat behind specialist teams. The kirana, the salon above a chemist, the bakery in Indiranagar still bought ads the old way: a cousin with a phone.
Google’s 2026 stack changed the unit economics. Gemini 3.5 Flash is cheap enough to read a listing. Veo 3.1 is cheap enough, at list price, to shoot eight seconds. Cloud Run and Pub/Sub are cheap enough to run that work without a GPU laptop. All Things Agentic asked for agents that do the work, not chat about it.
We pointed that brief at India’s SMBs. Search and Maps already are the grass roots. The missing piece was an agent that treats a listing the shop owns as a brief, spends a few dollars of Vertex like a producer, and hands the owner a kit they still control. Cheap film posted without consent is just a cheaper mistake.
This repo is a ground-up built on Gemini 3.5, Google ADK, and Cloud Run.
What it does
Leadsy Flock is a five-bird studio. A shop pastes a Google listing or site it owns. Flo waits for a human YES. Then the flock produces a bilingual paste kit. Flo never autoposts.
- Scout grounds the listing with Google Search, Maps, and URL context. Evidence only — no invented second address, no fake UGC.
- Inka writes copy and starts Veo 3.1 from this shop’s own photos. Gemini Image fills a still only when there is no usable visual.
- Harvest polls Veo off the request path, muxes English + one Indic voice (Gemini TTS), crops with ffmpeg, retries Lyria.
- Ledge fail-closes copy: regex + Gemma classifier + Gemini judge. A reject revises once. It does not ship.
- Stella publishes a consent-first landing. Discovery is not consent.
- Ad Kit fans one master into Meta 4:5 / 1:1 / 9:16, WhatsApp, Google display / RSA, with UTMs. The owner pastes into Ads Manager.
Judges open the already-finished Glen’s Bakehouse seeded kit (google-listing-eaf57cae). Public listing, pipeline proof — we do not email, call, review, or YES that bakery. Hire, campaign writes, and ADK /run_sse are closed on the public roost so a blog link cannot burn Vertex.
The observatory shows tokens, tools, models, and Vertex list-price reconstruction for the seed: $6.41 · ₹545, almost all of it Veo at $0.40/s. That is not a Google invoice and not a sell SKU.
How we built it
Mandatory stack, used as the product spine rather than a checklist:
| Piece | Job |
|---|---|
| Gemini 3.5 Flash via Vertex | Flo, brief, copy, gate judge |
| Google ADK + A2A AgentCard | Flo is an agent, not a prompt file |
Cloud Run flock-api + flock-worker (asia-south1) |
Request-shaped work vs long work |
Pub/Sub campaign-steps |
One message, one step, one receipt; at-least-once + idempotency |
| Model Armor | Inbound text is not a prompt-injection toy |
| Search + Maps + URL context | Scout’s grass-roots record |
| Veo 3.1 | 8s place film + proof film, then stop |
| Gemini Image | Fallback still, not the default |
| Gemini TTS | English + Indic on the same picture |
| Gemma | Creative Gate classifier |
| Lyria | Jingle when quota allows; skip, don’t fake |
| Memory Bank, Firestore, GCS, Cloud Trace | Long context, receipts, films, audit |
Inka starts Veo and returns. A harvest sidecar polls operations.get, sleeps 12s, republishes itself (max 24). We do not hold a Cloud Run request open for eight seconds of video. ffmpeg derives 4:5 / 1:1 / 9:16 / 1.91:1 from one master so we do not buy the film twice.
Public surfaces for the event: /demo, /k/google-listing-eaf57cae, /l/google-listing-eaf57cae, /blog, /architecture, /dash. Everything else that could hire the flock or open ADK 404s.
Challenges we ran into
Veo-in-Inka was a timeout dressed up as a model failure. Waiting on the LRO in the same step that started it killed the worker. The fix was architectural: start, ACK, poll on a sidecar, never mark the campaign complete until bytes land in GCS.
Vertex is not one regional soup. Imagen 3 publisher IDs 404 after 30 Jun 2026 — stills moved to gemini-3.1-flash-image on global. gemma-3-12b-it 404s as a publisher model on this project’s us-central1, so the gate still fail-closes on regex + Gemini judge. Lyria 429s on this quota; harvest skips after two tries so a jingle cannot stall Scout → Ad Kit. Ephemeral google-genai 2.x clients raise Cannot send a request, as the client has been closed — we process-cache clients.
Veo RAI-filters faces when asset refs look like a person. Harvest falls back (9:16 no refs, then 16:9) instead of stopping on done_no_bytes. person_generation="dont_allow". We do not fake UGC to dodge the filter.
Do not contact a real shop. Glen’s is a public listing, not a customer. The seed is already finished. The theatrical /demo play does not POST /v1/campaigns.
A public write-up is an attack surface. Once the blog pointed at the roost, hire / YES / /run_sse were a way for a stranger to burn Vertex. We locked the API in the app (Cloud Run stays reachable so the kit still loads). GET / redirects to /demo.
Never autopost. The tempting last mile — push the kit to a Page — is the one we refused.
Accomplishments that we're proud of
- A ground-up Gemini + ADK + Cloud Run rebuild in the submission window, with a public disclosure of the earlier prototype.
- A deterministic kit: same listing, own photos, fail-closed gate, same paste shape — not a slot machine.
- Honest COGS on the observatory: $6.41 Vertex list-price for a bilingual courtyard kit, Veo as ~99% of the burn, no fake invoice, no hire SKU on the roost.
- Own pixels first. Scout +
own.pyfeed Veo. Gemini Image is a refine/fill, not a generated shop. - ffmpeg as a first-class engine. One 8s master, many crops. Lowest cost is a refusal to regenerate.
- Harvest sidecar so Flo can stay interactive while Veo works.
- Fortified fleet pieces with jobs: Model Armor, Memory Bank, Cloud Trace, A2A AgentCard, Gemma on the gate.
- A seeded Glen’s kit judges can open without us ever contacting the bakery — and a public lock so the tweet cannot become a Vertex bill.
What we learned
Lowest cost is a series of refusals: no Veo until YES, no wait on Veo in the interactive path, no second Veo for a square, no fake UGC, no autopost, no hiding the burn.
Determinism is a product feature for SMBs. Inventing a second branch or a dish the bakery does not sell is liability.
Long-running models belong on workers. Bonus models need real jobs or they are slides. Transparency is cheaper than a PDF. A demo URL is part of the threat model.
Google already has the grass-roots dataset: millions of listings, photos, hours, reviews. The agency was the missing runtime.
What's next for Leadsy
After the hackathon we will open hire again only for listings the operator owns — never a cold campaign on a stranger’s bakery. Telegram and Whatsapp Flo opens door to the simplest GTM strategy for businesses that are already on these channels.
On the engine: quota for Lyria so the jingle is a track, not a skip; Gemma as a publisher model where this project can actually reach it; The observatory should keep showing list-price burn in the open.
The product stays the same: paste a listing you own. Scout reads it. Inka films from this shop’s photos. Stella hands you a kit. Flo never autoposts.
Log in or sign up for Devpost to join the conversation.