Skip to content
How much to read

EaseMySemester

A revision tool for first-year medical students, now on its second version. It narrows to the hour before the paper, answers every question out of nine textbooks with the page number attached, and charges nobody.

Use the demo door on the sign-in screen. It is a seeded account and touches no real student's data, but it is shared, so the read state, the coverage figure and any notes may already be marked up by whoever was in it before you.

v1 is still running and still has students on it, with its own demo account offered on the login screen. What it was, and the measurement that replaced it, is at /work/easemysemester-v1/.

Role
Product, research and engineering
Year
2026
Stack
Next.js, TypeScript, PostgreSQL, pgvector, Neon, Vercel

At this depth1 min2 min10 min of 10

34 of ~50students in the batch moved to v2, which has never been marketed

In short

Problem
A question bank of past questions, reached on exam night with an hour left and no time to find the answers.
User
First-year MBBS students, one batch of roughly fifty.
Decision
Build for the hour before the paper, not the term. Exam night won, and most of v1's structure went with it.
Refused
No public signup, no ingestion pipeline, no paid tier. Loading PDFs stays an offline job I run myself.
Number
809 questions answered out of nine textbooks, each citing its book and pages. 82, or 10.1%, decline rather than guess, nearly all multi-part questions with one unsourced sub-part. Corpus or retrieval, I have not separated which.

What this one proves

  • Cutting scope as I learned what the thing was for. v2 dropped the self-rating flow, the six-level browse tree as the front door, and question-level prediction, and I took out the paywall that six people were already through.
  • An answer feature that cites the book and the pages it was built from, and declines rather than guesses when the corpus does not cover the question.
  • Reporting the prompt change that improved one decline rate and tripled another, rather than the half of it that moved the right way.
Read next. The paper being sat, the coverage bar, and a named chapter to start with.
Cram asks how long you have: ten minutes, twenty-five or forty-five, with the question count for each.
A cram run under way, with the clock running and the card counted one of twenty-four.
The foot of an answer card: the textbook and the four pages it was built from, above the revisit and got-it controls.
The bank, opened on Biochemistry: fifteen chapters with a question count against each, and the ranked study-first list one tap above them.
Searching the bank for one word: 135 results, each hit naming its subject and chapter, how many times the word occurs, and the line it falls on.
EaseMySemester, as it runs. Scroll for more; tap any screen to open it full size.

That is the brief. Set the dial to 3 min for the argument, section by section, or Deep for all 10 minutes of it.

Where it is now

About fifty first-year medical students use this. 34 of them are on v2; the rest are still on v1, which stays hosted and which you can open from that page. It has never been marketed. I built it for one person I know, and it spread through their batch one at a time.

Nobody pays for it today. Six people used to, on v1, and all six are among the 34 who moved. I took the paid tier out, which is the decision on this page I would expect to be challenged hardest, so it gets its own section rather than a clause here.

The two versions are not the same product wearing a new coat. v1 asked what has been asked before. v2 asks what you should read in the next hour, and answers it out of the textbooks. What v1 was, and the measurement that replaced it, is a page of its own; everything below is v2.

v2: same students, a much narrower moment

The users did not change. First-year MBBS, same college, same syllabus. What changed is which moment of their week I am building for, and who I am assuming they are when they open it.

v1's user was someone browsing a question bank. v2's user is someone with a paper tomorrow morning who wants to be told what to read, and then read it. Those are different people wearing the same name, and almost every difference between the two versions falls out of taking the second one seriously.

The rule I had written down was that when the term-long job and the exam-night job compete, exam night wins. It then took someone asking me directly what a student is actually looking for at 2am, thirty minutes before a paper, to notice that my own MVP scope had quietly put browse and search ahead of the ranking. A stated priority only works as a tiebreaker if something forces you to invoke it, so now every issue has to name which of the two jobs it serves.

What that produced, concretely.

v2 opens on Read next, not on a tree. It knows which paper you are sitting, shows how much of it you have covered, and names the chapter to start with and why. The structure is still underneath and you can still browse it. It is just no longer the front door.

v2 opens here. The paper being sat, how much of it you have covered, and a named place to start: 28 unread, the most-examined chapter in Paper 1. Coverage reads 0% because the shared demo account had just been reset. Compare it with v1's two-pane browser, which is the same product asking the reader to find their own way in.
v2 opens here. The paper being sat, how much of it you have covered, and a named place to start: 28 unread, the most-examined chapter in Paper 1. Coverage reads 0% because the shared demo account had just been reset. Compare it with v1's two-pane browser, which is the same product asking the reader to find their own way in.

Cram asks how long you have, not what you want to study. Ten minutes is 24 questions, twenty-five is 59, forty-five is 109, counted over the demo's focused subject rather than the whole bank. You swipe: right for got it, left for revisit. A tool that sizes itself to the hour you actually have is a different proposition from one that shows you everything and wishes you luck.

A cram run under way, one card of twenty-four with ten minutes on the clock. The clock is the point: you told it how long you had, and it gave you the questions that fit.
A cram run under way, one card of twenty-four with ten minutes on the clock. The clock is the point: you told it how long you had, and it gave you the questions that fit.

The answer itself has two shapes, full and condensed, because what you read while studying a topic properly and what you read at 1:40am are not the same artifact, and the condensed one fails at its only job if it does not fit a phone screen without scrolling.

And it is built for a phone, which v1 never really was. That is not a styling choice. It is the same narrowing again: nobody sits at a desk thirty minutes before a paper.

Answers, cited to the page

The v1 bank was browse and rank. It also had a real hole in it: 811 of its 898 questions had no answer at all. v2 answers.

The corpus went in first: nine textbook volumes, 7,731 chunks, just under four million tokens, embedded for about eight cents. Netter is in there as a figure reference cited by plate rather than as prose, which took two goes. A plural match was reading plate numbers off the table of contents, and a bonus plate series was colliding with the main one. Nobody would have noticed either from the output; the citations would just have pointed at the wrong picture.

The bank itself is 809 questions across 34 chapters and 218 topics. The parser emits 816, and the difference is the kind of thing I want in writing: seven questions are asked in both Paper 1 and Paper 2 of the same subject, so they are stored once and counted as two appearances. A reconciliation gate checks the appearance count on every import, because the failure I am actually afraid of is an import that silently drops a tag and still looks like it worked.

Then the whole bank got an answer. 809 of 809, 721 complete, 88 declining to answer, for about 65 cents in total.

Every answer carries the book and the page it came from. The citations are built from the retrieved rows themselves and never asked of the model, so a fabricated reference is structurally impossible rather than merely unlikely. That is the difference between the two versions I care about most: v1 could tell you a question had been asked five times, and v2 can tell you which page to read and let you check it.

The foot of the same card. Under the answer, the book and the four pages it was built from. A student who doubts it can go and look, which is the only version of this feature I would put in front of someone the week before an exam.
The foot of the same card. Under the answer, the book and the four pages it was built from. A student who doubts it can go and look, which is the only version of this feature I would put in front of someone the week before an exam.

The decline rate is the interesting output, not the cost. A declined answer is the system saying the books in front of it do not support one, which is the behaviour I want, so the question is which questions it declines and whether that is defensible. It was not what I expected. I assumed Biochemistry would decline most, because it leans on a single source. Biochemistry declined 6.3% of its questions. Physiology declined 16.2%.

A prompt change made one metric better and the other much worse

The answers were coming back in the wrong shape rather than with the wrong content: an essay where the exam wants five labelled points. So I wrote a per-subject prompt overlay that states the shape the answer has to take, and regenerated all 809 with no errors.

Single-part questions improved: declines fell from 10.9% to 7.9%.

Multi-part questions got much worse: declines rose from 9.2% to 28.7%.

I could have shipped the first number. It is the headline, it moved the right way, and the overall decline rate today is 82 of 809, about 10%, which sounds fine. The second number is what the change actually did. Telling the model what a complete answer looks like made it much stricter about admitting when it could only half-build one, and a multi-part question is mostly where one sub-part has nothing behind it in the books.

So the honest reading is that the prompt did not break anything. It exposed a retrieval gap that was already there and was previously being papered over with a partial answer. The fix is to retrieve per sub-part instead of per question, and I have deliberately not done it yet, because I want to see how many of those declines are genuinely unanswerable from the corpus before I spend the retrieval budget on it.

A feature that reports its own coverage honestly is worth more to a student the week before an exam than one that always says something.

Six people paid, and then I took the paywall out

v1 had an Intelligence tier. There was no fixed price on it. It ran the way things run inside a college: a student pays what they can, someone records it, and the tier gets granted by hand. Six people paid something.

v2 has no paid tier at all. Those six are among the 34 who moved across, and they now pay nothing, because there is nothing to pay for.

I want to be straight that this makes the strongest claim on this site historical. Strangers paying for something you built is the hardest evidence a project like this can produce, and I gave it up on purpose. The reasoning:

In a college, the thing that spreads a product is word of mouth, and the thing that produces word of mouth is daily habit. A paywall at this size buys a small amount of money and costs the habit, and I would rather have fifty students opening it every day than six paying and forty-four drifting. Adoption during a migration is its own argument too: asking a batch to move to a new app and pay for it in the same week is asking for two decisions when I need one.

The second reason is more concrete. What I want to build next needs usage data, and the data I need is what people actually read and skip, which a paying minority does not give me. Coverage, unread counts and revisit flags are already in v2 for the student's benefit; they are also the input to the next thing.

Monetisation was never the goal, and I would rather it arrived as a byproduct of the product being worth paying for. When it comes back I know roughly what it is: additional subjects, supplementaries, and an expanded knowledge base. Charging for more material is a cleaner promise than charging for a ranking, particularly now the measurement says the ranking should be the simplest version of itself.

The counter-argument, which I hold at the same time: six people paying was proof of value, and usage without payment is a weaker signal and an easier one to fool myself with. I will know whether this was right when the semester starts and the batch is either opening it daily or not.

What I refuse to build, in both versions

No LLM in the ranking. The whole point is that a student can ask why a question is first and get an answer made of arithmetic.

No public signup. Invite only, because trust in the content is the product.

No ingestion pipeline. The app owns the consumer side and the schema contract, and getting PDFs into the database stays an offline job I run myself. The tempting half is the pipeline. The half that actually matters is the contract between them.

And the three things v2 dropped that v1 had.

The self-rating flow. v1 let a student rate their preparedness per topic, off through strong, and blended that into a curated ranking. It was the feature I had the most fun building. It also asked a student to do a chunk of admin before the tool would help them, at exactly the moment they have least patience for admin, and the ranking it produced blended hard evidence with a guess somebody made about themselves while tired.

The six-level tree as the front door. Still there, still correct, no longer the first thing you meet.

Question-level prediction, replaced by topic-level. Not a taste call. The recurrence ceiling said the question-level version could not carry the product.

What I'd do differently

I'd have asked about the navigation before building it instead of after. The six-level structure was a faithful rendering of the data and it took someone else finding it annoying for me to see the difference. It was cheap to reverse because the app was small. On something bigger that's a quarter gone.

I'd also have measured the strike rate from the first cycle instead of the second. The 40% is the single most persuasive thing about v1 and it exists because I eventually thought to check.

And I'd have built the grading harness before the ranking instead of after. The rules I was defending stayed plausible exactly as long as nothing could grade them, which is the entire argument for building the measuring part first. I had already written that rule down after learning it somewhere else, then took a while to notice I was breaking it here. The cost was not a wasted week. It was charging six people for the version of the feature the measurement later told me to replace.

That is every section's opening. Deep has the working under each one, 10 minutes in all.