Projects
What Datooine builds outside client work: a released open-source tool, a product in progress, talks and articles.
Open source · MIT license
recto
Learn things by heart with flashcards, in the terminal, in the spirit of Anki.
A deck holds only question and answer pairs. When it’s imported, a model writes variants of every card: the question asked the other way round when that makes sense, and a few rephrasings. Each review asks one at random, so you learn the knowledge, not one wording.
You type the answer, the model grades it and says what was missing, and FSRS decides when the card comes back.
# Python 3.12+ and an OpenAI key$ uv tool install recto$ export OPENAI_API_KEY=...$ recto # The model is configurable$ export RECTO_MODEL=gpt-5.4-miniHow it works
The LLM does what it’s good at, the algorithm does the rest.
- 1
Import a deck
A TOML file of questions and answers, or one of the five example decks.
- 2
Generate variants
For every card, the model writes the reversed question and a few rephrasings.
- 3
Review
Each review asks one variant picked at random. You type your answer.
- 4
Grade
The model scores the answer and explains what was missing, following the deck’s instructions.
- 5
Schedule
FSRS, a spaced-repetition algorithm, decides when the card comes back.
What this project shows
A small project, built like a client project.
Rephrasing and grading are language tasks: a model does them well. Scheduling reviews is a solved problem: FSRS does it better, deterministically and testably.
The variant generator and the answer judge are ports. PydanticAI is just one adapter: switching model or provider doesn’t touch the domain.
Use cases run on an in-memory repository, a fake generator, a fake judge and a fixed clock. The UI is tested headless through Textual’s Pilot, SQLite against a real file.
CI builds the package on every push. Each version tag publishes to PyPI through trusted publishing and creates a GitHub release.
Under the hood
A deck is a plain TOML file. The optional instructions are passed to the model when it writes variants and grades answers.
[deck]name = "Wines"description = "French grape varieties, appellations and wine regions"instructions = "Be strict on appellations, lenient on grape spelling." [[cards]]id = "chablis-grape"question = "Which grape dominates the white wines of Chablis?"answer = "Chardonnay"src/recto/ domain/ cards, variants, grades, FSRS memory ports/ deck repository, variant generator, answer judge, clock use_cases/ one class per action adapters/ SQLite, PydanticAI, TOML deck files, system clock tui/ Textual screens, calling use cases only container.py the one place where adapters are plugged into portsIn progress · Invite only
FactUp Live
Live fact-checking: claims are checked while they’re being spoken.
FactUp Live listens to a conversation and transcribes it live, in French or English. Checkable claims (figures, dates, statements) are picked out automatically and checked against the web: each one gets a verdict, an explanation and its sources.
The starting point is Brandolini’s law: refuting a false claim takes far more energy than making it. The idea is to bring fact-checking up to the speed of speech.
The product is still being built, and access is invite-only for now.
Verdict scale
- True
- Mostly true
- Mostly false
- False
- Unverifiable
Brandolini’s law
“The amount of energy needed to refute bullshit is an order of magnitude bigger than to produce it.”
01
Record
A debate, an interview, a council meeting: the transcript appears live.
02
Detect
Only checkable claims are kept. Opinions stay out of scope.
03
Verify
Each claim is checked against the web: verdict, explanation and cited sources.
04
Publish
The checked transcript becomes a public page, shareable with one link.
The principles
The same standards as a client AI project, on a problem where every mistake shows immediately.
Every verdict relies on retrieved, cited sources. Never “just trust me”.
Figures, dates, statements: only claims worth checking are kept, opinions are left aside.
Transcription and checking happen live, while the conversation goes on. A verdict that lands three hours later is no use to anyone.
Talks and articles
Write-ups published on the blog, in French.
An AI project to build with the same rigor?
Let’s talk about your context, your data and what needs to reach production.