Skip to content
Christian Andrey Reyes

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

  1. 01

    Import

    Research title, rationale and gaps load from the group's CATalyst workspace.

  2. 02

    Upload

    PDFs go to R2; text is extracted with page offsets, with OCR for scanned files.

  3. 03

    Score

    Selected passages go to an n8n workflow that scores four weighted criteria with Gemini.

  4. 04

    Trace

    Each evidence quote is checked against the page offsets and opens at its page.

  5. 05

    Approve

    The student approves or rejects each paper and can reweight the criteria.

  6. 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.