With all of the demands on instructor time, it can feel impossible to
provide detailed, individualized feedback that addresses each student's
unique approach to solving problems. Rubrics are too generic, electronic
learning platforms only check final answers, and existing grading tools
struggle with handwritten work.
uGraid is designed to address these challenges. It is an
instructor-in-the-loop system that leverages the reasoning and
organizational strengths of state-of-the-art large language models to
build a contextual profile of how you grade. It follows each student's
individual reasoning process, identifies their solution strategy, and
provides targeted, substantive feedback — not just a score. A carefully
designed memory system learns from the examples you provide and the
corrections you make, so over time it provides the feedback you would
provide, to every student.
A separate grading workspace will be created. Custom instructions carry over.
Add Problem to Assignment
Creates a new problem and adds it to this assignment. You can configure
its solution and rubric later from the Details tab.
New Assignment
An assignment groups multiple problems so you can upload one combined
student PDF and have it segmented automatically. You can add or
reorder problems afterward.
New Course
You become the new course's instructor. A course cannot be deleted
from the app, so check the name before creating it.
Delete assignment?
How should the member problems be handled?
Post Grades to LMS
Waiting for server…
Resolve duplicate grades before posting
One or more students have multiple approved grades on the same problem.
Pick which grade should be posted to the LMS for each row. Non-selected
grades stay in uGraid but won't contribute to the LMS post.
Grade preview
Loading…
Sync Roster from LMS
Segment submission
The PDF will be anonymized once, then segmented into per-problem page
ranges by the AI. You'll review and edit the proposal before anything
is saved.
Drag page chips between lanes, or use each chip's Move ▾
menu (keyboard accessible). Hold Shift while dragging — or pick
Duplicate to… — to duplicate a page (use this for a page that
straddles two problems). Reorder within a lane by dragging or via the
menu's Move earlier / later in lane. Click a page, or press
Enter on it, to see it larger in the preview.
All pages
Problem lanes
Unassigned
Page preview
Select a page to see it larger.
Press Enter or Space to show this page in the preview.
Split a bulk scan
Add scans
Upload the scanned stacks and, if you have one, a copy of the blank
cover page. uGraid finds every page that looks like that cover page
and splits a stack into one submission per student.
Drop PDFs here, or activate to browse.
Skip this and pick the divider pages from the scans instead.
Choose one or more pages that look like the front page of a submission.
Rotation and page size do not matter.
Select at least one divider page to continue.
Review the split
Roster
Class roster used for name + student-ID matching during detection.
One entry per line: Name, Name, 123-45-6789, or
Name, 123-45-6789, login with the student's sign-in name
(Name, , login when there is no student number). The login
is letters, digits, ., _ or -,
with at least one letter and no spaces; the ID contains a digit and no
spaces. For Family, Given names, end the line with a comma
and a space (Lee, Kim, K-7781, ).
Existing rows use quoted CSV ("Name", "ID", "login") to
preserve literal fields, including alphabetic IDs. Unreadable lines are
named and the entire save is refused.
The login
lets you tell two students with the same name apart on Approvals.
Variants (accent-stripped, Last-First, initials, dash/space/no-separator
ID forms) are auto-generated. Saving replaces the whole roster with what
is in the box: delete a line to remove that student, add a line to add one.
Confirm
Affected submissions
Prompt
Pick a rubric criterion
⚙ AI Model Settings
Select which AI provider handles grading. Switching providers clears the current grading cache.
Approved grades and the rubric are not affected.
100%
Scales the entire interface. Range 80–150%.
Keys default to the server environment
(ANTHROPIC_API_KEY, GEMINI_API_KEY,
OPENAI_API_KEY in
.env), shared by every course. Set a key below to override
it for this course only; it is encrypted at rest and
never shown again. Leave a field blank to keep the current setting.
uGraid
Model price
Enter what the AI service charges for this model, in US dollars per
million tokens, as its pricing page lists them. The daily spending limit
counts this model's use at these prices once you save them.
Experimental and power-user features. Changes take effect immediately and persist across sessions.
🔧 Prompt inspector
editing as: —
Loading…
Open-source credits
uGraid is built on a stack of open-source and free components.
Each package, vendored project, and freely-licensed model below is
listed with its upstream URL and license type. Installable
dependencies are pinned in requirements.txt +
anonymizer_eval/requirements.txt; vendored projects
(DocRes) are gitignored and fetched per their setup notes.
Caveats. PyMuPDF is AGPL-3.0; review § 13 for
network-service deployments.
DocRes weights are research-only — do not redistribute. The
DocRes code is MIT and freely vendorable. ttkthemes
(GPL-3.0) is used only in the standalone anonymizer_eval/
desktop tool, not the deployed Flask surface.
Locating host…
⟳ —
Your Courses
Select a course to enter its dashboard. Every course keeps its own problems, assignments, roster, and submissions; nothing crosses between them.
Loading…
Problem Sets
Select a problem to open its grading workspace, or create a new one.
📋 Class Roster · this course
used for every problem in this course
The names + student IDs entered here are used to detect PII on
every submission in this course, across every assignment and
problem. This is the only roster — there is no per-assignment or
per-problem list.
Loading…
Assignment
Manage member problems, discipline, and assignment-level settings. Use the Submissions tab to upload combined student PDFs.
0 of 4,000 characters
When off, a student can submit new attempts on a problem only until you approve a grade for it.
or
Student Submissions · Assignment
Upload a multi-problem student PDF. The AI segments it into per-problem pages; review and commit to materialize submissions under each member problem.
Click to upload or drag & drop
Combined student PDF (multiple problems in one file), or one image
Select a problem
Pick a member problem to continue.
Set up your problem
Upload the solution PDF. The AI Model will extract a structured summary — shown below and fully editable — used for grading context.
Click to upload or drag & drop
Instructor solution PDF or image
Instructions for the AI (optional)
Tell the AI what matters in this solution: the key steps, the deductions you'd make,
or how you want it graded. Type, or record and we'll transcribe.
Once a strategy exists, use this to correct it.
Solution preview
🧭 Inferred Solution StrategySaved
This structured summary was extracted by the AI Model from the uploaded PDF and is used as grading context.
Edit any field to refine what the AI Model sees.
🧭 Discipline · this problem
disambiguates notation and method terminology for the AI
🗒️ Grading Instructions · this problem only
appended to your global instructions when grading submissions for this problem
Saved
Manage global instructions in Preferences (⚙).
🎓 Tutoring Chat · this problem only
when enabled, students can chat about this problem before submitting
The tutoring AI coaches the student's reasoning and points them at self-checks.
It will not confirm or deny final answers, and it cannot see the rubric or grade.
Off by default. When on, the tutor reads your solution summary as private
reference so it can tell whether a student's path is converging. Only prompt
instructions stop it being repeated back, so leave this off unless the extra
grounding is worth that risk. The problem pages from your solution PDF are
always shown — for most problems they are the only statement of the problem.
Saved
🧭 Alternative Solution Paths
Mines the tutoring chat transcripts for this problem and proposes valid solution paths the instructor didn't write up. Each candidate needs your explicit Accept before it influences clustering or grading. Approved paths are spliced into the cluster-submission and auto-grade prompts as problem-static context. Existing Accept/Reject decisions are preserved across re-runs.
Upload Submissions
Upload handwritten or typed student PDFs. The AI Model identifies each student's approach and groups similar work.
Click to upload or drag & drop
Select one or more student PDFs or images (each file is one paper)
Submissions analyzed.
You can generate a rubric now and let the AI Model propose it, or manually grade a few samples first for better calibration.
Uploaded papers
Student Submissions
Review processed submissions, inspect AI-grouped approaches, and grade them.
Show only:
No submission selected
Changing this selection loads the chosen submission.
Select a submission from the Submissions view to start grading.
— / —
Click the page to place a mark
Select a submission to view its PDF.
Add a mark without placing it
Adding a mark on the page — Escape to cancel
Add a mark
—
No deductions
🧠 Student Solution Process
🎙️ Narrate your gradingadds to the draft — never replaces it
Talk through the submission as you read it. What you say becomes comments and
deductions for you to review — nothing is graded for you.
Auto-grade
Needs the instructor solution with its point total and a rubric with criteria of your own — the catch-all lines alone are not enough. The AI Model will return a score, deductions, and individualized feedback.
🗒️ Grading Instructions · every paper of this problem
Applies to every paper of this problem, not just the one open here, and is the same text as Grading Instructions on the Setup tab. This problem only: appended to your global instructions (Preferences ⚙) on every grading call. Papers already graded change only when they are graded again. Changes save automatically.
Saved
✋ AI-interpreted hand grading — Review Required
The AI Model has interpreted the instructor's marks from this PDF.
Review the deductions above, then confirm or reject.
Grading Rubric
Generate a rubric once after uploading the instructor solution — the AI Model will infer it from the solution structure and any uploaded submission analyses. After that, use Distill to clean up the structure as deductions accumulate, or Force Regenerate as a last resort to rebuild from scratch.
📊 Accumulated Grading Context
🌱 Novel Deductions
These deductions were emitted against the catchall criteria because no specific rubric line covered the observed error. Click Promote into Rubric to add each one to the rubric word for word, under Not yet categorized; then run Distill to file those lines where they belong.
Approval Queue
Each submission's OCR + NER detection landed here before any
redactions were rendered. Review the auto-detected boxes, edit as
needed, and approve — only approved submissions leave this page
with their redactions irreversibly applied.
—— / —Click-drag empty area or “+ Add box” to add · Drag corners, or arrow keys to move and Shift+arrows to resize the selected box · Delete removes it
Select a pending submission from the list to review.
Review and Export
Review grades, batch-grade remaining submissions, export results as CSV, or post to LMS.
—
Total Submissions
—
Approved
—
Awaiting approval
—
Ungraded
Filename
Score
Status
Top Deductions
Loading…
LMS Gradebook Export
Assignment/course scope: one row per student, one column per problem, final scores only.
Analyze Performance
Histogram + box plot + per-student table. Toggle the grade-kind checkboxes to
filter the charts (the table always shows every row).
Loading…
How students progressed through this problem. The instructor solution is
laid out left→right; each student is a colored path that snaps onto shared
nodes where steps are conceptually the same. Click any edge to highlight
that student's whole path.
De-identified engagement metrics — no student names or filenames, ever
(see core/engagement.py). Metrics based on fewer than 5 contributing
students are suppressed and shown as "— (n<5)".
Loading…
History
Loading audit log…
Help
Guides and reference material for uGraid.
The Getting Started guide is the user manual: it walks through a grading
session from uploading student work to exporting grades, and opens in a
new tab so you can keep it beside the app.
uGraid
■
Server stopped
The uGraid Python process is no longer running.
Restart the server to continue working.