An iOS app · five questions a day · two minutes
Read the code.
Predict the
output.
Interleave is an iPhone app for people who already write code and keep being surprised by it. Each session is a handful of short snippets from the languages you are working on, mixed together on purpose. You say what the program prints — then you find out, with the reason. Two minutes, standing up, once a day.
79 courses written and verified today · 170 more in production · no ads, no tracking, no streak nagging you into a leaderboard.
JavaScript Foundations · Closures in loops
What does this print?
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
Show the answer
A 3 3 3
var is function-scoped, so all three callbacks close over the same i. The loop finishes before any timeout fires, and by then i is 3. Change var to let and each iteration gets its own binding: 0 1 2.
Every question carries an explanation like this one. You see it the moment you answer, right or wrong.
What is in the app
Everything Interleave does,
and nothing it doesn't
A short list, because the app is short. There is no feed, no chat, no leaderboard and no video. There is a session, a scheduler, and an honest explanation behind every answer.
A daily session that mixes courses
The session deals one question per enrolled course in rotation, so Rust never arrives in a block. Mixing is the effect the product is named for, and it is the single biggest difference between practice that feels easy and practice that lasts.
Spaced repetition per question
An SM-2-style scheduler tracks every question separately. A correct answer pushes it further out; a wrong one brings it back tomorrow and costs ease. You never decide what to review.
Six kinds of question
Multiple choice, predict the output, fill the blank, put the lines in order, match behaviour to snippet, and a concept card that teaches rather than tests.
Mastery you have to earn
A question counts as mastered after three correct answers spread over at least a week. Progress is the share of a course you have mastered, not the share you have seen.
Streaks that forgive
Streaks are counted in your own timezone. Every seven days earns a freeze, you can hold two, and a freeze covers a missed day automatically. Missing days never deletes the schedule underneath.
Difficulty you set per course
Easier, balanced or harder, chosen per course. It reorders which unseen questions come first without hiding any of them.
An explanation on every question
Not "correct" or "incorrect" - the reason, in a sentence or three, written next to the code it explains.
Answers verified by running the code
Every runnable snippet is executed before it ships, and the answer marked correct has to match what actually ran. It has caught wrong answers that careful reading missed.
Browse by language or by goal
A course belongs to one language and to any number of goals - foundations, interview prep, an exam. Search matches the names people actually type, so golang finds Go.
XP for mastery only
Points come from first-try-correct answers, cleared reviews, mastered questions and meeting the daily goal. Never for time spent or volume answered - a number you can farm makes the learning fake.
Your data stays small
An email, a display name, a timezone and what you have answered. No ad identifier, no third-party tracker, no App Tracking Transparency prompt, because there is nothing to ask permission for.
Every question cites its source
Each item records the specification or documentation it came from, its licence and the date it was read. Nothing under a non-commercial licence is ever used.
The habit
Two minutes,
on the phone in your pocket.
Interleave is an iOS app, not a website with a phone layout. One question fills the screen, the options sit under your thumb, and a session is short enough to finish in a lift, a queue or the time a kettle takes. There is no web version and nothing to install on a laptop.
Five questions is the default
About two minutes. You can set the goal anywhere from one to fifty, but the app is built around finishing rather than around a long sitting - and the scheduler has nothing more to show you once the day’s reviews are cleared.
Same slot every day beats a long Sunday
Five minutes a day is worth more than thirty-five in one go, because the forgetting between sessions is what makes the next answer count. Pick a slot that already exists - the commute, the first coffee, the bus home - and attach it to that.
Your day, in your timezone
The day rolls over at your midnight, not at UTC, so a session at 11pm counts for the day you think it does. Travel does not silently break a streak.
Sleep is part of the schedule
Intervals are measured in days precisely because the consolidation happens between sessions. An evening session that you review the next morning is the mechanism working, not you cramming.
Question types
Six ways to be asked
Recognising the right answer in a list is easier than producing it. That is why half of these do not give you a list.
Multiple choice
Four plausible answers, one of them right and the others wrong for a reason someone actually believes. The backbone of a session.
Predict the output
No options at all. You type exactly what the program prints. Free recall, with a list of acceptable spellings behind it so you are graded on understanding rather than whitespace.
Fill the blank
A snippet with a hole in it. You supply the call, operator or keyword that makes it behave the way the question describes.
Put it in order
Shuffled lines you reassemble into a working program. Structure, not syntax - and no partial credit for nearly.
Match
Pair each snippet with the behaviour it produces. Good for the cases that look identical until one of them isn't.
Concept card
A short teaching card with nothing to score, shown the first time a topic comes up. At most one per session: this is practice, not reading.
The method
The name is
the method.
Studying one topic until it clicks, then moving on, is called blocked practice. It feels productive and it is measurably worse. Interleaving mixes topics so your brain has to work out which idea applies before it can apply it — which is exactly what it will have to do at a keyboard.
Mixing, not blocking
The session deals one question per enrolled course in rotation. Two JavaScript questions in a row only happen when JavaScript is all you are enrolled in. Blocked practice lets you coast on the last answer; mixed practice makes you re-choose the concept every time, and that extra effort is what gets stored.
Spacing, widening
Your first correct answer books the question for tomorrow. Each clean review multiplies the gap by an ease factor that itself creeps up, so a question you keep getting right goes from a day to three to a week to a month. A wrong answer drops it straight back to tomorrow and lowers the ease - the schedule follows your forgetting, not a syllabus.
Retrieval, not review
Every card asks you to produce something before it shows you anything. Testing yourself on material outperforms re-reading it, and the gap widens the longer you wait to measure. Re-reading feels like learning because it feels fluent; retrieval feels harder because it is doing more.
Mastery, defined
Three correct answers, spread over at least a week, and the question is marked mastered. You cannot get there in one sitting no matter how long you sit - which is the point, and also why the app closes after five questions instead of offering you fifty.
Content integrity
Every runnable answer
was actually run.
A quiz app that is confidently wrong is worse than no quiz app. So the answer marked correct is not a matter of opinion: before a course ships, a build executes every snippet in it and fails if what the code printed is not what the question claims.
- Snippets run in a pinned toolchain image, because a language version is part of the answer — Ruby 3.4 changed how a hash prints, and content written against a newer local runtime failed on the older one.
- C and C++ run on two processor architectures and must agree.
(int)(char)200is -56 on an Intel machine and 200 on an Apple Silicon one; a question with two answers is not a question, so it becomes a concept card instead. - A separate sweep rejects the degenerate shapes: answers that cluster on one option, duplicate choices, a correct answer that is simply the longest one.
- A language with no runner fails the build rather than being quietly skipped.
- Your answers are never executed. Grading is comparison against a stored answer, so nothing you type ever runs anywhere.
Content gate
$ npm run validate:image
running 7,110 snippets in the pinned image
ok javascript-foundations 90/90
ok python-core 90/90
ok go-core 90/90
…
ok 79 courses, 0 disagreements
This runs on every content change. It is a gate, not a report: nothing ships past a red run.
The catalogue
Pick your language.
Then pick your depth.
Each language runs as a track of up to ten courses, from the syntax you already know to the traps that catch people who have shipped it for years. Enrol in as many as you like — the more you hold at once, the more the mixing does for you.
JavaScript Foundations
Ten topics that cover where JavaScript actually trips people up: scope, coercion, closures, this, async ordering and the modern syntax that replaced the old workarounds.
Python Core
Ten places where Python does not do what the syntax suggests. Mutable defaults, late-binding closures, identity versus equality, and the laziness underneath comprehensions and generators.
SQL Core
Ten topics covering where SQL actually bites: three-valued logic with NULL, which join drops which rows, WHERE against HAVING, window frames, and why the planner ignored your index. Every snippet is a complete script you can run.
Go Core
The places Go still surprises people who write it every day. append sometimes mutates the caller's array and sometimes does not, an interface holding a nil pointer is not nil, and a deferred call can rewrite a named return value.
Rust Essentials
The model underneath the syntax. Assigning a String to a second name moves it and the first name stops working, while an i32 is simply copied; borrowing, Option and exhaustive match are the same compiler insisting you say what happens in every case.
Java Core
Where Java trips developers who use it every day: autoboxing that hides a NullPointerException, a ternary that quietly unboxes, and dispatch rules that pick a method before the program runs. Ten spines on the gap between what the code says and what the JVM does.
Pricing
Free courses to start.
One price for the rest.
Every language track opens with a free Essentials course — the whole thing, not a sample. A subscription unlocks the entire catalogue, including every course added later. Your first subscription starts with a 7-day free trial, and nothing converts quietly: you see the price before you pay it.
Monthly
$6.99/month
Everything, month to month. Seven days free to begin with; cancel in the App Store whenever you like.
Annual
$29.99/year
$2.50 a month — the honest bet that a daily habit outlasts a fortnight. Saves 64% against monthly.
Lifetime
$89.99once
One payment, no renewal. Every course now and every course added later.
The app is with App Review now, so there is no download link here yet — and deliberately no badge pointing at a listing that does not exist. This is where it will appear.
Prices in US dollars; the App Store sets the local equivalent. Subscriptions renew until cancelled and are managed in your Apple account, not by us. iOS first — the app is in review, Android is realistic but unpromised, and there is no web version.
Questions
Before you ask
Will this teach me to code from scratch?
No. Interleave assumes you can read a for loop and would like to stop being wrong about what it does. If you have never written a line of code, start somewhere that has you writing one and come back — the Essentials course in each track is pitched at someone who has just done that.
Do I write code in the app?
No. You read code and predict its behaviour. That is a different skill from writing it, it is most of what debugging somebody else's work consists of, and almost nothing trains it deliberately.
How long is a session?
About two minutes at the default goal of five questions. You can set the goal anywhere from one to fifty, but the app is designed around finishing rather than around a long sitting.
What happens if I miss a day?
Every seven days of streak earns a freeze and you can hold two; a freeze covers a missed day automatically. Miss more than you have freezes and the streak resets — but the scheduler does not. The reviews you owe are still waiting and nothing you learned is deleted.
Can I study several languages at once?
That is the intended way to use it. Enrol in as many courses as you like; the daily session deals one question per course in rotation, so four courses is still five questions, just better mixed.
Where do the questions come from?
Written fresh against primary sources — language specifications and official documentation — with AI assistance, then executed, validated and reviewed. Every item stores its source, licence and retrieval date.
What if an answer is wrong anyway?
Execution catches the class of error a human reader misses; it cannot catch a badly worded or genuinely ambiguous question, and those still need a person to notice. If you find one, tell us at support.
Is my data sold, or used to train anything?
No. The app stores an email, a display name, a timezone and your answers. Analytics are anonymous and carry no device or advertising identifier, which is why the app needs no tracking prompt.
Android? Web?
iOS first. The app is written in Flutter, so Android is a realistic follow-up rather than a rewrite, but it is not promised and no date is set. There is no web version.
Who is it for, age-wise?
13 and over.
Two minutes a day,
against the forgetting curve.
7,110 graded questions across 79 courses, every runnable one verified by executing it.
- No ads
- No tracking
- Answers that were actually run