State what you want. An agent does the shopping.
Meridian kills the 15-tab shopping spiral. Type a plain-English request — "black over-ear noise cancelling headphones under $150 for the gym" — and an agent turns it into structured requirements, runs Channel3's agentic search across live merchant inventory, and returns ranked, in-stock offers with one-click checkout links. Changed your mind? Say "actually under $120" and it re-searches with your full context intact.
Built for the c0mpiled-13 / YC Startup School Hackathon #2.
- Sign up, type a messy request:
noise cancelation headphoens under 150 in black - Watch the agent clean it up, extract your constraints, and search — every result is live inventory with a real price, merchant, and buy link
- Refine conversationally:
over-ear only→ results re-rank with everything you've said so far still applied - Add to cart / open a product / click Buy → real merchant checkout
- Open
/testfor the glass-box view: every backend call and the exact payload sent to Channel3's API, live, as you use the app
cp .env.example .env # add CHANNEL3_API_KEY + OPENAI_API_KEY (or ANTHROPIC_API_KEY)
./run.sh # installs deps, starts backend :8787 + frontend :3000Then open http://localhost:3000. (Manual start: uvicorn app.main:app --port 8787 + npm run dev in frontend/ — install with --legacy-peer-deps.)
user message ─→ LLM bookkeeper ─→ Channel3 agentic search ─→ gentle re-rank ─→ ranked cards
(requirements, (plans sub-searches (preserve order, (real prices,
refine-merge, from the natural demote clear images, buy
hard filters) sentence) mismatches) links, cart)
- Channel3 does the heavy lifting.
mode: "agentic"— their planner decomposes the natural sentence into structured sub-searches. We layer hard guarantees on top:filters.price.max_priceand hexfilters.colors.palette(with an automatic retry if the beta color filter over-narrows). - The LLM is a bookkeeper, not a search engine. It keeps the conversation's
requirement state (so refinements compose), enforces prices are never
invented (no budget stated → no price filter), and writes the one-line
consumer blurb on each card. Internal reasoning stays internal — visible only
in
/test. - Every offer is real. Prices, stock, and images come from live merchant
inventory; each result carries the cheapest in-stock offer and a
commissionable checkout link (
buy.trychannel3.com).
| Tool | How it's used |
|---|---|
| Channel3 | The engine: agentic search, price + color-palette filters, product detail, commissionable buy links. /test shows every payload we send them. |
| Hexclave | The business layer: auth, sessions, and credit-metered payments — verified end-to-end (scripts/test_hexclave.py, test_payments.py, test_backend_metered.py). Demo runs DEV_AUTH_BYPASS=1; flipping metering on is one env var (HEXCLAVE_CREDITS_PRODUCT_ID), not new code. |
| Path | What |
|---|---|
app/ |
FastAPI backend — requirements/refine agents, Channel3 client, routes |
frontend/ |
Next.js UI — chat, cards/table, cart, product pages, /test glass-box |
API.md |
Full endpoint contract (frontend ↔ backend) |
run.sh |
One-command local startup |
Also in the codebase: a full simulated negotiation pipeline (LLM buyer vs.
seller under a hard ceiling, approval flow, purchase records, payment knowledge
graph — POST /api/negotiate, GET /api/graph). Parked from the product flow
by design; the API works if you want to poke it.
Josh · Dean · Edward