AI study and test-prep tooling that works off your own course material, not a generic question bank. Upload the readings, and it builds quizzes and study guides from them — or fills in an actual worksheet and hands the file back in its original format.
Live at study.ryantoolhub.org.
Worksheets. Upload a question sheet plus the readings it's drawn from, and Study Forge
answers the questions and writes the answers back into the original PDF or DOCX, in the
blanks where they belong, rather than emitting a separate answer list. It locates the
answer regions on the page, handles scanned sheets through OCR, extracts tables, and
re-checks its own filled page for answers dropped on the wrong row or run off the edge.
A sheet that asks for slides instead ("make a slide for each of these") is planned out and
returned as a .pptx.
Quizzes and study guides. Generated from uploaded materials, with attempts scored and tracked over time on a dashboard.
Google Classroom sync. A companion Chrome extension (extension/) picks up assignments
as you view them in Classroom, drafts a starting-point answer for each, and can turn in the
ones you've explicitly accepted in the review UI. It's built as an extension rather than a
Classroom OAuth integration so it works against what you can already see in your own
browser session.
Accounts. Multi-user with per-user material libraries, plus guest accounts for trying it without signing up.
React 19 + TypeScript + Vite on the front end; a Cloudflare Worker (worker/) on the back,
with D1 for relational data and KV for uploaded originals. Document work is done in the
Worker itself — pdf-lib and pdfjs-dist/unpdf for PDF, fflate for the DOCX and PPTX
OOXML containers.
AI generation runs through a provider layer (worker/ai/) that fronts Cloudflare Workers AI,
Anthropic, Gemini, Groq and OpenAI behind one interface, with automatic fallback to whichever
keys are configured. Workers AI is the default so the public site runs without spending a
paid key; paid providers stay admin-only unless PREMIUM_AI_PUBLIC is set.
npm install
npm run dev # vite + worker locally
npm run build # zips the extension, typechecks, builds
npm run lintLocal secrets go in .dev.vars (gitignored); in production they're set with
wrangler secret put <NAME>. Every AI key is optional — whichever are present become
available as providers. AUTH_SECRET is required and signs session cookies. See
worker/env.ts for the full list of bindings and secrets.
Schema and migrations live in worker/db/.