Zango App Developer

One prompt. A full working app.

Brief the agent like a teammate — tell it what the app tracks, who uses it, and how records move. The zango-app-developer skill handles the rest: models, roles, workflows, and AI agents, all baked in, nothing to configure.

skill · v3

generated build
expense-desk

Build a Zango app where employees submit expense reports. An AI agent reads each receipt, checks it against company policy, and flags anything over limit or missing a receipt.

Then it routes automatically — clean, small claims auto-approve; the rest go to the right manager by amount and department. Finance sees everything, and every decision is logged.

expense-desk-prd.md Product requirements · 4 pages
Attached

Build the Zango app described in this PRD filemodels, roles, workflows, and AI agents included.

Walkthrough
Full recording — prompt to running app, narrated step by step
Prompt → self-running app in Claude Code
Watch the zango-app-developer plugin build a working app from one plain-English brief
00:00 · Prompt
00:22 · Roles
00:48 · Policy check
01:15 · Auto-routing
What the Agent Built
Real screens from the generated app — flip through them, nothing mocked
Screen 1 of 3 · Sign in
Spendly sign-in screen
Claim detail with the AI review and verdict
Expense policies table
Authentication
Sign in, generated with the app
A real login screen with roles already wired in — employees, managers, finance and admins each land on exactly what they're allowed to see.
AI Review
It reads the receipt and shows its work
Open any claim to see the agent's read — extracted vendor and amount, the policy checks it ran, and a risk verdict, here a clean, low-risk claim.
Policy Engine
The rules it enforces
Per-category limits, auto-approval thresholds and receipt rules — the same policies the AI tool checks every claim against.
Code the Agent Wrote
Real generated files from the expense app — highlighted lines show the decisions the skill made
12345678910111213
class ExpenseClaim(DynamicModelBase):    employee = ZForeignKey(Employee, on_delete=models.PROTECT,tenant-aware platform field                          related_name="claims")    department = ZForeignKey(Department, on_delete=models.SET_NULL, null=True)    total_amount = models.DecimalField(max_digits=14, decimal_places=2)    assigned_manager = ZForeignKey(Employee, on_delete=models.SET_NULL, null=True)     # AI / rule review results    ai_reviewed = models.BooleanField(default=False)    ai_risk = models.CharField(max_length=10, choices=RISK_CHOICES, null=True)AI writes its verdict    is_suspicious = models.BooleanField(default=False)    ai_summary = models.TextField(null=True, blank=True)    ai_flags = models.JSONField(default=list, blank=True)
Every field is a typed platform model — including where the AI review stores its risk verdict — so it's tenant-aware and audited without any extra wiring.
1234567891011121314
from zango.ai.tools.decorator import ToolParam, ToolSafety, tool @tool(a tool the agent can call    name="get_expense_policies",    description="Return the company's active expense policies…",    section="claims",    safety=ToolSafety.READ_ONLY,read-only, can't mutate)def get_expense_policies() -> dict:    policies = []    for p in ExpensePolicy.objects.filter(is_active=True):        policies.append({"category": p.category,            "per_expense_limit": float(p.per_expense_limit)})    return {"policies": policies, "count": len(policies)}
Rather than guessing spending limits, the agent calls this read-only tool to pull the real policy rows from the database, so its decisions stay grounded in live data.
123456789101112131415
class ExpenseClaimWorkflow(WorkflowBase):    status_transitions = [        {"name": "draft_to_under_review", "display_name": "Submit",         "from": "draft", "to": "under_review",         "roles": ["Employee", "Manager", "Finance", "Admin"]},        # … auto_approved, pending_approval, approved, paid …    ]     # Submit → run the AI review, then auto-route on its verdict    def draft_to_under_review_done(self, request, object_instance, txn):        from .ai_review import run_review        decision = run_review(object_instance, actor=_actor(request))returns 'auto' or 'manager'        target = ("under_review_to_auto_approved" if decision == "auto"verdict picks the path                  else "under_review_to_pending_approval")        self.execute_transition(target, allow_system=True)
When a claim is submitted, this hook runs the AI review and then moves the claim itself — auto-approving small, policy-compliant claims and escalating the rest to the assigned manager.
Generated Automatically
Platform primitives, from one prompt
Models and forms
Role-based access control
Receipt-reading AI agent
Branching approval workflow
Audit logging
Describe your app.
The skill builds it.
Open Claude with the zango-app-developer skill enabled and paste a starter prompt — or write your own in plain language.
# starter prompt
Build a Zango app where [people] submit [records]. An AI agent checks each one against [your rules] and routes it — auto-approve the clean ones, send the rest to [reviewer]. [Who] sees everything, and every decision is logged.