DoneFast
Run your own sync server
Keep DoneFast in sync across your devices through a small server on a computer you own, such as a Mac, a Linux machine, a NAS, or a Windows PC. Your tasks stay on your hardware.
The server is free to use and share, but you may not sell it, and it isn't open source. It's published as a Docker image. See the licence.
Sync in the app is part of DoneFast Pro, a one-time purchase. You can restore it free on your other devices that use the same app store.
1. Set up the server
You only need Docker (Docker Desktop on a Mac or Windows). There are two ways to set it up, so pick one. Both keep the database in a folder of your choice.
One command (Mac and Linux)
It chooses a password for you, starts the server, and gives you commands for backups and upgrades.
- Start Docker. On a Mac, open Docker Desktop and wait until it says it's running. In its settings, turn on starting Docker when you sign in, so the server comes back after a restart.
- Download donefast-sync-1.0.2.zip and unzip it. Open a terminal in the folder it makes.
- Set it up, choosing the folder for the database:
./install.sh --data-dir ~/DoneFastSyncThe folder is created if it isn't there. When it finishes, it prints two things to keep: the admin page address and the admin password.
The server keeps running in the background and starts again after a reboot. If the terminal says donefast-sync: command not found, the command was put in ~/.local/bin, which isn't on your PATH. Open a new terminal, or run it as ~/.local/bin/donefast-sync.
You can add these options to the setup command:
| Add | To |
|---|---|
--port 9000 | Use another port than 8080. |
--access local | Let only this computer reach it (no other devices). |
--access https --domain sync.example.com | Reach it from the internet, with HTTPS. See Keep your connection private. |
To change them later, run donefast-sync setup --force with the options you want, including the same --data-dir. The password and the server's version are kept.
Docker Compose (any computer, including Windows)
You write two short settings in a file.
- Start Docker. On a Mac or Windows, open Docker Desktop and wait until it says it's running. In its settings, turn on starting Docker when you sign in, so the server comes back after a restart.
- Make a folder for the server, such as
DoneFastSync. In it, create a file calleddocker-compose.ymlwith this content:services: sync: image: ghcr.io/asprotunity/donefast-sync:latest ports: - "${SYNC_HOST_PORT:-8080}:8080" volumes: - ${SYNC_DATA_DIR:-sync-data}:/data environment: SYNC_DB_PATH: /data/sync.sqlite SYNC_PORT: 8080 SYNC_ADMIN_PASSWORD: ${SYNC_ADMIN_PASSWORD:?set SYNC_ADMIN_PASSWORD} restart: unless-stopped volumes: sync-data: - Create a file called
.envnext to it, with these two lines. Replace the example password with a long one of your own:SYNC_ADMIN_PASSWORD=pick-a-long-password-of-your-own SYNC_DATA_DIR=./dataThe password protects the admin page. Anyone who has read this page knows the example, so the server refuses to start with it. The database goes in a
datafolder next todocker-compose.yml, which is created when the server first starts.On Windows, Notepad may save the file as
.env.txt. In the Save dialog, choose All files and type the name.env. - Start the server. Open a terminal (PowerShell on Windows) in that folder and run this. The first time, Docker downloads the server, which takes a minute.
docker compose up -d - Check that it's running. Within about half a minute, the status should say
healthy.docker compose ps
The server starts again by itself after a reboot, once Docker is running.
2. Pair your devices
Pair each device once. Devices must be able to reach the computer, either on the same network or over a VPN such as Tailscale.
- Find the server's address. It's
http://<computer>:8080, where<computer>is the computer's name or IP address, such ashttp://192.168.1.20:8080. With the one-command setup, it's the address the setup printed. If a phone can't reach the name, use the IP address:- Mac: run
ipconfig getifaddr en0, or look in System Settings → Wi-Fi → Details. - Windows: run
ipconfigin PowerShell and look for IPv4 Address. - Linux: run
hostname -Iand use the first address.
- Mac: run
- Open the admin page in a browser, at the server's address followed by
/admin. Sign in with the user nameadminand your admin password. - Click + Add device. A six-digit code appears, valid for 10 minutes.
- On the device, open DoneFast, go to Settings → Sync, and choose Sync server. Enter the Server URL (the address from step 1, without
/admin), tap Pair with server…, and enter the code. Tap Pair, then Save. - Repeat steps 3 and 4 for each device. The admin page lists paired devices, and Revoke removes one without affecting the others.
The first time, the computer may ask whether Docker can accept incoming connections. Allow it.
Keep your connection private
The server uses plain HTTP, so anyone on the same network could read what travels between your devices and the server. Use it only on a network you trust or over a VPN, and don't expose port 8080 directly to the internet.
To reach the server from outside your network without a VPN, it needs a domain name pointing at your computer, and ports 80 and 443 forwarded to it by your router. Then, with the one-command setup:
donefast-sync setup --force --access https --domain sync.example.com --data-dir ~/DoneFastSync
It adds a Caddy web server in front, which gets and renews an HTTPS certificate by itself. Your devices then use https://sync.example.com as the Server URL.
Everyday commands
With the one-command setup
| Command | What it does |
|---|---|
donefast-sync status | Shows whether it's running and healthy, which version, and where the data is. |
donefast-sync password | Shows the admin password again. |
donefast-sync logs | Shows what it's doing. Press Ctrl+C to stop watching. |
donefast-sync stop | Stops the server. It stays stopped. |
donefast-sync start | Starts it again. |
With Docker Compose
Run these in the server's folder.
| Command | What it does |
|---|---|
docker compose ps | Shows whether it's running and healthy. |
docker compose logs -f | Shows what it's doing. Press Ctrl+C to stop watching. |
docker compose stop | Stops the server. |
docker compose start | Starts it again. |
Back up and restore
The folder you chose holds everything: sync.sqlite and, while the server is running, sync.sqlite-wal and sync.sqlite-shm. Don't copy, move, or delete these files while the server is running.
With the one-command setup
donefast-sync backup
The backup is a .tgz file in ~/.donefast-sync/backups, and the last 7 are kept. The server stops for a moment while it's made. To put one back, run donefast-sync restore <file>.
With Docker Compose
To back up, stop the server, copy the whole data folder somewhere safe, then start the server again:
docker compose stop
docker compose start
To restore, stop the server, replace the files in the data folder with your copies, and start it again.
If you lose the server
Your tasks are also on each of your devices, so you can set up a lost server again and pair the devices again. A backup also keeps the list of paired devices.
Upgrade
Some upgrades ask for something more. Deploying.md in the download says what.
With the one-command setup
Name the new version. It backs up first, and if the new version doesn't start properly, it goes back to the old one and its data by itself.
donefast-sync upgrade --version 1.2.0
With Docker Compose
Take a backup, then run these in the server's folder:
docker compose pull
docker compose up -d
Settings
The one-command setup writes these for you. With Docker Compose, they go in the .env file. Run docker compose up -d after changing them.
| Setting | What it is |
|---|---|
SYNC_ADMIN_PASSWORD | The admin page password. It's required. |
SYNC_DATA_DIR | The folder for the database. On a Mac or Linux, a full path works too. Without this setting, the database goes in a Docker volume. |
SYNC_HOST_PORT | The port devices connect to, if 8080 is taken. Use the same port in the Server URL. |
SYNC_TRUSTED_PROXIES | Only if you put your own reverse proxy in front of the server: its address, so the server sees the real address of each device. The one-command HTTPS setup sets it for you. With Docker Compose, this one doesn't go in .env: add SYNC_TRUSTED_PROXIES: "10.0.0.5", with your proxy's address, under environment: in docker-compose.yml. |
Remove the server
With the one-command setup, this removes the server but keeps your data folder:
donefast-sync uninstall
With Docker Compose, run this in the server's folder. It stops and removes the server but keeps your data:
docker compose down
If you no longer want the data, delete the folder too.
If something doesn't work
| What you see | What to do |
|---|---|
Cannot connect to the Docker daemon or docker: command not found | Docker isn't running or isn't installed. Start Docker Desktop and wait until it's running. |
set SYNC_ADMIN_PASSWORD when starting | The .env file is missing, isn't next to docker-compose.yml, or is named .env.txt. |
The server keeps restarting, and docker compose logs says the password is a placeholder | Choose a real password instead of an example such as changeme, then run docker compose up -d. |
port is already allocated or address already in use | Something else is using port 8080. Use --port 9000 with the one-command setup, or add SYNC_HOST_PORT=9000 to .env with Docker Compose, and use that port in the Server URL. |
| A device says it could not reach the server | Check that the Server URL starts with http:// and includes the port. Try the IP address instead of the computer's name. Check that the computer is awake and on the same network, and that its firewall lets Docker accept connections. |
| Pairing says the code is invalid or expired | Click + Add device again for a fresh code. Each code works once, for 10 minutes, and a new one replaces the old. |
| The admin page keeps asking for the password | Use the user name admin and your admin password. donefast-sync password shows it with the one-command setup. With Docker Compose, it's in your .env file. |
donefast-sync logs or docker compose logs shows what the server did, which helps with anything else.
Licence
DoneFast Sync Server Licence
Copyright (c) 2026 Asprotunity Limited. All rights reserved.
You may use this software free of charge, for personal or business purposes,
make copies of it and share them. You may change its setup files to suit your
own installation. In return:
1. You may not sell it. This means you may not charge for the software, for a
copy of it or for access to it, including as a hosted service, or include it
in something you sell.
2. You must keep this licence and the third-party notices with every copy.
This is not an open source licence, and it gives you no right to the source code.
The software is provided "as is", without warranty of any kind. To the extent
the law allows, Asprotunity Limited is not liable for any loss from using it,
including loss of data. Nothing here limits any liability or consumer right that
the law doesn't allow to be limited.
This licence ends automatically if you break it. It is governed by the laws of
England and Wales.
Third-party components keep their own licences: see THIRD-PARTY-NOTICES.md.
THIRD-PARTY-NOTICES.md is in the download, and in /app in the Docker image. To read it with Docker Compose, run this in the server's folder while the server is running:
docker compose exec sync cat /app/THIRD-PARTY-NOTICES.md