The Problem
University assignments are rarely difficult because the information doesn't exist. The problem is that the information is scattered — and that the thing holding the authority can't answer.
A student has the brief in one place, the rubric somewhere else, and dozens of discussion posts containing answers to questions already asked. When they get stuck, they must piece it together themselves.
Two failures follow. Students don't ask, because a public forum post is attributable and an email to the tutor takes a day. And when they do ask a general-purpose AI, it will happily write the code — turning a clarification problem into an academic integrity problem.
Meanwhile the tutor, who could resolve most of it in one sentence, cannot see where the confusion is concentrated until the marks come in.
The pattern: the channels that can answer are not authoritative, and the artefact that is authoritative cannot answer.
Introducing AssignMate
AssignMate is an AI-native assignment workspace. Tutors upload an assignment and its supporting documents; AssignMate turns them into a tutor-approved structure — map, milestones, checklist, FAQs, and a per-assignment AI Usage Policy. Students then work inside that structure.
The AI is strictly constrained. It never generates answers, code, or solution steps. It answers only from approved content, cites the source, and refuses everything else — naming the assignment's own policy when it does.
That refusal is the feature, not a limitation.
Grounded, Not Generic
Instead of a generic chatbot, every answer is grounded in this assignment: the original brief shown verbatim, the rubric, the tutor-approved structure, and published FAQ entries.
So rather than asking:
"How do I write a machine learning report?"
a student asks:
"Do I need to include my failed experiments in the report for this assignment?"
and gets an answer with citations to the page it came from.
Crucially, the original brief always wins. Requirements are never paraphrased into the interface — the source document is shown verbatim, and anything AI-generated is labelled as interpretation, never as the requirement.
Anonymous Discussion and a Living FAQ
Students ask anonymously under a stable pseudonym, and the tutor cannot see who posted. Private tutor queries are a separate channel for questions that shouldn't be public.
Tutor answers can be published to the assignment's FAQ, where they become durable, searchable knowledge rather than lost in a thread. An approved peer answer is never auto-published — promotion is always an explicit tutor action.
From Questions to Insight
Every student action produces an aggregate signal. For each milestone, AssignMate computes resolution rate, elapsed time, and question volume.
A milestone that is both slower than average and more heavily questioned is flagged as a potential difficulty area — with its evidence stated, and no recommended intervention. The tutor decides.
The k-anonymity floor is enforced in the query: any bucket with fewer than five contributors renders as "Insufficient data." There are no per-student dashboards, because they would destroy the anonymity that makes the question channel work.
How We Built It
Next.js (App Router), TypeScript, Postgres, Tailwind, and a provider-agnostic LLM adapter. Every model call goes through one adapter; the whole loop runs offline on a deterministic provider.
A deterministic guardrail runs before any model call. A prohibited request is refused with zero model calls, citing the assignment's own AI Usage Policy. It is covered by 53 golden cases including laundering attempts.
Nothing AI-generated reaches a student until a tutor approves it.
For the demo we ship a deterministic synthetic cohort — 37 students, 5 milestones, 503 events — generated reproducibly from a committed script. One milestone sits above both averages so the difficulty signal has something real to compute; one sits below the anonymity floor so the suppression state is demonstrable.
Our design input was real: a read-only capture of a live Canvas discussion topic — 33 posts, 12 separate root questions, only 10 authors. One assignment part, a dozen separate questions. The confusion is concentrated by stage, which is exactly why per-assignment structure is worth building. It is one observation, not a cohort study, and we present it as such.
Challenges
Deciding how much the AI should infer — and then refusing most of it.
A prompt clause is unverifiable. You can't demonstrate that a system prompt refuses; you can only show it refused once. So the guardrail is deterministic code that runs before any model call and is independently testable without a network.
The harder problem was the anonymity/insight trade-off. Per-student analytics are the obvious tutor feature, and they destroy the anonymity that makes students willing to ask. The two cannot coexist, so we chose the floor.
What We Learned
An assignment contains more context than its brief: what students ask, where they stall, and which requirements generate the most questions collectively describe how an assignment is actually experienced.
That led us to treat the assignment — not a chat window — as the object.
What's Next
Semantic search across discussions (the schema reserves the columns; the MVP deliberately ships Postgres full-text), richer analytics over real cohort data, and deeper LMS integration.
Stated as limitations, not as features: our analytics run on a synthetic cohort, and Canvas integration is out of scope entirely.
Our goal is simple: the assistant that refuses to do the work is the one you can trust to help.
Built With
- ai
- argon2
- deepseek
- drizzle-orm
- eslint
- full-text
- google-gemini
- llm
- next.js
- node.js
- pdf.js
- postgresql
- react
- tailwind-css
- typescript
- vercel
- vitest
- zod
Log in or sign up for Devpost to join the conversation.