Inspiration

Buying secondhand is a tab-juggling chore. Looking for a room near UofT, or a set of dumbbells under $50, means opening Facebook Marketplace, then Kijiji, then eBay, retyping the search, redoing the filters, and comparing listings that describe the same thing three different ways. None of these sites offer a public search API, and hand-written scrapers break the week a site redesigns. We wanted the experience a friend would give you: "tell me what you want, I'll check everywhere and send you the good ones."

What it does

Scout is a browser extension. You type what you want in plain English, tick the marketplaces, and hit Search. Behind it:

  • Claude parses your intent into item, budget, location, and condition.
  • One real cloud browser launches per marketplace and navigates the site the way a person would. Each session has a Watch live link, so you can literally watch the agent scroll Kijiji.
  • Listings stream in as each marketplace finishes. Kijiji lands in seconds; you never wait on the slowest site.
  • A second Claude pass judges every card against your full request, so a search for housing never shows you a car part called "housing" or a Magic card from "Duskmourn: House of Horror". A marketplace with nothing relevant contributes zero results, not filler.
  • A vision model inspects listing photos for visible wear and damage, and everything is deduplicated and ranked into one feed.

Facebook sign-in is human-in-the-loop: you log in yourself inside the live browser, Scout detects the session and resumes. It never touches your password, MFA code, or cookie values. You can cancel a search at any time, and closing the popup mid-search loses nothing.

How we built it

  • Extension: React + Vite, Manifest V3, a typed reducer driving live agent status and results over Server-Sent Events. Works in Chromium and Firefox.
  • Backend: Fastify + TypeScript. A job manager runs every marketplace in parallel with isolated timeouts, retries, and cancellation.
  • Agents: Steel cloud browsers driven by Playwright over CDP, with per-marketplace recipes and a search-box discovery fallback for unknown sites.
  • AI: Claude Haiku 4.5 via tool calls for intent parsing, semantic relevance judging, and image condition scoring, with GPT-5 Mini as a drop-in alternative and deterministic fallbacks for everything.
  • Contracts: Zod schemas shared between extension and server, so every event and listing on the wire is validated.

Challenges we ran into

  • Marketplaces fight back. eBay swapped its result markup from s-item cards to s-card cards, serves a "Something went wrong" page on the first request of a fresh browser, and returns near-match filler when nothing matches. We now handle both layouts, reload in-session, and flag near matches for the judge.
  • The popup closes when it loses focus. Clicking "Watch live" killed our event stream and froze the UI mid-search. We made the server replay the full event log on reconnect, so any reopened popup rebuilds exact per-marketplace state.
  • Silent AI fallbacks are dangerous. A rate-limited relevance call once fell back to "accept everything" and 28 Magic cards outranked real apartments. The fallback is now conservative, failures are retried and logged, and a partially scored batch treats unscored listings as irrelevant.
  • Login without ever holding credentials. Getting Facebook to work meant a persistent browser profile plus a live session the user completes themselves.

Accomplishments that we're proud of

  • Three real marketplaces searched by real browsers, live and watchable, merged into one ranked feed.
  • A search never fails because a model or a marketplace did. Every failure is isolated to one source.
  • A demo mode that runs the exact same UI and event flow with zero credentials.
  • 54 tests and strict TypeScript across the whole monorepo, verified against the live sites.

What we learned

Web agents are mostly about resilience, not navigation. The happy path took an afternoon; layout changes, transient error pages, lazy-loaded images, lost connections, and rate limits took the rest. We also learned that an LLM judge is only as trustworthy as its fallback, and that "show nothing" beats "show everything" when the judge is unavailable.

What's next for Scout - Secondhand Search

  • Saved searches with alerts when a matching listing appears.
  • Per-user Facebook profiles stored server-side, so Scout works as a hosted service instead of a local demo.
  • Asking the agent to message sellers and negotiate on your behalf.

Built With

Share this project:

Updates

Submission history