CiteWise
Scores related literature against a research gap, shows the page behind every score, and drafts the introduction from approved sources.

- Role
- Team developer
- Team
- Capstone team of 5
- Period
- May – Nov 2026
- Stack
- Express 5, React 19, Supabase, n8n, Google Gemini, Cloudflare R2, Node.js, Vite, PostgreSQL, pdf-parse, LlamaParse, Vitest, Supertest
The problem
Students writing a research proposal have to judge many related papers against their research gap, then write an introduction that cites them correctly. A model can score papers quickly, but a score without a source is hard to trust and harder to defend. CiteWise scores each paper, shows where each score came from, and drafts only from papers the student approved.
What I built
- Page traceability: per-page character offsets recorded at upload, so every evidence quote the model returns maps back to its PDF page.
- A page preview that opens the source PDF at the cited page and highlights the quoted passage.
- The chunking and rubric-scoring helpers in the Express API that choose which passages are sent for scoring.
- Metric weight sliders and relevance scoring components in the assessment view, and draft version history in the drafting step.
- Authentication and ownership checks on group and workflow routes, and a password policy enforced at signup.
- Fixes for QA-reported failures in auth, rate limiting and synthesis, with regression tests.
- Mobile layouts across the CiteWise screens, including a portal-based mobile navigation.
- Parts of the original Spring Boot document-analysis service, before the team replaced it with the Express API.
How it works
- 01
Import
Research title, rationale and gaps load from the group's CATalyst workspace.
- 02
Upload
PDFs go to R2; text is extracted with page offsets, with OCR for scanned files.
- 03
Score
Selected passages go to an n8n workflow that scores four weighted criteria with Gemini.
- 04
Trace
Each evidence quote is checked against the page offsets and opens at its page.
- 05
Approve
The student approves or rejects each paper and can reweight the criteria.
- 06
Draft
Approved papers feed a RAG workflow that drafts the introduction and references.
Decisions
Show the page, not just the score
Every AI score comes with verbatim excerpts, and I mapped each one to the page it came from so the student can check it in the PDF. Showing the score and rationale alone was the alternative; it is quicker to build but asks the student to trust the model.
Offsets beside the text, not a new text format
I kept the extracted text exactly as before and stored each page's starting offset next to it. Re-extracting with page markers inside the text was the alternative, but it would have changed the input the scoring workflow already received.
One backend: Express over Spring Boot
CiteWise began with a Spring Boot service, which I worked on. When it merged with CATalyst, which already ran on Express, the team kept the Express API and archived the Spring Boot code. Running two backends for one app was the option we rejected.
Evidence
This repository is private, so these figures can't be checked from outside. I can walk through the code on request.
- 58 of 228 commits are mine
- Page traceability tests added in my commits
- 9 API test files (Vitest and Supertest)
- My commits to the original Spring Boot service
Next
- Test page traceability on scanned PDFs, where OCR text and page offsets are harder to line up.
- Extend the browser tests to cover opening a cited page from an evidence quote.