Project Info
Inspiration
Education is entering an AI arms race. Students feel constant pressure to ``keep up.'' Some use AI to skip hard thinking and get answers instantly. Others don’t have the same access and feel like they’re falling behind anyway. Everyone is afraid of being wrong. Teachers are left grading final outputs while the real learning process stays invisible. That’s the fracture Veridian was built for. Classrooms already generate massive learning signal: drafts, crossed-out steps, partial reasoning, misconceptions, and recovery attempts. Today, most of that disappears. Teachers get snapshots. Students get scores. Nobody gets a true diagnostic of how learning happened. Veridian starts with one question: What if every mistake became structured data? We’re building an AI-native classroom runtime where errors are not failures to hide, but the highest-value signal in the room. What Veridian Does Veridian is a full-stack EdTech platform with symmetric teacher and student surfaces. It outperforms existing edtech platforms like Canvas and Google Classroom by unifying the full assignment workflow—creation tech stack, including writing/completion, and submission—into a single AI-powered, data-driven platform Veridian includes AI driven learning insights from student data, seamless digital notebook integrations for easy assignment submission, and AI assisted notetaking autocomplete plus correction within digital homework notebooks. Teacher Side Create classrooms students can join Upload a course corpus per classroom (PDFs, TeX, lecture notes, reference material) Generate auto-formatted assignments delivered directly to students Configure runtime policies (for example: when analysis runs, whether chat is allowed, and how much guidance students receive) Review submissions, mistake patterns, and classroom-level analytics Student Side Work inside a digital canvas for notes and problem-solving Get AI-assisted writing/autocomplete with mistake tracking, when enabled by the teacher Receive real-time mistake analysis during work, based on teacher-defined classroom settings Use Socratic chat guidance when teacher-enabled Operate under teacher-defined runtime policy via resolved_config (the effective classroom configuration applied to each student session) At its core, Veridian converts raw student work into structured mistake intelligence, giving students better feedback loops and giving teachers visibility into learning that used to happen behind closed doors. How We Built It We built Veridian as a mirrored system by design: teacher/backend (Flask) teacher/frontend (Expo React) student/backend (Flask) student/frontend (Expo React) supabase/ (shared schema + migrations) This symmetry is intentional: one platform, two operating surfaces, one source of truth. Backend Flask APIs for teacher and student runtimes JWT auth with strict membership gating (401 / 403) Supabase as the shared persistence layer Config-driven student runtime via GET /assignments/:id, returning teacher-controlled resolved_config Frontend Expo React apps for both teacher and student Shared design tokens and reusable UI primitives (src/components/ui/) Canvas-first student workspace AI analysis trigger modes: auto_idle auto_page_change manual_only passive auto_idle auto_page_change manual_only passive We enforced hard boundaries between: Auth Classroom logic Assignment configuration AI runtime behavior Challenges We Ran Into 1. Runtime policy enforcement at the edge Teacher intent had to survive all the way to the student session. That required strict backend contracts and disciplined frontend state orchestration. 2. Hard role separation We enforced single-role identity (Teacher or Student). It made permissioning safer, but raised the bar for membership and access flows. 3. Multi-layer state sync Assignments, submissions, and AI feedback had to stay coherent across Supabase, Flask APIs, and Expo client state in near real time. 4. Automation vs pedagogy Choosing when AI should intervene (auto_idle) versus when students should drive (manual_only) was a product and learning-design challenge, not just an engineering one. Accomplishments We’re Proud Of AI-assisted handwritten note completion inside the student canvas, so students can keep working without losing momentum AI mistake localization with red-dot markers and suggestion captions that pinpoint exactly where an error occurs for instant correction and review Symmetric architecture that scales without chaos Teacher-governed, config-driven student runtime Fully gated endpoints with role-based access control AI mistake analysis embedded directly in the workflow Repeatable end-to-end classroom demo path Supabase migrations that cleanly separate teacher/student concerns Most importantly: Veridian behaves like infrastructure, not a prototype. What We Learned AI in classrooms must be policy-driven, not always-on. Mistake analysis is strongest inside the workflow, not after the fact. Architectural symmetry lowers team cognitive load and speeds iteration. Strong backend contracts prevent frontend state blowups. In education, teacher trust is the adoption curve. What’s Next For Veridian Longitudinal mistake trajectories across assignments Teacher-side misconception heatmaps Adaptive assignment branching based on error patterns Fine-grained error distribution analytics Agentic reasoning over a student’s full historical mistake profile Institutional deployment model for district and campus rollout Our long-term vision: Veridian becomes the mistake intelligence layer for modern classrooms.
Veridian - EducAItion
Full EdTech platform: teacher side (classrooms, assignments, corpus, submissions) and student side (canvas, AI mistake analysis, Socratic chat). Shared Supabase.
Student Runtime Config (PR #4)
- Student assignment behavior is now controlled by teacher
resolved_configvalues returned by student backendGET /assignments/:id. - Endpoint contract is auth-protected and membership-gated (
401unauthenticated,403non-member). - Student app honors:
analysis_trigger:auto_idle,auto_page_change,manual_only,passivecheck_button_visible,chat_enableddot_threshold,max_dots_shownnotification_style:silent,toast,badge
Repo Structure
| Path | Purpose |
|---|---|
teacher/backend/ | Teacher backend (Flask) — classrooms, assignments, corpus |
teacher/frontend/ | Teacher frontend (Expo React) — dashboard, assignment creation; Veridian design system (tokens + src/components/ui/) |
student/backend/ | Student backend (Flask) — mistake analysis, OCR, chat |
student/frontend/ | Student frontend (Expo React) — canvas, document, workspace |
supabase/ | Shared DB migrations |
scripts/ | Migration script, etc. |
plans/ | Feature plans |
Layout: Symmetric teacher/ and student/ each with backend/ and frontend/. Shared Supabase project.
Prerequisites
Python 3.11+, Node 18+, Expo CLI. One Supabase project (migrations run once — see Supabase Migrations below).
Quick run (from repo root)
After one-time setup, use the scripts in scripts/:
- Teacher app:
./scripts/setup-teacher.shonce, then./scripts/run-teacher.sh(or run backend and frontend separately). - Student platform:
./scripts/setup-student.shonce, then./scripts/run-student.sh.
See scripts/README.md for all script options.
Setup
- Copy env (4 apps, 4
.envfiles — each app loads from its own dir):teacher/backend/.env.example→teacher/backend/.env(setCORS_ALLOWED_ORIGINSfor your frontend hosts)teacher/frontend/.env.example→teacher/frontend/.env(setEXPO_PUBLIC_API_URL=http://localhost:5001for teacher backend)student/backend/.env.example→student/backend/.envstudent/frontend/.env.example→student/frontend/.env(setEXPO_PUBLIC_BACKEND_URLfor student backend, e.g.http://localhost:8000)
- Install deps:
pip install -r requirements.txtinteacher/backend/andstudent/backend/;npm installinteacher/frontend/andstudent/frontend/
(Migrations: run once per project via ./scripts/apply_migrations.sh if needed.)
Convention: When adding packages or env vars, update requirements.txt (or package.json), the relevant .env.example, and running docs in the same PR.
Supabase Migrations
Run in this order (fresh DB):
- Teacher:
supabase/all_migrations.sql - Teacher:
supabase/migrations/20260214000008_*.sql,20260214000009_*.sql,20260215000001_*.sql - Student:
student/supabase/migrations/202602140001_*.sql,202602140003_*.sql,20260214153135_*.sql,20260214153124_*.sql
Script: ./scripts/apply_migrations.sh — set SUPABASE_DB_URL, requires psql. If teacher tables exist, run steps 2-3 only.
Full Flows (Repeat Testing)
Teacher flow: Create classroom → upload corpus → create assignment → view submissions
# Terminal 1: Teacher backend (port 5001)
cd teacher/backend && python3 run.py
# Terminal 2: Teacher frontend
cd teacher/frontend && npx expo start
Student flow: Sample worksheet → canvas → Done → AI analysis → Socratic chat
# Terminal 1: Student backend (port 8000)
cd student/backend && python3 get_coords.py
# Terminal 2: Student frontend
cd student/frontend && npx expo start
Both sides: Run all four above. Backend required for full flows; frontend alone works for auth/login UI only.
Demo flow
Use this sequence for a repeatable demo:
- Teacher: Sign in to the teacher app.
- Teacher: Create a classroom (note or copy the class code).
- Teacher: Create an assignment (add title; optionally due date and assignment file).
- Teacher: (Optional) Upload a corpus file for the classroom.
- Student: Sign in to the student app.
- Student: Join the class using the class code.
- Student: Open the assignment and submit a solution.
- Teacher: (Optional) View submissions for the assignment.
Conversion Progress WebSocket
- Namespace:
/conversionon teacher backend. - Auth required: send teacher JWT token in Socket.IO
auth.token. - Subscribe payload:
{ "job_id": "<uuid>" }. - For PDF/TEX conversion endpoints, frontend can send
job_idin multipart form to subscribe before conversion starts.
Quick Checks
| Test | Command |
|---|---|
| Teacher backend | cd teacher/backend && python3 run.py — hit /classrooms with JWT |
| Student backend | cd student/backend && python3 get_coords.py — curl http://localhost:8000/health |
After migrations: assignments load without config errors; corpus upload works.
Production Deployment
Frontends deploy to Vercel (veridian.fyi, s.veridian.fyi). Backends on Render: teacher https://veridian-teach.onrender.com, student https://veridian-fi00.onrender.com. Set EXPO_PUBLIC_API_URL / EXPO_PUBLIC_STUDENT_API_URL (teacher) and EXPO_PUBLIC_BACKEND_URL (student) in Vercel env. See plans/production-deployment.md.
Development
See AGENTS.md, CLAUDE.md for workflow and conventions. Running docs: AGENTS.md, CLAUDE.md, README.md, PLAN.md.
Analysis
View
Metric
- 136
- 97
- 49
- 49
- 37
- 13
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- FlaskIn code
- HTMLIn code
- JavaScriptIn code
- OpenAIIn code
- PythonIn code
- ReactIn code
- SQLIn code
- SupabaseIn code
- TypeScriptIn code
- PostgreSQLClaimed
10 of 11 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- Claude CodeConfig · Commits
- CodexConfig
- CursorConfig · Commits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
1.3 MB
Source files
332
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
VeridianTH/Veridian
375 files · 3.8 MB · @ 99f6237
Structure
Interface
123 files · 33%Screens, components and styles rendered to the user.
API & routing
12 files · 3%Request entry points: routes, handlers and controllers.
Application logic
109 files · 29%Domain rules, services and shared utilities.
+2 moreData & schema
29 files · 8%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript53%
- Python30%
- Markdown9%
- SQL4%
- JavaScript2%
- Shell1%
- Other (2)1%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
teacher/frontend/package.json
npm · 38- @expo-google-fonts/dancing-script
- @expo-google-fonts/dm-sans
- @expo/vector-icons
- @react-native-async-storage/async-storage
- @react-native-community/datetimepicker
- @react-navigation/native
- @react-navigation/native-stack
- @supabase/supabase-js
- expo
- expo-clipboard
- expo-constants
- expo-document-picker
- expo-file-system
- expo-font
- expo-linear-gradient
- expo-linking
- expo-status-bar
- framer-motion
- +20 more
student/frontend/package.json
npm · 36- @expo/vector-icons
- @react-native-async-storage/async-storage
- @react-navigation/bottom-tabs
- @react-navigation/elements
- @react-navigation/native
- @supabase/supabase-js
- expo
- expo-constants
- expo-document-picker
- expo-file-system
- expo-font
- expo-haptics
- expo-linear-gradient
- expo-linking
- expo-router
- expo-splash-screen
- expo-status-bar
- expo-system-ui
- +18 more
student/backend/requirements.txt
pypi · 14- anthropic
- certifi
- cryptography
- eventlet
- flask
- flask-cors
- flask-socketio
- gunicorn
- openai
- pillow
- PyJWT
- PyPDF2
- python-dotenv
- supabase
teacher/backend/requirements.txt
pypi · 13- anthropic
- certifi
- cryptography
- eventlet
- flask
- flask-cors
- flask-socketio
- gunicorn
- PyJWT
- PyMuPDF
- python-dotenv
- python-socketio
- supabase
student/backend/pyproject.toml
pypi · 7- anthropic
- flask
- flask-cors
- openai
- pillow
- python-dotenv
- supabase
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.