Local-first by default
Libre Academy is local-first. By default:
- Every course is a JSON file on disk (or in IndexedDB in the browser)
- Progress, XP, and streak counters live in SQLite (desktop) / IndexedDB (browser)
- The AI tutor runs against a local Ollama instance, so zero tokens get billed and there’s no cloud round-trip
- Anonymous, cookieless product analytics (self-hosted, first-party Plausible) help us improve the apps. No personal data, no cross-site tracking, no error reporters, and you can turn it off anytime under Settings → Data & storage. Beyond that and the optional cloud-sync toggle, there are no outbound calls except the playground proxies
What does talk to a server?
A small, well-defined set of things:
- The Anthropic backend for the AI tutor, if you flip it on under Settings (the local Ollama path stays default)
- Cloud sync, if you sign in. Small JSON progress records, nothing else
- The Rust + Go playgrounds at play.rust-lang.org and play.golang.org, since neither toolchain ships with Libre Academy
- Product analytics (self-hosted, first-party Plausible). On by default, but anonymous and cookieless, with no personal data and no cross-site tracking. Turn it off anytime under Settings → Data & storage
Everything else, including PDF ingest, lesson rendering, and code execution for the in-browser languages, runs entirely on your machine.