Back to DoneFast

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.

  1. 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.
  2. Download donefast-sync-1.0.2.zip and unzip it. Open a terminal in the folder it makes.
  3. Set it up, choosing the folder for the database:
    ./install.sh --data-dir ~/DoneFastSync

    The 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:

AddTo
--port 9000Use another port than 8080.
--access localLet only this computer reach it (no other devices).
--access https --domain sync.example.comReach 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.

  1. 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.
  2. Make a folder for the server, such as DoneFastSync. In it, create a file called docker-compose.yml with 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:
  3. Create a file called .env next 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=./data

    The 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 data folder next to docker-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.

  4. 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
  5. 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.

  1. Find the server's address. It's http://<computer>:8080, where <computer> is the computer's name or IP address, such as http://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 ipconfig in PowerShell and look for IPv4 Address.
    • Linux: run hostname -I and use the first address.
  2. Open the admin page in a browser, at the server's address followed by /admin. Sign in with the user name admin and your admin password.
  3. Click + Add device. A six-digit code appears, valid for 10 minutes.
  4. 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.
  5. 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

CommandWhat it does
donefast-sync statusShows whether it's running and healthy, which version, and where the data is.
donefast-sync passwordShows the admin password again.
donefast-sync logsShows what it's doing. Press Ctrl+C to stop watching.
donefast-sync stopStops the server. It stays stopped.
donefast-sync startStarts it again.

With Docker Compose

Run these in the server's folder.

CommandWhat it does
docker compose psShows whether it's running and healthy.
docker compose logs -fShows what it's doing. Press Ctrl+C to stop watching.
docker compose stopStops the server.
docker compose startStarts 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.

SettingWhat it is
SYNC_ADMIN_PASSWORDThe admin page password. It's required.
SYNC_DATA_DIRThe 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_PORTThe port devices connect to, if 8080 is taken. Use the same port in the Server URL.
SYNC_TRUSTED_PROXIESOnly 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 seeWhat to do
Cannot connect to the Docker daemon or docker: command not foundDocker isn't running or isn't installed. Start Docker Desktop and wait until it's running.
set SYNC_ADMIN_PASSWORD when startingThe .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 placeholderChoose a real password instead of an example such as changeme, then run docker compose up -d.
port is already allocated or address already in useSomething 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 serverCheck 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 expiredClick + 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 passwordUse 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