Documentation
Everything you need to know about creating and importing flashcards.
Formatting your cards
Cards support markdown, LaTeX math, syntax-highlighted code blocks, and custom HTML widgets. Write the front and back of each card using any combination of these.
Terminal widget
Display command-line interactions with a styled terminal window.
syntax
<terminal title="My Terminal"> git init git add . </terminal>
result
git add .
The title attribute defaults to "terminal" if omitted.
Code highlighting
Use fenced code blocks with a language for syntax highlighting.
syntax
```python
def hello():
print("Hello!")
return 42
```
result
Supports Python, JavaScript, HTML, CSS, Bash, JSON, and more.
Math expressions
Write LaTeX math with KaTeX. Single $ for inline, double $$ for display.
inline math
$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$
result
display math
$$\int_{a}^{b} f(x) \, dx = F(b) - F(a)$$
result
JSON import format
Upload cards in bulk via JSON. Two formats are accepted.
option 1 — array of cards
[
{
"front": "What is the capital of France?",
"back": "Paris",
"tags": ["geography", "europe"]
},
{
"front": "What is 2 + 2?",
"back": "4",
"category": "math"
}
]
option 2 — object with cards key
{
"cards": [
{
"card_uuid": "my-unique-id",
"front": "What is the capital of France?",
"back": "Paris",
"tags": ["geography"]
}
]
}
Required fields: front and back on every card.
Optional fields:
tags— array of strings, used to organize and filter cardscategory— string, added as an extra tagcard_uuid— string (max 36 chars), enables in-place updates
In-place updates with card_uuid
When you include a card_uuid, re-uploading a file will update matching cards instead of creating duplicates. Your review history and due dates are preserved.
Workflow: export your cards (they'll include UUIDs), edit the JSON, re-upload. Cards without a UUID get one auto-generated.
API
Use the versioned API to automate card management. API keys are managed from your profile and authenticate requests with a Bearer token.
authentication
Authorization: Bearer rc_lookup_secret
list cards
curl -H "Authorization: Bearer $REMEMBER_CARDS_API_KEY" \ "http://calmcards.app/api/v1/cards.json?search=%23python&per_page=25"
create a card
curl -X POST "http://calmcards.app/api/v1/cards.json" \
-H "Authorization: Bearer $REMEMBER_CARDS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"front":"What is spaced repetition?","back":"A review schedule that expands over time.","tags":["learning"]}'
update a card
curl -X PATCH "http://calmcards.app/api/v1/cards/<card_uuid>.json" \
-H "Authorization: Bearer $REMEMBER_CARDS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"back":"Markdown **is supported**.","tags":["learning","markdown"]}'
get markdown
curl -H "Authorization: Bearer $REMEMBER_CARDS_API_KEY" \ "http://calmcards.app/api/v1/cards/<card_uuid>.md"
Endpoints:
GET /api/v1/cards.json— list cards with optionalsearch,tags,flagged,page, andper_pagePOST /api/v1/cards.json— create a card from JSONGET /api/v1/cards/<card_uuid>.json— fetch one card as JSONPATCH /api/v1/cards/<card_uuid>.json— update card fields from JSONDELETE /api/v1/cards/<card_uuid>.json— delete a cardGET /api/v1/cards/<card_uuid>.md— export one card as markdownGET /api/v1/tags.json— list tags currently attached to cards
The older /api routes are browser endpoints for the web app. External integrations should use /api/v1.
Custom HTML with Tailwind
Use raw HTML with Tailwind CSS classes for advanced card layouts. Add dark: variants for dark mode.
syntax
<div class="p-4 bg-yellow-100 rounded-lg border-l-4 border-yellow-500 text-yellow-700"> <strong>Note:</strong> Something important. </div>
result