OpenMind logo

OpenMind

Your bCourses, in Claude. A read-only Canvas connector for Berkeley students that runs on your own laptop.

Independent student project. Not affiliated with UC Berkeley.
uv tool install git+https://github.com/qazybekb/openmind.git
Works with Claude Desktop · Claude Code · Cursor · ChatGPT desktop
Claude · openmind connected
You → What's due this week?
Three items, including one overdue.
OVERDUECausal Inference: Problem Set 4
was due Tue Sep 1, 11:59 PM · still submittable · 20% of your grade
HIGHCausal Inference: Problem Set 3
due tonight 11:59 PM · 20% of grade · ~6h · you should already be on it
HIGHCausal Inference: Midterm 1
due Thu Sep 10 · 30% of grade · ~4h · start by Wednesday
Nothing else in NLP until the Final Project on Sep 13.
12
read-only tools
11K
Berkeley courses
240
departments
0
accounts to create
What it does

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.

See it in action

Example conversations.
Real tool results.

Claude — explain an assignment
You → Explain problem set 3 using the week 3 slides
Problem Set 3 · due Fri Sep 4, 11:59 PM · 20 points · 20% of your grade · not yet submitted

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.
tutor
You → Tutor me on confounding
Before we start: what do you already know about confounding, and where does it break down?
You → It's a third variable that messes up the result?
That's the right instinct, and there's a sharper version of it. Your slides say a confounder causes both the treatment and the outcome (Week 3 Slides, p. 4).

So: ice cream sales and drowning deaths rise together. What's causing both — and would adjusting for it change the association?
course planning
You → What should I take next semester? I'm into NLP.
What's your major and year, and what are you aiming at after graduation? That changes the answer a lot.
You → MIMS, second year, applied research roles
INFO 259 — Natural Language Processing (3 units)
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.
Try asking

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.

See more example prompts →

How it works

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.

1 — You ask

You type a question in Claude, Cursor, or ChatGPT. The app decides OpenMind can help and calls one of its twelve tools.

2 — OpenMind reads

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.

3 — The app answers

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.

Never leaves your machine:
✓ Your bCourses token — it lives in your OS keychain
✓ Your config and any indexed course materials (0600 files)
✓ Your conversations — OpenMind never sees them
✓ Nothing about your grades is ever written to disk
Goes to your AI provider:
• Whatever a tool returns — deadlines, grades, course text
• Under Anthropic's or OpenAI's privacy policy, not ours
• Only for the courses you chose at setup
• If a course is sensitive, don't enable it

Every place OpenMind connects to — four, and there is no fifth:

bcourses.berkeley.edu — your courses, with your token
the file host bCourses redirects to — only when reading a document, and the token is dropped first
github.com — a public course-catalog file, once a day, nothing about you. Switch it off with data_updates=false
classes.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 →

Get started

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.

Terminal
$ uv tool install git+https://github.com/qazybekb/openmind.git
$ openmind setup
Paste your bCourses access token.
It is stored in your operating system's credential store, not in a file.
bCourses token: ********
Token: 1072~****4T2r
Connected as Oski Bear (America/Los_Angeles).
Your active courses (* = current term):
1. * Causal Inference [Fall 2026] (id 1001)
2. * Natural Language Processing [Fall 2026] (id 1002)
3.   Social Issues of Information [Spring 2026] (id 1003)
OpenMind shares only the courses you choose here with your AI app.
Numbers to share; Enter for the 2 current; 'all' for all: 1,2
Saved 2 courses. 11,156 courses across 240 subjects indexed.
Course materials are NOT stored locally unless you ask for it.

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_desktop_config.json
{
"mcpServers": {
  "openmind": { "command": "/Users/you/.local/bin/openmind-mcp" }
}
}

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.

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.

$ openmind index --course 1001  # search inside slides and readings
$ openmind doctor          # check everything end to end
$ openmind update-data       # refresh the Berkeley catalog
$ openmind config          # show or change settings
$ openmind clear --all       # delete everything it stores