Inspiration

Every shop shows you one number: the price. It's the wrong number. A €30 pan that lasts three years costs more over a decade than a €45 pan that lasts twenty, and the planet pays for the cheap pan four times over. Sustainability advice usually arrives as a lecture, so most people tune it out. I wanted the opposite: a wallet-first tool that treats the footprint as the bonus of the better-value choice, and shows its working on every figure.

The box came from a shipping box on the kitchen table. You write what you need on the outside, your answers become labels, and when it opens, what comes out isn't the product. It's the true cost, in labelled parts.

What it does

Tell it what you need and your budget, or paste a product link. Unboxed asks up to five questions that matter for that kind of product, each with the reason it's asked and where that reason came from. Then a team of agents finds up to three options at European shops and works out, for each one: the price with the shop it was seen at, cost per year and per use, an expected lifespan with the evidence it rests on, a CO2e range with its confidence label, and a ten-year comparison of one durable item against the cheap replacements it avoids.

Every price, cost and comparison is arithmetic done in code on figures found on real pages; a model never writes a number into the report. Where no published footprint exists, the CO2e is a model's estimate from the product's materials, and the page labels it "AI synthetic estimate" rather than passing it off as a fact. Unknown is shown as unknown. The app sells nothing and links out to shops.

How I built it

A LangGraph of agents, all on NVIDIA Nemotron 3 via Nebius Token Factory:

  • Supervisor (Nemotron 3 Nano): reads the request into a typed brief, in any language.
  • Brief agent (Nemotron 3 Super): researches what matters for the category and phrases the questions, with sources.
  • TCO analyzer (Super): finds candidates on comparison sites, confirms prices on the product pages, reads durability evidence and what owners and testers report.
  • LCA agent (Super, and Ultra as the last resort): a three-tier estimate. A published figure if one exists, a benchmark from materials and weights, and only when both fail, an estimate from the 550B model, with its own call limits and a time cap.

Three model tiers, chosen per call with evidence from measured runs: the big model runs for one job only. Every call returns structured output against a schema, and every quote a model cites is checked against the page it cites. Search is Tavily, page reads are Firecrawl. The backend is FastAPI with Server-Sent Events on a Nebius Serverless Endpoint; the frontend is Next.js on Vercel, with the box drawn in code (no WebGL, reduced motion respected). About 1,050 tests, most offline against recorded fixtures.

Challenges I ran into

  • Prices lie, quietly. A shop page for one kettle also mentions another kettle's price. Comparison sites quote a different seller than the one shown. bol.com, the largest Dutch shop, can't be read by the scraper at all. I ended up confirming every shortlist price on the actual product page, matching the amount to the product name, and dropping what couldn't be confirmed.
  • Prompt shape beats model size. The price read returned nothing for 11 of 14 candidates. Full reasoning didn't help (10 of 14). One entry per search result instead of one list did: 3 of 14. I measured each tier against the job and moved up only with evidence.
  • Making estimates honest. When no published footprint exists, the big model estimates from materials. The code checks its masses against the page weight, widens ranges that are too narrow, and labels the result "AI synthetic estimate" rather than hiding it behind a number.
  • Saying "don't know". Every lifespan and factor value needs a quote the code can find on the cited page. The search is aimed at lifespans, so most "does it work on induction?" answers come back "could not be confirmed". That's visible on the page, and I'd rather show it than let a model guess.
  • Agentic web interaction Agents still need quite a lot of steering through loops, filters etc. In order to make output from web searches and interaction with found pages relevant and accurate.
  • The design. Two rounds with an AI design tool gave me forms. I threw them out and started from the box.

Accomplishments that I'm proud of

  • A report where every figure has a source, a confidence label, or the word "unknown".
  • Questions that teach something: the reason and its source sit under each one.
  • The cost ladder: Nano, Super, Ultra, each chosen by measurement, so an analysis costs cents.
  • The box and app layout. Your words in pencil, the app's reading in marker, on one object, the report cards and view switching. :)

What I learned

  • A model you can't measure is a model you can't trust. Recorded fixtures and a findings doc per task turned prompt-tuning from guesswork into engineering.
  • The small models are enough more often than you'd think, and the big one is worth it exactly once.
  • Honesty is a feature. "Rough estimate" next to a lifespan did more for trust than any polish.
  • In the EU, a green claim is a legal claim. The wording rules came from the EU's green-claims rules as much as from taste.

What's next for Unboxed

Second-hand listings within budget from eBay across EU marketplaces: the agent exists as a stub and isn't in this version. A conversation after the report ("find something under €40", "why is this one better?"). A user-friendly view of the live agent trail, so you watch the searches and decisions as they happen. EU energy labels (EPREL) and the French repairability index, so more figures rest on public data. And a skeptic agent that reviews the report against the evidence rules before you see it: greenwashing detection, turned on itself.

Built With

  • docker
  • fastapi
  • firecrawl
  • langgraph
  • langsmith
  • nebius-serverless-ai
  • nebius-token-factory
  • next.js
  • nvidia-nemotron
  • pydantic
  • python
  • react
  • server-sent-events
  • serverless
  • tailwind
  • tavily
  • typescript
  • vercel
Share this project:

Updates

Submission history