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

My Terminal
git init
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

def hello():
print("Hello!")
return 42

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

x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

display math

$$\int_{a}^{b} f(x) \, dx = F(b) - F(a)$$

result

\int_{a}^{b} f(x) \, dx = F(b) - F(a)

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 cards
  • category — string, added as an extra tag
  • card_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 optional search, tags, flagged, page, and per_page
  • POST /api/v1/cards.json — create a card from JSON
  • GET /api/v1/cards/<card_uuid>.json — fetch one card as JSON
  • PATCH /api/v1/cards/<card_uuid>.json — update card fields from JSON
  • DELETE /api/v1/cards/<card_uuid>.json — delete a card
  • GET /api/v1/cards/<card_uuid>.md — export one card as markdown
  • GET /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

Note: Something important.