Inspiration
Most clothes and household goods that get thrown out still work. US landfills took in 11.3 million tons of textiles in 2018 alone (EPA). The problem isn't demand, it's effort: photographing, describing, pricing, listing and dropping things off. Meanwhile, people who need things dig through thrift stores hoping the right size turns up. We wanted one photo to be enough to give something away, and one sentence to be enough to find what you need.
How we built it
- Frontend: SvelteKit and Tailwind. The landing page hero is a three.js scene drawn as ASCII art.
- Agents: GLM-5.3-Flash on a Modal Endpoint turns a donor's photo into a catalog item, fills in what a requester didn't say ("moving to Chicago in December" → insulated, water-resistant), suggests prices from live eBay listings, and explains each match. A LangGraph concierge agent uses tool calls to price an item, check who nearby needs it, then list or donate it and say why.
- Backend: FastAPI. A deterministic orchestrator is the only code that touches the database. The agents are prompt-to-JSON functions, and every answer is checked against a schema.
- Matching: items and requests are embedded and ranked by cosine similarity with pgvector on Tiger Data:
$$\text{score}(q, v) = \frac{q \cdot v}{\lVert q \rVert \, \lVert v \rVert}$$
- Marketplace: listings are signed Nostr NIP-99 events, so they show up on Shopstr. If an item doesn't sell in 30 days, it moves to the donation pool.
- Impact: every agent step is logged to a Tiger hypertable, and a continuous aggregate feeds the live dashboard.
Challenges we ran into
- Donors and requesters use different words. Donors write "black puffer, size M"; requesters write "something warm for Chicago." The parser and the requester share one attribute vocabulary, so both sides end up close together in vector space.
- Letting an agent act for someone. The concierge can list or donate your things, so it acts once per item, only through the orchestrator. If the model fails, it falls back to a simple rule: donate if someone nearby is waiting or the item is worth under 15 dollars, otherwise list it.
- Live demos fail. Campus Wi-Fi blocked our Modal endpoint's domain. Every agent has a rule-based fallback, so the whole demo still runs offline.
- Four people, one repo, 24 hours. We wrote the API contract first and logged every change in a shared
SOURCE_OF_TRUTH.md.
What we learned
- Agents are easier to trust on top of a boring, deterministic layer: the model decides, and plain Python does the side effects.
- Open protocols lower the bar. Listing on Nostr needed no developer account or approval.
- Build the offline path first. It kept our 119 backend tests fast and gave us a working fallback when the network didn't cooperate.
Built With
- fastapi
- javascript
- python
- sql
- svelte
Log in or sign up for Devpost to join the conversation.