Lexiverse
Lexiverse - AI contextual reading engine for English learners. Your next article is your next review.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
A Duolingo-style quiz experience for CAPS-aligned school learning.
Next.js 14 · TypeScript · Tailwind CSS · Supabase
The quiz system expects these tables. Create them if they don't exist.Read the full README ↗CAPS-aligned study site for South African learners (curiolearning.co.za): free practice papers with memos, quizzes with short lessons, subject guides, and Bloom, an AI tutor that is currently testers-only. Next.js 14 (App Router) · TypeScript · Tailwind CSS · Supabase
# 1. Install dependencies
npm install
# 2. Run locally
npm run dev
# → http://localhost:3000
The Supabase project URL and publishable key live in lib/supabaseConfig.ts, so the site runs without a .env.local. Bloom needs the variables below.
| Variable | Required | Description |
|---|---|---|
ANTHROPIC_API_KEY | For Bloom | Powers Bloom, the AI tutor (/bloom). Locally it goes in the git-ignored .env.local; never commit it |
BLOOM_ACCESS | Optional | Who can use Bloom: off, testers or everyone. Unset means off, except under npm run dev (testers) |
BLOOM_TESTERS | Optional | Extra Bloom testers by email, comma-separated. Admin accounts are always testers |
BLOOM_MODEL | Optional | Overrides the Claude model Bloom uses |
The base tables predate the migrations folder; later changes are in supabase/migrations/. Tables and functions the app uses:
quiz_levels: one row per level, including the lesson (intro, concepts, tested). Premium rows are readable only by admins and paid-up members (20261105130000_lock_premium_content.sql).quiz_level_catalog(): every level's name, order and lock state, with no lesson content. Use it wherever locked levels must still be listed.questions: linked to a level by level_id + grade + subject; locked the same way as quiz_levels.user_level_progress: best score, attempts and pass state per user per level. question_attempts logs each answer.profiles: grade, XP, streak, is_premium, is_founder, is_admin, subscription dates.papers: the practice paper library (PDF and memo URLs).bloom_conversations, bloom_turns, bloom_usage: Bloom chats and daily limits.Server-rendered pages read content through lib/content.ts with the publishable key and no user session, so they only ever see what an anonymous visitor may see. Never use a service-role key there.
/ Landing page, or the dashboard when signed in
/papers Practice paper library
/subjects, /subjects/grade-N/[slug] CAPS subject guides (lib/data/subjects.json)
/quiz Browse quiz topics
/quiz/[broadTopic]?grade=&subject= Levels in one topic
/quiz/[broadTopic]/[levelId]/learn Lesson for one level (levelId = quiz_levels.id)
/quiz/[broadTopic]/[levelId]/play Quiz runner
/subscription Premium
/bloom Bloom chat (testers only for now)
/deeplearn Bloom "coming soon" page
/sitemap.xml Generated by app/sitemap.ts
Every quiz attempt:
Implemented in lib/questions.ts → shuffleQuestion() and fetchLevelQuestions().
Vercel builds from GitHub. Set the Bloom variables above in the Vercel dashboard when Bloom should run there.
Colours, fonts and layout classes are CSS variables and classes in app/globals.css (fonts are loaded in app/layout.tsx). Every colour has a dark-mode value.