Skip to content
sourcelocationPublic

About

Open-source flashcards with a modern memory model: FSRS, native apps for iPhone, iPad, Mac, Android and the web, offline-first sync, and Anki import.

Resources

Code of conduct

Contributing

Stars

3 stars

Watchers

1 watching

Forks

Latest commit

 

History

63 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rondo: spaced repetition that comes back around. One card, A, keeps returning between new cards B, C and D, after 1 day, then 4 days, then 2 weeks.

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

License: AGPL-3.0 CI Platforms: iOS, iPadOS, macOS, Android, web Scheduler: FSRS-6

Note

Rondo is pre-release: web first, native apps next. Until hosting opens, run it from source.

Rondo's Today screen on a Mac and a study card on an iPhone

Features

  • 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

How it works

 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. :core checks every write, on devices and again on the sync server.
  • Spec-first for Go. rondo.yaml generates the Go interfaces and API docs; Kotlin types are the sync contract.

ARCHITECTURE.md has the full map.

Run your own

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 start

Procfile 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.

Repository

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:docs

Contributing

Issues 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.

License

AGPL-3.0. The Rondo name and logo are trademarks; forks need their own (brand/artwork).

About

Open-source flashcards with a modern memory model: FSRS, native apps for iPhone, iPad, Mac, Android and the web, offline-first sync, and Anki import.

Resources

Code of conduct

Contributing

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages