Linux Desktop Client won't sync with Dropbox

Operating system

Linux

Joplin version

3.7.21

Desktop version info

Linux Mint 22.3, Cinnamon 64 bit v 6.6.9

Sync target

Dropbox

Editor

Markdown Editor

What issue do you have?

About a month ago, my Linux desktop clinet stopped syncing with Dropbox on 2 different profiles. Both profiles still sync on Android, and a shared profile syncs fine across my wife's Android and Macbook. I've since updated to version 3.7.21, tried to re-sync with the Dropbox API, uninstalled and reinstalled, tested the network and the Dropbox API is reachable. Looks like an ETIMEDOUT error is the reason? Out of ideas here how to resolve this. Log files attached.

Thanks in advance for any help.

Hi,

I don't see any log files attached that I can look at. Can you try posting the log file again and possibly even just a screenshot with a bunch of lines above and below the ETIMEDOUT error? You should be able to drag and drop a screenshot and/or log right into the box.

Particularly useful details are anything mentioning:

  • ETIMEDOUT
  • dropboxapi.com or dropbox.com
  • an IP address and :443
  • resource, upload, or download
  • a .md filename or resource ID
  • FetchError, Network request failed, or request

This particular error means that Dropbox sent an API request to Dropbox and never heard back in the allotted time frame.

Thanks.

Weird - logs showed they were attached when I posted. Thanks for flagging that.

Anyway, error is pasted below. It's scattered about in every sync, so a screenshot won't capture it in one shot.

2026-09-28 10:59:48: Preparing scheduled sync
2026-09-28 10:59:48: Starting scheduled sync
2026-09-28 10:59:48: Synchronizer: Sync: starting: Starting synchronisation to target 7... supportsAccurateTimestamp = false; supportsMultiPut = false} [1790585988084]
2026-09-28 10:59:48: Synchronizer: Indexing resources...
2026-09-28 10:59:48: ResourceService::indexNoteResources: Start
2026-09-28 10:59:48: Performance: ResourceService/indexNoteResources: Start at 201.68s
2026-09-28 10:59:48: Performance: ResourceService/indexNoteResources: End at 201.78s (took 106.4ms)
2026-09-28 10:59:48: ResourceService::indexNoteResources: Completed
2026-09-28 10:59:48: Performance: ShareService/maintenance: Start at 201.78s
2026-09-28 10:59:48: Performance: ShareService/maintenance: End at 201.78s (took 0.2ms)
2026-09-28 10:59:48: RepositoryApi: findWorkingMirror: Using: https://ghproxy.com/https://raw.githubusercontent.com/joplin/plugins/master
2026-09-28 10:59:50: PluginState: [error] Error: Could not parse JSON: Unexpected token '<', "<!DOCTYPE "... is not valid JSON
Error: Could not parse JSON: Unexpected token '<', "<!DOCTYPE "... is not valid JSON
    at RepositoryApi.loadManifests (file:///tmp/.mount_JoplinMHCifG/resources/lib/services/plugins/RepositoryApi.ts:131:10)
    at processTicksAndRejections (node:internal/process/task_queues:104:5)
    at RepositoryApi.initialize (file:///tmp/.mount_JoplinMHCifG/resources/lib/services/plugins/RepositoryApi.ts:104:3)
    at fetchManifests (file:///tmp/.mount_JoplinMHCifG/resources/app.asar/gui/ConfigScreen/controls/plugins/PluginsStates.tsx:120:5)
2026-09-28 10:59:58: Performance: SearchEngine/syncTables: Start at 211.79s
2026-09-28 10:59:58: SearchEngine: Updating FTS table...
2026-09-28 10:59:58: Updating items_normalized from {"updated_time":0,"id":""}
2026-09-28 10:59:58: SearchEngine: Updated FTS table in 2ms. Inserted: 0. Deleted: 0
2026-09-28 10:59:58: Performance: SearchEngine/syncTables: End at 211.89s (took 102.6ms)
2026-09-28 11:00:10: Synchronizer: [error] FetchError: request to https://content.dropboxapi.com/2/files/download failed, reason: 
Code: ETIMEDOUT
FetchError: request to https://content.dropboxapi.com/2/files/download failed, reason: 
    at ClientRequest.<anonymous> (/tmp/.mount_JoplinMHCifG/resources/app.asar/node_modules/node-fetch/lib/index.js:1491:11)
    at ClientRequest.emit (node:events:509:28)
    at emitErrorEvent (node:_http_client:109:11)
    at TLSSocket.socketErrorListener (node:_http_client:593:5)
    at TLSSocket.emit (node:events:509:28)
    at emitErrorNT (node:internal/streams/destroy:170:8)
    at emitErrorCloseNT (node:internal/streams/destroy:129:3)
    at processTicksAndRejections (node:internal/process/task_queues:90:21)
2026-09-28 11:00:10: Synchronizer: Sync: finished: Synchronisation finished [1790585988084]

TRY THIS FIRST:

On the problem computer, go to this web address and see if there's a response. I get a 404 error which means that Dropbox responded to my query. We want to know if Dropbox is responding to queries.

You don't need to get a useful webpage β€” it's an API endpoint. We're mainly interested in whether the browser connects immediately or sits there for 20–30 seconds before reporting a connection failure.

https://content.dropboxapi.com/

There is another thing that we can try if you're up for it? If you create a new profile in Joplin you can select a different subdirectory so you don't interfere or cause any problems with your existing data. Using the Dropbox synchronization module in Joplin that you are using now you have no choice regarding what directory the data synchronizes to. That's why we will be using file system synchronization instead. All you need to do is make a duplicate of the data in your existing directory which should be /Apps/Joplin.

Install an app called Rclone. There is a Linux installation script on their download page. Do not install from a repository it will be outdated. It can mount your Dropbox account so you can do a file system style access and synchronization to the new profile directory. We want to know if the problem is a network connectivity problem or is it a software issue. This option takes the Joplin to DropBox connection out of the equation. If you can synchronize properly using Rclone .

I can help you configuring rclone to talk to Dropbox. I am a support person for them as well.

Essentially, what you'll be doing is using Rclone to talk to DropBox rather than using Joplin to talk to Dropbox. The data should be identical.


This log narrows it down considerably. The actual Joplin/Dropbox sync failure is a network timeout while Joplin is trying to download something from Dropbox.

The important part is:

request to https://content.dropboxapi.com/2/files/download failed

Code: ETIMEDOUT
request to https://content.dropboxapi.com/2/files/download failed

Code: ETIMEDOUT

Joplin starts synchronization at 10:59:48 and the request fails at 11:00:10, about 22 seconds later. So this isn't an authentication error, Dropbox permission error, or obvious Joplin database error. Joplin made a Dropbox download request and the network connection timed out.

There's also a second, probably unrelated problem earlier:

RepositoryApi: findWorkingMirror: Using:
https://ghproxy.com/https://raw.githubusercontent.com/joplin/plugins/master

PluginState: [error] Error: Could not parse JSON:
Unexpected token '<', "<!DOCTYPE "... is not valid JSON
RepositoryApi: findWorkingMirror: Using:
https://ghproxy.com/https://raw.githubusercontent.com/joplin/plugins/master

PluginState: [error] Error: Could not parse JSON:
Unexpected token '<', "<!DOCTYPE "... is not valid JSON

That's Joplin trying to retrieve its plugin repository information through ghproxy.com. It expected JSON but received an HTML webpage instead. That isn't what caused the Dropbox synchronization to fail.

What is interesting is that two separate Internet operations are failing or behaving incorrectly during the same session:

  • Joplin β†’ plugin repository: receives unexpected HTML.
  • Joplin β†’ Dropbox content server: connection times out.

That makes me more suspicious of something affecting this computer's/network's Internet traffic than of Dropbox itself. Possibilities include VPN software, DNS filtering, proxy settings, antivirus HTTPS scanning, firewall/security software, Pi-hole/AdGuard-type filtering, or simply a network connectivity problem.

One other thing I'd like to see is a little more of the Joplin log before this section, particularly the synchronization activity preceding the Dropbox download request. That may reveal the resource ID or filename Joplin was attempting to download. If the timeout happens every single time on the same resource, then we should investigate that particular attachment rather than the network generally.

Here is a link I just created with rclone instructions.

@LeoW Thanks for your time and effort looking into this.

I tried again to upload the full logs (I turned on verbose recently) spanning back to last year below. Hopefully this time it attaches.

log.txt (4.4 MB)

For the dropbox api link you asked about - I also get a 404.

So, there is a VPN client running on this machine (Proton) but even when I kill the process, there's no sync on Joplin. There's also a Wireguard VPN running at the router level, but it's been running for months without an issue. I've actually changed network equipment since this issue started, and same effect. However, on Android and MacOS everything is syncing just fine. There's no DNS filtering that I'm aware of other than Proton using their DNS while the VPN is on. But, obviously I can see the same 404 and can contact Dropbox URLs on the problem machine via CLI.

As far as I know, I'm running stock Joplin and got this both from the app image and CLI install versions, so I haven't changed anything about target URLs or anything.

I'm unclear what you're asking me to do with rclone. Just test that this works? Or as you proposing this as a workaround?

Rclone for now would not be a workaround unless there is no alternative.

Joplin is having problems communicating with Dropbox. Rclone will take the place of Joplin's services that communicate with Dropbox and do it itself. In my instructions and the link I provided, which is a Joplin page, by the way, shows you how to set up the software to be a WebDAV server.Then you would select WebDAV as your provider in Joplin.

I will take a look at this log file and let you know what I find.

I went through the end of the full log. It changes my diagnosis somewhat: this looks much more like a networking/DNS/connectivity problem on that Linux machine than a bad Joplin attachment.

The strongest evidence is that several unrelated Internet destinations are failing at essentially the same time:

  • Dropbox downloads repeatedly fail with ETIMEDOUT.
  • Joplin also cannot connect to raw.githubusercontent.com.
  • Its alternate plugin server cdn.staticaly.com fails with getaddrinfo ENOTFOUND, which is specifically a hostname/DNS-resolution failure.
  • Joplin then falls back to ghproxy.com, which responds, but sends HTML instead of the JSON Joplin expects.

Also, these Dropbox failures happen immediately after synchronization starts, and the log reports 312 notes but 0 resources. That makes the earlier theory about a particular large attachment much less likely.

Earlier in the history, Dropbox synchronization was working normally. For example, Joplin successfully fetched remote items and completed synchronization without errors. log

What I'd test next

On the affected Linux computer, open a terminal and run:

ping -c 4 dropbox.com

ping -c 4 content.dropboxapi.com

ping -c 4 raw.githubusercontent.com

Then:

curl -I https://www.dropbox.com
curl -I https://content.dropboxapi.com
curl -I https://raw.githubusercontent.com

And, importantly, check DNS:

getent hosts content.dropboxapi.com
getent hosts raw.githubusercontent.com

If available:

resolvectl status

Send me the output from those commands. I would not reinstall Joplin, reset Dropbox synchronization, or delete anything at this point. The log contains enough evidence that I'd investigate the Linux machine's networking/DNS first.

Sure thing - here you go. Hopefully there's something in here that's useful.

DB_J_DNS.txt (7.1 KB)

These results are very useful. DNS and ordinary HTTPS connectivity are working. I would no longer consider a general DNS failure the leading explanation.

All three hosts resolve and respond. Dropbox has 0% packet loss, content.dropboxapi.com responds, and GitHub responds normally. DB_J_DNS DB_J_DNS DB_J_DNS

Even more importantly, the HTTPS tests work:

  • www.dropbox.com β†’ HTTP 200 DB_J_DNS
  • content.dropboxapi.com β†’ HTTP 404, which is expected when requesting its root without a Dropbox API operation. DB_J_DNS
  • raw.githubusercontent.com β†’ HTTP 301, also a valid response. DB_J_DNS

One thing now stands out: IPv6

Notice something interesting in the DNS tests:

getent hosts content.dropboxapi.com
2620:100:601b:14::a27d:80e ...

getent hosts raw.githubusercontent.com
2606:50c0:8001::154 ...

getent is returning IPv6 addresses. DB_J_DNS

But the successful ping content.dropboxapi.com used:

162.125.8.14

which is IPv4. DB_J_DNS

That makes broken or unreliable IPv6 worth testing. Electron/Node (which Joplin uses) and curl don't necessarily choose IPv4/IPv6 in exactly the same way.

Run these four commands and post results:

curl -4 -I https://content.dropboxapi.com
curl -6 -I https://content.dropboxapi.com

curl -4 -I https://raw.githubusercontent.com
curl -6 -I https://raw.githubusercontent.com

The -4 forces IPv4 and -6 forces IPv6.

There's another clue

The latency is unusually high: about 295–297 ms to Dropbox and 277 ms to GitHub. DB_J_DNS DB_J_DNS

That's not necessarily a problem by itself, but it's high enough that I'd also like to know whether this machine is going through a VPN, proxy, Tor, unusual DNS/network service, or satellite/cellular connection.

For now, though, don't change anything. Run those four IPv4/IPv6 tests first. If curl -4 works immediately while curl -6 hangs or fails, I think we'll have found a very strong explanation for Joplin's ETIMEDOUT.

Yep, looks like that is the problem.

Easily tested. My VPN client allows IPV6 when connected to some servers.

$ curl -6 -I https://content.dropboxapi.com
curl: (7) Failed to connect to content.dropboxapi.com port 443 after 288 ms: Couldn't connect to server


$ curl -6 -I https://content.dropboxapi.com
HTTP/2 404 
content-length: 1233
content-type: text/html
date: Tue, 29 Sep 2026 12:44:33 GMT
server: envoy
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-robots-tag: noindex, nofollow, noimageindex
vary: Accept-Encoding
x-dropbox-response-origin: remote
x-dropbox-request-id: 8152cd1fc0d64a6d8ce093b66abbb2b1

When I try and sync with the IPV6 allowed connection running, sure enough, it syncs.

It looks an issue with my VPN provider - but is there any way to just force an IPV4 connection? My phone syncs on the same network, so it does seem possible, right? I don't see anything in the settings.

I haven't tested this option ever but you can give it a try.

Since Joplin Desktop is an Electron/Node application, there is a good way to make Joplin prefer IPv4 without disabling IPv6 for the entire Linux computer.

Joplin itself doesn't appear to expose an β€œIPv4 only” Dropbox setting; its Dropbox configuration is essentially choosing Dropbox as the sync target and authorizing it. But Node supports --dns-result-order=ipv4first, specifically for preferring IPv4 when both IPv4 and IPv6 addresses are returned.

Since your log showed Joplin running as an AppImage, I'd test it first from a terminal:

NODE_OPTIONS=--dns-result-order=ipv4first /path/to/Joplin.AppImage

Then click Synchronise in Joplin.

If that fixes Dropbox sync

We can make it permanent just for Joplin by modifying its .desktop launcher. For example, its Exec= line can be changed from something resembling:

Exec=/home/gunner/Applications/Joplin.AppImage

to:

Exec=env NODE_OPTIONS=--dns-result-order=ipv4first /home/gunner/Applications/Joplin.AppImage

That way:

Joplin β†’ prefers IPv4

while:

Firefox, Chrome, Dropbox, Linux, everything else β†’ continues using IPv4/IPv6 normally.

This is preferable to disabling IPv6 system-wide if IPv6 is otherwise working.

One caveat: ipv4first means prefer IPv4, rather than literally making every networking operation IPv4-only. But given the behavior we've diagnosed, that's exactly what I'd try first.

There is a way to make Joplin desktop prefer ip4 over ip6.

This is the first time I've run across this issue that you're having.

I'm not one of the developers so I have no idea who might be listening in on this conversation that can perhaps put the ip4 preference in the GUI.

@LeoW I guess it's a TIL about Joplin and IPV6.

The easiest workaround here is for me to change my home's VPN server to one that allows IPV6 addresses. Proton prefers IPV4 for security reasons, but for this network, it's perfectly fine as it's mostly just for the geolocation. I typically keep the home network on a range of the same geographic location, and so I must have hit a batch of servers that weren't IPV6 ready. It likely means other things are affected as well, and I'm just not noticing it.

I've changed the server and I'm going to go ahead and call this resolved. Thanks again for all your help. I never would have expected that to be the issue, but life is funny like that. Enjoy the rest of your week.

Thank you and have a great rest of your week yourself.

@laurent

Can you please read through this thread and answer this gentleman's question regarding whether or not there is an option to tell Joplin to prefer IP4 over IP6?

We discovered through testing that the problem he's having connecting is that Joplin is trying to use IP6.

Thanks .