TutorLoom
The learning platform for companies, colleges and training institutes. Free and open source, with an Enterprise edition.
Free, exam-focused study material, revision notes, and practice questions for every US CPA section — organized topic by topic. No expensive coaching. No scattered PDFs. Just CPA.
EducationTypeScript · CSSGitHub @simplycpaindia-glitchOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A research-backed US CPA Exam study platform built for Indian CA students, commerce graduates, and working professionals — study material, revision notes, MCQ practice, and a real admin CMS, organized around the actual CPA Exam structure (3 Core sections + 1 Discipline).
Non-technical? See CONTENT-MANAGEMENT-GUIDE.md instead — it covers everyday editing without touching any code. For the research and content assumptions behind the seed data, see docs/RESEARCH.md.
sanitize-html before storageNote on Prisma 7: this version of Prisma moved connection configuration out of
schema.prismaand intoprisma.config.ts, and generates the client intosrc/generated/prisma(via driver adapters like@prisma/adapter-pg) instead ofnode_modules/@prisma/client. If you're used to older Prisma versions, don't be surprised by this — it's intentional, not a misconfiguration.
prisma/
schema.prisma # data model
seed.ts # seed script orchestrator
seed-data/ # seed data: subject and topic structure (far.ts, aud.ts, ...), FAQs, blog, fees...
content/ # study page + revision sheet for each topic, one file per topic
mcq-bank/ # practice questions, keyed by topic slug
check-abbreviations.ts # checks short forms are written out in full on first use (npm run content:check)
src/
app/
(site)/ # public site — homepage, /cpa/*, /blog, /faq, /login, /dashboard, ...
admin/ # staff-only CMS
api/auth/ # Auth.js route handler
components/
ui/ # design-system primitives (Button, Card, Badge, Tabs, Accordion...)
home/, practice/, discussion/, faq/, fees/, admin/, content/, auth/, site/
lib/
actions/ # Server Actions (mutations)
auth.ts, dal.ts # Auth.js config + server-side authorization helpers
prisma.ts # Prisma client singleton (driver-adapter setup)
sanitize.ts # HTML allow-list for admin-authored content
generated/prisma/ # generated Prisma Client (not checked in — see .gitignore)
proxy.ts # route protection for /admin and /dashboard (Next 16 renamed "middleware" to "proxy")
npm install
Copy .env.example to .env and fill in the values:
DATABASE_URL="postgresql://user:password@host/dbname?sslmode=require"
AUTH_SECRET="run: openssl rand -base64 32"
NEXT_PUBLIC_SITE_URL="http://localhost:3000"
# Optional — controls the admin account created by the seed script
SEED_ADMIN_EMAIL="[email protected]"
SEED_ADMIN_PASSWORD="choose-a-real-password"
npm run db:generate # generate the Prisma Client into src/generated/prisma
npm run db:migrate # create tables (prompts for a migration name on first run)
npm run db:seed # populate subjects, topics, study material, MCQs, FAQs, blog, fees, sources
npm run dev
Visit http://localhost:3000. Log in at /login with the admin email/password from your .env (or the defaults [email protected] / ChangeMe123! if you didn't set them — change this password immediately if you seed a real environment with the defaults).
The seed script creates one ADMIN user. To promote another user to staff access, either:
npm run db:studio) to change their role field to EDITOR, MODERATOR, or ADMIN, or| Task | Command / place |
|---|---|
| Add a subject/topic, edit content, manage MCQs, moderate comments | /admin — see CONTENT-MANAGEMENT-GUIDE.md |
| Regenerate Prisma Client after a schema change | npm run db:generate |
| Create a new migration after a schema change | npm run db:migrate |
| Inspect/edit raw data | npm run db:studio |
| Re-run the seed script (safe — uses upserts) | npm run db:seed |
| Lint | npm run lint |
| Production build | npm run build |
.env.example in the Vercel project settings (DATABASE_URL, AUTH_SECRET, NEXT_PUBLIC_SITE_URL set to your production domain).npx prisma migrate deploy && npm run build. Do not run prisma migrate dev or db:seed automatically in production builds — apply migrations deliberately and seed only once per environment.Homepage, all 6 CPA sections with real topic structures, full study material + revision notes + MCQs for FAR (flagship), one fully-worked demo topic each for AUD/REG/BAR/ISC/TCP, an MCQ practice engine (server-graded, answers never sent to the client before submission), per-topic discussion/comments, FAQ + blog + CPA Radar + Fee Estimator + Indian-candidates guide, authentication with role-based admin access, a real admin CMS (subjects, topics, Study Material/Revision Notes editors with independent versioning, MCQ CRUD + CSV bulk import, blog/FAQ CRUD, comment moderation, source manager), SEO (sitemap, robots, JSON-LD), and responsive design throughout.
Tier field ready for this)ContentStatus.AI_DRAFT is ready for an AI drafting pipeline)prisma/seed-data/facts.ts + reseed, or Prisma Studio, for now)PracticeSession/MCQAttempt models and are a natural extension)