NandaHack Step 2 a full submission you can explore
Step 2 · main event · full walkthrough

What a NandaHack submission actually looks like.

A live worked example, end to end. One service, one SkillMD, one agent test the judges will run. Then a second service that composes the first, because that is the point of a shared skills registry.

Team A · Service 1
Cheapest LLM Router
FastAPI · picks cheapest LLM at your quality bar
Team A · SkillMD 1
skill.md
Teaches an OpenClaw agent how to call the router
Team B · Service 2
Polite Email Rewriter
Composes the router as its LLM backend
Every button below makes a real HTTPS call to a Python service deployed on Render. First request after a quiet period wakes the container, which can take up to 60 seconds. After that, calls return in a few hundred milliseconds. Source in the repo.
01

The service we built

router-service/main.py

What it does

Give it a prompt and a minimum quality tier. It picks the cheapest model that meets the bar, tells you the estimated cost, and can optionally run the completion for you. Real routing math. Deterministic mock completions so the demo works with zero API keys.

GET /models POST /route POST /complete
Click "List models" to see the registry.

Try the router live

Same call an agent would make. Different quality bars → different models → different costs. This is the whole submission's value in one call.

Fire /route to see the routing decision, then /complete to run it.
02

The SkillMD the judge reads

skill.md

A vanilla OpenClaw agent gets nothing but this file. No hand-holding, no in-context examples of the API. If the agent can drive the service with just this, the submission scores well.

not loaded
Click "Load skill.md live" to fetch it from the router service.
03

The judge's test, agent uses skill.md alone

judge-demo/run_agent.py, in-browser edition

Play the role of a NandaHack judge. Their OpenClaw reads skill.md and must succeed at four user tasks without any other context. Below is that same test, running in your browser against the real service. If it turns green, this submission passes the "agent succeeds from SkillMD alone" criterion.

not run
Ready.
04

A second submission that composes the first

emailer-service · POST /rewrite

Why this matters

NANDA Town is a registry, not a project. The moment your router is registered, another team can build on top of it. Here is that second team: a Polite Email Rewriter. It takes a blunt draft, calls the router at a quality tier based on priority, and returns the softened email. Two agent-facing services, connected end to end.

team Ateam Bcomposed
POST /rewrite  ─────►  router:/complete
{                       {
  draft: "…",             prompt: "Rewrite…"
  tone: "warm",           min_quality: "basic"|"standard"
  priority: "normal"    }
}

Try it live

The reply will note which model it went through, that proves the composition.
05

Submit both to NANDA Town

POST /api/skills

Two ways to register on NANDA Town: the form at nandatown.projectnanda.org/skills, or one curl. Both call the same API. Once your service has a public URL, this is the whole submission.

Click to render the two curl commands you would run for these submissions.
06

How judging maps to what you just saw

rubric
Useful
Every multi-model app has to trade cost against quality. This service does it as a shared primitive so downstream teams do not each solve it.
Creative
Quality-tier abstraction. Callers reason in plain English (basic → frontier) instead of memorizing model IDs.
Easy to set up
Three endpoints, one required field, no auth, no keys. New models added in one JSON file.
Agent succeeds from SkillMD alone
That's the test in section 03. Green means it passes, the OpenClaw drove the API with no other context.
Composability bonus
Section 04 proved a second team can build on top. That is exactly what a shared skills registry is for.