A curriculum engine that turns a YAML curriculum definition into a deployable SvelteKit learning application.
Project description
learningfoundry
A curriculum engine that turns a YAML curriculum definition into a deployable SvelteKit learning application — with interactive assessments, executable notebooks, and data visualizations — in a single pipeline.
Table of Contents
- Overview
- Installation
- Quick Start
- CLI Reference
- Curriculum YAML Format
- Configuration File
- Development Setup
Overview
learningfoundry takes a single curriculum.yml file and generates a fully self-contained SvelteKit learning application. The generated app supports:
- Text — Markdown content rendered in the browser
- Video — YouTube embeds
- Quiz — Interactive assessments via quizazz (optional)
- Exercise — Executable notebooks via nbfoundry (stub provided)
- Visualization — D3-based charts via d3foundry (stub provided)
Learner progress is persisted locally in SQLite (via sql.js) — no backend required.
Installation
pip install learningfoundry
With optional quizazz support:
pip install "learningfoundry[quizazz]"
Requirements:
- Python 3.12+
- pnpm (for
previewcommand and generated app development) - Node.js 18+ (for the generated SvelteKit app)
Quick Start
-
Create a curriculum file (see Curriculum YAML Format):
cat > curriculum.yml << 'EOF' version: "1.0.0" curriculum: title: "My Course" description: "A short description." modules: - id: mod-01 title: "Module One" lessons: - id: lesson-01 title: "Getting Started" content_blocks: - type: text ref: content/lesson-01.md - type: video url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ" EOF
-
Validate the curriculum:
learningfoundry validate # OK — curriculum is valid.
-
Build and preview locally:
learningfoundry preview # Preview server started at http://localhost:5173
learningfoundry previewis the canonical "see your work" command — it builds the SvelteKit project, installs Node dependencies on first run (and again whenever they change), and starts a Vite dev server. On subsequent runs it skips the install step automatically.learningfoundry buildalone is also available if you want to generate the SvelteKit project without serving it (e.g. to inspect output, deploy a static export viacd dist && pnpm build, or wire into your own toolchain).
CLI Reference
learningfoundry build
Parse → resolve → generate a SvelteKit project.
Usage: learningfoundry build [OPTIONS]
Options:
-c, --config PATH Path to the curriculum YAML file. [default: curriculum.yml]
--log-level LEVEL Logging verbosity. [default: INFO]
Choices: DEBUG, INFO, WARNING, ERROR
-o, --output PATH Output directory for the generated SvelteKit project.
[default: dist]
--base-dir PATH Base directory for content refs.
(default: curriculum file's parent directory)
--help Show this message and exit.
Exit codes:
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Curriculum validation error |
| 2 | Content resolution error (missing file, bad URL, etc.) |
| 3 | SvelteKit generation error |
| 4 | Configuration file error |
learningfoundry validate
Validate a curriculum YAML without generating any output.
Usage: learningfoundry validate [OPTIONS]
Options:
-c, --config PATH Path to the curriculum YAML file. [default: curriculum.yml]
--log-level LEVEL Logging verbosity. [default: INFO]
--base-dir PATH Base directory for resolving content refs.
--help Show this message and exit.
Prints OK — curriculum is valid. on success, or a list of errors and exits with code 1.
learningfoundry preview
Build then launch a local Vite dev server.
Usage: learningfoundry preview [OPTIONS]
Options:
-c, --config PATH Path to the curriculum YAML file. [default: curriculum.yml]
--log-level LEVEL Logging verbosity. [default: INFO]
-o, --output PATH Output directory for the generated SvelteKit project.
[default: dist]
--base-dir PATH Base directory for content refs.
--port INTEGER Port for the local dev server. [default: 5173]
--help Show this message and exit.
Runs learningfoundry build, then pnpm install (skipped when every declared dependency is already present in node_modules/), then pnpm run dev in the generated project directory. Requires pnpm on PATH.
This serves the SvelteKit project from source via Vite's dev server; it does not serve the static pnpm build output in dist/build/. For static deploys, use cd dist && pnpm build and host the resulting dist/build/ directory on any static host.
Curriculum YAML Format
version: "1.0.0"
curriculum:
title: "Course Title" # required
description: "Course overview." # optional
modules:
- id: mod-01 # required, kebab-case
title: "Module One" # required
description: "..." # optional
# Optional pre/post assessments (requires quizazz-builder)
pre_assessment:
source: quizazz
ref: assessments/mod-01-pre.yml
post_assessment:
source: quizazz
ref: assessments/mod-01-post.yml
lessons:
- id: lesson-01 # required, kebab-case; unique within module
title: "Lesson One" # required
content_blocks:
# Text block — Markdown file
- type: text
ref: content/mod-01/lesson-01.md
# Video block — YouTube URL only
- type: video
url: "https://www.youtube.com/watch?v=XXXXXXXXXXX"
# Quiz block — requires learningfoundry[quizazz]
- type: quiz
source: quizazz
ref: assessments/mod-01-quiz.yml
# Exercise block — requires nbfoundry (stub included)
- type: exercise
source: nbfoundry
ref: exercises/mod-01-exercise.yml
# Visualization block — requires d3foundry (stub included)
- type: visualization
source: d3foundry
ref: visualizations/mod-01-vis.yml
Rules:
- Module and lesson
idvalues must be unique within their scope, and match the pattern[a-z0-9][a-z0-9-]*. - Every curriculum must have at least one module; every module at least one lesson.
- All
refpaths are resolved relative to--base-dir(default: directory containing the curriculum YAML). - Only YouTube URLs are accepted for
videoblocks (youtube.com/watch?v=oryoutu.be/).
Configuration File
An optional config file can set defaults for logging. The CLI always takes precedence.
Default location: ~/.config/learningfoundry/config.yml
logging:
level: INFO # DEBUG | INFO | WARNING | ERROR
output: stdout # stdout | stderr
Pass a custom config location with -c / --config.
Development Setup
Prerequisites
- Python 3.12+
- pyve (virtual env manager used in this project)
- pnpm 9+ and Node.js 18+
Setup
git clone https://github.com/pointmatic/learningfoundry.git
cd learningfoundry
# Create the Python environment and install the package in editable mode
pyve init
pip install -e .
# Create the test runner environment and install dev dependencies
pyve testenv --init
pyve testenv --install -r requirements-dev.txt
Running Tests
# Fast unit + integration tests (~2 min)
pyve test
# End-to-end SvelteKit smoke tests (requires pnpm, ~15 s extra)
pyve test tests/test_smoke_sveltekit.py -v
Linting and Type Checking
pyve testenv run ruff check .
pyve testenv run mypy src/
Project Structure
learningfoundry/
├── src/learningfoundry/
│ ├── cli.py # Click CLI entry point
│ ├── config.py # Configuration loading
│ ├── exceptions.py # Exception hierarchy
│ ├── generator.py # SvelteKit project generator
│ ├── integrations/ # Quiz / exercise / visualization providers
│ ├── logging_config.py # Logging setup
│ ├── parser.py # YAML parser + version dispatch
│ ├── pipeline.py # run_build / run_validate / run_preview
│ ├── resolver.py # Content reference resolver
│ └── schema_v1.py # Pydantic v1 curriculum schema
├── sveltekit_template/ # SvelteKit app template (copied on build)
├── tests/ # pytest test suite
├── requirements-dev.txt # Dev dependencies
└── pyproject.toml # Build config, ruff, mypy, pytest settings
License
Apache 2.0 — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file learningfoundry-0.36.0.tar.gz.
File metadata
- Download URL: learningfoundry-0.36.0.tar.gz
- Upload date:
- Size: 83.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c705b655da1203904f734c3ffd8f44eca2dcbd53d0e4024335e7b53152a0f6ed
|
|
| MD5 |
605e808efe0a5d92482f40a0f87df10a
|
|
| BLAKE2b-256 |
52c4990fe949084c04173a0df2089f8a3b6608b77b6f58f18b4db16a1b3a55d1
|
Provenance
The following attestation bundles were made for learningfoundry-0.36.0.tar.gz:
Publisher:
publish.yml on pointmatic/learningfoundry
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
learningfoundry-0.36.0.tar.gz -
Subject digest:
c705b655da1203904f734c3ffd8f44eca2dcbd53d0e4024335e7b53152a0f6ed - Sigstore transparency entry: 1404929654
- Sigstore integration time:
-
Permalink:
pointmatic/learningfoundry@bff4ad50697231d87b3f75cdc38aeafc61342b9c -
Branch / Tag:
refs/tags/v0.36.0 - Owner: https://github.com/pointmatic
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bff4ad50697231d87b3f75cdc38aeafc61342b9c -
Trigger Event:
push
-
Statement type:
File details
Details for the file learningfoundry-0.36.0-py3-none-any.whl.
File metadata
- Download URL: learningfoundry-0.36.0-py3-none-any.whl
- Upload date:
- Size: 83.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0224c1db7446aa0b2912a035b821119e934153fd130520e410cfbc4b1fca3da9
|
|
| MD5 |
b817cf1ac62346e495816b7674764da6
|
|
| BLAKE2b-256 |
6e2b5cf0d4df1125e2a141c978314f10c15de5b60dbfbdf1966034948c30cbf6
|
Provenance
The following attestation bundles were made for learningfoundry-0.36.0-py3-none-any.whl:
Publisher:
publish.yml on pointmatic/learningfoundry
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
learningfoundry-0.36.0-py3-none-any.whl -
Subject digest:
0224c1db7446aa0b2912a035b821119e934153fd130520e410cfbc4b1fca3da9 - Sigstore transparency entry: 1404929788
- Sigstore integration time:
-
Permalink:
pointmatic/learningfoundry@bff4ad50697231d87b3f75cdc38aeafc61342b9c -
Branch / Tag:
refs/tags/v0.36.0 - Owner: https://github.com/pointmatic
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bff4ad50697231d87b3f75cdc38aeafc61342b9c -
Trigger Event:
push
-
Statement type: