Inspiration
Every Nigerian undergraduate writes a final-year project. It's defended once, bound, shelved, and never read again. Tens of thousands a year, and some of them are good.
Meanwhile b54 pays $1,500 for undergraduate research across six fields, with submissions closing in December. Almost no student here has heard of it, and the few who have don't know how to turn a Word-exported project into something an expert panel will take seriously.
Those two facts sit next to each other and nobody has connected them.
What it does
You upload a final-year project — PDF or .docx. Unshelved parses it, checks it's actually a student research write-up, and scores it on five dimensions: problem framing, method soundness, results and error treatment, contribution, and reproducibility.
Then the part that matters. Every score carries verbatim quotes from the document with their page numbers, and each quote is checked programmatically against the source text before it's displayed. Anything the model produces that can't be found in the document is dropped, shown as dropped, and counted on the report.
You get a shareable report, a verdict on whether it's worth submitting for the prize, and a list of what's missing.
The /all page aggregates everything scored so far — how many projects, how many are submittable, and which dimension is weakest across the whole corpus.
How we built it
Next.js and TypeScript on Vercel, Tailwind v4, Supabase for storage, Gemini for assessment.
Two architectural decisions did most of the work:
Extraction happens in the browser. unpdf parses the PDF client-side into one string per page and only the text is sent to the server. No upload pipeline, no storage bucket, no file size limit — and the document itself never leaves the user's device.
No RAG. Gemini's context window takes a 250-page project whole, so there's no chunking and no vector store. One call, full document, page markers so the model can cite locations.
The verification layer is the core. Extracted PDF text is full of hyphenated line breaks, collapsed whitespace, ligatures and curly quotes, so quotes are aggressively normalised on both sides before comparison. If the model cites the right text under the wrong page number, the page is corrected rather than the quote discarded.
Challenges we ran into
Making the model's claims checkable. A score is worthless to a foundation awarding real money if the reasoning behind it might be invented. The fix was telling the model in its instructions that quotes are verified programmatically — so a fabricated quote is strictly worse than a short honest one — and then actually verifying them.
Normalisation. The first version failed valid quotes because the model retyped curly quotes as straight ones. Hyphenated line breaks broke it too. Getting this right is most of why the verification is trustworthy.
.docx has no pages. Pagination happens at render time in Word and isn't in the file. Rather than invent page numbers, .docx is chunked into stable sections and the interface says "section 4" instead of "page 4."
Ineligible documents. A novel scored 1/5 across every dimension and burned a full 250-page context call to do it. Now a cheap triage pass on a sample screens the document first and rejects non-research uploads in about a second.
Accomplishments we're proud of
The system shows its own failures. Dropped claims are struck through and counted on the report rather than quietly hidden. That's unusual for an AI product and it's the reason this could be trusted with a decision about money.
[N] real UNILAG projects scored today, [X] of them submittable to a prize none of those students knew existed.
What we learned
That the interesting engineering in an LLM product usually isn't the model call. The prompt took twenty minutes. Making the output checkable took the rest of the day, and it's the only reason the thing is worth anything.
What's next
Similarity detection across the corpus — a foundation awarding $2,500 needs integrity checking, and it's a natural extension of the verification work.
The other five prize fields, each with a rubric encoded properly rather than generically.
And a direct submission path, so a student who scores well goes from "my project is on a shelf" to a submitted prize entry without leaving the page.
Built With
- google-gemini
- mammoth
- next.js
- postgresql
- supabase
- tailwindcss
- typescript
- unpdf
Log in or sign up for Devpost to join the conversation.