QuizCraft is a full-stack, AI-powered quiz platform for instructors and students. Instructors log in to create quizzes â either generated by AI from source text or entered manually â configure scheduling and availability, review and edit questions, preview the full quiz, and save it. They then share a public link with students, who open it without an account, enter their name and an optional email, take the quiz one question at a time under an optional timer, and receive instant grading with a score, correct/incorrect breakdown, and explanations. Instructors track performance through a dashboard of stats and analytics, a per-quiz results view with CSV export, and a personal quiz-taking history.
The product intent is a modern creative-tool feel rather than a sterile LMS: instructors need clarity and control; students need a low-friction, confidence-building experience. The audience is two active human roles â Instructor and Student â plus an Admin actor referenced only by the access-control rules for per-quiz results and attempt records.
QuizCraft is delivered as a React single-page application (React Router navigation, Tailwind CSS, shadcn/ui components, Framer Motion animations, Recharts charts, date-fns formatting, lucide-react icons) backed by application-owned authentication, entities, and AI integration. The user permits an alternative tech stack; the source-specified libraries and behaviors are preserved as the product contract, with implementation technology left open where the user explicitly allowed substitution.
Current actors:
index.html for in-app support.Accepted behavior spans: instructor identity and access; quiz configuration; AI-assisted and manual question authoring; question editing and preview; save/create/update; public link sharing; student quiz-taking with availability and one-attempt enforcement; instant grading; result email; instructor dashboard with stats and filtered analytics; per-quiz results with CSV export; and personal quiz-taking history.
Narrow exclusions and boundaries:
QuizCraft is a first-party web application with application-owned identity for instructors. Instructors establish identity through a self-service Login surface (enrollment and returning verification) before reaching Dashboard, CreateQuiz, Results, or QuizResults. Students never authenticate: the shared TakeQuiz?id={quizId} link is their entry, and the name/optional-email start screen is the only identity they provide. The Landing page is the anonymous public entry that explains the product to both audiences before sign-in.
Access ownership:
All listed behavior is current. No future-horizon requirements were stated; the "you can use your own tech stack" allowance is a delivery latitude, not a future feature.
No reference directive declares a content_source; this section is intentionally omitted.
linear-gradient(135deg, hsl(250,84%,60%) 0%, hsl(260,80%,65%) 100%) on hero accents and CTAs. Background bg-gradient-to-br from-slate-50 via-blue-50 to-purple-50. Glass cards bg-white/95 backdrop-blur border-white/20, rounded-xl.User.me()).User.me(), Quiz.list('-created_date', 50), QuizAttempt.filter({quiz_owner_email}), QuizAttempt.filter({created_by}).?id= is present.TakeQuiz?id={quizId} URL to clipboard. Download CSV exports all attempts (name, email, score, time, date). Statistics (QuizStatistics): average score, pass rate, score distribution chart. Student results list (StudentResultsList): table of each student's name, score, time, date, pass/fail badge.FR-1 â Instructor identity and access (required_inference) As an Instructor I should establish my identity through Login (self-service enrollment or returning verification) so that I can reach my protected workspace.
FR-2 â Instructor creates a quiz manually or with AI (explicit) As an Instructor I should create quizzes either AI-generated from source text or manually entered so that I can author assessments quickly or precisely.
FR-3 â Quiz configuration fields (explicit) As an Instructor I should configure title, description, subject, difficulty, time limit, start/end dates, is_public, and is_active so that the quiz has complete settings.
FR-4 â AI generation inputs and output (explicit) As an Instructor I should generate questions from source text with a chosen count and type so that questions load into the editor for review.
response_json_schema returns { questions: [{question, type, options, correct_answer, explanation}] }.gemini_3_flash when URL-based (with add_context_from_internet: true).FR-5 â Manual question entry (explicit) As an Instructor I should add questions manually so that I can author without AI.
FR-6 â Question editing (explicit) As an Instructor I should add, edit, delete, and reorder questions and set type, options, correct answer, and explanation so that the quiz content is correct.
FR-7 â Full quiz preview (explicit) As an Instructor I should preview the full quiz before saving so that I can verify it.
FR-8 â Save, create, or update via ?id= (explicit)
As an Instructor I should save the quiz, creating a new one or updating an existing one when ?id= is present so that edits persist.
FR-9 â Share public link (explicit)
As an Instructor I should share a public TakeQuiz?id={quizId} link so that students can take the quiz without an account.
FR-10 â Student opens shared link without account (explicit) As a Student I should open the shared link without an account so that I can take the quiz.
FR-11 â Student start with name and optional email (explicit) As a Student I should enter my name and optional email to start so that my attempt is identified.
FR-12 â One question at a time with progress and timer (explicit) As a Student I should answer one question at a time with a progress bar and timer when a time limit is set so that I can complete the quiz.
FR-13 â Availability checks (explicit) As a Student I should see "Not Available" when the quiz is inactive or outside its start/end window so that I know it cannot be taken.
FR-14 â One attempt per student per quiz (explicit) As a Student I should see "Already Completed" with my previous score if I have already attempted this quiz so that duplicate attempts are prevented.
FR-15 â Instant grading (explicit) As a Student I should have my answers graded instantly so that I see my result immediately.
FR-16 â Attempt persistence (explicit) As a Student my completed attempt should be saved with score, per-question correctness, time spent, and total time so that results are recorded.
FR-17 â Results screen with breakdown (explicit) As a Student I should see my score with correct/incorrect breakdown and explanations so that I can learn from the result.
FR-18 â Result email (explicit) As a Student I should receive a result email if I provided an email so that I have a record.
FR-19 â Dashboard stats and trends (explicit) As an Instructor I should see four stats cards (Quizzes Created, Quiz Attempts, Average Score, Study Time) each with a weekly trend so that I understand my activity.
User.me(), Quiz.list('-created_date', 50), QuizAttempt.filter({quiz_owner_email}), QuizAttempt.filter({created_by}).FR-20 â Detailed analytics (explicit) As an Instructor I should filter analytics by quiz and time range and see bar/line/pie charts of score distributions, completion trends, and hardest questions so that I can diagnose performance.
FR-21 â Recent quizzes grid with ownership actions (explicit) As an Instructor I should see recent quiz cards with subject/difficulty badges, status (active/closed/scheduled), and take/share/edit/delete actions based on ownership so that I can manage my quizzes.
FR-22 â Quick Start panel (explicit) As an Instructor I should have Quick Start buttons (create quiz, view results, etc.) so that I can act quickly.
FR-23 â Instructor sees only own quizzes and analytics (explicit) As an Instructor I should see only my own quizzes and analytics so that my data is scoped to me.
FR-24 â Personal quiz-taking history (explicit) As an Instructor I should view my personal quiz-taking history with average score, best score, total attempts, and a chronological attempt list with score badges and time taken so that I can review my own attempts.
FR-25 â Per-quiz results access control (explicit) As an Instructor I should access QuizResults only for quizzes I own (or as admin) so that others' results are protected.
FR-26 â Quiz info and share from QuizResults (explicit) As an Instructor I should see a quiz info card (subject, difficulty, time limit, student count) and copy the share link so that I can distribute the quiz.
FR-27 â CSV export (explicit) As an Instructor I should download all attempts as CSV (name, email, score, time, date) so that I can analyze externally.
FR-28 â Per-quiz statistics (explicit) As an Instructor I should see average score, pass rate, and a score distribution chart so that I can assess the cohort.
FR-29 â Student results table (explicit) As an Instructor I should see a table of each student's name, score, time, date, and pass/fail badge so that I can review individual outcomes.
FR-30 â Sidebar navigation and branding (explicit) As an Instructor I should navigate via a sidebar with QuizCraft branding (BookOpen icon + gradient), nav items (Dashboard, Create Quiz, My Results), Quick Stats (Quizzes Created count, Average Score), gradient active state, and mobile collapse with hamburger header so that navigation is clear and responsive.
FR-31 â Embedded Chatbase support widget (explicit)
As a user I should have an embedded Chatbase widget loaded via script in index.html so that I can get in-app support.
?id=); share the public link; monitor dashboard stats and filtered analytics; manage recent quizzes with ownership-based take/share/edit/delete; view per-quiz results (owner or admin only) with statistics, student table, and CSV export; review personal quiz-taking history.TakeQuiz?id={quizId} link and never creates an account.User.me() and the instructor's quizzes and attempts.response_json_schema returning {questions: [...]}; the default model is used, or gemini_3_flash with add_context_from_internet: true when URL-based.?id= is present) with built-in id, created_date, updated_date, created_by.?id= in the URL.TakeQuiz?id={quizId} URL is copied to the clipboard with confirmation.User.me(), Quiz.list('-created_date', 50), and QuizAttempt.filter({quiz_owner_email}) / QuizAttempt.filter({created_by}) load.TakeQuiz?id={quizId} link (no account).Muse: Michal Malewicz. Headline: "Layered translucency for a quiz studio that feels like a smart workspace." The emotional register is encouraging, intelligent, and slightly playful but not childish â clarity and control for instructors, low-friction confidence for students.
Mode: Light mode.
Color tokens (exact hex by role):
#F5F7FF with a subtle gradient overlay from #EEF2FF to #F5F3FF (source: bg-gradient-to-br from-slate-50 via-blue-50 to-purple-50).#FFFFFF at 95% opacity with backdrop blur and 1px border #E0E7FF (source: bg-white/95 backdrop-blur border-white/20).#1E1B4B (deep indigo, high contrast).#7C3AED (rich violet) for buttons, active states, icon gradients.linear-gradient(135deg, hsl(250,84%,60%) 0%, hsl(260,80%,65%) 100%) â used on buttons, icons, active states.#F472B6 (warm pink) used sparingly for highlights, badges, hover states.#E0E7FF (pale periwinkle) for dividers and secondary surfaces.Typography:
clamp() scaling between 40px and 56px.Shape language: Generous rounded corners 16â24px on cards, buttons, inputs; glass panels with 1px semi-transparent borders and soft inner glow; pill-shaped or rounded-xl buttons with gradient fills; subtle blurred low-opacity blob shapes and floating orbs in the background; rounded friendly lucide-react icons with rounded linecaps.
Spacing rhythm: Generous padding 24â32px and spacing between sections; 12-column dashboard grid; stats cards in a row of 4; analytics full-width; recent quizzes 2/3 and quick start 1/3; wizard progress indicator with numbered circles connected by lines, current step highlighted with gradient.
Imagery style: Abstract gradient blobs and soft 3D primitives (spheres, toruses) in violet/pink gradients as decorative background elements; no stock photos; gradient-stroke lucide icons; simple line-art with gradient fills for empty states; a shimmering gradient orb as the AI generation loading state.
Avoid: Flat opaque cards with no depth; harsh shadows or neumorphism; overuse of gradients on text (keep text solid); cluttered layouts; stock photography or generic illustrations; bouncy or exaggerated animations; low-contrast text on glass surfaces (minimum 4.5:1); gradient blobs overlapping readable text or controls.
Readability constraint: Headlines, wordmarks, labels, numbers, and card text/controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling (e.g., clamp()) to fit; no other element covers any part of them. Decoration and motion may crop, bleed, rotate, or overlap as the direction asks, provided they cover no readable text or control. With prefers-reduced-motion, provide a usable static arrangement.
"The Luminous Studio" â the public entry (Landing) is a full-width glass panel floating over a soft lavender-blue field (#F5F7FF with #EEF2FF â #F5F3FF overlay). A large gradient-filled headline in Plus Jakarta Sans bold (56px desktop, 40px mobile via clamp()) anchors the left side, with a floating 3D gradient orb (CSS radial gradient in violet/pink) drifting slowly and bleeding off the right edge. The panel has a soft inner glow and a 1px light border (#E0E7FF) that catches light. Composition is asymmetric: text left-aligned, orb bleeding off the right edge, and a prominent pill-shaped "Create New Quiz" / instructor entry button with the primary gradient anchored bottom-right, with a subtle shine animation on hover. Two audience entry points are composed as glass chips â Instructor (â Login) and Student (â shared link) â so the anonymous visitor immediately understands both paths. Decorative blobs sit behind the panel and never overlap readable text or controls. This recomposes only accepted content and navigation; it introduces no new behavior.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
Landing Hero Motion Brief
response_json_schema returns {questions: [...]}; model default or gemini_3_flash with add_context_from_internet: true when URL-based.prefers-reduced-motion; readable text and controls stay whole at 375px, 768px, and 1280px.index.html.Source-specified stack (preserved; user permits an alternative stack):
index.html.Where the user's "you can use your own tech stack" allowance is exercised, the replacement must preserve all source-specified behaviors, entities, fields, grading rules, RLS, and AI generation contract. No additional services are required beyond the application backend, the AI generation service, and the email delivery service.
response_json_schema.index.html.
One studio for both audiences: instructors build multiple-choice, true-or-false, and short-answer quizzes by hand or with AI, then share one link. Students open it, enter their name, and see results the moment they finish â no student account needed.
Students take quizzes without an account â no sign-up, just the shared link.
In-app support is available through the support widget built into the app.

One studio for both audiences: instructors build multiple-choice, true-or-false, and short-answer quizzes by hand or with AI, then share one link. Students open it, enter their name, and see results the moment they finish â no student account needed.
Students take quizzes without an account â no sign-up, just the shared link.
In-app support is available through the support widget built into the app.
No comments yet. Be the first!