Backing up Any.do tasks with any.down
I’ve used Any.do for task management for years. It is simple and stays out of the way. It also has no export or backup (their support page confirms it), so a deleted list or a dead service would take the data with it.
any.down is a small Python CLI that logs into Any.do’s web API, pulls tasks, and writes timestamped JSON and Markdown. Run it on a schedule (or via Docker) and you keep a local copy.
How it works
First run, any.down asks for your Any.do email and password, then sends a 2FA code to your inbox. After that it saves the session so you don’t have to re-authenticate each time. It only writes new files when your tasks have actually changed, so you don’t end up with hundreds of identical exports.
git clone https://github.com/aioue/any.down.git
cd any.down
uv sync
uv run anydown
The output lands in outputs/ - raw JSON for archival and Markdown tables that are easy to read or grep through.
Unattended backups with Docker
The main reason I built this was to run it on a schedule without thinking about it. A docker compose up -d gives you hourly syncs via supercronic, with session state in a Docker volume so it survives container rebuilds:
docker compose up -d
There’s also a --watch flag if you’d rather run the process directly without Docker - it syncs every 90 minutes or so with some random jitter.
Duplicate cleaner
Any.do occasionally creates duplicate tasks (sync conflicts or API oddities). anydown-dupes finds exact duplicates (same title, list, note, and subtasks) and can delete them:
uv run anydown-dupes # dry run
uv run anydown-dupes --delete # prompt before deleting
I keep the local exports because plain JSON/Markdown survives vendor churn and is easy to move to another system later.
Source: aioue/any.down