We're excited to announce our newest challenge with Sanity!
The Sanity Challenge runs September 18 to October 4. Build an AI agent on structured content, or vibe-code an app with Sanity behind it. $2,500 in prizes.
New to Sanity? Sanity is the AI Content Operating System. Your content lives in the Content Lake as JSON documents, with schemas you define in TypeScript and query with GROQ. You can use Sanity to build anything that you can imagine with structured content as your starting point.
Read on to learn more.
Our Prompts
Path one: Ship an agent that queries real content
Build an agent, then point it at a Sanity Context MCP endpoint backed by a Knowledge Base. Any agent framework, hosted anywhere.
Build anything that needs an answer it can't afford to get wrong. A board game companion that knows the errata contradicts the rulebook. A better interface to your favorite open-source docs. A eurorack planner that knows what actually fits in your case. An award-travel agent that untangles which transfer partner story is current. A car repair agent? A camera gear-head compendium? The sky is the limit.
Point Sanity Context at a website, a set of files, or your own Sanity content, and it distills a navigable Knowledge Base your agent reads through MCP. Every entry stays linked to the source it came from. When two sources contradict each other, both claims surface side by side with their sources, and the decision you make carries across future builds. It all lives in your Sanity Dashboard.
Path One Submission Template
The strongest submissions will show an agent that only works because the content was structured. If a keyword search would have gotten you the same answer, aim higher.
Path two: Vibe-code something strange
Prompt your way to a working app. Any AI-native IDE, Next.js or Astro on the front, Sanity behind it.
This one is judged on the build as much as the result. How deep did you get into Sanity's features? Did you customize the interface? Build a new component to turn videos into gifs? Create a workflow that kicks off an external API call? A rough app with an honest writeup beats a polished one with three sentences.
Bonus points for reaching past the Studio. Two things we'd especially like to see prompted into existence:
-
App SDK: build a custom app on top of your content, with real-time data and your own interface, instead of another read-only frontend.
-
Workflows: model a process (content reviews, translations, and so on) as data next to the content, so an agent can move a draft forward and a person can approve it through the same transitions.
Neither is required. A submission that uses one well will stand out from a pile of blog templates.
Path Two Submission Template
One Extra Submission Requirement 📌
Every submission, both paths, needs to include your Sanity project ID or a link to a public dataset URL.
This lets the Sanity team look at how you actually modeled and used your structured content, which is a real part of judging. There's a section for it in both templates above. Submissions without it may be considered incomplete, so don't skip it.
Judging Criteria
Path one: Ship an agent that queries real content submissions will be evaluated for:
- Meaningful use of Sanity Context and structured content
- Technical implementation and code quality
- Use of Knowledge Bases
- Usability
Path two: Vibe-code something strange submissions will be evaluated for:
- Quality and honesty of the build process writeup
- Functionality of the finished app
- Thoughtfulness of the schema behind it
- Creativity and originality
Prizes 🏆
Three winners from Path one, "Ship an agent that queries real content," will receive:
-
$500 USD cash prize
-
DEV++ Membership
- Exclusive DEV Badge
Two winners from Path two, "Vibe-code something strange," will receive:
-
$500 USD cash prize
-
DEV++ Membership
- Exclusive DEV Badge
All participants with a valid submission will receive a completion badge on their DEV profile.
How To Participate
Publish a post on DEV using the prompt submission templates above and be sure to include the required challenge tag: #sanitychallenge. You may submit to both paths, but you must create a separate post for each.
If your app requires logging in, please provide testing credentials in your submission and/or instructions on how to best test your application for judges.
Optional but encouraged: embed your agent session. Upload a transcript from Claude Code, Gemini CLI, Codex, GitHub Copilot CLI, or Pi, curate or slice the parts worth showing, and drop it straight into your post. It beats a screenshot, and for Path two it's the most direct way to show your work.
Head to the Agent Sessions uploader to get started. Two things to remember: uploads are unlisted by default, so use the Make Public button or judges won't be able to open your session. And check your transcript for keys and sensitive data before publishing. There's a redaction layer, but it won't catch every edge case.
Please review our judging criteria, rules, guidelines, and FAQ page before submitting so you understand our participation guidelines and official contest rules such as eligibility requirements.
Getting Started With Sanity 🚀
Important Dates
-
September 18: Sanity Challenge begins!
- October 4: Submissions due at 11:59 PM PDT
-
October 22: Winners Announced
We can't wait to see what you build. Questions about the challenge? Drop them in the comments below.
Good luck and happy coding!
Top comments (3)
Freezing the judge closes one failure mode, but an eight-task split leaves another: the optimizer can overfit the holdout indirectly through repeated keep/rollback feedback. Even without seeing task text, each accepted or rejected patch leaks one bit about the three held-out cases.
I would keep that set as a development gate and add a second, untouched audit set evaluated only after the search stops. Better still, rotate audit tasks from a larger bank and log cumulative evaluation queries. The integrity hash proves the rubric did not change; it does not prove the optimizer learned nothing about the examples through outcomes.
Just when I thought I was out, they pull me back in.
Let's goooo.