Inspiration
I grew up in Shanghai, around crafts that families pass down, like Gu embroidery. I came to Cal Hacks to build something for makers like that: people with real skill and very little time to sell. Anthropic's mentors pushed me on one question. Who gets the least help? If not us, who's going to help them? That question led me to Native American makers. Selling online takes time, broadband and marketing reach, and many makers on tribal lands don't have all three. In March 2024 the FCC reported that broadband at its 100/20 Mbps benchmark still hadn't reached more than 23% of people living on Tribal lands (FCC). Fakes make it worse: in August 2026 a San Francisco eBay seller admitted selling more than $92,000 of counterfeit Native American jewelry (Indian Arts and Crafts Board). Yes, Cindia works like Etsy. But a marketplace hands you a shop to run, and a co-op on it gets one payout to split by hand. Cindia runs the shop for the makers, pays each one, and shows the buyer that the person who made the piece got paid.
What it does
Cindia does the selling, the marketing and the books for makers, so they can keep making. The demo follows the Diné Weaving and Silver Co-op, a fictional co-op on the Navajo Nation, and its maker Grace N.
For buyers
- Vibe search for gifts. You describe who the gift is for: "a warm, bold gift for my mom. she loves red wool. under $200." Cindy turns it into keyword chips you can edit, and our own embedding model finds pieces that fit, each with the reason it matched.
- Where your money goes. Before you pay, the piece page shows the split. Of Grace N.'s $180 weaving, $134.48 goes to her, after $22 for materials, an $18 Cindia fee and a $5.52 card fee. Through the gallery, she'd get $86.
- Help from a swarm. Ask whether she wove it herself, and small agents answer from the co-op's records only. A check confirms every quote is really in the record. A question only the maker can answer goes to her, and her reply comes back in her own words.
- A receipt that keeps going. It says "Received" at checkout and turns to "Paid to the maker" when her payout goes out, with a note from her. ###For makers and their co-op
- Listings from notes. A maker writes a few lines. Agents draft the listing, check it against the community's rules, strike any claim her notes didn't make, and our model indexes it. The manager approves before it goes live.
- The books, done. Cindy replays the co-op's month across every channel it sells on and matches every payout, bundled ones and refunds included.
- The catch. The gallery paid $340 less than the contract says. Cindy puts the contract, the statement and the bank record side by side, says which one to trust, and drafts the follow-up. Nothing goes out until the manager approves it with her seal.
- Pay that explains itself. The month closes into a real Excel file. Grace N.'s statement shows $95 held until the gallery pays, and says why.
- A counterfeit watch. Cindy scans a sandbox market for listings that use the co-op's name or copy its words. The manager decides, and nothing is sent.
- Fair by design. Search ranks by fit, not ads. Surprise me leans toward makers who sold less this month, with the weights on screen. Cindy's agents fill three seats: bookkeeper, collections and support. A person approves anything that moves money.
How we built it
Cindia stands on three pillars, and every sponsor tool has one job in it.
- A swarm of small Claude agents. 21 roles, each with one narrow job. Fifteen run on Claude, on claude-haiku-5-5 and claude-sonnet-5-5 only, and a server test fails on any other model ID. Six are plain code, labeled rule-based. Cindy routes and merges but holds no facts. Code fills every number, date and quote, and no agent can emit an approval, a payout or a money move. A live help answer takes about 6 seconds.
- Our own embedding model. We fine-tuned intfloat/multilingual-e5-small on 926 buyer-style queries that Claude wrote about the catalog: 3 epochs, 45.8 minutes on CPU, published to a private Hugging Face repo. The Indexer embeds every new listing the moment it's drafted. We scored it on 50 held-out test queries, written separately and never used for training (recall at 5 / MRR at 10): ◦ Keyword search: 0.784 / 0.875 ◦ The base model: 0.722 / 0.781 ◦ Cindia's model: 0.789 / 0.892 ◦ Local hybrid (our model plus keywords): 0.825 / 0.940 ◦ Elastic hybrid: 0.819 / 0.887 ◦ It's a small test, not a benchmark.
- One database that holds everything. SpacetimeDB is the system of record: the catalog, listings, orders, approvals, every swarm run and step, and the screens watching. Its tables are private, and only the publisher can write. The data view shows the tables live. The other tools, one job each
- Elastic: hybrid search over our own vectors plus keywords, with the Agent Builder agent cindia-finder answering find questions.
- Apify: the Cheerio Scraper crawls our own sandbox market at cindia.design/market for copies of the co-op's pieces. It never crawls the real web.
- Capital One's Nessie: sales post as deposits and payouts as withdrawals, and the books read the bank side back from Nessie, so the $340 catch is found in Nessie's own records. Nessie is a sandbox bank, so no real money moves.
- Figma: research, moodboards, style tiles, 24 screens and three handoff drops, all through the Figma MCP server, plus a Slides deck that mirrors the pitch.
- Cloudflare Pages and a GoDaddy Registry domain: the public site at cindia.design.
How the build ran. I built Cindia alone, with a team of Claude Code agents: an orchestrator, feature leads, builders, verifiers, an integrator, backend builders, a scribe and a design lead. I wrote the plan and the contracts and made the calls. Each agent could write only its own files, hooks blocked everything else, and nothing moved past a gate until its checks passed and a verifier signed off. Stack: React, TypeScript, Vite, Tailwind CSS, Motion, Recharts and SheetJS in the browser. Python, FastAPI and the Anthropic SDK on the server. sentence-transformers and PyTorch for the model. Playwright, Vitest and pytest for the tests.
Challenges we ran into
- School work. I had schoolwork to do, not to mention that I'm doing it solo. So I started work on the project Saturday morning, which was about 12 hours less than the other participants.
- Changing who it's for, halfway through. Cindia started with a Chinese embroidery studio. On Saturday afternoon I narrowed it to Native American makers. We re-skinned the whole money story onto a new co-op and kept every number, so the checks could prove nothing broke: the $180 weaving, the $134.48 maker share, the $340 short payment and the $95 held.
- Telling a story about communities we haven't worked with. Every maker, community and story is fictional, and the site says so on every page. Verification shows as demo verification. The drawings use plain geometry, and seven of the 54 went back to placeholders after my own art check. Nothing shows a feather, a figure or a sacred design.
- A demo that can't fail, on a backend that's real. The tour is always scripted, so it plays the same every time and never waits on a network. Live mode answers people's own questions. A screenshot can't prove a live source answered, because the scripted fallback draws the same pixels, so the live tests check the data's source instead.
- A bank with no purchases. Nessie can't create purchases or transfers, so sales are deposits and payouts are withdrawals, and the books read the list back.
- Time budgets. Elastic's Agent Builder sometimes took longer than our 9.4-second budget, so find questions fall back to our own hybrid search when it does.
- The Claude API changed on Oct 21. No temperature, no top_p or top_k, and no prefilled assistant turns. Every agent call was written for the new API, with typed inputs and outputs and a check after each call.
- English only, at midnight. The first version shipped every label in two languages. Our buyers are American, so at 11:35 PM we took the second language off every screen without reopening a green feature.
Accomplishments that we're proud of
- A tour that never misses. The 220-second tour plays all 20 beats the same way every time. It passed its demo gate 5 of 5: three full runs in a row and one with the network cut.
- The catch. The matcher caught 4 of 4 planted errors, and the $340 short payment is found in the bank's own records.
- Our own model holds up. Fine-tuned on queries Claude wrote, it beats keyword search on MRR at 10 (0.892 against 0.875), and our local hybrid reaches 0.940.
- ixteen live upgrades. Each one swaps a scripted source for a real service: Claude, Nessie, Elastic, SpacetimeDB, Apify and our model.
- Honest by default. Every panel still on scripted events carries a Simulated badge, and the end card lists what's live and what isn't.
- One person, one weekend. I built it alone, with a team of agents I planned and checked, and design ran from research to code through the Figma MCP server.
What we learned
- Scope is the feature. The project got better the moment I chose one community to start with and said no to the rest. One named co-op, one weaving and one maker carry the whole story.
- Contracts first, agents second. The agents worked best when every name, event and number was written down before any code. When two agents disagreed, the contract settled it.
- Agents need gates. A builder will tell you it's done. A verifier that never fixes anything, and a gate that runs the checks itself, tell you whether it is.
- Fictional still needs care. Even made-up makers stand in for real people. Writing the labels, the verification lines and the cultural rules took as long as some features, and it should.
What's next for Cindia
- Start with the communities, not the code. Work with Native-led arts organizations and the co-ops themselves, and let each community write its own page and set its own rules.
- Use the marks that already exist. In a real launch, makers would be enrolled members of their nation or certified by it as Indian artisans, as the Indian Arts and Crafts Act defines. Cindia would keep only a yes or no, never issue a mark of its own.
- Put live mode online. Today live mode runs on my laptop. Next is a hosted API, so anyone can try their own search or question.
- A real storefront builder, so each co-op builds its own page at its own link.
- Other underrepresented makers, each community only with that community's own organizations.
Built With
- anthropic
- apify
- claude
- claude-code
- cloudflare-pages
- elastic-agent-builder
- elasticsearch
- fastapi
- figma
- hugging-face
- motion
- nessie
- openpyxl
- playwright
- python
- pytorch
- react
- recharts
- sentence-transformers
- sheetjs
- spacetimedb
- tailwindcss
- typescript
- vite
- vitest
Log in or sign up for Devpost to join the conversation.