Skip to content
Agentmart
Submit a tool

flashcards

Flashcards → Mochi.

Skill by jamierumbelow

IndexedMIT
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/jamierumbelow-flashcards

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Flashcards → Mochi. Use when the user asks to add a flashcard, or when running the import to Mochi. Covers the callout format and the Mochi sync process.

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/flashcards

What's inside

Skill name
flashcards
Description
Flashcards → Mochi. Use when the user asks to add a flashcard, or when running the import to Mochi. Covers the callout format and the Mochi sync process.
License
MIT
Instructions
177 lines in SKILL.md · view on GitHub

Before installing

  • Instructions call the network

Files (1)

  • SKILL.md

SKILL.md (first lines)

# Flashcards

Flashcards live in the Obsidian vault as callouts and get batch-imported into
Mochi. This skill covers both writing and importing them.

## Writing flashcards

Add flashcards to the `## Flashcards` section of the current daily note (or
whatever file the user specifies). Use this exact callout format:

```
> [!flashcard|Deck Name] - [ ]
> Question text
> ---
> Answer text
```

- **Deck name** goes after the pipe `|`. Ask the user which deck if you're
  unsure. Common decks: Friends and Family, Geography, History, Science.
- `- [ ]` means not yet imported; `- [x]` means already synced to Mochi.
- Question and answer can span multiple lines — every line must start with `> `.
- `> ---` separates question from answer.

Do **not** use `question :: answer` syntax or any other format.

## Importing flashcards to Mochi

When the user asks to sync or import flashcards, run through these steps:

### 1. Get the Mochi API key

```bash
op read "op://Machine/secrets.zshrc/MOCHI_API_KEY"
```

If this fails, tell the user to check their 1Password setup and stop.

### 2. Find unmoved flashcards

Search all `.md` files under `~/workspace/vault/` for flashcard callouts where
the checkbox is `- [ ]`. Skip any marked `- [x]`.

Parse each callout:
- Deck name: text between `|` and `]`
- Question: lines between the header and `> ---`
- Answer: lines after `> ---` until the callout ends

Strip leading `> ` from content lines. Collect file paths and line numbers for
marking later.

### 3. Create cards in Mochi

Fetch existing decks:

```bash
curl -s -u "$MOCHI_API_KEY:" https://app.mochi.cards/api/decks/
```

For each flashcard:

1. **Match or create the deck** (case-insensitive). If the deck name is close
   but not exact (e.g. "social" vs "Friends and Family"), ask the user. If
   creating a new deck, confirm first:
   ```bash
   curl -s -u "$MOCHI_API_KEY:" -X POST https://app.mochi.cards/api/decks/ \
     -H "Content-Type: application/json" \
     -d '{"name": "Deck Name"}'
   ```

2. **Create the card**:
   ```bash
   curl -s -u "$MOCHI_API_KEY:" -X POST https://app.mochi.cards/api/cards/ \
     -H "Content-Type: application/json" \
     -d '{"content": "Question\n---\nAnswer", "deck-id": "deck_id_here"}'
   ```

Make API calls sequentially — Mochi enforces **one concurrent request per account**. Wait for each response before sending the next. Use 5-second gaps when doing bulk operations; use exponential backoff (starting at 5s) on 429.

### 3b. Cards with images

If a flashcard's question includes an Obsidian image embed (`![[filename.jpg]]`), the image must be uploaded as a Mochi attachment and the content reference updated. Do this **after** the card is created.

**Step 1 — Upload the attachment** (multipart form, one per card):

```bash
curl -s -u "$MOCHI_API_KEY:" \
  -X POST "https://app.mochi.cards/api/cards/$CARD_ID/attachments/$SLUG" \
  -F "file=@/path/to/image.jpg"
```

The `$SLUG` must match the regex `/[0-9a-zA-Z]{8,16}\.(jpg|jpeg|png)/` — generate a random 10-char alphanumeric string + extension. Example: `aB3kRt9mXq.jpg`.

**Step 2 — Update the card content** to reference the attachment:

```bash
curl -s -u "$MOCHI_API_KEY:" \
  -X POST "https://app.mochi.cards/api/cards/$CARD_ID" \
  -H "Content-Type: application/json" \
  -d "{\"content\": \"![](@media/$SLUG)\nQuestion text\n---\nAnswer\"}"
```

The `![](@media/slug)` syntax is how Mochi resolves card attachments in markdown. The update endpoint is `POST /api/cards/:id` (not PATCH or PUT — those return 404).

**Important gotchas discovered in practice:**
- The `attachments` key in the card create/update body is deprecated and returns 422 — always use the separate upload endpoint
- The rate limit error "Please wait for the previous request to finish" means a previous request is still processing server-side — wait 5+ seconds, not just until you receive a response
- If the upload succeeds but the content update fails, the attachment persists on the card — just re-run the content update step; no need to re-upload
- Slug filenames: 8–16 alphanumeric chars only (no hyphens or underscores), then the extension

**Python pattern for image cards:**

```python
import random, string, time, os, base64, urllib.request, json

def random_slug(ext, n=10):
    chars = ''.join(random.choices(string.ascii_letters + string.digits, k=n))
    return chars + ext

def upload_attachment(card_id, slug, file_path, api_key):

From jamierumbelow/agentfiles, MIT.

More from jamierumbelow/agentfiles

Signals

Stars
0
Forks
0
Open issues
0
Last commit (this folder)
Mar 30, 2026 (7 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from jamierumbelow

Cite this page

flashcards skill. Agent Mart. https://agentmart.dev/skills/jamierumbelow-flashcards (last updated 2026-10-24)