Skip to content
SchlafliedPublic

About

Evidence-driven curriculum operations: turn learning signals into reviewable course changes, then track outcomes over time with knowledge graphs and long-term memory.

Topics

Resources

Stars

13 stars

Watchers

0 watching

Forks

Repository files navigation

English | δΈ­ζ–‡

Plot Ark β€” Observe Β· Remember Β· Improve

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

Plot Ark is an open-source long-term memory for course improvement. It connects each course version to the evidence that prompted a change, the human decision that followed, and the results observed in the next learning cycle.

Most learning platforms show what happened once: completion, time spent, scores, or feedback. Plot Ark is built for the question that comes next:

We changed the course. Did it actually get better?

Plot Ark keeps that answer traceable across repeated analysis runs:

  1. collect course structure, learner behavior, and learner voice;
  2. diagnose where learning friction is concentrated;
  3. let a human accept, reject, or revise the recommendation;
  4. persist the evidence and decision in long-term memory (LTM);
  5. compare the next course version and cohort against the earlier run.
flowchart LR
    A[Course version] --> B[Learning evidence]
    B --> C[Friction diagnosis]
    C --> D[Human decision]
    D --> E[(LTM snapshot)]
    E --> F[Next course version]
    F --> G[Next learning cycle]
    G --> B
Loading

Two workspaces, one improvement loop

Academic Enterprise L&D
Primary question Where are students struggling, and how should the course change? Where does training lose people, and what should the next version fix?
People Professor / Student Admin / User
Typical inputs Syllabus, course materials, xAPI events, concept annotations, student feedback SCORM/PDF/PPTX/DOCX materials, LMS CSV/XLSX exports, Learner Pulse; xAPI optional
Evidence level Individual self-view plus privacy-safe cohort analysis Cohort-level diagnosis; no employee ranking
Human control Instructor reviews curriculum suggestions L&D owner reviews revision recommendations
Memory Analysis snapshots preserve course changes across teaching cycles The same LTM model is intended to compare training versions and later business evidence
Current state Functional end-to-end backend and UI Product preview with synthetic data; server-side ingestion and parsing are roadmap work

The two workspaces are not separate products. They share the same core: evidence β†’ diagnosis β†’ human decision β†’ LTM β†’ next version.


Explore Plot Ark

Area What it contains
Academic workspace Course generation, xAPI evidence, LightRAG knowledge graph, learner self-view, A2A diagnosis, LTM, and instructor-governed revision
Enterprise L&D workspace LMS/HCM-adjacent workflow, practical file inputs, Learner Pulse, privacy boundary, current preview, and planned ingestion backend
Full system architecture Page flows, services, database schema, privacy red lines, and project structure
Interactive landing page Visual product overview and demos
Releases Version history and shipped changes

πŸ—οΈ Architecture

System Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Frontend (React + TypeScript + Vite)                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”‚ Generate  β”‚ β”‚ Courses  β”‚ β”‚  Course  β”‚ β”‚ Knowledge β”‚ β”‚ Student β”‚ β”‚ Student  β”‚ β”‚Settingsβ”‚β”‚
β”‚  β”‚   Page    β”‚ β”‚   Page   β”‚ β”‚   Page   β”‚ β”‚   Graph   β”‚ β”‚  Data   β”‚ β”‚ Profile  β”‚ β”‚ (Prof) β”‚β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜β”‚
β”‚       β”‚            β”‚            β”‚              β”‚            β”‚           β”‚            β”‚     β”‚
β”‚  components/ui/  components/generate/    components/analytics/  ModelSelection (shared)   β”‚
β”‚  (Select, Input)   (SyllabusUpload)   (TrendChart, ReportSections, ...)                   β”‚
β”‚                             GraphViewer (2D KG + mastery overlay)                          β”‚
β”‚                                              SSE streaming                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”˜
        β”‚            β”‚            β”‚              β”‚            β”‚           β”‚            β”‚
        β–Ό            β–Ό            β–Ό              β–Ό            β–Ό           β–Ό            β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Backend (Flask + Blueprints)                                                              β”‚
β”‚  β”œβ”€β”€ app.py (~30 lines, routing)         β”œβ”€β”€ config.py (18 models + env constants)        β”‚
β”‚  β”œβ”€β”€ extensions.py (Global instances)    β”œβ”€β”€ async_loop.py (Event loop)                   β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  routes/                                                                              β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ curriculum.py           generate / skeleton / expand / save                      β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ curriculum_agent_routes flags / suggestions / apply / redo                       β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ history.py              CRUD + favorite + DOCX export                            β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ analytics.py            A2A SSE + history API + export                           β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ xapi.py                 xAPI statements + mock data seed                         β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ feedback.py             Student sentiment + comments                             β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ profile.py              Profile CRUD + model_config + Fernet API keys            β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ settings.py             Professor settings (preferences, models, prompts)        β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ graph.py                KG data + RAG query + /courses lookup                    β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ annotations.py          KG concept annotations + aggregation                     β”‚  β”‚
β”‚  β”‚  β”œβ”€β”€ 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 (⚑ aware)        β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ content_optimizer.py   β”‚  β”‚  β”œβ”€β”€ student_diagnosis.py (diagnosis)    β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ cohort_comparator.py   β”‚  β”‚  β”œβ”€β”€ report_exporter.py (facade)         β”‚   β”‚
β”‚  β”‚  β”œβ”€β”€ kg_context_analyst.py  β”‚  β”‚  β”œβ”€β”€ chart_generator.py (+history)       β”‚   β”‚
β”‚  β”‚  └── curriculum_agent.py    β”‚  β”‚  β”œβ”€β”€ ltm_writer.py (Cold layer)          β”‚   β”‚
β”‚  β”‚       SharedMemory (Redis)  β”‚  β”‚  β”œβ”€β”€ threshold_checker.py                β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”œβ”€β”€ kg_mapper.py (3-layer match)        β”‚   β”‚
β”‚             β”‚                     β”‚  └── export_{pdf,docx,excel}.py          β”‚   β”‚
β”‚             β”‚                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              β”‚                                    β”‚
              β–Ό                                    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  PostgreSQL            β”‚  β”‚  Redis   β”‚  β”‚   LightRAG   β”‚  β”‚  data/ltm/   β”‚
β”‚  β”œβ”€β”€ curricula         β”‚  β”‚ (πŸ”΄ Hot: β”‚  β”‚  GraphML KG  β”‚  β”‚  (πŸ”΅ Cold:   β”‚
β”‚  β”œβ”€β”€ xapi_statements   β”‚  β”‚  pipelineβ”‚  β”‚  (Hot Layer) β”‚  β”‚   .md YAML   β”‚
β”‚  β”œβ”€β”€ student_profiles  β”‚  β”‚  runtime)β”‚  β”‚              β”‚  β”‚   snapshots) β”‚
β”‚  β”œβ”€β”€ concept_          β”‚  β”‚          β”‚  β”‚              β”‚  β”‚              β”‚
β”‚  β”‚   annotations       β”‚  β”‚          β”‚  β”‚              β”‚  β”‚              β”‚
β”‚  └── 🟑 Warm:          β”‚  β”‚          β”‚  β”‚              β”‚  β”‚              β”‚
β”‚      snapshots/mastery β”‚  β”‚          β”‚  β”‚              β”‚  β”‚              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Full Project Pipeline

Full Project Pipeline

LTM 3-Layer Architecture

LTM 3-Layer Architecture

Full Agentic Loop

Full Agentic Loop

πŸ“ Full architecture, page-by-page data flows, database schema, red lines, and project structure β†’ ARCHITECTURE.md


πŸ› οΈ 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 (10 Blueprints + 6 Agents + 6 Services)
AI OpenAI GPT-4o / Google Gemini Content generation & A2A analysis (via AI_PROVIDER); A2A agents are sql-only β€” zero LLM cost for analytics
Research Agent Tavily Search API Pre-generation academic source retrieval
Database PostgreSQL Curricula, xAPI statements, student feedback, course_analysis_snapshots (LTM)
Cache & Memory Redis Graph query cache, learner state, A2A shared memory (a2a:{session}:{key})
Knowledge Graph LightRAG + networkx + react-force-graph-2d Course material ingestion β†’ interactive concept graph
Behavior Data xAPI 1.0.3 + mini-LRS Statement ingestion β†’ mock data engine (4 noise levels) β†’ professor analytics panel
Analytics Engine A2A multi-agent (Hive-style, sql-only Phase 1) 5-node pipeline: Orchestrator + 4 parallel agents; token tracking; LTM snapshot
Report Export ReportLab + python-docx + openpyxl + matplotlib PDF (Anthropic-style cover), DOCX, Excel; filenames include course slug + noise label
Curriculum Export IMS Common Cartridge + DOCX + PDF + Markdown LMS-compatible output in multiple formats
Dev Docker Compose Single-command local environment (frontend :5173, backend :5000)

πŸš€ 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

The login screen offers two workspaces:

  • Academic β€” Professor / Student
  • Enterprise β€” Admin / User

The Enterprise workspace ships with synthetic data for product evaluation. Its file selector currently performs client-side format, file-count, and size validation; it does not yet upload or parse the selected files on the backend.


πŸ•ΈοΈ 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

πŸ—ΊοΈ Roadmap

  • KG ↔ Curriculum concept mapping β€” 3-layer matching (word-boundary + abbreviation + reverse lookup)
  • Knowledge Map tab β€” per-module KG concepts with definitions + cross-module dependencies
  • Concept mastery tracking β€” xAPI verb + feedback β†’ cohort_concept_mastery; auto-sync after every analysis run
  • GraphViewer mastery overlay β€” fill = mastery level, border = knowledge layer; unified gray for untracked concepts
  • KG bidirectional annotation β€” students mark confused/important; professors mark exam focus; anonymous aggregation feeds confusion heatmap
  • KG β†’ Agentic Loop β€” KGContextAnalystNode injects per-concept confusion % + top confused concepts into CurriculumAgent context
  • GraphViewer role-split β€” student view (mastery filters + confusion social signal) vs professor view (high confusion heatmap + exam focus)
  • xAPI ↔ KG bridge β€” KG annotation events mirror to xAPI statements (verb: flagged / noted); full signal unification
  • Student Profile β€” 4-tab profile with avatar, discipline selector (5 disciplines), CP/OC narrative anchors, and progress color blocks
  • One-sentence diagnosis β€” template-driven concept-gap guidance with "Jump to Module" navigation
  • AI Settings β€” custom prompt instructions + clickable ideas library with auto-save
  • Multi-persona sets β€” multiple character groups with relationship tags, gender, personality descriptions, linked courses
  • Multi-model Agent Team β€” 18 preset models across 9 providers + custom model support; β˜… recommended tags, ⚠ MoE warnings, dynamic API keys
  • Professor Settings Portal β€” profile, academic preferences, model defaults, prompt templates; all with auto-save
  • Per-provider API keys β€” Fernet-encrypted storage, dynamic detection, masked GET responses
  • Professor prompt template editor β€” DB-backed prompt management with version control and variable highlighting
  • Week 1 hardening β€” fail-closed encrypted BYOK storage, browser-secret removal, and main application CI
  • Enterprise L&D Preview β€” workspace-aware Admin/User login, synthetic compliance-training diagnosis, evidence chain, Learner Pulse, and HITL revision review
  • Enterprise source-intake contract β€” SCORM ZIP/PDF/PPTX/DOCX/XLSX/CSV selector with explicit client-side count and size limits; xAPI remains optional
  • Enterprise ingestion backend β€” safe static SCORM manifest/content extraction, persisted uploads, CSV/XLSX field mapping, evidence coverage, and revision-brief export
  • Assignment Timeline + Due Date calculator
  • A2A Phase 2 β€” LLM integration for CurriculumAgent (dense model required); other agents remain sql-only
  • Progressive summarization β€” semester-level LTM summaries for LLM context management
  • 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.

About

Evidence-driven curriculum operations: turn learning signals into reviewable course changes, then track outcomes over time with knowledge graphs and long-term memory.

Topics

Resources

Stars

13 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages