{"id":28536613,"url":"https://github.com/amarao/duoload","last_synced_at":"2025-10-04T16:50:29.363Z","repository":{"id":297815164,"uuid":"997967315","full_name":"amarao/duoload","owner":"amarao","description":"Export vocabulary from Duocards into Anki or JSON","archived":false,"fork":false,"pushed_at":"2025-06-11T19:53:38.000Z","size":316,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-09-26T05:58:59.712Z","etag":null,"topics":["anki","vibe-coding"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amarao.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-07T15:30:10.000Z","updated_at":"2025-08-30T09:53:30.000Z","dependencies_parsed_at":"2025-06-07T17:36:00.958Z","dependency_job_id":null,"html_url":"https://github.com/amarao/duoload","commit_stats":null,"previous_names":["amarao/duoload"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/amarao/duoload","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amarao%2Fduoload","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amarao%2Fduoload/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amarao%2Fduoload/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amarao%2Fduoload/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amarao","download_url":"https://codeload.github.com/amarao/duoload/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amarao%2Fduoload/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278343083,"owners_count":25971399,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anki","vibe-coding"],"created_at":"2025-06-09T18:06:58.887Z","updated_at":"2025-10-04T16:50:29.312Z","avatar_url":"https://github.com/amarao.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Overview\n\nDuoload is a command-line tool that allows you to export your data from [Duocards](https://duocards.com/) 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.\n\nThis application is intended to be used only with user-created cards. Please, respect copyright and don't download own Duocards card stacks.\n\n## Installation\n\nThere are three ways to get Duoload:\n\n* Download an archive with pre-compiled binary\n* Build your own from source code\n* Use Docker image\n\n### Binary Installation\n\nDuoload provides pre-built binaries for all major platforms. You can download the latest release from the [GitHub releases page](https://github.com/amarao/duoload/releases):\n\n* Linux (AMD64): `duoload-linux-amd64`\n* Linux (ARM64): `duoload-linux-arm64`\n* Windows (AMD64): `duoload-windows-amd64.exe`\n* macOS (AMD64): `duoload-macos-amd64`\n* macOS (ARM64): `duoload-macos-arm64`\n\nNote: all binaries are coming unsinged (I don't have excess €100 to throw to Apple just for privilege to compile opensource software for\ntheir OS).\n\nAfter downloading, extract archive, make the binary executable (on Unix-like systems):\n```bash\nunzip duoload-linux-amd64.zip\ncd duoload-linux-amd64\nchmod +x duoload\n./duocard --verion\n```\n\n### Build your own\n\nRun\n\n```\ncargo install duoload\n```\n\n### Docker\n\nDuoload is also available as a Docker image. You can pull it from GitHub Container Registry:\n\n```bash\n# Pull latest version\ndocker pull ghcr.io/amarao/duoload:latest\n\n# Or pull specific version\ndocker pull ghcr.io/amarao/duoload:v1.0.0\n```\n\n## Usage\n\nTo download your vocabulary you need to know deck ID in Duocards. Deck ID is a base64-encoded identifier that looks like: `RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=`\n\n### Finding Your Deck ID\n\nInstructions for Firefox:\n\n* Login into https://app.duocards.com\n* Open your browser debug console (usually, F12)\n* Go to into storage tab (1 on the picture)\n* Go into 'Local Storage' (2 on the picture)\n* Find 'reduxState' line, click on it. (3 on the picture)\n* On the right pannel find 'deckID' (scroll manually or put it into search line on the right, 4 on the picture)\n* Click on this value (on the right pannel) (5 on the picture)\n* Copy value (just press Ctrl-C or Cmd-C)\n* Remove 'deckID:' from copied string. Everything after column is deck ID to use in command line with duoload.\n\n![Deck ID](deck_id.png)\n\n### Examples\n\n#### 1. Export to Anki Package\n\nExport your vocabulary to an Anki package file that can be directly imported into Anki:\n\n```bash\n# Using binary - export all pages\n./duoload --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" --anki-file \"my_vocabulary.apkg\"\n\n# Using binary - export only first 5 pages\n./duoload --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" --anki-file \"my_vocabulary.apkg\" --pages 5\n\n# Using Docker - export all pages\ndocker run --rm -v \"$(pwd):/data\" ghcr.io/amarao/duoload:latest \\\n    --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" \\\n    --anki-file \"/data/my_vocabulary.apkg\"\n\n# Using Docker - export only first 3 pages\ndocker run --rm -v \"$(pwd):/data\" ghcr.io/amarao/duoload:latest \\\n    --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" \\\n    --anki-file \"/data/my_vocabulary.apkg\" \\\n    --pages 3\n```\n\n#### 2. Export to JSON File\n\nSave your vocabulary as a JSON file for custom processing:\n\n```bash\n# Using binary - export all pages\n./duoload --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" --json-file \"my_vocabulary.json\"\n\n# Using binary - export only first 10 pages\n./duoload --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" --json-file \"my_vocabulary.json\" --pages 10\n\n# Using Docker - export all pages\ndocker run --rm -v \"$(pwd):/data\" ghcr.io/amarao/duoload:latest \\\n    --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" \\\n    --json-file \"/data/my_vocabulary.json\"\n\n# Using Docker - export only first 5 pages\ndocker run --rm -v \"$(pwd):/data\" ghcr.io/amarao/duoload:latest \\\n    --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" \\\n    --json-file \"/data/my_vocabulary.json\" \\\n    --pages 5\n```\n\n#### 3. Export to JSON via stdout\n\nPipe the JSON output directly to other tools or save it to a file:\n\n```bash\n# Using binary - export all pages\n# Save to file\n./duoload --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" --json \u003e my_vocabulary.json\n\n# Using binary - export only first 2 pages\n./duoload --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" --json --pages 2 \u003e my_vocabulary.json\n\n# Process with jq - export all pages\n./duoload --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" --json | jq '.[] | select(.learning_status == \"new\")'\n\n# Process with jq - export only first 3 pages\n./duoload --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" --json --pages 3 | jq '.[] | select(.learning_status == \"new\")'\n\n# Using Docker - export all pages\n# Save to file\ndocker run --rm -v \"$(pwd):/data\" ghcr.io/amarao/duoload:latest \\\n    --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" \\\n    --json \u003e my_vocabulary.json\n\n# Using Docker - export only first 5 pages\ndocker run --rm -v \"$(pwd):/data\" ghcr.io/amarao/duoload:latest \\\n    --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" \\\n    --json --pages 5 \u003e my_vocabulary.json\n\n# Process with jq - export all pages\ndocker run --rm ghcr.io/amarao/duoload:latest \\\n    --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" \\\n    --json | jq '.[] | select(.learning_status == \"new\")'\n\n# Process with jq - export only first 2 pages\ndocker run --rm ghcr.io/amarao/duoload:latest \\\n    --deck-id \"RGVjazo1YjZmMTA3My1hZjA2LTQwMGMtYTQyNC05ZWM5YzFlMGEzZjg=\" \\\n    --json --pages 2 | jq '.[] | select(.learning_status == \"new\")'\n```\n\n### Command Line Options\n\nThe following options are available:\n\n- `--deck-id`: (Required) Your Duocards deck ID\n- `--anki-file`: Output path for Anki package (.apkg)\n- `--json-file`: Output path for JSON file\n- `--json`: Output JSON to stdout (for piping to other tools)\n- `--pages`: (Optional) Limit export to N pages (default: all pages)\n\nNote: You must specify exactly one output format (either `--anki-file`, `--json-file`, or `--json`).\n\n## Output Format\n\n### Anki Package (.apkg)\nThe generated Anki package contains your vocabulary cards with the following fields:\n- Front: The foreign language word\n- Back: The translation\n- Example: Example usage (if available)\n- Tags: Learning status (duoload_new, duoload_learning, or duoload_known)\n\n### JSON Format\nThe JSON output is an array of card objects with the following structure:\n```json\n[\n    {\n        \"word\": \"hello\",\n        \"translation\": \"hallo\",\n        \"example\": \"Hallo, wie geht's?\",\n        \"learning_status\": \"new\"\n    }\n]\n```\n\n\n## Vibe coding\n\nThis utility was vibe coded using:\n\n* Gemini 2.5 Pro\n* Cloudie 4.0 sonnet\n* Cursor using 'auto' mode\n\nIt also got some manual polishing (mostly in specs, PRDs and tests) and was completely reviewed by humans.\n\nIt also was tested to work with Duocards as per June 2025 with a personal database of 2k+ words.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famarao%2Fduoload","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famarao%2Fduoload","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famarao%2Fduoload/lists"}