RomansLab project · 2026 →

tauko

I built tauko because I kept reaching for my phone every time an AI agent started working. Now a flashcard opens next to the chat when I press enter, and the pane tells me when Claude is done. I use it for Finnish, and it works for any subject: Claude can write a course, check its answers, and install it.

Go SQLite Spaced repetition Claude Code Open source
Running · 2026 →
Claude Code working on a dark mode toggle on the left, and a Spanish flashcard in the tauko pane on the right
On this page 7 sections

tauko turns the time I spend waiting for Claude Code into short study sessions. When I send a prompt, a flashcard opens in a pane next to the chat. I answer one or two cards, and when Claude finishes, the pane tells me and I go back to work. The source and installer are on GitHub.

Why I made it#

I wrote about this in I Don’t Need AI for That: I give a task to an AI agent, and while it writes the code, I open TikTok. It happens many times a day. Each wait is only thirty seconds or a couple of minutes, but together they add up to an hour or more.

I didn't want to stop using agents. I wanted those gaps to leave something behind. Spaced repetition already works well in small sessions, and I'm learning Finnish, so I tried putting flashcards exactly where the phone used to be.

The name is Finnish for "a pause".

The wait is the trigger#

Study apps need me to decide to study. tauko doesn't: the Claude Code plugin opens the pane when I press enter and shows "Claude is done" when the turn ends. The status line under the prompt shows how many cards are left today.

One card takes 5 to 20 seconds. If Claude finishes in the middle of a card, I can leave it; nothing is lost and the card comes back later.

Answering a card#

I type the answer and press enter. The check ignores case and punctuation, and a missing accent or a single typo counts as "almost" instead of wrong. That matters for languages: cene instead of cené is close, but it is a different word.

An answered Spanish card: almost right because of a missing accent, with the answer, translation, grammar note and grade buttons

After each answer I grade the card from Again to Easy. tauko uses FSRS, a spaced-repetition scheduler, to decide when I see it next: minutes for new cards, weeks for cards I know well. Pressing e asks Claude to explain the answer I actually gave, and k retires a card I already know.

Learning, not only testing#

Flashcards are good at keeping what I've already met, but they don't introduce new ideas. So a course can start each idea with a short lesson of 40 to 80 words, which takes under 40 seconds to read. A quick check follows, and then the spaced cards take over.

Making a course#

A course is a folder of JSON files, so I can write one by hand. Usually I ask Claude instead:

tauko gen "Spanish for travellers" -level A2

Claude drafts the lessons and cards. A second, independent pass checks every answer and fixes wrong or ambiguous cards. tauko then runs its own checks on the result: unique IDs, one blank in each fill-in card, and the rest of the course format.

tauko gen output: drafting, two fixes from the verification pass, the course outline and install

Since version 0.5, I can do the same from the pane. I type a topic, keep working, and the new course opens in the pane about a minute later. With no courses installed, the pane starts on this screen, with the public gallery one press away.

The tauko pane making a photography course in the background, with gallery courses to install in one press

How it is built#

tauko is a single Go binary. A small local server holds the scheduler and a SQLite database, and every client talks to it over HTTP: the Claude Code pane, the terminal, a browser page, and my phone over Tailscale. My progress stays in ~/.tauko on my machine. There is no account and no telemetry; it only goes online to download gallery courses and to call Claude.

What I want to improve#

Generated courses are drafts. The verification pass catches a lot, but a wrong or awkward card still gets through sometimes, and today the fix is editing the JSON. I want a key for "my answer was right" that adds the answer to the card.

I also want to match the material to the wait: a lesson when Claude is working on something long, a quick review when it isn't. And I want to try quizzes about the code Claude has just changed, so I keep my own skills while the agent writes code.

If tauko helps you too, you can leave a tip.

View on GitHub →