Inspiration
Isha Foundation volunteers meet the same viral allegations every week: land grabs, missing persons, fabricated scandals. The rebuttals exist in published articles, court records, and RTI responses, but finding the right one takes hours while the post spreads in minutes. We also knew what we did not want: a bot that auto-posts replies. The volunteer should stay the author. So we built a desk that hands them verified facts and gets out of the way.
What it does
Paste a claim, get a fact brief. Every statement in the brief carries a citation that links to a published source, and a chat tab handles follow-up questions with the same grounding. When the reviewed corpus does not cover a claim, Satya refuses with a fixed message instead of guessing. It never drafts ready-to-post replies, stores nothing a user types, and needs no login. The whole product is one page and one API route.
How we built it
We wrote a single goal document with nine ordered tasks, each with module contracts, exact copy strings, and a verification step, and OpenAI Codex executed it end to end: scaffold, corpus, index, retrieval, pipeline, UI, eval, deploy. The corpus is 20 markdown topic files curated from published sources, chunked and embedded at build time into a committed JSON index. At runtime a rewrite model turns hostile posts into neutral queries, cosine retrieval runs in memory, a similarity gate decides whether to answer, and generation streams a cited brief. Stack: Next.js, TypeScript, Tailwind, Vercel AI SDK, Gemini models, Zod, Vitest, deployed on Vercel.
Challenges we ran into
Refusal was harder than answering. A fabricated claim like "Isha runs a secret gold mine" still mentions Isha, so retrieval finds related chunks and the gate passes. We added a second guard in the generation prompt that refuses when the excerpts miss the specific claim, then built an 18-case eval that tests both layers. Mid-build we also had to switch embedding providers, and the similarity space changed under us: scores that clustered near 0.32 landed near 0.72 on the new model. We rebuilt the index, re-normalized every vector, and re-tuned the threshold until the eval went green again.
Accomplishments that we're proud of
The eval deck runs 15 hostile in-scope claims and 3 fabrications through the live pipeline, and all 18 pass: correct topics, valid citation numbers, refusals where refusals belong. A provenance script verifies every verbatim quote in the corpus against the canonical source texts, so a misquote fails the build. Warm responses start streaming in about a second. And the agent-built codebase shipped with tests, an eval harness, and a clean production deploy inside the hackathon window.
What we learned
Embedding spaces are not interchangeable; a retrieval threshold is a property of the model that produced the vectors, and it has to be re-tuned when the model changes. Refusal is a product feature that deserves its own eval rows, not an afterthought. Rhetorical source text makes a poor retrieval corpus, so we rewrote jokes and sarcasm as plain neutral fact. And an agent can build a full product unsupervised if the spec pins down contracts, exact strings, and pass criteria instead of intentions.
What's next for Satya
Growing the corpus is now an editorial task: one reviewed markdown file per new allegation, and the pipeline rebuilds itself. Tamil and Hindi briefs are the next big win for the volunteers who need them most. The source schema already supports court orders, police reports, and RTI documents as first-class citation types, so official records can join the article corpus. And the architecture generalizes to any organization that faces recurring misinformation with a finite set of documented answers.
Built With
- gemini
- nextjs
- node.js
- react
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.