Course Harness
Course Harness is a local-first application for creating source-grounded Courses in a human-readable Course Workspace.
Install and launch
Install uv. It downloads Python 3.14 if you do not have it.
uvx --torch-backend cpu course-harness
Or install it as a command-line tool:
uv tool install --torch-backend cpu course-harness
course-harness
--torch-backend cpu installs the CPU build of PyTorch for local document conversion. Without it,
uv installs the CUDA build on Linux, which downloads several gigabytes of GPU libraries.
To run the latest revision from GitHub (no flag needed; the CPU build is selected automatically):
uvx --from git+https://github.com/martinkozle/course-harness.git course-harness
The command opens http://127.0.0.1:8765 with the Workspace Launcher, where you create or open a
Course Workspace. Useful options:
course-harness /path/to/course-workspace # open a Workspace directly (`.` works too)
course-harness --no-browser # do not open the browser
course-harness --port 9000 # use another local port
Optional: install LibreOffice (libreoffice or soffice on PATH) for high-fidelity slide
thumbnails.
What it does
- Sources: add PDF,
.pptx,.docx, and web pages, or discover papers through arXiv, Crossref, Semantic Scholar, and OpenAlex. Documents are converted locally with Docling; the layout and OCR models are downloaded on first use, after you confirm. - Course Agent: plans the Course, researches sources, and writes Lectures. Only Sources added to the Course can be cited.
- Connectors: web search and page reading through remote MCP servers. Exa is set up by default and works without a key.
- History: save and restore Course Revisions, publish Releases, and export Lectures to PowerPoint.
Canonical Course state lives in readable files in the Course Workspace. Caches, conversations, and credentials live in platform-native user locations outside it; credentials go to the operating system keyring when one is available. Settings → Diagnostics shows the exact locations.
To use an OpenAI-compatible provider on another machine over plain HTTP, select Allow HTTP to another host. The API key and Course content are then sent unencrypted, so use it only on a network you trust.
Development
Development uses Nix with flakes. The flake pins Python, uv, Bun, Node.js,
Chromium, and Git; uv.lock and bun.lock pin application packages.
nix develop # or `direnv allow` once with nix-direnv
Entering the shell installs the pre-commit and pre-push hooks (Biome, Ruff, ty, nixfmt, uv lock
freshness, and hygiene checks). Their configuration lives in flake.nix.
Launch from a checkout:
uv sync --locked
bun install --frozen-lockfile
bun run build
uv run course-harness
For frontend hot reload, run the API and Vite side by side; Vite serves http://127.0.0.1:5173
and proxies /api:
uv run course-harness /path/to/course-workspace --no-browser
bun run dev
Checks:
pre-commit run --all-files
uv run pytest
bun run lint
bun run typecheck
bun run build
bun run test:e2e # Playwright smoke journey
Outside Nix, install the Playwright browser once with bunx playwright install --with-deps chromium
or set PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH.
Build the wheel and smoke-test it through uvx, uv tool install, and a git+file:// install of
the current commit, all in isolated temporary environments:
uv run python scripts/verify_distribution.py
The Release workflow runs these checks on every push to main. To publish a version:
uv version --bump minor # or patch/major; updates pyproject.toml and uv.lock
git commit -am "Release 0.2.0" && git push
Then create a GitHub Release with a new tag v0.2.0 on that commit (or push the tag with
git tag v0.2.0 && git push origin v0.2.0). The tag must match the package version. The workflow
publishes to PyPI through trusted publishing and attaches the wheel and source distribution to the
Release.
Without Nix, install Python 3.14, uv, Bun 1.3 or newer, Node.js, and Chromium, then use the same commands.
Metadata
Release files for course-harness 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| course_harness-0.2.0.tar.gz | 778.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| course_harness-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.6 MB
Release files / course_harness-0.2.0.tar.gz
| Download URL | course_harness-0.2.0.tar.gz |
|---|---|
| Size | 778.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
16aa7ee844a6171d4a05388ccb113e24f44adc4694f59ec59233b37fdbc8d101
|
|
BLAKE2b-256 checksum How to use checksums |
ebd528bd7baea546ec6399b83987a2b5de11865428f0c774087c7a4bda8e174c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / course_harness-0.2.0-py3-none-any.whl
| Download URL | course_harness-0.2.0-py3-none-any.whl |
|---|---|
| Size | 801.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b98da4291cc7fd971f9939a0491b94401ed2a2edfc30165b2f6b489e065d3467
|
|
BLAKE2b-256 checksum How to use checksums |
e58f531c0d2ebd41290dc71b72d1e0d1e6997323a80f8bc8d64703babfc6db2f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for course-harness 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.