Bodi Raj

March 2026 to now

Skopos, a free MCAT study app, built and led by me

It began as a personal flashcard tool and has grown into a complete study platform: a daily plan built around the exam date, questions in the AAMC format with detailed explanations, and spaced-repetition flashcards. I lead the product and test every release. A team of AI coding agents writes the code, working to the rules I set.

Demo, 1:00

The problem

Quality MCAT preparation costs thousands of dollars, and that cost should not decide who gets into medicine. Students trust the official AAMC questions but find the explanations thin. UWorld explains well, but many students cannot afford it. This app offers both, for free.

What it does

Plans every day

Builds a day-by-day schedule from the exam date and the time available, with catch-up and rest days. Anki schedules cards. This plans the whole day: reviews, reading, questions and practice exams.

Exam-format questions

Passage-based questions in the AAMC format. Each wrong answer is explained step by step.

Spaced-repetition flashcards

Each card returns just before it would be forgotten. Anki decks import and export.

Sourced content

Science content comes from OpenStax textbooks. Reading passages are verbatim excerpts from published works.

Question generator

Writes new questions from textbook sections. Several independent checks review each one, and any of them can reject it.

Private by design

Runs locally with encrypted storage. Data does not leave the computer unless the student turns that on.

Screens

Results

Questions, scored blind

Biology and biochemistry questions mixed with AAMC and UWorld items, sources hidden, scored 1 to 5 by two independent raters.

OursUWorldAAMC
Explanation4.874.103.08
Answer key4.734.803.78
Reasoning4.915.004.53
Reads like the exam4.965.004.95

Flashcards, scored blind

96 cards across six topics, presented identically without labels, scored 1 to 5 by two independent raters.

OursMileDownAnKing-style
Correct4.603.923.56
Depth3.022.132.71
Pictures3.833.352.35
Study value3.793.022.81

Compared with current options

PriceWhat students say
AAMCabout $324Most like the exam. Thin explanations.
UWorldfrom $339Great explanations. Expensive.
Blueprint$1,499+Structured. Lots of video.
Anki decksFreeHuge, but with gaps and errors.
This appFreeExam-format questions, detailed explanations and a daily plan.

Reliability

  • Over 2,100 automated test files, including end-to-end tests that drive the real app.
  • Every change is tested and reviewed before it is merged.
  • Every question and card traces back to its textbook section.
  • Imports Anki decks of over 6,000 notes in under 30 seconds.

How it's built

Select a topic to expand it.

How it grewFrom a personal flashcard tool to a full study platform, March to November 2026.
  1. Mar to Jun

    Flashcard tool

    A personal flashcard app, extended with practice exams, a planner and statistics.

  2. Jun to Aug

    Full rebuild

    Rebuilt on a modern framework, with every existing feature listed first so that every one was kept.

  3. September

    Design and data

    Every screen redesigned. Textbook library, encrypted storage and Anki import added.

  4. October

    Question generator

    Generator built and tested blind against official and commercial questions. Phone companion added.

  5. November

    Question bank

    Completing the full bank ahead of launch to pre-med students at the University of Manitoba.

Product decisionsWhat was cut, what was required, and why.

Cut a feature that looked great

We built a 3D world for the home screen. It was impressive, but it slowed the app and pulled focus from studying, so I removed it.

Every fact is sourced

Every question and card must trace back to a textbook section. Anything that cannot is discarded.

Every change is checked

Every change is tested and approved by a separate reviewer before it is merged.

Privacy first

The app does not require an account and does not use cloud storage. AI features are optional and use the student's own key.

Engineering decisionsLocal and encrypted storage, the React migration, single owners, headless logic and state.

Local only, and encrypted

Most apps today are cloud subscriptions that keep your data on their servers. I chose the opposite. Students' study records sit close to health and medical information, and that kind of data should not be sent over the internet without their say. Everything stays on the student's own computer, in an encrypted database (SQLCipher). The app does not require an account, does not use cloud storage, and works fully offline. AI features are optional and use the student's own key, so data is shared only when they choose.

Migration to React

The original app had grown to about 30,000 lines of plain JavaScript and was getting risky to change. I moved it to React, starting from a full feature inventory so that every feature was kept, and old code was retired only after a script confirmed it was unused.

Single owners

Every rule lives in exactly one place. One module decides what is due for review, and the home screen, study sessions, flashcards and planner all read from it. When two screens work something out separately, they eventually disagree. One owner means one answer and one place to fix.

Headless logic

Scheduling, pacing and planning are pure functions that do not depend on the screen, the clock or storage. They can be tested thoroughly on their own and behave the same wherever they are used.

Clear state management

State is split into four layers: shared logic, encrypted study data, settings and background services. Each screen's state has exactly one owner in the store (Zustand), so any bug traces back to one place.

A plan that cannot go stale

A saved study plan is out of date the moment a student misses a day. So the plan is not stored. It is recalculated from the student's real progress every time, and every change they make is applied the same way.

Locked-down desktop shell

Even a local app should limit what can go wrong. The Electron shell runs sandboxed, the interface reaches the system only through an approved list of channels, and every response is checked at that boundary.

The AI routerSix providers, the student's choices first, and failures that are always reported.

The app can work with six AI providers: Anthropic, OpenAI, Google Gemini, Mistral, Groq and Ollama, which runs models on the student's own computer. A router decides which model handles each task. I designed it around one principle: the student's choices always come first, and quality, capability and cost are weighed only within them.

  1. The student's choices

    A model the student has pinned is used as is. Otherwise the router stays within their chosen provider, their quality setting and their spending limit.

  2. What the task needs

    Each task declares what it requires, such as reading images, reading PDFs, structured output, long documents or keeping data on the computer. Models that cannot do the job are filtered out.

  3. Best fit, then cost

    Among the models left, it scores quality for that kind of work and moves up a tier only for harder material, such as difficult questions or answers that must be graded precisely.

  4. Clear when it falls short

    If none of the available models meets every requirement, it uses the closest match and tells the student plainly, including what would fix it. It does not fail silently.

The routing decision is a pure function: the same inputs always give the same answer, without side effects, so every rule can be tested directly. Adding a new provider means registering it, not changing the router.

How it differs

Most study apps are tied to one cloud AI service and send everything to it. This router works across six providers, including one that runs entirely on the student's computer, and it puts the student's choices and data rules ahead of the system's preferences.

How it was proved

Because each decision is a pure function, every rule (pins, capability filters, tier escalation, spending limits, the loud fallback) is checked directly by automated tests, without needing a live AI service.

The question generatorSeven stages, four rejection gates, benchmarked against 13 published and commercial systems.

Generated questions are only useful if they are right. The generator is a pipeline of seven stages, using several AI models and code checks, each with one job. Four of the stages can reject a question, and anything that fails is discarded rather than patched.

  1. Source first

    Every question starts from one section of a real text: OpenStax for the sciences, published works for reading passages.

  2. Blueprint

    The question is planned before it is written: the skill it tests, the reasoning it needs, and the specific mistake each wrong answer is built to catch.

  3. Write

    Passage, question, four options and a step-by-step explanation, written only from the source and the blueprint.

  4. Blind solve

    A separate model answers without seeing the key. If it does not reach the intended answer, the question is removed.

  5. Grounding check

    Every fact the answer depends on must be found in the source text. Anything unsupported is removed.

  6. Rules in code

    Fixed checks that a model cannot argue past: format, option letters, explanation steps, giveaway wording and duplicates.

  7. Measured against the exam

    Each batch's mix of skills and difficulty must sit within the real exam's range, and batches are rated blind alongside real exam questions.

How it differs

I benchmarked the design against 13 published and commercial systems. Research generators rely on templates built by experts or a human reviewer at the end, and commercial banks do not publish how their questions are made. A single AI prompt produces acceptable questions only 18 to 31 percent of the time in a published medical study. This pipeline does not have a human in the loop, so its gates are built to carry that load: every wrong answer is planned around a real mistake, and every fact is checked against the source.

How it was proved

Batches were rated blind, mixed in with official AAMC and commercial questions. On biology and biochemistry, its explanations scored 4.87 out of 5, against 4.10 for UWorld and 3.08 for the AAMC's own. Each round of testing fed the next version of the pipeline.

How it's testedSimulated students, the real app driven day by day, and signed proof that tests ran.

Simulated students

Simulated students study for a week, a month, a year and several years, on the real encrypted database. They miss days, move their exam date, import decks and rest, and the app is checked every simulated day. One run loads 100,000 cards to test scale.

The real app, day by day

Automated tests open the real desktop app and study through it for weeks at a time with a controlled clock, then compare the app's plan against an independent calculation every day.

Rules about the plan

Property tests state rules the planner must always keep, then check them across many randomly generated study histories with missed days, rest days and exam date changes.

Proof, not promises

A task can only be marked done with a signed record that its tests ran. The system re-runs that command itself, and blocks any commit made with code newer than the last passing test run.

Wording rules, enforced

The app's writing rules are checked automatically by the test suite: plain everyday words, without internal jargon, dashes or trailing dots. A screen that breaks them fails the tests.

Credit where it's due

Every textbook figure carries its source and licence on the card. A licence audit corrected the terms shown across the app.

Iteration in practiceThe flashcard generator before and after, and how the plan was proved over months.

Every major part was iterated and re-tested until it measured up. The flashcard generator is a good example: the previous version's cards were thin, so it was rebuilt and tested again, blind.

Flashcard generator, previous version against current

Same blind test, same raters, same six topics.

CurrentPrevious version
Depth3.021.94
Pictures3.831.35
Study value3.792.50
Correct4.604.40

The plan, proved over months

  • Simulated students run from one week to several years on the real encrypted database.
  • The real app is driven through weeks of study, and its plan is compared every day with an independent calculation.
  • Missed days, rest days, exam date changes and large imports are all part of the test.

My role

I lead the product. I define the requirements and quality standards, design the interface, and test every release. My biochemistry degree lets me verify the science content directly.

The code is written by a team of AI coding agents (Claude Code and OpenAI Codex), each with a defined role: planning, building, design or review. I set the rules and the review process they work to.

Also: hands-on engineering

Get in touch

I'm open to IT, QA, health technology and laboratory roles in Winnipeg or remote.

Email me LinkedIn