Skip to main content

A curriculum engine that turns a YAML curriculum definition into a deployable SvelteKit learning application.

Project description

learningfoundry

License Python CI codecov

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

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 preview command and generated app development)
  • Node.js 18+ (for the generated SvelteKit app)

Quick Start

  1. 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
    
  2. Validate the curriculum:

    learningfoundry validate
    # OK — curriculum is valid.
    
  3. Build and preview locally:

    learningfoundry preview
    # Preview server started at http://localhost:5173
    

    learningfoundry preview is 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 build alone is also available if you want to generate the SvelteKit project without serving it (e.g. to inspect output, deploy a static export via cd 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 id values 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 ref paths are resolved relative to --base-dir (default: directory containing the curriculum YAML).
  • Only YouTube URLs are accepted for video blocks (youtube.com/watch?v= or youtu.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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

learningfoundry-0.36.0.tar.gz (83.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

learningfoundry-0.36.0-py3-none-any.whl (83.7 kB view details)

Uploaded Python 3

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

Hashes for learningfoundry-0.36.0.tar.gz
Algorithm Hash digest
SHA256 c705b655da1203904f734c3ffd8f44eca2dcbd53d0e4024335e7b53152a0f6ed
MD5 605e808efe0a5d92482f40a0f87df10a
BLAKE2b-256 52c4990fe949084c04173a0df2089f8a3b6608b77b6f58f18b4db16a1b3a55d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for learningfoundry-0.36.0.tar.gz:

Publisher: publish.yml on pointmatic/learningfoundry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file learningfoundry-0.36.0-py3-none-any.whl.

File metadata

File hashes

Hashes for learningfoundry-0.36.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0224c1db7446aa0b2912a035b821119e934153fd130520e410cfbc4b1fca3da9
MD5 b817cf1ac62346e495816b7674764da6
BLAKE2b-256 6e2b5cf0d4df1125e2a141c978314f10c15de5b60dbfbdf1966034948c30cbf6

See more details on using hashes here.

Provenance

The following attestation bundles were made for learningfoundry-0.36.0-py3-none-any.whl:

Publisher: publish.yml on pointmatic/learningfoundry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page