---
title: Sync
description: How tagwerk keeps your notes on several devices - with the built-in WebDAV sync or a folder of your own - and what to do when a sync stops or two devices disagree.
reviewed: 2026-10-29
---

## Two ways to sync {#two-ways}

tagwerk has no server of its own. Your notes reach your other devices in one of two ways:

| | Built-in sync | A folder of your own |
| --- | --- | --- |
| How | The app talks WebDAV to your server: Nextcloud, ownCloud, Synology, any WebDAV address. | The notes lie in a folder that another program carries: Syncthing, the Nextcloud app, a desktop sync client. |
| Where to set it up | *Settings → Sync → Set up sync...* | *Settings → Storage → Choose folder...*, then set up the other program for that folder. |
| Conflicts | Settled by tagwerk's rules, see [Conflicts](#conflicts). | Settled by the other program's rules; tagwerk recognises its conflict copies. |
| Cost | Part of tagwerk Pro. | Free, and always will be. |

> [!PRO]
> The built-in sync is part of tagwerk Pro on Android and Windows - €12 / US$12 once, no
> subscription, see [the licence page](../../license/). On Linux every Pro feature is included, the
> built-in sync too. A folder synced by another program is not a feature of the app and is free on
> every platform.

On Android, *Choose folder...* opens the system folder picker. On Windows and Linux it is an ordinary
folder dialog. The [guide to your own sync](../../guides/sync/) walks through both ways with the
reasoning behind them.

Use one of the two ways per profile. A folder that the Nextcloud client already carries does not
also need the built-in sync to the same server folder.

## What the built-in sync moves {#what-moves}

Four kinds of file, each by a rule of its own:

| File | Where it lies | Rule |
| --- | --- | --- |
| Day notes | `2026/10/2026-10-28.md` | Both ways. Uploads are conditional, so a device cannot overwrite a version it never saw. |
| Day templates | `templates/` | Both ways, like the notes. Removing a template removes it on the other devices too. |
| Tag colours | `settings/tagwerk.colors` | Both ways, like the notes. Clearing every colour removes the file, and that removal travels too. |
| Licence | `settings/tagwerk.license` | Uploaded only when the server has none, downloaded only when this device has none. Never replaced, never deleted. |

What the built-in sync never does:

- **It does not pass on a deleted day.** Removing a note on one device leaves it on the server and
  on every other device, and the next sync brings it back to this one. A tidy-up on one device
  cannot take a year of notes with it. To clear a day everywhere, empty it in the app: an empty day
  is passed on like any other change.
- **It does not take the licence away.** Removing the licence on one device leaves the copy on the
  server and on every other device. Where that device keeps Pro another way - a Google Play
  purchase, or Linux - its next sync brings the file back; elsewhere removing the licence also ends
  the built-in sync on that device. To remove it everywhere, delete it in the folder on the server.
- **It does not touch other files.** Only the files above are read and written. Anything else in
  the folder on the server, or in your notes folder, stays where it is.
- **It does not upload conflict copies.** A conflict copy stays on the device that made it, until
  you decide (see [Conflicts](#conflicts)).
- **It does not upload the untouched welcome note.** A second device would otherwise show the
  tutorial a first device wrote. Once you have edited it, it travels like any note.

When the sync replaces a note on this device with the server's version, the state before is kept
in that day's history first.

## Before you start {#before}

You need:

- the address of your WebDAV server, for example `https://cloud.example.org`. For Nextcloud and
  ownCloud the plain address of the server is enough;
- a username and a password. With two-factor authentication on the account, an app password
  instead of the account password - or, for Nextcloud, the sign-in through the browser;
- Pro on Android and Windows (see above).

Which address a particular server wants, and what it has to support, is in
[Sync servers](../sync-servers/index.md#address).

## Setting it up {#setup}

Open *Settings → Sync* and press *Set up sync...*. The wizard has three steps; the counter in its
title shows where you are. Nothing is saved before the last step: *Cancel* at any point leaves an
existing setup as it was.

### Step 1: server and sign-in {#setup-sign-in}

1. Enter the *Server address*. An address without `https://` gets it added.
2. Enter *Username* and *Password*. Under the password the wizard reminds you: *With two-factor
   authentication, use an app password.*
3. Press *Continue*. The wizard checks the connection up to the WebDAV stage and shows each stage
   as it runs.

> [!WARNING]
> An address that starts with `http://` is accepted, with the warning *Unencrypted: your username
> and password travel in the clear.* tagwerk signs in with every request, so the password crosses
> the network with every sync. Use `http://` only inside a network you trust.

### Step 2: the notes folder {#setup-folder}

The wizard lists the folders on the server, starting at your account's top folder.

- Tap a folder to open it, *Up* to go back one level.
- To make a new folder, type its name into *New folder* and press *Create folder* beside it.
- *Use this folder* takes the folder you are in. Your notes go below it, filed by year and month.

A folder somebody shared with you appears only once your account has accepted the share, and then
inside the folder that account files received shares into - not at the top.

### Step 3: the full check {#setup-check}

The wizard runs all six stages again, now with a write test in the chosen folder. When every stage
is green, press *Finish*. The password goes into the device's credential store, never into a file,
and the first sync starts at once.

If the first sync finds days that exist both on this device and on the server with different text,
it overwrites neither: each becomes a conflict for you to settle (see [Conflicts](#conflicts)).

## Signing in to Nextcloud {#nextcloud}

For Nextcloud the wizard offers a second way in step 1: *Sign in through the browser (Nextcloud)*.

1. Enter the *Server address*.
2. Press *Sign in through the browser (Nextcloud)*. Your browser opens your server's sign-in page,
   where your password manager and your second factor work as usual.
3. Confirm there. The wizard waits with *Confirm the sign-in in your browser.* If you closed the
   page by mistake, *Open the sign-in page again* brings it back.

Your server then hands tagwerk an app password of its own. The app never sees your account
password. The connection appears in your Nextcloud's security settings, where you can revoke it.

If the server does not offer this, the wizard says *This server does not offer browser sign-in -
use your username and password above.*

Without the browser sign-in - ownCloud, or an account with two-factor authentication - create an
app password in the server's web interface (Nextcloud and ownCloud: *Settings → Security → Devices &
sessions*) and enter it as the password.

## When it runs {#when}

| Occasion | What happens |
| --- | --- |
| You change a note | A sync starts about ten seconds after the last change, so a burst of typing is one upload. |
| The app starts | One sync. |
| You come back to the app and a note changed in another app meanwhile | The same as a change of your own: a sync about ten seconds later. |
| You switch profiles | A sync for the new profile starts at once; one still running for the old profile is stopped. |
| You press the cloud in the toolbar, or *Sync now* in the settings | A sync starts at once. |
| *Check for changes* | While the app is open, it asks the server on a clock: *Off*, 5, 15, 30 or 60 minutes. 15 minutes by default. |
| *Sync in the background* (Android) | With the app closed: *Off*, 15 or 30 minutes, 1, 3 or 6 hours. 1 hour by default. |
| The app closes or goes to the background | Changes still waiting are sent, for up to eight seconds. |
| You change a task on an Android widget with the app closed | A sync about a minute later, when Android allows it - also with *Sync in the background* off. |

*Check for changes* is set per profile in *Settings → Sync*, and appears once sync is set up. A
check that finds nothing leaves the cloud in the toolbar alone.

*Sync in the background* exists only on Android, under *Settings → Home screen & system*. It is set
once per device and syncs the profile that is open when it runs. Android picks the exact moment and
may postpone it to save battery. Whatever comes down goes onto the widgets straight away. On Windows
and Linux nothing syncs while the app is closed.

A failure that may pass on its own - no network, a server that does not answer, a timeout, a server
error - is retried after 20 seconds, 90 seconds and 5 minutes before it is reported. A rejected
password or a missing folder is reported at once, because trying again does not change it.

## The sync button {#button}

Once sync is set up, a cloud stands in the toolbar of the day view. It also stands there without
sync while conflict copies are waiting.

| The cloud shows | Tooltip | A tap |
| --- | --- | --- |
| A tick | *Synced* | Syncs now. |
| An arrow up | *Changes pending - will sync shortly* | Syncs now. |
| Turning arrows and a coloured dot | *Connecting to the server...*, *Looking for changes...* | Asks for one more sync after this one. |
| A spinner | *Transferring notes...* | Asks for one more sync after this one. |
| A warning sign | *Sync error:* and the cause | Opens the error, with *Sync settings* and *Try again*. |
| A warning sign and a dot at the top | *Conflicts waiting:* and the number | Opens the days that exist twice. |
| A struck-through cloud | *Sync error:* *This device has no network connection.* | Opens the error. |
| A struck-through cloud | *Sync paused - part of tagwerk Pro* | Opens the Pro card. Without the licence nothing is synced; the changes stay on this device. |

A sync started by *Check for changes* does not animate the button. Only what it finds shows: changes
waiting, a conflict, an error.

After *Sync now* in the settings, a line under the buttons says what moved: `↑ 2 · ↓ 1`, with
the number of conflicts where there were any.

## The connection test {#connection-test}

*Test connection* in *Settings → Sync* runs the same check as the wizard: six stages in order. It
stops at the first one that fails and names the cause instead of "sync failed".

| Stage | What it checks |
| --- | --- |
| *Network available* | The device has a network connection. |
| *Server name resolves* | The address is valid and its name can be looked up. |
| *Connection and encryption* | The server answers on its port, and its certificate is valid for that name. |
| *Sign-in accepted* | The server takes the username and password, and tagwerk finds its WebDAV address. |
| *WebDAV and notes folder* | The address speaks WebDAV, and the notes folder exists or can be created. |
| *Write test* | A test file can be written into the notes folder and removed again. |

Every failure comes with a sentence on what to do. The causes for each stage, and how a server
admin fixes them, are in [Sync servers](../sync-servers/index.md#troubleshooting).

## Conflicts {#conflicts}

Every upload carries the version the device started from, so the server refuses a write that would
land on top of something newer. When both sides really did change the same day, nothing is thrown
away: this device's version keeps the file, and the other version is written beside it.

```
2026/10/2026-10-28.md
2026/10/2026-10-28.sync-conflict-tagwerk.md
```

A second conflict on the same day gets `-2`, then `-3`. The same happens without any sync: if
another editor or a sync client writes the day tagwerk has open, that version is kept beside it.

A day that lies in the folder twice - `2026-10-28.md` loose in the notes folder and
`2026/10/2026-10-28.md` - is read from the one under its year. If the loose one says something
else, it is offered the same way, as the other version of that day.

A day is not a conflict when this device's version of it is empty, or when the server holds an
earlier state of this device's own text. Then the newer side is simply taken.

### Where conflicts show {#conflicts-show}

- the cloud in the toolbar: *Conflicts waiting:* and the number;
- above the note of an affected day: *This day exists twice.* with *Compare the versions*;
- *Settings → Storage*: *One day exists twice - changed here and somewhere else.* with *Review*.

### Settling a conflict {#conflicts-settle}

The sheet *Days that exist twice* lists every copy. Choose one, and both versions stand as one list:
lines both versions have are already in, and every line only one of them has carries a tick box.

| Choice | Result |
| --- | --- |
| Tick lines, then *Apply selection* | The day holds the shared lines and the ticked ones. *Everything*, *All of the current version* and *All of the copy* set the ticks in one go. |
| *Keep both* | The copy is appended below the current version, after the line `--- The other version ---`. Not offered for templates. |
| *Keep the current version* | The file stays as it is; the copy is deleted. |
| *Take the copy* | The copy replaces the current version. |

The current version is what the day's file holds now, and the copy shows the date it was made.
When the copy is made, the current version is this device's. If a later sync brings a newer version
of the day down, the current version is the server's, and the sheet says so; what this device had
before is in the day's history. A copy whose every line the downloaded day already holds is removed
by the sync, because there is nothing left to decide.

When this device has nothing for that day, *Keep the current version* is called *Discard the
copy*, because that is what it does. Before a choice writes over the current version, the day's
history keeps it. A conflict copy of a template is written back into the template, never into a day.

## Errors during a sync {#errors}

Most errors stop the connection test at a stage (see above). A few are only found by a sync that
has been running for a while:

| Message | What it means | What to do |
| --- | --- | --- |
| *Reading works, but writing is not allowed.* | The folder is read-only for this account, typical for a share without edit permission. Downloads still arrive. | Ask for write access or choose another folder. Your notes stay on the device and go up once writing works. |
| *The storage on the server is full.* | The server refused the upload for lack of space. | Free up space or ask the admin to raise the quota. |
| *The sign-in works, but the server keeps it away from the files.* | The account sees no folder at all and may create none, while the web interface shows folders. | Set the password anew and sign in again; check whether the app password may access the files. |
| *A note on this device could not be read.* | Another program holds the file open. | Nothing; the note follows on the next run. |
| *The notes folder on this device cannot be reached.* | The drive is not connected, the folder is gone, or the app may no longer open it. Nothing was synced. | Connect the drive or choose the folder again. |
| *The app password could not be saved.* | The device's credential store refused the password. | Unlock the keychain and finish the wizard again. In the Linux snap, run `sudo snap connect tagwerk:password-manager-service` once. |
| *The server sent the request somewhere else, and that address refused it.* | The address forwards to another one, usually `http://` to `https://`, and the sign-in is dropped on the way. | Enter the address the message shows. |

## Server speed {#server-speed}

*Settings → Help → Server speed* shows how long your server takes, measured on every request the
sync makes. It helps when a sync feels slow and you want to know why.

- *Server* - *Address*, *Account*, *Requests measured* and *Since*. With more than one server
  measured, buttons switch between them.
- *By operation* - one row each for *Connect*, *List folder*, *Download*, *Upload*, *Create
  folder* and *Delete*, with *Count*, *First*, *Then*, *95th percentile*, *Slowest* and *Failed*.
  *First* is the first request of its kind in a sync; a large gap to *Then* points at a server that
  is slow to start rather than slow in general.
- A chart of the last requests on a logarithmic scale, one bar per request, failed ones in a
  colour of their own.
- *For your hosting provider* - the same numbers as plain English text. *Copy* puts them on the
  clipboard for a support request; *Clear measurements* starts over.

The measurements stay on this device. Nothing is sent anywhere.

## Profiles {#profiles}

Each profile has a sync of its own: server, account, folder, password and *Check for changes*. The
work profile's Nextcloud and the private profile's server never see each other's notes or
credentials. *Settings → Sync* always belongs to the profile that is open; with more than one
profile, the heading above it names that profile.

Only *Sync in the background* on Android is set once per device; it syncs whichever profile is open
when it runs.

## Without the built-in sync {#own-folder}

Put your notes in a folder of your own (*Settings → Storage → Choose folder...*) and let another
program carry that folder. For the notes this works as well as the built-in sync. Two differences:

- **Conflicts follow the other program's rules.** tagwerk recognises the conflict copies of
  Syncthing, Nextcloud and Dropbox and lists them under *Days that exist twice*, like its own.
- **The licence travels with the folder.** `settings/tagwerk.license` lies in the notes folder, so
  every device on that folder has Pro from one purchase.

A device that does not have Pro yet cannot use the built-in sync to fetch its licence. It gets the
licence through a folder synced by another program, through *Import licence* in the *tagwerk Pro*
settings, or from the purchase mail.

What a server needs for either way, and how to check it, is in
[Sync servers](../sync-servers/index.md#own-folder).
