Learn French, freely.
A French grammar exercise generator (sentence transformation, conjugation, pronouns, negation, dictation, vocabulary) built around an engine that produces exercises endlessly, finds your weak points, and picks exactly what you should work on next. In your browser, and nowhere else.
![]() |
![]() |
![]() |
![]() |
APP: https://excusemyfrench.org/
npm install
npx playwright install chromium # once, for the tests
npm run dev # http://localhost:5173/
npm test # the Playwright suiteThe pedagogical content, exercises, dictionary, conjugations, vocabulary,
notions, explanations, lives in content/ as JSON and
Markdown: readable, editable, and reusable without touching the engine.
The architecture is described in CLAUDE.md.
- Made with love: first for one person, then for everyone.
- Open source: obvious here
- Local first: your progress stays in your browser as long as you decide it to, and most of the app works with no internet connection (you can use it as a PWA)
- AI/ML for good: your level is estimated statistically; weaknesses are detected per grammar concept; the exercises offered are neither too hard nor too easy.
- Learning over retention: no mechanic that optimises time spent in the app without serving the learning. Your dopamine is precious; save it for learning.
Everything under content/ is CC BY-SA 4.0. Everything else in this repository is AGPL-3.0-or-later.
content/ is the pedagogical corpus: exercises, dictionary, conjugations,
vocabulary, notions, placement questions and explanations. It is published
as-is into dist/content/ at build time, to be read and reused without the
engine. The rest, the generation engine, the analysis, the interface and
the tooling, is software: a software licence fits it, and a Creative
Commons licence does not, as Creative Commons itself recommends.
One architectural invariant keeps the boundary legible: human-authored
educational material meant to be shown or reproduced as content belongs in
content/. Algorithms may of course carry linguistic rules; nobody
chases a constant or an if.
Material the app produces, generated exercises and sentences, printed worksheets, is made available under CC BY-SA 4.0, to the extent that any rights subsist in it. A worksheet printed for a class is the teacher's.
LICENSE: GNU AGPL v3 or later, for the software.content/LICENSE: CC BY-SA 4.0, for the corpus.package.jsondeclaresAGPL-3.0-or-later: that field describes the package, and the corpus exception is the one stated here.
Contributions are accepted under the licence of the files they touch:
CC BY-SA 4.0 for content/, AGPL-3.0-or-later everywhere else. No
copyright assignment, no CLA. To date the author is the sole copyright
holder of the project.
| OpenMoji | the flashcard and vocabulary pictures | CC BY-SA 4.0 |
| Handlee | the handwriting on the exercise page | SIL Open Font License 1.1 |
| Bootstrap 4 | the CSS base | MIT |
| React | the interface | MIT |
The first two are vendored in the repository rather than loaded from a
CDN, so the app works offline and tells no one which exercise you are
doing. Their licences travel with them, in
public/openmoji/LICENSE.txt and
public/fonts/Handlee-OFL.txt.
Hoping you enjoy Excuse My French, and that it serves you well.
Onur Çelebi





