Inspiration
Extraordinary-ability visas — O-1, EB-1A, EB-2 NIW — are one of the only immigration paths in the U.S. that don't require a specific employer to sponsor you. That should make them empowering. In practice, almost nobody outside an immigration law firm actually understands them. You need to prove you meet a specific list of USCIS criteria, but there's no free, honest way to check where you stand before paying a lawyer thousands of dollars just to find out. As an immigrant, that gap felt personal and worth fixing. We also wanted to be careful about what kind of tool this should be: not something that replaces an attorney, but something that gets an applicant to their attorney with a much stronger starting point — a real evidence file instead of a folder of loose PDFs and hope.
What it does
CaseAtlas is a case-intelligence platform for extraordinary-ability visa applicants. It walks someone through:
- Intake — upload a resume, LinkedIn export, portfolio links, and supporting documents. Real PDF text extraction builds an evidence file; identity documents like passports are logged as present but their contents are never extracted or stored.
- Live criteria scoring — an LLM assesses the evidence on file against the actual USCIS Policy Manual criteria for the applicant's specific visa type, marking each one Satisfied, Partial, or Not Yet, with a confidence score and a citation.
- Gap guidance and roadmap — for anything not yet satisfied, the app suggests a concrete next step and a realistic (explicitly non-legal) timeframe. Applicants can talk to an AI concierge to update their roadmap in plain language — "I'm working on a publication" becomes a tracked step — but nothing is written to the case file without the user confirming it first.
- Navigator — real DOL prevailing wage data and DOS Visa Bulletin priority-date history, so applicants can see actual wait times instead of guessing.
- Sponsor scorecard — real USCIS H-1B employer filing data by company, so applicants can see who is actually sponsoring people in their field. For companies outside that dataset, a live AI web search fills the gap.
- Attorney handoff — a case can be shared to a firm-facing view, so the person who eventually takes this on professionally — a licensed immigration lawyer — inherits an organized dossier instead of starting from zero.
How we built it
The stack is Next.js 16 (App Router, Turbopack), TypeScript, Tailwind CSS v4, and the Vercel AI SDK against OpenAI models. Persistence is real SQLite (better-sqlite3), not an in-memory mock, so accounts, cases, and evidence actually survive a restart.
We treated "no fabricated data" as a hard constraint, not a nice-to-have. That meant sourcing and parsing real government datasets directly the USCIS H-1B Employer Data Hub, DOL OFLC prevailing wage files, and DOS Visa Bulletin history rather than inventing plausible-looking numbers. Where we didn't have reliable live data (e.g. Visa Bulletin coverage outside India), the app says so honestly instead of filling the gap with a guess.
LLM calls are wrapped in a caching middleware so repeated evaluations don't re-pay for tokens, and every AI action that touches the case file — roadmap edits, evidence-driven reassessment — goes through the same pattern: the model proposes, the user confirms, then the database writes. That human-in-the-loop gate was non-negotiable given the app is handling someone's real immigration evidence.
Challenges we ran into
- PDF parsing under Turbopack.
pdf-parsev2 shipped a worker architecture that Turbopack's bundler couldn't resolve. Downgrading to v1 fixed the worker issue but exposed a second bug: the package's rootindex.jshas a debug-mode shim keyed onmodule.parentthat misfires under Next.js's module evaluation and tries to read a nonexistent test fixture. We had to import the inner module directly to sidestep it. - Silent caching failure. Our LLM cache middleware quietly wasn't caching streamed responses at all — both cached and uncached calls took the same ~4 seconds. The root cause was middleware ordering:
wrapLanguageModeltreats the first middleware in the array as outermost, and our cache middleware only implementedwrapGenerate, notwrapStream, so streaming calls skipped it entirely. Reordering the middleware array fixed it verified with a 4.8s → 56ms before/after timing test. - Strict structured output. OpenAI's strict JSON schema mode rejects Zod's
.optional()because it drops a key from the schema'srequiredarray. Every "optional" field in our assessment schema had to become.nullable()instead. - Honesty as a design constraint. The hardest problem wasn't technical — it was resisting the urge to paper over gaps with confident-sounding filler. When a data source didn't cover something (a country's Visa Bulletin history, a company's sponsorship record), the right answer was almost always to say so plainly rather than to reach for something that sounded complete.
Accomplishments that we're proud of
Every number in the app is real and traceable to a source: real DOL wage data, real Visa Bulletin history, real USCIS employer filings, real USCIS Policy Manual citations. Nothing was mocked to make a demo look better than the underlying product actually is. We're also proud of the confirm-before-write pattern for AI-driven edits it's a small amount of UI friction that buys a large amount of trust for a tool touching someone's immigration case.
What we learned
Building something meant to sit upstream of a lawyer, not replace one, changed a lot of small decisions from how gap guidance is worded (always framed as illustrative, never as legal advice) to how identity documents are handled (recorded, never content-extracted). We also relearned a very old lesson: middleware ordering and library debug shims cause some of the hardest bugs to trace, precisely because they fail silently instead of loudly.
What's next for Case Atlas
Expanding Visa Bulletin and prevailing-wage coverage beyond the current demo scope (India-only priority dates, a limited NAICS slice of H-1B employers) to cover every country of chargeability and industry. Building out the firm-facing side further so an attorney can act directly inside a client's dossier instead of only reviewing it. And adding export to a real, attorney-ready evidence packet, so the roadmap this tool builds turns into the actual filing.
Built With
- better-sqlite3
- gpt-4o-mini
- next.js
- node.js
- openai
- pdf-parse
- react
- sqlite
- tailwind-css
- typescript
- vercel-ai-sdk
- zod
Log in or sign up for Devpost to join the conversation.