Open-source flashcards with a modern memory model.
FSRS, native apps everywhere, offline-first sync, and your Anki history.
Open the web app · Docs · Discord · Features · Run your own · How it works
Note
Rondo is pre-release: web first, native apps next. Until hosting opens, run it from source.
- FSRS-6 scheduling
- Personal FSRS weights
- Cloze deletions
- Image occlusion
- LaTeX & MathJax
- Furigana
- Pinyin
- Typed answers
- Text-to-speech
- Custom note types
- .apkg import
- .colpkg import
- Full review history
- Daily limits
- Suspend & bury
- Sub-decks & levels
- Shared decks
- Six native apps
- Works offline
- Background sync
- AI assistants (MCP)
- Free
- Open source
- Self-hostable
Web (React) iPhone · iPad · Mac (SwiftUI) Android (Compose) AI assistants
└────────────────┬──────────────────────────────┘ │
:client — SQLite, sync, sign-in, study, import, screens (Kotlin) MCP
:core — the rules, models, markup, FSRS-6, levels (Kotlin) │
│ │
rondo.matthewsource.com: / /docs /app ──► static files │
/api /media ──► Go server ──────────────┐ /sync /mcp ──► sync server (Kotlin, :core)
/auth ──► Kratos ───────────────────────┤ │
/oauth2 ──► Hydra ──────────────────────┴──────► one PostgreSQL ◄──────────┘
- Local-first. Apps use their own SQLite and never wait on the network; the newest row wins.
- Progress is a log. Reviews are never-overwritten events, so offline devices can't lose answers.
- One set of rules.
:corechecks every write, on devices and again on the sync server. - Spec-first for Go.
rondo.yamlgenerates the Go interfaces and API docs; Kotlin types are the sync contract.
ARCHITECTURE.md has the full map.
A Go server and a Kotlin sync server over PostgreSQL, with Kratos, Hydra and any S3 store (or a folder).
server/compose.yaml runs all of it from the released images; the guide puts it on a server of your own. Below runs Rondo from source: Docker runs what Rondo depends on, and Rondo's own servers run on this machine (Go, JDK 25, Node 24 and pnpm), each reloading itself as you edit.
git clone https://github.com/sourcelocation/rondo.git
cd rondo/server && cp .env.example .env
# Postgres, Kratos, Hydra and Mailpit; they stay up, so this is only needed again after a reboot or a `down`
docker compose up -d --wait# From the repository root: the JavaScript workspace (the brand, the web app and the site)
pnpm install
# The Go server (:23901), the sync server (:23902) and the web app, http://localhost:23900/app/
overmind startProcfile lists the three, for overmind or any Procfile runner (uvx honcho start needs no install), or run each line in a terminal of its own. The Go server migrates and restarts on every save, the sync server rebuilds through Gradle, and the web app rebuilds the Kotlin client and proxies everything on one origin. Sign-in codes land in Mailpit at http://localhost:23908. Ports: 23900–23912 (server/compose.yaml).
To run it as production does, from containers, stop the Procfile and add the app profile: docker compose --profile app up --build builds this checkout and serves the same address. .env.example's secrets are public, for this machine only. Production runs four images on k3s.
Four standalone projects, joined only by contract files.
| Project | Inside |
|---|---|
server/ |
The Go server: accounts, sharing, billing, mail. Owns the API and schema. |
app/ |
Kotlin core, client, MCP, sync server and web app. |
site/ |
The landing page (Astro) and the docs (Fumadocs). |
brand/ |
Design tokens, fonts and artwork for every platform. |
Build and test
# Go server: lint, tests (with the compose Postgres)
cd server && go tool -modfile=tools/go.mod golangci-lint run && go test ./...
# Kotlin: format, the rules on JVM and JS, the client, the sync server against Postgres and real clients,
# on a test database migrated as production's is
cd server && RONDO_DATABASE_URL=postgres://rondo:rondo@localhost:23903/rondo_test?sslmode=disable go run ./cmd/rondo migrate
cd app && ./gradlew spotlessCheck :core:allTests :client:jvmTest :sync:test
# Web app
cd app/platforms/web && pnpm format:check && pnpm typecheck && pnpm build
# Sites: landing on :23911, docs on :23912
cd site && pnpm dev
cd site && pnpm dev:docsIssues and PRs welcome; open an issue first for anything bigger than a fix. API changes start in the spec.
Contributions fall under the CLA. Questions: support@matthewsource.com.
AGPL-3.0. The Rondo name and logo are trademarks; forks need their own (brand/artwork).