Flash

Run Flash yourself.

The server behind Flash is open source. Pull one image, set one variable, and you have the whole thing on your own hardware: the FSRS scheduler, the web app, Anki import and export, and the MCP server your AI studies through. No plan, no card cap, no account anywhere but yours.

What you get

Everything that studies
The full scheduler, decks and cards, web study, stats, media. Nothing is held back for the hosted version.
Your AI, on your server
Flash serves MCP at /mcp with OAuth 2.1. Claude, ChatGPT, Grok, Claude Code, or any MCP client signs in with your passkey and studies your cards out loud.
Anki in, Anki out
Import .apkg decks whole — cloze, images, audio, LaTeX, typed answers, nested decks — and export back at any time.
One file to back up
Cards, reviews and media live in a single data directory around one SQLite database. Copy it and you have copied everything.
Small and quiet
One static Rust binary. The Docker image runs read-only with every capability dropped. No ads, no tracking, no calls home.
Unlimited cards
There is no plan to hit. The 1,000-card free tier and Pro exist on the hosted service; a server you run has no limit at all.

Five-minute setup

1. Get the compose file
Clone the repository, or just download docker-compose.yml and .env.example from it.
git clone https://github.com/flash-cards/flash && cd flash
2. Set your address
Copy the example environment file and set FLASH_BASE_URL to the URL you will reach Flash at. Passkeys and every sign-in link are minted against it, so it must be exactly what the browser sees. http://localhost:8437 is fine for a trial.
cp .env.example .env
3. Start it
The image is on GitHub's container registry; compose pulls it and starts Flash on port 8437, loopback only.
docker compose up -d
4. Claim the admin account
The first boot finds an empty database and logs a one-time enroll link, good for 24 hours. Open it, add a passkey or a password, and you are the admin.
docker compose logs flash | grep enroll
Every later account is created from Settings → Invite. There is no public signup on a self-hosted Flash, by design.
5. Put HTTPS in front
Flash speaks plain HTTP on the loopback port. Put a reverse proxy with a certificate in front of it (Caddy is two lines) and set FLASH_CLIENT_IP_HEADER=x-real-ip so rate limits see each visitor rather than the proxy. The web app needs HTTPS or http://localhost: its session cookie is marked Secure.

No Docker? cargo build --release -p flash-server produces one binary that takes the same environment variables. The README covers every setting.

Connect your AI

Claude
Settings → Connectors → Add custom connector, paste https://<your host>/mcp. Claude's connectors need a publicly reachable HTTPS origin: a domain with a certificate, or a tunnel (Cloudflare Tunnel, Tailscale Funnel, ngrok) if you would rather not open a port. Voice study works the same as on the hosted service.
Claude Code
Runs on your own machine, so a LAN address works as long as it matches FLASH_BASE_URL.
claude mcp add --transport http flash https://<your host>/mcp
ChatGPT and Grok
ChatGPT (Plus and up, Developer mode): Settings → Apps, add the same URL as an MCP server. Grok: Connectors → New → Custom. Both need the server reachable from the internet over HTTPS, like Claude.

Once connected, say “quiz me on my pharmacology deck” and follow along. The guided setup shows each app step by step.

What's different from the hosted version

You create the accounts.
An admin enrolls once, then invites from Settings. No signup page, no Google or Apple sign-in; passkeys and passwords only. Password reset works once you set an outbound mail key.
No community library.
Sharing decks with strangers is a hosted feature. Your decks still export as .apkg and import anywhere.
The mobile apps talk to the hosted service.
On your own server you study in the browser or through your AI. The web app works fine on a phone.
You keep the backups.
Copy the data directory on a schedule. That is the whole disaster plan, and it is yours to run.
The hosted version is the same server, kept running for you.
Signup, sign-in with Google or Apple, community, the apps, and someone on call. If what you want is voice study on your phone without owning a server, it starts free.

License and contributing

Flash is AGPL-3.0-only: run it, change it, and if you host your changed version for others, publish the changes. Issues and pull requests are welcome under a contributor license agreement that lets the same code power the hosted service. This is one person's project and the hosted service is where the time goes, so bug reports get read and fixed as they come; feature requests are weighed against the roadmap rather than promised.

Take it home.
One image, one file, unlimited cards.