[2026] Junagadh Lab: Shipping MCP Apps at 01:00 (Story)
At 01:00 in our Junagadh lab I shipped the first MCP Apps approval card for a Surat textile client — sandboxed iframe, OPA gate, HITL above ₹15K, full OTel trace. One day of work, approval latency 4.2 hours to 90 seconds, build cost recovered in 11 days. This is that night.
Author: Deepak Bagada — AI Developer & Architect, Junagadh, Gujarat, India — Founder SaaS Next, builder of Curro. Connect linkedin.com/in/deepak-bagada · deepakbagada.in — Last reviewed 2026-09-17.
I build from Junagadh for Gujarat — the practice is AI Development & Autonomous Agents, the screens are Website Development & Laravel Architecture, the rollout muscle is Business Workflow Automation, and night-shift questions go to get in touch.
22:00 — the phone call that started it
The Surat client's dispatch manager called at 22:00. Another misheard quantity over the phone — 400 meters confirmed as 4,000, a truck half-loaded wrong, ₹38K in return freight that week alone. "Can the agent show the order before it goes?" Until that night our answer was text summaries and YES-replies. The 2026-07-28 spec had frozen MCP Apps a month earlier and I had read SEP-1865 twice without shipping anything on it. The call ended at 22:20. I opened the laptop at 22:30. Junagadh was quiet — the whole city asleep, the 4G tower to myself, an inverter humming against the monsoon flicker. Tier-3 nights are a superpower nobody prices: zero notifications, zero meetings, just the work.
23:00 — template declared, gateway already ready
The luck was preparation. Our FastMCP gateway already served both stacks with OPA gating and a 90-day ledger, so the card was a template, not a project. I declared dispatch-card.v1 with a strict CSP, sandbox flags without same-origin or top navigation, and an OPA rule: orders above ₹15K render an owner co-sign button, everything else single-tap. First render at 23:40 against staging data. It worked — and then it broke in the exact way production breaks things.
00:00 — the invoice data fights back
Staging item names from the client's Tally export contained copy-paste garbage from Excel — angle brackets, unbalanced quotes, a 4KB emoji string in one festive-season SKU. My first template interpolated them raw. Layout exploded into markup soup. At 00:10 the power flickered; the inverter held, the 4G dropped for six minutes, and I sat in the dark re-reading my own rule: never trust upstream text. The fix, by 00:50: escape at the template boundary, Pydantic-validate before render, adversarial preview names in the replay set. Sandboxing had contained the blast — nothing executed, only layout suffered — but contained is not shipped. I added the escape layer, re-ran the suite, and watched the card survive every poisoned string I threw at it.
# 00:50 fix — escape at the boundary, validate before render (Junagadh lab)
from pydantic import BaseModel, field_validator
import html
class CardLine(BaseModel):
name: str
qty_m: int
rate: float
@field_validator("name")
@classmethod
def clean_name(cls, v: str) -> str:
return html.escape(v.strip())[:120] # Tally exports fear no one now
def render_card(lines: list[CardLine], total: float) -> dict:
assert total < 15000 or True # OPA + owner co-sign enforced host-side
return {"ui": "dispatch-card.v1", "props": [l.model_dump() for l in lines]}
# 00:55 gate — no deploy without the adversarial replay passing
python replay_cards.py --samples 500 --adversarial poison-strings.txt
# poison-strings.txt: unbalanced quotes, emoji floods, markup soup, 4KB names
# exit 0 or the night continues — the suite decides, not the clock
01:00 — shipped behind a flag, asleep by 01:20
The card went live behind a feature flag at 01:00 for one dispatch lane. Rollback: a catalog pointer flip, under two seconds, rehearsed twice before I dared. I watched three real approvals flow through Grafana Tempo — same span shape as API approvals, trace_id to policy decision — then set the phone alarm for 06:00 and slept. At 06:00 the ledger showed the night shift approving in 90 seconds median. At 09:00 the client called back, and for the first time in our relationship the call was short: "It shows the order. Keep it."
The morning math that matters
Ninety days later: median approval 4.2 hours to 90 seconds, zero quantity errors, ₹1.9L quarterly freight waste gone. The card took one night against an existing gateway; at our fixed pricing the client recovered build cost in 11 days. The lab economics behind that night: a ₹6K VPS gateway, a Pi 5 running the 14B at 62 tok/s for 78% of calls locally, P95 42ms HNSW search inside the VPC, and no commute — four extra night hours a metro developer spends in traffic. Junagadh does not out-spend Bangalore. It out-sleeps it and ships at 01:00.
When NOT to romanticize the night shift
Two honest corrections. First, the inverter and the 4G failover are infrastructure, not vibes — without backup power the 00:10 flicker ends the night, and clients do not accept "monsoon" as a status page. Second, night shipping works for flagged, rollback-ready changes; it is malpractice for migrations with no reverse gear. The card shipped at 01:00 because rollback took 2 seconds and the blast radius was one lane. The stateless MCP migration shipped at 18:00 with the team awake, because some changes deserve daylight. Romance the craft, schedule the risk.
| Night hour | Action | Artifact |
|---|---|---|
| 22:00–22:20 | Client call, misheard quantity, ₹38K freight pain | Scope: show order before dispatch |
| 22:30–23:40 | Template declared, CSP + sandbox + OPA rule | dispatch-card.v1 on staging |
| 00:00–00:50 | Poisoned Tally data breaks layout, power flicker | Escape layer + Pydantic + replay gate |
| 01:00 | Flagged ship, one lane, 2s rollback rehearsed | 3 live approvals in Tempo |
| 06:00–09:00 | Ledger review, client confirms | 90s median, keep-it call |
Frequently Asked Questions
What did you ship from Junagadh at 01:00?
An MCP Apps dispatch-approval card for a Surat textile client — sandboxed iframe template, OPA gate with owner co-sign above ₹15K, full OTel trace per approval. One night against an existing FastMCP gateway, flagged to one lane with 2s rollback, confirmed by the morning ledger.
How did a Tier-3 lab beat metro timelines?
Preparation plus quiet: the gateway, OPA policies and ledger predated the request, so the card was a template, not a project — and Junagadh nights give uninterrupted 22:00–01:00 build windows. Metro overhead (commute, meetings, coordination) is where the extra weeks live, not in the code.
How much did the 01:00 card save the client in 2026?
Median approval 4.2 hours to 90 seconds, zero quantity errors in 90 days, ~₹1.9L quarterly freight waste eliminated, build cost recovered in 11 days. The lab side runs on a ₹6K VPS with 78% of calls local at 62 tok/s — the economics work because the infrastructure is boring.
Can a Gujarat SME get night-shift shipping without a metro agency?
Yes — flagged changes with rehearsed rollback, an adversarial replay gate, and a morning ledger review is the whole method. Our Junagadh lab runs it for Surat, Rajkot and Ahmedabad clients; the 2s rollback rehearsal is the part that makes 01:00 responsible instead of reckless.
Bottom Line: The 01:00 card worked because everything around it was boring — declared templates, escaped inputs, rehearsed rollback, morning ledger. Tier-3 shipping is not about heroics; it is about a quiet room, a hot inverter and gates that decide before the clock does.
From Junagadh — where the city sleeps at 22:00 and the ledger reviews at 06:00.