Releases: d0nizam/kosyncthing_plus.koplugin
Release list
KOSyncthing+ v1.1.9
[v1.1.9] — 2026-06-21
Fixed
- A successful pairing no longer shows a warning icon. After accepting a
pairing request in the wizard, the "Paired with … successfully" message was
displayed with a ⚠ warning icon instead of the neutral info icon, making a
success look like something had gone wrong. The icon now matches the outcome.
(The failure message is unchanged - it still shows the warning icon.)
Added
- Windows test setup. A one-command
spec/setup_windows.ps1(installs
MinGW-w64, LuaRocks andluafilesystem, then runs the suite) plus Windows
path/command shims inspec/run_tests.lua, so the full 506-test suite runs
on Windows as well as Linux/WSL. Dev tooling only - not part of the shipped
plugin.
Changed
- The LICENSE is now bundled with the installed plugin. It was previously
excluded from the install package; it now ships alongside the runtime files. - Dropped the deprecated
namefield from_meta.lua. KOReader derives the
plugin name from its directory and logs a deprecation warning for aname
key in_meta.lua; removing it silences that warning with no change to the
plugin's identity.
KOSyncthing+ v1.1.8
[v1.1.8] — 2026-06-15
Fixed
- "No devices online" while devices were actually connected. The
device-online count shown in the header and in Status & conflicts treated
Syncthing'sisLocalconnection flag as "this entry is the local device" and
excluded it. ButisLocalactually marks a connection made over the local
network (LAN) — so every peer on the same Wi-Fi was excluded, and the count
read "no devices online" even though the device list showed them all
connected. (A peer reached over the internet/relay reportsisLocal=false, so
it was counted — meaning the same device dropped in and out of the count as
it moved between a LAN and a global connection.) The local device is now
identified by its device ID only, so LAN and global peers are both counted. - The error header now takes you straight to the problem. Tapping the
"⚠ Error in N folders" header used to open Status & conflicts rendered as a
bare list without the normal nested navigation. It now opens the erroring
folder's dialog directly — or, when several folders have errors, a short list
of just those folders — mirroring how tapping a conflict opens its resolver.
Added
- "Explain the error" button on folder errors. When a folder has a
non-transient error, its dialog now offers a plain-language explanation of
what happened, why, and what to do, tailored to the kind of error: a remote
deletion blocked by ignored files, out of disk space, no write permission, a
missing path or.stfoldermarker, or a generic fallback. The original
Syncthing message is included. For the ignored-files case it points to
deleting the folder from a file manager (warning that the files inside go
too) and clarifies that Remove folder only stops tracking without deleting.
Changed
- Android: the plugin-update item is now labelled "Check for updates" rather
than "Check for plugin updates". Remote mode has no plugin-managed Syncthing
binary, so there is nothing to disambiguate from. Kindle/Kobo keep "Check for
plugin updates" (it sits next to the binary updater). - The device-connection count refreshes immediately after a sync, so a peer
that connected or dropped during the sync is reflected without waiting for the
short connection cache to expire.
KOSyncthing+ v1.1.7
[v1.1.7] — 2026-06-15
Fixed
- The plugin updater now works on Android. v1.1.6 added a Check for plugin
updates item to the Android remote-mode menu, but the updater wrote its
downloaded release metadata to a hardcoded/tmp/…path, which does not exist
on Android — so every check failed immediately with "No such file or
directory" and reported "Could not check for updates". That temporary file now
lives in the plugin folder (where the downloaded update archive already goes),
so the check works on Android the same as on Kindle/Kobo. (Android has no
curl/wgeteither, so the updater always uses KOReader's built-in network
stack there — which now has a writable place for its temporary file.)
KOSyncthing+ v1.1.6
[v1.1.6] — 2026-06-14
Added
- Update the plugin itself from GitHub. Maintenance → Check for updates is
now a submenu with Update Syncthing binary (the existing binary updater) and
a new Check for plugin updates. The latter checks the plugin's GitHub
releases, shows the release notes, downloads the new version and unpacks it in
place, then offers to restart KOReader. Your settings, paired devices and the
downloaded Syncthing binary are preserved. It prefers the release's install-zip
asset and falls back to the source archive when none is attached. - Android remote mode can update the plugin too. The dedicated Android menu
now includes Check for plugin updates. Remote mode has no plugin-managed
Syncthing binary, so there is no "Update Syncthing binary" item there — only
the plugin updater, with help text that reflects the remote-mode setup.
Fixed
- The conflict menu no longer crashes on open. Tapping Status & conflicts
with one or more conflicts present could crash with anipairs(nil)error in
KOReader'stouchmenu.lua. The conflict screens are flat item lists, so they
now use KOReader'sMenuwidget instead ofTouchMenu(which expects tabbed
tab_item_tableinput). ~-separated conflict files are now detected. Syncthing writes a conflict
copy as eithername.sync-conflict-….extorname~sync-conflict-….ext; both
scanners previously matched only the.form, so~conflicts were never
surfaced (nor de-mangled on resolve). Both separators are handled everywhere now.- Auto-merge no longer runs while a book is open. Reading-progress auto-merge
(after Quick Sync, or the manual Auto-merge progress action) replaces a
KOReader metadata sidecar on disk when the remote copy has higher progress. - The "devices online" count no longer includes this device. Syncthing's
/system/connectionslists the local device itself (markedisLocal, keyed
by the local device ID), so the status header and the Status submenu reported
one device too many — e.g. "1/2 devices online" with a single online peer. - Updates no longer crash on the LuaSocket fallback. When neither curl nor
wget could complete a GitHub request — e.g. an e-reader whose BusyBox wget
cannot negotiate theapi.github.comTLS — the download fell through to
KOReader's built-in LuaSocket transport, which crashed with "attempt to use a
closed file".
Changed
- IgnoreRegistry: a companion may register a LIST of patterns (not just a
single one), and the call REPLACES that plugin's set. A conflict copy is now
matched by de-mangling it to its original name and testing the registered
globs, so a companion registers plain names/globs (state.lua,*.sdr)
without encoding Syncthing's.sync-conflict-…form. Both conflict scanners
share this one matcher, which excludes only genuine conflict copies (a file
that merely contains the text, with no./~separator, is left alone).
The companion API version is now1.1.0. - Enabling auto-merge now requires an explicit double confirmation (on every
device, including Android), mirroring the factory-reset flow. The first dialog
spells out that the winner is chosen by reading position only — so a copy that
is further ahead can overwrite annotations held by a copy that is not the
furthest-read — with a concrete two-device example; a second dialog is the
final confirm. Disabling stays a single tap. - More robust kernel detection for Legacy mode.
kernelState()still tries
uname -rfirst, then falls back to the kernel's own procfs files
(/proc/sys/kernel/osrelease, then/proc/version), so a stripped e-ink
firmware with nounamebinary is still classified instead of falling through
to "unknown". KOReader already relies on procfs for device detection, so it is
present wherever the plugin runs.
Documentation
- README: the UI-string table and the menu tree show real singular/plural forms
instead of the(s)shorthand; the IgnoreRegistry overview documents pattern
lists and conflict-copy matching. - API.md:
IgnoreRegistry:registerdocuments list input and replace semantics,
getAllreturns{ plugin_id = { pattern, … } }, and the new
matchesConflictBasenamemethod is described. - README: the Android (remote mode) section documents the plugin self-updater
(and why there is no binary updater there). - spec/README: the test catalogue is updated to 508 tests across 16 spec files,
adding the plugin-updater logic spec and the download-transport regression spec.
KOSyncthing+ v1.1.5
[v1.1.5] — 2026-06-08
Changed
- New optional Start mode replaces the single Autostart Syncthing
on/off toggle. It offers two mutually exclusive automatic modes, and neither
is on by default — without one, Syncthing runs only when you start it by
hand or via Quick Sync/Periodic Sync:- When Wi-Fi is on — follows Wi-Fi: starts when Wi-Fi is already on,
stops when it goes off, and never turns Wi-Fi on by itself. - Always (brings Wi-Fi up) — the previous behaviour: keeps Syncthing
running whenever possible, turning Wi-Fi on when needed.
Tapping the selected mode again turns it off. An existing "Autostart on"
setting maps to Always.
- When Wi-Fi is on — follows Wi-Fi: starts when Wi-Fi is already on,
- Count-aware UI strings — every message containing a number now uses proper
singular/plural forms (ngettext) instead of the old "folder(s)" style. English
reads naturally at any count ("1 folder up to date" / "5 folders up to date"),
and Bulgarian uses the correct counting forms with verb/adjective agreement.
Fixed
- A Wi-Fi disconnect no longer stops a manually started daemon when no
start mode is selected — automatic stop-on-disconnect applies only to the
Wi-Fi-coupled modes ("When Wi-Fi is on" / "Always").
Documentation
- README overhaul: the Status & conflicts menu is documented as its current
three-door layout (Folders / Devices / Conflicts); the settings reference now
lists everysyncthing_*key; the Start mode section and menu tree
describe the two modes; the companion-API overview lists the periodic-sync
and settings/legacy methods. - API.md: clarified that
resolveConflictByPathaccepts onlykeep_local/use_remote(auto-merge is available on the bulkresolveAllConflictsonly). - Bulgarian translation completed (all UI strings translated).
Development
- The translation tool (
tools/i18n.py) now extractsN_("one", "other", n)
plural calls and maintains thePlural-Formsheader, alongside_("...").
KOSyncthing+ v1.1.4
[v1.1.4] — 2026-06-08
Changed
- Manual Stop is now session-only — Syncthing starts again on the next
KOReader launch; only turning off the Autostart toggle stops it for good. - Conflict list shows readable names — book/file name and detection time
instead of the raw…sync-conflict-…filename. - Redesigned Copy diagnostic info — labelled sections and aligned columns;
fixes wrapped/doubled separators on Kindle.
Fixed
- Reading-progress conflicts no longer swap "Mine" and "Theirs" when this
device wrote the moved-aside copy — the dialog now offers Keep incoming /
Restore mine with the correct percentages. - Conflict-resolution messages are now orientation-aware.
- Missing reading percentage shows unknown instead of no date.
- Autostart now starts on a cold launch.
- Android: auto-merge after Rescan waits for the rescan to land instead of
running before any conflicts exist.
Removed
- Dead
SyncthingStateChangedevent (no listener; the broadcasts did nothing).
SyncthingSyncCompletedandSyncthingConflictDetectedare unchanged.
KOSyncthing+ v1.1.3
[v1.1.3] — 2026-06-07
Added
- Richer Copy diagnostic info — binary ELF check, process RSS/threads/CPU,
filesystem type & free space, network loopback & Kindle firewall ports
(22000 TCP, 21027 UDP), folder/device counts. - Kindle firewall now opens TCP 22000 (sync) and UDP 21027 (discovery)
automatically, fixing pairing issues. - Autostart respects manual pause — manually stopping Syncthing from the
menu now pauses Autostart until you start it again. Previously Autostart
would immediately restart the daemon after a manual stop. - LAN-only network support — Autostart and sync timers now use
NetworkMgr:isConnected()(has IP association) before falling back to
isOnline()(has internet route). Syncthing can sync on local networks
without internet access.
Changed
- Binary download validates ELF & gzip magic and enforces a minimum file size
before extraction. - Binary installation is atomic (
.newfile replaced only after ELF check). - Notifications say "network unavailable / disconnected" instead of
"Wi‑Fi unavailable / disconnected" to match the new LAN-only behaviour.
Fixed
-
Text file named
syncthing(Kobo app‑stream metadata) no longer accepted as
a valid binary. -
Curl is tried before wget for more reliable GitHub downloads.
-
Architecture detection now uses a single shared helper
(st_utils.detectArch). -
Autostart no longer breaks after network loss. Automatic stops
(network disconnect, app close) were incorrectly setting theuser_paused
flag, causing Autostart to stay disabled after reconnecting or restarting
the app. Only an explicit manual stop now sets the flag. -
Conflict dialog no longer shows "unknown" for older devices. Older
KOReader builds (pre-2022) writelast_percentinstead of
percent_finished; both fields are now recognised when reading progress
from metadata sidecar files. -
Conflict dialog now appears when only one side has a percent field.
Previously the "reading progress conflict" dialog was suppressed when the
conflict copy lackedpercent_finishedeven though the local copy had it
(or vice versa). The dialog now opens whenever either side carries progress
data, showing the known percentage and "unknown" only for the side that
genuinely has none. -
getConflictsDetailednow reportshas_progress = truewhen at least
one side has a percent field (previously required both sides). This
affects the auto-merge menu display and any companion plugins that read
conflict metadata.
KOSyncthing+ v1.1.2
I forgot to add auto-merge button, to Android remote mode, menu.
KOSyncthing+ v1.1.1
[v1.1.1] — 2026-06-06
Added
- Auto-merge conflicts after sync — opt-in checkbox in
Automationmenu.
After every Quick Sync, reading-progress conflicts are merged automatically
(higherpercent_finishedwins). Off by default.
Fixed
- Architecture detection unified into a single helper (
st_utils.detectArch).
LuaJIT is tried first,uname -mas fallback. InfoMessagewas used inmain.lua
KOSyncthing+ v1.1.0
Initial public release.
Sync books, annotations, and reading progress across your e-readers — privately, without any cloud.
- Quick Sync — one-tap sync with automatic Wi-Fi on/off, disk-space check,
progress notifications, and transfer summary. - Autostart & Periodic Sync — background daemon management with Wi-Fi
awareness, exponential backoff, and a charging gate. - Conflict resolution — scan, auto-merge reading progress, keep-local, or
use-remote; per-file and bulk actions. - Folder & device management — pause, rescan, add/remove via the KOReader
menu without opening the Syncthing web UI. - Pairing wizard — guided setup for adding new devices.
- Legacy mode — runs an older Syncthing binary (v1.27.12 or v1.2.2) on
devices with kernels ≤ 3.1 (Kindle PW2/PW3, Kobo Touch 2, etc.). - Android remote mode — connects to an existing Syncthing app on Android
instead of managing a local daemon. - Binary auto-update — checks GitHub Releases and downloads the correct
architecture binary over Wi-Fi. - Companion plugin API — public Lua API for other KOReader plugins to
query status and trigger sync actions. - Bulgarian translation (
bg.po).