Quoting from Speed of synching with various targets? - #3 by horvat
Sync speed is affected not only by target, but by client as well. I’m syncing to selfhosted WebDAV without encryption. On desktop, sync speed is reasonable, comparable with syncing to local directory. Sync to android is considerably slower, with only a few items per second synced.
I asked ChatGPT the likely cause of slower sync on Android, after giving it context of what I know from reverse engineering the Joplin code. These answers seem the most likely causes (aside from varying sync speeds dependent on the sync target / server used). The first is a SQLite for Android limitation and the second is a React Native limitation, so neither are solvable without completely re-writing the app
Most Likely Causes (with filesystem/server/backgrounding eliminated)
1. SQLite Write Performance on Android
While filesystem APIs are bypassed in the sync process, the SQLite layer itself on Android is inherently slower than on desktop:
-
Joplin writes downloaded items (notes, resources, metadata) into its local SQLite database.
-
On Android, the SQLite engine is often slower due to:
-
WAL (write-ahead logging) may be disabled or less optimized on mobile.
-
Storage performance (even on fast phones) is limited by I/O contention and limited fsync throughput.
-
Joplin does not batch writes very deeply — this becomes a bottleneck when syncing thousands of small items.
-
On Android, SQLite performance is often 2–5× slower than desktop for bulk inserts due to this overhead.
There are GitHub issues in various SQLite-based apps citing this. Joplin also acknowledges SQLite overhead as a factor in sync time, especially on Android.
2. Joplin Android App’s JS Runtime (React Native) Performance
The Android app is built on React Native, and the sync logic is implemented in JavaScript using Node-style async IO.
-
On desktop, the app uses Node.js (V8 engine), which is much faster than Hermes or JSC (React Native's JS engines).
-
Sync involves:
-
Reading sync metadata
-
Parsing JSON
-
Creating/updating database rows
-
Handling encryption/decryption
-
-
Each of these steps runs slower in JS on mobile than on desktop, especially under large item counts or long sync runs.
So the performance gap is not due to the WebDAV API or the server, but in the JS environment that processes the data on Android.