Inspiration

Teachers and trainers face the same tension every assessment season: building a fair quiz takes hours, but delivering it online often means watching students tab away, copy answers, or use a second device. Enterprise LMS and proctoring stacks solve part of that problem — at thousands of dollars per year and weeks of IT setup. Most educators need something they can ship tonight: a quiz from a PDF or spreadsheet, a shareable link, and enough integrity controls that results actually mean something.

Quizava started from that gap. AI quiz generators can draft questions quickly, but they rarely help with delivery, cheating, or analytics in one place. We wanted a platform where an educator could upload course material, generate a draft quiz in minutes, share it via link or QR, and get actionable insights — without a credit card, a US bank account, or an IT department.


What it does

Quizava is an end-to-end assessment platform for educators, schools, and training teams.

Build quizzes three ways

  • Upload Excel/CSV (with images)
  • Use a visual card editor
  • Upload PDF, DOCX, or TXT and let AI generate a draft multiple-choice quiz from the source material (RAG pipeline)

Deliver securely

  • Share via short link or QR code
  • Schedule open/close windows
  • Randomize questions and answer order
  • Optional leaderboards
  • Anti-cheat: fullscreen lock, tab/visibility detection, copy/paste blocking, inactivity timeouts, auto-submit on timer expiry
  • Optional gaze and head-pose proctoring (browser-based, with server-side validation)

Analyze results

  • Mean scores and completion times
  • Question difficulty ranking
  • Per-option answer distributions
  • Excel export
  • Proctoring signals in the analytics dashboard

Scale with teams (Pro)

  • Organization workspaces with member invites
  • Whitelabel branding (logo and colors on participant-facing pages)
  • Usage-based freemium limits on Lite; higher caps on Pro

Global from day one

  • UI in 7 languages: English, Arabic, French, German, Simplified Chinese, Spanish, and Russian
  • Regional pricing (PPP) so Pro is accessible in more markets

Tagline from the product: “Run fair quizzes your students can't cheat through — built in minutes, not hours.”


How we built it

Quizava is a Django 5 monolith with clear app boundaries, containerized for local and production parity.

Backend & infrastructure

  • Django apps: home (landing + quiz taking), dashboard (CRUD + analytics), rag (AI generation), billing, organizations
  • PostgreSQL + pgvector for hybrid retrieval (dense vectors + BM25, merged with reciprocal rank fusion)
  • Celery + RabbitMQ (quorum queues, dead-letter handling) for async work like payment webhooks
  • Docker Compose for the full dev stack: web, Postgres, RabbitMQ, Celery worker/beat, Flower
  • Production: Gunicorn behind Nginx; optional Cloudflare R2 for media storage

AI / RAG pipeline

  • Two LangGraph graphs: ingest (extract → chunk → embed) and generate (retrieve → LLM → parse JSON)
  • Local embeddings via BAAI/bge-base-en-v1.5 (sentence-transformers) to keep API costs down on CPU-only servers
  • OpenAI-compatible chat API for quiz generation
  • Background threads for ingest/generation with polling endpoints for the UI

Integrity & proctoring

  • Client-side event collection (fullscreen, visibility, paste, gaze via MediaPipe Face Mesh)
  • Server-side threshold validation so reports can't be trivially spoofed

Billing & auth

  • Dodo Payments as merchant of record (global tax/compliance, localized checkout) — chosen after Lemon Squeezy and because Stripe isn't viable for every founder market
  • django-allauth for Google OAuth; Cloudflare Turnstile on auth forms
  • Atomic usage-limit enforcement in services/limits.py

Product engineering

  • Spec-driven development: numbered feature specs (dashboard UI, RAG, subscription limits, analytics, whitelabel, anti-cheat, etc.) tracked to completion
  • Ruff pre-commit linting; Sentry, PostHog, and OpenTelemetry for observability
  • Scripted i18n pipelines for all supported locales

Challenges we ran into

RAG on CPU-only hardware
Running embeddings and hybrid search on a 4 vCPU server without a GPU meant careful pipeline design: background threads, batch embedding, and pgvector instead of loading everything in-process. Performance tuning became its own spec.

English embeddings vs. multilingual UI
The product ships in 7 languages, but the current embedding model (bge-base-en-v1.5) is English-only. Non-English documents get weaker retrieval until we migrate to a multilingual model like BGE-M3.

Anti-cheat without a native app
Browsers can't fully prevent ESC from exiting fullscreen or block every cheating vector. We focused on detect, log, and enforce policy (e.g., repeated tab switches block submission) rather than claiming perfect prevention.

Global payments without Stripe
Founders in many regions can't easily use Stripe or US banking. We migrated Lemon Squeezy → Dodo Payments and added PPP regional pricing so checkout matches local purchasing power.

Proctoring UX vs. false positives
Gaze tracking needs grace periods and soft/hard thresholds so a student glancing at notes doesn't instantly fail — while still surfacing suspicious patterns to instructors.

Subscription limit races
Concurrent quiz creation and analytics views required atomic database increments (F() expressions) to avoid limit bypass under load.


Accomplishments that we're proud of

  • Full core roadmap shipped: quiz dashboard, visual editor, Excel/image upload, RAG document ingestion, subscription limits, answer insights analytics, whitelabel organizations, and quiz ownership access control
  • Production-grade RAG: LangGraph ingest/generate graphs, hybrid pgvector + BM25 retrieval, local embeddings to reduce cost
  • Integrity stack in the free tier: core anti-cheat on Lite so adoption isn't gated behind paywalls
  • Browser proctoring: gaze/head monitoring with server-validated reports — no separate proctoring software install
  • 7-language product: not just translated strings — locale-prefixed URLs, RTL for Arabic, scripted translation workflows
  • Global SaaS billing: Dodo Payments integration with PPP pricing for international educators
  • Open source (GPL-3.0): self-hostable with Docker; transparent architecture docs for RAG, Celery, pgvector, and localization

What we learned

  • Merchant of Record matters for global micro-SaaS. Handling VAT, invoicing, and local payment methods through Dodo/Paddle-style providers beats fighting Stripe eligibility country by country.
  • Hybrid search beats pure vector retrieval for quiz content — definitions, names, and numbers often match better with BM25 + dense fusion than embeddings alone.
  • The “aha moment” must be under 5 minutes: upload a PDF → review AI draft → share a link. Every extra step loses teachers who are grading at midnight.
  • Freemium limits should feel generous: Lite includes real anti-cheat and AI quotas so users experience the full value proposition before upgrading.
  • Spec-driven development scales when one codebase spans auth, billing, RAG, proctoring, and i18n — numbered specs kept scope clear and testable.
  • Build in public constraints teach trade-offs: CPU-only deployment forces smarter architecture (local embeddings, background jobs) instead of defaulting to expensive GPU/API stacks.

What's next for Quizava

Near-term (documented roadmap)

  • Multilingual embeddings — migrate from bge-base-en-v1.5 to BAAI/bge-m3 (100+ languages) so RAG matches the 7-locale UI
  • ONNX quantization for faster CPU inference on embedding workloads
  • BGE-M3 hybrid retrieval (dense + sparse) for better cross-lingual document search
  • LaTeX equation editor for STEM quizzes
  • Tier 2/3 anti-cheat — keyboard lock, DevTools detection, and stronger browser hardening
  • School pilot program expansion with org onboarding for districts and bootcamps

Longer-term

  • JWT/API auth for programmatic quiz management and integrations
  • Expanded social auth and LMS export formats

Built With

Share this project:

Updates

Submission history