OpenMind
Your bCourses, in Claude.
A read-only Canvas connector for Berkeley students that runs on your own laptop.
uv tool install git+https://github.com/qazybekb/openmind.git
The model talks.
The code computes.
Deadlines, grade weights, and start-by dates are worked out in Python and handed over as facts — because a due date off by a day is worse than an unhelpful answer. No AI model runs inside OpenMind.
Deadlines & grades
Ranked, not listed
HIGH means due within 2 days or worth 20%+ of your grade. Overdue work that was never submitted comes first, separately, so it can't get lost in the list.
Your actual time zone
Canvas stores deadlines in UTC. An 11:59 PM Friday deadline is Saturday in UTC — OpenMind reads the time zone off your Canvas profile so it lands on the right day.
What it's worth
Grade weight computed from your course's assignment-group weights. When Canvas won't say, it reports unknown rather than guessing.
When to start
An hour estimate and a start-by date for each item. A 15-hour project due in six days says "start now", not "due in 6 days".
Learning
Socratic tutoring
Diagnose, teach one block, check with a scenario question, climb a hint ladder.
It won't hand over the answer — unless you type /answer, and then it will,
without a lecture about it.
From your own slides
Index a course and it teaches from that course's readings and lecture decks, citing the page. Not from the internet's idea of the topic.
Your course's AI policy
Every study session quotes what your syllabus actually says about AI, so the tutor works inside your instructor's rules instead of guessing at them.
Retrieval practice
One question at a time, a confidence rating before the reveal, feedback with a citation, and a recap of only what you missed.
Course planning
The whole catalog
11,000 undergraduate and graduate courses across 240 departments, searchable offline, stamped with the date the snapshot was taken.
Actually offered
A course existing in the catalog isn't the same as being able to take it. OpenMind knows which courses have sections this term — and says so when the Registrar hasn't posted the next one yet.
Live sections
Times, instructors, instruction mode, and open seats, straight from the public class schedule.
Stays current
Course data refreshes on the university's calendar, not on ours — a scheduled job republishes it and your copy updates without an upgrade. Switch it off if you'd rather.
By design
Read-only, in code
No tool submits work, posts a reply, sends a message, or uploads a file. The Canvas routes are a fixed list — not a promise, a constraint.
You pick the courses
Courses you leave out at setup are invisible to every tool. Storing a course's materials is a second, separate choice.
Never a silent zero
If a course fails to load, you get a warning naming it. An empty list means nothing is due — never that something broke.
Token in the keychain
Your bCourses token goes into your OS credential store, never a config file, and is dropped before any file download leaves bCourses.
Example conversations.
Real tool results.
It asks you to estimate an average treatment effect and state the assumptions that make your estimate valid. Two rubric criteria:
Correctness (12 pts) — the rubric asks specifically for identification assumptions stated, so writing the estimator without justifying it loses most of these points.
Clarity (8 pts) — the reasoning has to be followable.
Your Week 3 slides define exactly what you need for the assumptions section:
“A confounder causes both the treatment and the outcome. Adjusting for it removes the backdoor path.”
— (Week 3 Slides, p. 4)
Suggested plan for ~6 hours: one hour on the assumptions section first (it's where the points are), three on the estimation, two on writing it up. You're due tonight, so start with the assumptions.
So: ice cream sales and drowning deaths rise together. What's causing both — and would adjusting for it change the association?
Fall 2026: 1 section · directly on your path
STAT 156 — Causal Inference (4 units)
Fall 2026: 1 section, Peng Ding · what applied research interviews actually probe
Catalog snapshot Sep 5, 2026. These are fit-based suggestions — check with your advisor for requirements.
What can you ask OpenMind?
"What's due this week?"
Ranked by urgency, with weights, hour estimates, and start-by dates. Overdue work listed first.
"Is my Tuesday deadline actually Tuesday?"
Your time zone, read off your Canvas profile — not UTC, not your laptop's clock.
"What's my grade in STAT 156?"
What bCourses shows, broken down by assignment group. Ungraded work isn't counted as zeros.
"Explain problem set 3 using the week 3 slides"
The assignment, what the rubric rewards, and cited excerpts from your own materials.
"Tutor me on confounding"
Questions before answers, one concept at a time, taught from your course's readings.
"Quiz me on this week's reading"
One question at a time, confidence rating before the reveal, feedback with a citation.
"Plan my week"
A schedule built from real deadlines, respecting start-by dates and how much you can actually do in a day.
"What should I take next semester if I'm into NLP?"
Catalog matches filtered to what's actually offered, with prerequisites flagged and the advisor caveat.
"Is STAT 156 offered this fall?"
Live sections, times, instructors, and open seats from the public class schedule.
A connector, not a chatbot.
OpenMind is a small program on your laptop that gives an AI app a set of tools. It doesn't have a voice, a personality, or a model of its own — the app you already use provides all three.
You type a question in Claude, Cursor, or ChatGPT. The app decides OpenMind can help and calls one of its twelve tools.
It reads bCourses with your token, computes the dates, weights, and priorities in Python, and returns labelled facts. No model is involved in this step.
Your AI app turns those facts into an answer — which means your course data goes to that provider. That's the trade, and it's stated plainly below.
Why the code does the arithmetic
Language models are good at explaining and bad at being sure. A deadline shifted by a day, or a confident "that's 5% of your grade" when it's 30%, does real damage. So every number you can act on — due dates in your zone, grade weight, hours, start-by — is computed in Python and pinned by tests, and the app is instructed to show it as given.
Why it only reads
An assistant that could submit your work would need to be right every time. This one can't submit, post, message, or upload anything — not as a policy, but because those routes don't exist in the code. That's what makes it safe to leave connected.
Why it tutors instead of answering
Ask a factual question — when's the midterm, what's my grade — and you get a direct
answer. Ask to learn something and it switches: diagnose first, one concept at a
time, hints before answers. Type /answer and it gives you the answer, with no
lecture about why you should have worked harder.
Why your syllabus gets quoted
Course AI policies range from "encouraged" to "academic integrity violation". Every study session includes what your syllabus actually says, so the tutor works inside your instructor's rules rather than guessing at them.
What "local" means, and what it doesn't
OpenMind runs on your laptop with your own bCourses token. There is no OpenMind server, no account, and no telemetry — but the AI is not local.
Every place OpenMind connects to — four, and there is no fifth:
bcourses.berkeley.edu — your courses, with your tokenthe file host bCourses redirects to — only when reading a document, and the token is dropped firstgithub.com — a public course-catalog file, once a day, nothing about you. Switch it off with data_updates=falseclasses.berkeley.edu — only when you ask whether a course is offered
There is no tool that can submit work, post a reply, send a message, or fetch an
arbitrary URL — those routes don't exist in the code.
openmind clear --all deletes everything.
Full privacy documentation →
5 minutes to
your first question.
No Docker, no server, no signup. Install it, paste a bCourses token, tell your AI app where it is.
PyPI publication is pending. After the corrected release is published,
uv tool install openmind-berkeley is an alternative.
From a local checkout, use uv tool install ..
Then connect your AI app
openmind mcp prints the exact config for each app,
with the absolute path filled in. Nothing secret appears in it.
Claude Code: claude mcp add --scope user openmind -- /path/to/openmind-mcp
Cursor: the same JSON block in ~/.cursor/mcp.json.
ChatGPT desktop: add a local (STDIO) server with that command.
What you need
Optional, later
By default OpenMind sees the names of your files, not what's inside them. Indexing a course extracts its text into a private file on your machine so tutoring can quote it with page citations.