SBC - Steel Bank Course
A comprehensive Python toolkit for managing Jupyter notebook-based courses with interactive widgets, persistent state, leaderboards, and gamification.
Features
For Students
- Interactive Widgets - Quizzes, flashcards, trivia games, code puzzles, and reflections
- State Persistence - Automatically resume activities where you left off
- Gamification - Streaks, points, and leaderboard competition
- PDF Export - Export notebooks to PDF with source attachment
For Instructors
- YAML-based Content - Define quizzes, flashcards, and challenges in simple YAML
- Assignment Distribution - Strip solutions and generate student versions
- Score Tracking - Discord-based leaderboards with multiple metrics
- Course Templates - Quickly scaffold new course structures
Installation
pip install sbcourse
# For Discord bot functionality
pip install sbcourse[bot]
Quick Start
In Jupyter Notebooks
# Load the extension
%load_ext sbc
# Run a quiz
%quiz week-01
# Play trivia
%trivia calculus -n 5
# Study flashcards
%flashcards derivatives
# Write a reflection
%%reflection week-01
What did you learn about derivatives this week?
# Export to PDF (with .ipynb attached)
%pdf
Command Line
# Create a new course
sbc new my-course
# Generate student assignment (strips solutions)
sbc assign assignment-01 --push
# Show configuration
sbc cfg show
# Run Discord leaderboard bot
sbc bot run
Magic Commands
| Command | Description |
|---|---|
%quiz <name> |
Load and display an interactive quiz |
%trivia [topic] [-n NUM] |
Start a trivia game |
%flashcards <deck> |
Load flashcard deck for study |
%leaderboard [--weekly] [--fair] |
Display course leaderboard |
%%reflection <name> |
Create reflection prompt (cell body is prompt) |
%pdf [filename] |
Export notebook to PDF |
%index [--rebuild] |
Build semantic search index |
%%search [-n NUM] |
Search course notebooks |
%assign <notebook> |
Generate student version |
%update <files> |
Commit and push files |
Content Formats
Quiz Format (YAML)
title: Week 1 Quiz
questions:
- question: What is the derivative of x^2?
options:
- "x"
- "2x"
- "x^2"
answer: 1
explanation: Power rule - bring down the exponent and subtract 1
Flashcard Format (YAML)
title: Calculus Fundamentals
cards:
- front: What is the derivative of sin(x)?
back: cos(x)
- front: What is the integral of 1/x?
back: ln|x| + C
Leaderboard Setup
1. Configure Students
from sbc.leaderboard import configure
configure(
api_url="https://your-bot.fly.dev",
api_secret="your-secret",
student_id="jsmith",
display_name="Jane Smith",
cohort="F25-06623"
)
2. Run Discord Bot
export DISCORD_TOKEN="your-bot-token"
export API_SECRET="your-api-secret"
sbc bot run --port 5000
3. Discord Commands
/leaderboard [metric] [cohort]- Display standings/mystats- View your personal statistics/cohorts- List all cohorts
Project Structure
sbc/
├── src/sbc/
│ ├── widgets/ # Interactive Jupyter widgets
│ │ ├── quiz.py # Multiple choice quizzes
│ │ ├── trivia.py # Timed trivia games
│ │ ├── flashcards.py # Spaced repetition cards
│ │ ├── reflection.py # Free-form responses
│ │ └── puzzles.py # Code challenges
│ ├── persistence/ # State management
│ ├── leaderboard/ # Score tracking
│ │ ├── client.py # Notebook client
│ │ └── server/ # Discord bot + API
│ ├── magic.py # IPython magic commands
│ ├── pdf.py # PDF export
│ ├── search.py # Semantic search
│ ├── cli.py # Command-line interface
│ └── config.py # Configuration system
└── pyproject.toml
Configuration
SBC uses a hierarchical configuration system:
- Default values (built-in)
~/.sbc.toml- User-level config.sbc.toml- Project-level configSBC_*environment variables
Generate a template:
sbc cfg init
Assignment Generation
Mark solution code in notebooks:
# Code cells
### BEGIN SOLUTION
answer = 42
### END SOLUTION
<!-- Markdown cells -->
<!-- BEGIN SOLUTION -->
The answer is 42.
<!-- END SOLUTION -->
Generate student version:
sbc assign assignment-01 --push
PDF Export Options
%pdf # Default: attach .ipynb, add header
%pdf report.pdf # Custom filename
%pdf --no-attach # Don't attach source notebook
%pdf --no-header # Skip timestamp header
%pdf --no-save # Don't auto-save before export
%pdf -v # Verbose output
Semantic Search
Search across all course notebooks using ChromaDB for semantic similarity.
# Build the search index (one time)
%index
# Force rebuild the index
%index --rebuild
# Search for related content
%%search -n 5
What is a Gaussian process?
The search returns links to relevant notebook cells (markdown and code) ranked by semantic similarity to your query.
Development
# Install with dev dependencies
pip install -e ".[dev]"
# or with uv
uv pip install -e ".[dev]"
# Run tests
pytest
# Lint code
ruff check src/
License
MIT License - see LICENSE file for details.
Author
John Kitchin (jkitchin@andrew.cmu.edu)
Metadata
Release files for sbcourse 0.1.7
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 | |
|---|---|---|---|---|
| sbcourse-0.1.7.tar.gz | 37.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sbcourse-0.1.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 86.0 kB
Release files / sbcourse-0.1.7.tar.gz
| Download URL | sbcourse-0.1.7.tar.gz |
|---|---|
| Size | 37.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4e3969674159efddf3b3b4ee56257ebe70f9a8f6111b8feb1c82b696e692ece2
|
|
BLAKE2b-256 checksum How to use checksums |
3217333e162b5c6e43b0468556fd8c6cfb40a50deabb2b2ffb0cd32cf291683e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / sbcourse-0.1.7-py3-none-any.whl
| Download URL | sbcourse-0.1.7-py3-none-any.whl |
|---|---|
| Size | 48.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7bbd5746557f74de66c148c2387baaf7bc629950b18ee594afc91f6f77c56a0d
|
|
BLAKE2b-256 checksum How to use checksums |
7589459794086008fe08e62e9cc47cb7cd51690a8922f985fb2a3446b5f640a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for sbcourse 0.1.7
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.