Skip to content

Schlaflied/Plot-Ark

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

103 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

English | δΈ­ζ–‡

Plot Ark β€” Agentic Curriculum Engine

License: AGPL v3 GitHub stars GitHub forks Docker Python Flask React PostgreSQL Redis LightRAG xAPI Tavily IMS Awesome Built on Hive Hive Contributor

Plot Ark Logo

An open-source agentic curriculum engine that generates pedagogically grounded course content through narrative frameworks.

Unlike static AI course generators, Plot Ark applies evidence-based instructional design principles β€” Bloom's Taxonomy, Krashen's i+1 difficulty scaffolding, and Cognitive Load Theory β€” so the curriculum it generates is structured the way learning actually works.

Agentic pipeline β€” a Tavily research agent searches real academic sources first, then injects verified URLs into the generation prompt. No hallucinated citations.

Multi-provider AI β€” switch between OpenAI (GPT-4o-mini) and Google Gemini via a single env variable. Bring your own key.


🎬 Demo

syllabus upload β€” drop PDF/DOCX β†’ auto-fill form fields + extract required readings

syllabus upload

research agent&human in the loop β€” Tavily research agent β†’ human source review β†’ approve/reject

research agent&human in the loop

module adjuistment β€” drag-and-drop reorder, inline editing, all fields editable

module adjuistment

Knowledge Graph β€” concept map, node detail, natural language query with node highlight

Knowledge Graph

β–Ά Full demo video (Google Drive)


✨ Features

🧠 Curriculum Generation
  • Agentic source research β€” Tavily agent runs multi-type queries across academic (JSTOR, Springer, ResearchGate…), video (TED, Coursera, YouTube), and news (HBR, Economist, NYT) domains before generation begins
  • Grounded citations β€” verified real URLs injected into the prompt; sources panel shows full titles, type badges (πŸ“„/🎬/πŸ“°), and estimated read/watch time
  • Structure self-check β€” after generation, validates complexity_level progression and module count; auto-retries once if structure is invalid
  • Bloom's Taxonomy alignment β€” course code (e.g. ACCT 301) automatically maps to the correct cognitive level (Remember β†’ Create)
  • i+1 difficulty progression β€” complexity_level increases across modules so each one builds on the last
  • Cognitive Load constraints β€” max 2 readings per module, each with explicit pedagogical rationale
  • Course typology β€” project-based, essay, debate/roleplay, lab/simulation, or mixed assessment formats
  • SSE streaming β€” content streams token-by-token; research agent status shown before generation starts
  • Syllabus import β€” upload PDF or DOCX; GPT extracts topic, course code, level, audience, module count, and required readings to pre-fill the form
  • Course narrative β€” a 2–3 sentence "story of the course" generated at the skeleton phase; professor-editable, student read-only
✏️ Module Editor
  • Single-card navigation β€” left/right arrows through modules, or click the sidebar index
  • Drag-and-drop reordering β€” restructure the sequence without regenerating
  • Inline editing β€” edit every field across all three tabs (Objectives, Resources, Assessment)
  • Add / remove items β€” learning objectives, readings, assignments all editable
  • Resource cards β€” each reading shows type badge, estimated time, and links directly to the source
  • LocalStorage persistence β€” edits survive page refresh
  • Course narrative editing β€” professor can edit the course-level narrative inline; students see read-only version
πŸ“¦ Export
  • IMS Common Cartridge (.imscc) β€” direct import into Canvas, Moodle, D2L
  • PDF export β€” client-side jsPDF; readings listed as inline titles per module, full citations collected in a References section at the end
  • DOCX export β€” python-docx backend; same structure as PDF
  • Markdown export β€” full curriculum with readings and assignments as a .md file
  • Citation format selector β€” APA / MLA / Chicago, applied across all export formats
  • Copy to clipboard β€” paste into any editor
πŸ•ΈοΈ Knowledge Graph (LightRAG)
  • Material ingestion β€” right-side panel always visible; drag-and-drop PDF/PPTX upload (max 15 files, 50MB each); per-file progress tracking; Build Graph button triggers LightRAG ingestion
  • Undergraduate year sidebar β€” Year 1–4 + All Courses navigation; courses organized by academic year
  • Course management β€” course banner with pill navigation per year; add/delete/rename/drag-reorder course pills; each course has an editable full name tag; changes auto-saved to localStorage
  • Dynamic subject tabs β€” add/delete/rename/drag-reorder subject tabs; tab state persists across sessions
  • Force-directed visualization β€” interactive 2D graph with warm brown palette; node size scales with connection count
  • Node detail panel β€” click any concept to see its definition and connection count
  • Fullscreen mode β€” fullscreen toggle with ESC key support
  • Course search β€” search courses by name or code across all years; auto-navigates to correct year
  • Concept search β€” filter and highlight matching nodes across the graph
  • Knowledge query β€” ask natural language questions against the graph; Redis-cached answers (persistent cache)
  • Query history β€” starred + deletable history of past questions with subject tags
  • Persistent event loop β€” LightRAG async engine runs on a dedicated background thread; no cold-start penalty after first query
πŸ€– A2A Multi-Agent Analytics
  • xAPI mock data engine β€” seeds realistic learner behavior (experienced/completed/struggled/passed/failed/attempted) across all courses with 15% anomaly noise injection
  • Multi-agent analysis pipeline β€” Orchestrator dispatches 4 specialized agents: Behavior Analyst, Risk Detector, Content Optimizer, Cohort Comparator
  • Hive-style node architecture β€” each agent inherits BaseNode with reflexion/retry, L3 JSON Schema validation, and SQL fallback
  • SharedMemory (Redis) β€” agents communicate through Redis-backed shared memory with local dict fallback
  • SSE real-time streaming β€” analysis progress streams via Server-Sent Events; frontend shows live agent status
  • Student Data dashboard β€” dedicated full-page analytics view with resizable sidebar, section navigation, and course metadata
  • Risk assessment β€” multi-signal scoring (low activity, high struggle, incomplete modules) with at-risk student table
  • Cohort comparison β€” students grouped into high-performers / average / at-risk / disengaged with avg completion and struggle rates
  • Report export β€” PDF (ReportLab + matplotlib charts), DOCX (python-docx + charts), Excel (openpyxl) with brand-colored visualizations
  • Section 5 Overview β€” data-driven recommended actions with priority levels (πŸ”΄ HIGH / 🟑 MEDIUM / βšͺ LOW)

🧭 Design Philosophy

Most EdTech AI tools treat artificial intelligence as a threat to be monitored β€” detecting whether students used AI, flagging "inauthentic" work, enforcing originality.

Plot Ark takes the opposite position.

AI is a cognitive tool, not a threat. A student who uses AI to draft an answer, then understands it, refines it, and can explain it in their own words β€” that student has learned. Copy-paste without comprehension is a student deceiving themselves, not a system to be policed.

Plot Ark has no AI detection mechanism. It never will. The question it asks is not "did you use AI?" but "did learning happen?" β€” and it answers that through Bloom's Taxonomy alignment, i+1 difficulty progression, and xAPI learner behavior tracking.

The curriculum engine itself is built the same way: AI generates the structure, pedagogy constrains the output, and the instructor stays in the loop. The tool thinks; the human decides.

Anthropic's Economic Index (Jan 2026) found r = 0.925 between prompt sophistication and response sophistication β€” the deeper you engage it, the deeper it responds.


πŸ—οΈ Architecture

System Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Frontend (React + TypeScript + Vite)                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ Generate  β”‚ β”‚ Courses  β”‚ β”‚  Course  β”‚ β”‚ Knowledge β”‚ β”‚ Student Data  β”‚  β”‚
β”‚  β”‚   Page    β”‚ β”‚   Page   β”‚ β”‚   Page   β”‚ β”‚   Graph   β”‚ β”‚    Page       β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚       β”‚            β”‚            β”‚              β”‚              β”‚           β”‚
β”‚  components/ui/  components/generate/    hooks/ (useIngest, useQuery)    β”‚
β”‚  (Select, Input)   (SyllabusUpload)             SSE streaming            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚            β”‚            β”‚              β”‚              β”‚
        β–Ό            β–Ό            β–Ό              β–Ό              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Backend (Flask + Blueprints)                                              β”‚
β”‚  β”œβ”€β”€ app.py (~30 lines, routing)         β”œβ”€β”€ config.py (Env constants)     β”‚
β”‚  β”œβ”€β”€ extensions.py (Global instances)    β”œβ”€β”€ async_loop.py (Event loop)    β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  routes/                                                            β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ curriculum.py    generate / skeleton / expand / save           β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ history.py       CRUD + favorite + DOCX export                 β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ analytics.py     A2A SSE analysis + PDF/DOCX/Excel export      β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ xapi.py          xAPI statements + mock data seed              β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ graph.py         KG data + RAG query                           β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ sources.py       Tavily source preview                         β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ syllabus.py      PDF/DOCX parse + import                       β”‚   β”‚
β”‚  β”‚  └── materials.py     LightRAG ingest                               β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  agents/ (Hive-style A2A)   β”‚  β”‚  services/                         β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ base.py (BaseNode)     β”‚  β”‚  β”œβ”€β”€ research.py (Tavily)          β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ orchestrator.py        β”‚  β”‚  β”œβ”€β”€ file_parser.py                β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ behavior_analyst.py    β”‚  β”‚  β”œβ”€β”€ prompt_builder.py             β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ risk_detector.py       β”‚  β”‚  β”œβ”€β”€ xapi_generator.py             β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ content_optimizer.py   β”‚  β”‚  β”œβ”€β”€ report_exporter.py (facade)   β”‚   β”‚
β”‚  β”‚  └── cohort_comparator.py   β”‚  β”‚  β”œβ”€β”€ chart_generator.py            β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  └── export_{pdf,docx,excel}.py    β”‚   β”‚
β”‚             β”‚  SharedMemory       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              β”‚                                   β”‚
              β–Ό                                   β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  PostgreSQL  β”‚  β”‚    Redis     β”‚  β”‚   LightRAG   β”‚
β”‚  (curricula  β”‚  β”‚  (cache +    β”‚  β”‚   (KG data)  β”‚
β”‚  + xapi +    β”‚  β”‚   shared     β”‚  β”‚              β”‚
β”‚  feedback)   β”‚  β”‚   memory)    β”‚  β”‚              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Course Generation Pipeline

Course Generation Pipeline

RAG & Knowledge Graph Ingestion

RAG & Knowledge Graph Ingestion

A2A Multi-Agent Analytics Architecture

A2A Multi-Agent Analytics Architecture

Planned agentic loop:

xAPI behavior events β†’ Curriculum Agent β†’ Redis learner state β†’ Narrative Engine β†’ LMS

πŸ› οΈ Tech Stack

Layer Technology Role
Frontend React + TypeScript + Vite Module editor, A2A dashboard, SSE client, drag-and-drop
Backend Python + Flask Blueprints Modular route-based API (8 Blueprints + 6 Agents + 5 Services)
AI OpenAI GPT-4o / Google Gemini Content generation & A2A analysis (via AI_PROVIDER)
Research Agent Tavily Search API Pre-generation academic source retrieval
Database PostgreSQL Curricula storage, mock xAPI statements, and student feedback
Cache & Memory Redis Graph query cache, learner state, and A2A shared memory
Knowledge Graph LightRAG + networkx + react-force-graph-2d Course material ingestion β†’ interactive concept graph
Behavior Data xAPI 1.0.3 + mini-LRS Statement ingestion β†’ Redis learner state β†’ professor analytics panel
Analytics Engine A2A multi-agent (Hive-style) Orchestrator + 4 specialized agents for behavior, risk, content, & cohort analysis
Report Export ReportLab + python-docx + openpyxl + matplotlib PDF/DOCX with branded charts, Excel with raw data
Export IMS Common Cartridge + DOCX + PDF LMS-compatible output in multiple formats
Dev Docker Compose Single-command local environment

πŸš€ Quick Start

Prerequisites: Docker, an OpenAI or Gemini API key, a Tavily API key (free tier at tavily.com)

git clone https://github.com/Schlaflied/Plot-Ark
cd Plot-Ark

cp .env.example .env
# Set AI_PROVIDER=openai or AI_PROVIDER=gemini
# Add the corresponding API key + TAVILY_API_KEY

docker compose up --build
Service URL
Frontend http://localhost:5173
Backend http://localhost:5000

πŸ•ΈοΈ Using the Knowledge Graph

The knowledge graph feature lets you ingest your own course materials (PDFs, PPTXs, or DOCXs) and explore them as an interactive concept map.

  1. Go to the Knowledge Graph tab
  2. In the Upload Materials panel on the right, fill in:
    • Subject name (required) β€” e.g. "Organizational Behavior"
    • Course code (optional) β€” e.g. "ADMS 2400"
    • Year (required) β€” which year of study this course belongs to
  3. Drop your PDF / PPTX / DOCX files into the dropzone
  4. Click Build Graph β€” ingestion runs in the background (~$0.10–0.30 per 10 PDFs at gpt-4o-mini rates)
  5. Once complete, the graph appears automatically under the correct year and course tab

πŸ“ Project Structure

plot-ark/
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ .env.example
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ Syllabus Upload.gif              ← Demo: syllabus import β†’ form auto-fill
β”‚   β”œβ”€β”€ research agent&human in the loop.gif  ← Demo: research agent + source review
β”‚   β”œβ”€β”€ module adjuistment.gif           ← Demo: module editing + drag-and-drop
β”‚   └── Knowledge graph .gif             ← Demo: knowledge graph features
β”‚
β”œβ”€β”€ backend/                             ← Flask (modular Blueprints)
β”‚   β”œβ”€β”€ app.py                           ← Entry point (~30 lines, registers Blueprints)
β”‚   β”œβ”€β”€ config.py                        ← Pure setup constants and environment variables
β”‚   β”œβ”€β”€ extensions.py                    ← Global service singletons (Flask app, AI, Redis)
β”‚   β”œβ”€β”€ async_loop.py                    ← Background event loop manager
β”‚   β”œβ”€β”€ db.py                            ← PostgreSQL operations
β”‚   β”œβ”€β”€ constants.py                     ← Bloom's taxonomy, session constraints, formats
β”‚   β”œβ”€β”€ routes/
β”‚   β”‚   β”œβ”€β”€ curriculum.py                ← /api/curriculum/* (generate, skeleton, expand, save)
β”‚   β”‚   β”œβ”€β”€ history.py                   ← /api/history/* + /api/curriculum/export/docx
β”‚   β”‚   β”œβ”€β”€ sources.py                   ← Tavily source preview
β”‚   β”‚   β”œβ”€β”€ graph.py                     ← KG data + RAG query
β”‚   β”‚   β”œβ”€β”€ xapi.py                      ← xAPI statements + seed generator
β”‚   β”‚   β”œβ”€β”€ analytics.py                 ← A2A SSE analysis + export endpoints
β”‚   β”‚   β”œβ”€β”€ syllabus.py                  ← PDF/DOCX parse + import
β”‚   β”‚   └── materials.py                 ← LightRAG ingest
β”‚   β”œβ”€β”€ agents/
β”‚   β”‚   β”œβ”€β”€ base.py                      ← BaseNode + SharedMemory + NodeResult
β”‚   β”‚   β”œβ”€β”€ orchestrator.py              ← Multi-agent coordinator with SSE
β”‚   β”‚   β”œβ”€β”€ behavior_analyst.py          ← xAPI verb/module engagement analysis
β”‚   β”‚   β”œβ”€β”€ risk_detector.py             ← Multi-signal at-risk scoring
β”‚   β”‚   β”œβ”€β”€ content_optimizer.py         ← Module performance cross-analysis
β”‚   β”‚   └── cohort_comparator.py         ← Student cohort grouping
β”‚   β”œβ”€β”€ services/
β”‚   β”‚   β”œβ”€β”€ research.py                  ← Tavily search + credibility scoring
β”‚   β”‚   β”œβ”€β”€ file_parser.py               ← PDF/PPTX/DOCX text extraction
β”‚   β”‚   β”œβ”€β”€ prompt_builder.py            ← Centralized AI prompt templates
β”‚   β”‚   β”œβ”€β”€ lightrag_service.py          ← LightRAG instance management
β”‚   β”‚   β”œβ”€β”€ xapi_generator.py            ← Mock xAPI data with noise injection
β”‚   β”‚   β”œβ”€β”€ report_exporter.py           ← Thin facade for report generation
β”‚   β”‚   β”œβ”€β”€ chart_generator.py           ← Matplotlib visualizations & brand colors
β”‚   β”‚   β”œβ”€β”€ export_pdf.py                ← ReportLab PDF layout & structure
β”‚   β”‚   β”œβ”€β”€ export_docx.py               ← python-docx Word document builder
β”‚   β”‚   └── export_excel.py              ← openpyxl Excel spreadsheet builder
β”‚   β”œβ”€β”€ Dockerfile
β”‚   └── requirements.txt
β”‚
β”œβ”€β”€ frontend/                            ← React + TypeScript + Vite
β”‚   β”œβ”€β”€ App.tsx                          ← Router (React Router v7)
β”‚   β”œβ”€β”€ pages/
β”‚   β”‚   β”œβ”€β”€ GeneratePage.tsx             ← Course generation form
β”‚   β”‚   β”œβ”€β”€ CoursePage.tsx               ← Module editor + export
β”‚   β”‚   β”œβ”€β”€ CoursesPage.tsx              ← Course dashboard
β”‚   β”‚   β”œβ”€β”€ GraphPage.tsx                ← Knowledge graph viewer
β”‚   β”‚   └── StudentDataPage.tsx          ← A2A multi-agent analytics dashboard
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   β”œβ”€β”€ Select.tsx               ← Reusable dropdown
β”‚   β”‚   β”‚   └── Input.tsx                ← Reusable text input
β”‚   β”‚   β”œβ”€β”€ generate/
β”‚   β”‚   β”‚   β”œβ”€β”€ SyllabusUpload.tsx       ← Drag-and-drop syllabus upload
β”‚   β”‚   β”‚   β”œβ”€β”€ SourceReview.tsx         ← Review Tavily research sources
β”‚   β”‚   β”‚   └── SkeletonReview.tsx       ← Review course module skeleton
β”‚   β”‚   β”œβ”€β”€ analytics/
β”‚   β”‚   β”‚   └── ReportSections.tsx       ← A2A analytics report viewer component
β”‚   β”‚   β”œβ”€β”€ ModuleCard.tsx               ← Individual curriculum module card
β”‚   β”‚   β”œβ”€β”€ ModuleSidebar.tsx            ← Navigation sidebar for modules
β”‚   β”‚   β”œβ”€β”€ GraphViewer.tsx              ← Core force-directed graph rendering
β”‚   β”‚   β”œβ”€β”€ GraphToolbar.tsx             ← Subject tabs, node/course search
β”‚   β”‚   β”œβ”€β”€ CourseBanner.tsx             ← Course pills, DnD, inline rename
β”‚   β”‚   β”œβ”€β”€ NodeDetailPanel.tsx          ← Node detail floating sidebar
β”‚   β”‚   β”œβ”€β”€ IngestPanel.tsx              ← File upload and lightrag pipeline
β”‚   β”‚   β”œβ”€β”€ QueryPanel.tsx               ← RAG query input and history
β”‚   β”‚   β”œβ”€β”€ YearSidebar.tsx              ← Year 1-4 lateral navigation
β”‚   β”‚   └── Diagrams.tsx                 ← Mermaid diagram component
β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”œβ”€β”€ useIngest.ts                 ← Upload polling logic and state
β”‚   β”‚   β”œβ”€β”€ useQuery.ts                  ← RAG answer logic and history state
β”‚   β”‚   └── useCourseManager.ts          ← Course CRUD and persistence
β”‚   β”œβ”€β”€ constants/
β”‚   β”‚   β”œβ”€β”€ theme.ts                     ← Shared GraphViewer UI constants
β”‚   β”‚   └── formOptions.ts               ← LEVELS, COURSE_TYPES, SESSION_DURATIONS
β”‚   β”œβ”€β”€ Dockerfile
β”‚   └── vite.config.ts
β”‚
└── data/
    β”œβ”€β”€ materials/                       ← Course PDFs/PPTXs (gitignored)
    └── lightrag_storage*/               ← Knowledge graph data (gitignored, regenerate)

πŸ—ΊοΈ Roadmap

  • Flask SSE streaming backend
  • React frontend with module card navigation
  • Docker Compose dev environment
  • Bloom's Taxonomy course code mapping
  • i+1 difficulty progression
  • Inline module editing (all fields)
  • Drag-and-drop module reordering
  • IMS Common Cartridge + Markdown export
  • Tavily agentic research pipeline β€” real academic sources before generation
  • PostgreSQL history β€” persist, favorite, and delete curricula
  • LMS-style module sidebar (D2L Brightspace-inspired layout)
  • Multi-type resource pipeline β€” academic / video / news with type badges and estimated time
  • Structure self-check with auto-retry β€” validates complexity progression and module count
  • LightRAG knowledge graph β€” PDF/PPTX ingestion β†’ interactive force-directed concept map
  • Knowledge graph query β€” natural language Q&A against course material graph, Redis-cached
  • Assignment Timeline + Due Date calculator
  • Human-in-the-loop source review β€” approve/reject Tavily results before generation
  • xAPI mini-LRS β€” statement ingestion, learner state, professor analytics panel (mock data)
  • Syllabus import β€” PDF/DOCX β†’ auto-fill form + extract required readings
  • Course narrative β€” course-level story generated at skeleton phase, professor-editable
  • Citation format selector β€” APA / MLA / Chicago across all exports
  • PDF + DOCX export β€” client-side jsPDF and python-docx backend
  • Multi-course management β€” dynamic course slots with add/delete/rename/drag-reorder
  • My Courses dashboard β€” card grid with course history overview
  • Knowledge Graph course management β€” year sidebar, course banner, dynamic subject tabs, fullscreen, course search
  • Knowledge Graph ingestion panel β€” drag-and-drop material upload, always-visible right panel
  • Backend modularization β€” Flask Blueprints (7 routes + 3 services), app.py reduced to ~30 lines
  • Frontend code splitting β€” extracted reusable UI components (Select, Input, SyllabusUpload)
  • Session Duration pill selector β€” quick presets + custom hr/min input
  • Module Count pill selector β€” quick presets + custom input
  • A2A multi-agent analytics β€” Orchestrator + 4 agents (Behavior Analyst, Risk Detector, Content Optimizer, Cohort Comparator)
  • Student Data dashboard β€” dedicated analytics page with resizable sidebar, section nav, SSE progress
  • Analytics report export β€” PDF with branded charts + DOCX + Excel
  • xAPI mock data engine β€” 15% anomaly noise, full course coverage
  • Redis learner state management
  • Professor LTM β€” preference learning from edit history
  • LTI 1.3 β€” push into Canvas / Moodle

πŸ“„ License

GNU Affero General Public License v3.0 β€” see LICENSE

  • Free for personal use, research, and open-source projects
  • Modifications must be open-sourced under the same license
  • Network deployment requires your product to also be open-source
  • Commercial licensing β€” open a GitHub Issue

Featured In


⭐ Star History

Star History Chart

πŸ™ Acknowledgements

Architectural inspiration from Hive (YC-backed AI agent infrastructure) β€” the node pipeline, shared memory, and evolution loop patterns informed the agentic curriculum engine design.

Knowledge graph layer powered by LightRAG (HKUDS) β€” incremental knowledge graph construction and prerequisite inference across course materials.

Two-phase generation pipeline design inspired by OpenMAIC (Tsinghua University) β€” the outline-first, then expand pattern informed Plot Ark's curriculum skeleton generation approach.

Built with Claude (Anthropic) as AI pair programmer.

Special thanks to the two chief quality assurance officers who supervised every late-night coding session β€” Icy (ε†°η³–, white) and ι›ͺζ’¨ (calico):

Icy and ι›ͺζ’¨ β€” Chief QA Officers


Report Bug Β· Request Feature

Star this repo if it's useful.

Packages

 
 
 

Contributors