| Crates.io | duoload |
| lib.rs | duoload |
| version | 0.1.2 |
| created_at | 2025-06-09 11:46:33.515756+00 |
| updated_at | 2025-06-09 19:06:03.199462+00 |
| description | Export vocabulary from Duocards |
| homepage | |
| repository | https://github.com/amarao/duoload |
| max_upload_size | |
| id | 1705824 |
| size | 349,472 |
Duoload is a command-line tool that allows you to export your data from Duocards and transfer it to either Anki flashcards or a JSON format. This gives you full control over your learning data, enabling you to use it with the powerful Anki ecosystem or process it with your own tools.
This application is intended to be used only with user-created cards. Please, respect copyright and don't download own Duocards card stacks.
There are three ways to get duocards:
Duoload provides pre-built binaries for all major platforms. You can download the latest release from the GitHub releases page:
duoload-linux-amd64duoload-linux-arm64 (broken, under construction)duoload-windows-amd64.exeduoload-macos-amd64duoload-macos-arm64After downloading, extract archive, make the binary executable (on Unix-like systems):
unzip duoload-linux-amd64.zip
cd duoload-linux-amd64
chmod +x duoload
./duocard --verion
Run
cargo install duoload
Duoload is also available as a Docker image. You can pull it from GitHub Container Registry:
# Pull latest version
docker pull ghcr.io/amarao/duoload:latest
# Or pull specific version
docker pull ghcr.io/amarao/duoload:v1.0.0
To download your vocabulary you need to know deck ID in Duocards. Deck ID is a base64-encoded identifier that looks like: RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=
Instructions for Firefox:

Export your vocabulary to an Anki package file that can be directly imported into Anki:
# Using binary - export all pages
./duoload --deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" --anki-file "my_vocabulary.apkg"
# Using binary - export only first 5 pages
./duoload --deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" --anki-file "my_vocabulary.apkg" --pages 5
# Using Docker - export all pages
docker run --rm -v "$(pwd):/data" ghcr.io/amarao/duoload:latest \
--deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" \
--anki-file "/data/my_vocabulary.apkg"
# Using Docker - export only first 3 pages
docker run --rm -v "$(pwd):/data" ghcr.io/amarao/duoload:latest \
--deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" \
--anki-file "/data/my_vocabulary.apkg" \
--pages 3
Save your vocabulary as a JSON file for custom processing:
# Using binary - export all pages
./duoload --deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" --json-file "my_vocabulary.json"
# Using binary - export only first 10 pages
./duoload --deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" --json-file "my_vocabulary.json" --pages 10
# Using Docker - export all pages
docker run --rm -v "$(pwd):/data" ghcr.io/amarao/duoload:latest \
--deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" \
--json-file "/data/my_vocabulary.json"
# Using Docker - export only first 5 pages
docker run --rm -v "$(pwd):/data" ghcr.io/amarao/duoload:latest \
--deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" \
--json-file "/data/my_vocabulary.json" \
--pages 5
Pipe the JSON output directly to other tools or save it to a file:
# Using binary - export all pages
# Save to file
./duoload --deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" --json > my_vocabulary.json
# Using binary - export only first 2 pages
./duoload --deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" --json --pages 2 > my_vocabulary.json
# Process with jq - export all pages
./duoload --deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" --json | jq '.[] | select(.learning_status == "new")'
# Process with jq - export only first 3 pages
./duoload --deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" --json --pages 3 | jq '.[] | select(.learning_status == "new")'
# Using Docker - export all pages
# Save to file
docker run --rm -v "$(pwd):/data" ghcr.io/amarao/duoload:latest \
--deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" \
--json > my_vocabulary.json
# Using Docker - export only first 5 pages
docker run --rm -v "$(pwd):/data" ghcr.io/amarao/duoload:latest \
--deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" \
--json --pages 5 > my_vocabulary.json
# Process with jq - export all pages
docker run --rm ghcr.io/amarao/duoload:latest \
--deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" \
--json | jq '.[] | select(.learning_status == "new")'
# Process with jq - export only first 2 pages
docker run --rm ghcr.io/amarao/duoload:latest \
--deck-id "RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=" \
--json --pages 2 | jq '.[] | select(.learning_status == "new")'
The following options are available:
--deck-id: (Required) Your Duocards deck ID--anki-file: Output path for Anki package (.apkg)--json-file: Output path for JSON file--json: Output JSON to stdout (for piping to other tools)--pages: (Optional) Limit export to N pages (default: all pages)Note: You must specify exactly one output format (either --anki-file, --json-file, or --json).
The generated Anki package contains your vocabulary cards with the following fields:
The JSON output is an array of card objects with the following structure:
[
{
"word": "hello",
"translation": "hallo",
"example": "Hallo, wie geht's?",
"learning_status": "new"
}
]
This utility was vibe coded using:
It also got some manual polishing (mostly in specs, PRDs and tests) and was completely reviewed by humans.
It also was tested to work with Duocards as per Jule 2025 with a personal database of 2k+ words.
Most of the plan was implemented, we have working code and packages.
Leftovers: