finds.dev← search

// the find

kantord/LibreLingo

★ 2,614 · Python · AGPL-3.0 · updated Apr 2026

🐢 🌎 📚 a community-owned language-learning platform

LibreLingo is an open-source, AGPLv3 alternative to Duolingo — YAML-defined courses, spaced repetition, PouchDB-backed sync, Svelte frontend. Aimed at developers and language enthusiasts who want a self-hostable, freedom-respecting platform where course content itself can be freely licensed. The Python toolchain (yaml-loader, json-export) lets you author courses in plain files and compile them to the web app format.

The YAML course format is genuinely clean — skills, modules, and challenges are human-readable and diffable, which makes community contribution tractable in a way that a database-backed editor never would be. The data pipeline is well-separated: yaml-loader handles parsing and validation, json-export handles compilation, and the web app just consumes static JSON — each layer is independently testable and replaceable. Test coverage on the Python packages is extensive, with snapshot tests catching regressions in challenge generation. PouchDB for progress storage means offline-first sync without a backend, which is the right call for a learning app.

The web app appears to have migrated from Svelte (mentioned in the README) to Next.js (the actual code in apps/librelingo-web is TypeScript/Next), but the README still talks about Svelte — this is a sign of documentation drift and suggests the project has undergone significant rewrites without keeping docs in sync. Course content is thin: after several years, the available courses are limited, and a language-learning platform lives or dies by its content. Audio support is listed as a separate project with its own CLI (librelingo-audios) rather than being integrated, so courses without audio are a real gap for pronunciation-heavy languages. The architecture requires a build step (YAML → JSON) before any course changes appear in the web app, with no live-reload dev workflow documented — contributing to courses is more friction than it should be.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →