TinyFish bounty · Job portal
Openings: build progress
A student job radar. Search discovers postings, Fetch reads them, Agent handles the portals Fetch can't. This page tracks the build and lets you run the pipeline against live data.
Phases
0 Scaffold + spike
DoneProve Search, Fetch and Agent work on real job data before building anything.
- Next.js app + TinyFish SDK
- Search finds postings on Greenhouse / Lever / Ashby / Workday
- Fetch reads posting pages in batches of 10
- Agent searches a Workday portal and returns JSON
- npm run spike script
1 Pipeline: structured jobs
DoneTurn raw pages into clean Job records and read whole company boards.
- Job schema (zod)
- Rule-based extraction: location, remote, pay, visa, term, grad year (tested)
- Watchlist boards: Greenhouse feed + Lever board via Fetch
- Fair read budget: boards ≤ half, round-robin per company
- LLM extraction via AI Gateway (openai/gpt-4.1-mini, free-tier OK)
2 Agent escalation
DoneSend JS-app portals (Workday, Ashby boards) to Agent, with a budget.
- Search finds a company's Ashby/Workday portal (free)
- Agent searches that portal and lists postings
- Pages Fetch can't render (<600 chars) are read by Agent
- Per-run budget, 2 in flight, 150s timeout, live-view URL captured
- LLM extraction batched 5 per call (free tier: 5 req/min)
- Firecrawl fallback: search + render before Agent; survives a TinyFish outage
3 Dedupe + rank
DoneOne entry per job, filtered and ranked with a 'why it matched'.
- Dedupe by URL, then company + title + location + term (keeps the fullest copy)
- Skip before reading: clearly-senior titles, board postings in other locations
- Hard filters with reasons: level, location (aliases), visa refusals, grad year
- 0–100 score with 'why it matched' chips; keywords, grad year, visa, watchlist
4 The real app
DoneA proper product: landing page with hero, onboarding for preferences, and a jobs dashboard.
- Landing page: radar-sweep hero, how it works, posting specimen, light + dark
- 4-step onboarding saved in this browser (no account)
- Streaming /api/run: stage-by-stage progress as NDJSON
- Jobs dashboard: live run timeline, Agent's live browser, filters, ranked cards
- Checked at 375px, light + dark, small-text contrast ≥4.5:1
5 Freshness
DoneCache, last-refreshed, and 'new since your last visit'.
- Browser remembers when it first saw each job (capped at 1,000)
- 'New' badges, '+N new' on the tab, 'New since last scan' tile, New-only filter
- Nudge to rescan when results are over a day old
- Posting cache cut from 6h to 1h; searches are always live
6 Submission
In progressREADME with endpoint usage, demo video, deploy.
- Cost guard: rate limit, deep-search passcode, dev endpoint off in prod
- README: how Search / Fetch / Agent are used + requirement mapping
- Deployed: job-portal-career-finders.vercel.app (LLM via Gateway OIDC)
- Demo video (shot list in docs/DEMO.md)
Run the pipeline
Live Search + board reads → Fetch → extraction, with Firecrawl as the fallback when TinyFish comes back empty. Agent is off unless you give it a budget (it's metered).
The pipeline runner is a local dev tool. On the live site, use My radar.