Local vault mirror
Your whole semester as plain JSON in ~/canvas-vault/. Grep it, jq it, back it up. Structured, atomic, and yours.
Mirror your whole semester into a local vault, then ask it questions in plain English.
canvasctl what's due this week? — no subcommand, no quotes — answered by your own AI over your real course data. Claude-first; any provider's key works.
Every Canvas operation is defined exactly once in an ops registry — then served, unchanged, to the CLI, to Claude Code over MCP, and to the built-in chat agent.
Fast, local, and scriptable. Everything reads from a plain-JSON mirror you own — no dashboards, no lock-in.
Your whole semester as plain JSON in ~/canvas-vault/. Grep it, jq it, back it up. Structured, atomic, and yours.
Your own AI answers over your real data — Anthropic, OpenAI, or any compatible endpoint. Just type canvasctl for a session, or put your question right after it.
Expose every op as tools. claude mcp add canvasctl -- canvasctl mcp and your assistant can read your semester too.
See what's due in any window — 24h, 7d, 2w — then export the next 60 days to a calendar you can subscribe to.
SHA-256 snapshots per course, per kind. canvasctl changes replays exactly what shifted between two syncs — added, moved, or edited.
Bring your own Canvas token and any AI provider's key — Anthropic, OpenAI, or a compatible endpoint. They never leave your machine. No servers, no telemetry, no account.
Install it, point it at your school, and start talking to your semester.
One curl line drops canvasctl on your $PATH.
# one line, no sudo curl -fsSL …/install.sh | sh
Answer three prompts: your Canvas URL, an access token, and an optional AI key (Anthropic or OpenAI-compatible).
$ canvasctl setup Canvas URL › canvas.psu.edu Access token › ••••••••
Sync once, then ask anything — a bare canvasctl drops into chat — or hand the tools to Claude Code.
$ canvasctl sync $ canvasctl what changed today?
Copy, paste, run. Prefer isolation? Use the pipx tab. Either way, nothing phones home.
$ curl -fsSL https://raw.githubusercontent.com/vivekp-05/canvasctl/main/install.sh | sh
$ pipx install "canvasctl[agent,mcp]"
claude mcp add canvasctl -- canvasctl mcp
canvasctl talks to Canvas and your AI provider directly, with credentials that live only in your shell and your vault. There is no CanvasCTL backend to send your data to — because there isn't one.
~/canvas-vault/. Plain JSON on disk. Delete the folder and it's gone.Python 3.10 or newer and a Canvas access token (Account → Settings → New Access Token). The ask / chat agent also wants an AI key — Anthropic (first-class) or any OpenAI-compatible provider — but the core read commands and MCP work without one.
canvasctl itself is free and MIT-licensed. The only cost is your own AI usage when you use the agent — Anthropic, OpenAI, or even a free local model via an OpenAI-compatible endpoint. Billed directly to your key, at your rate, with no markup from us.
Yes. Your token and API key live only on your machine — in your shell environment and vault config. Nothing is sent to any server we operate; Canvas and your AI provider are called directly from your terminal. You can revoke the token in Canvas at any time.
Any Canvas LMS instance. During canvasctl setup you point CANVAS_BASE_URL at your school's Canvas host (for example canvas.your-school.edu). If your institution runs Canvas, canvasctl works.
No. canvasctl is read-focused by design — it mirrors, lists, and answers. There are no write operations in this release, and the architecture requires explicit user confirmation on every surface before any future write to Canvas could ever run.
In ~/canvas-vault/ as plain JSON — metadata, a change log, and any files you pull. It's yours to grep, back up, or delete. Remove the folder and every trace of your synced data is gone.