Settings synchronization — v0.6.72
English | Українська
Full settings backup — v0.6.65
Update all clients that share a server profile to v0.6.65 or later before syncing. Save / Sign in / Sync stores all saved settings, including mouse events, bindings, application language profiles, startup and elevation, keep-awake, logging, clipboard history options, and OCR. An older snapshot preserves local values for fields it never contained. A current snapshot with an explicitly empty profile can clear the corresponding settings.
After reinstalling Windows, reconnect to the same OpenBao profile and choose Download remote. Executable paths are restored as saved. Reinstall optional OCR tools and adjust any paths that have changed. Windows may ask for approval to restore elevated startup.
Download feedback and live Settings refresh — v0.6.59
Download remote shows Downloading remote settings from OpenBao..., then reports the server version and whether changes were applied or this PC was already up to date. Applied changes have a local backup. A failed download reports Download failed. Local settings were not changed. followed by the cause. HTTP 400 now distinguishes authentication, download and write requests: check login fields for authentication errors, or the KV v2 mount and profile path for download errors. Configuration/validation errors remain visible until another action.
After a successful explicit download, the existing Settings window refreshes automatically, keeping its selected tab. This also works if you close the Sync dialog before the download finishes. The confirmation warns that unsaved Settings edits will be discarded. Download does not write the remote profile; Keep this PC's layouts still preserves the local global cycle and its shortcuts. A failed download leaves the Settings draft intact. Automatic/background sync still uses the existing save/merge rules; this automatic editor refresh is for Download remote.
Application-specific snippets — v0.6.51
Existing snippets remain global. Enable Only in these applications (unchecked: everywhere) to restrict a snippet. Enter comma-separated process names such as chrome.exe, ms-teams.exe, or choose a running application and click Add app. You can type a process name for an application that is not running. Names ignore case and the optional .exe suffix; paths and wildcards are not supported. An enabled restriction requires at least one application. Chrome means the entire browser, not one website.
The list shows [All apps] or the selected processes. Save applies edits; Cancel discards them. A matching application-specific snippet takes priority over a global snippet with the same trigger; elsewhere the global snippet remains available. The same trigger is allowed in disjoint application scopes, but overlapping scopes are rejected. The target application is checked again before insertion. No OCR or polling timer is used.
Manual export/import and synchronization preserve application scopes. Update every synchronizing PC to v0.6.51 or newer before sharing restricted snippets: older versions may treat them as global or reject repeated triggers. Keep a backup before downgrading. Sync conflicts distinguish the trigger and its application scope.
Chat profile synchronization — v0.6.53
Chat language profiles now synchronize through Settings → Sync → Sync settings…, alongside your other shared settings. First update every synchronizing PC to v0.6.53 or newer; older clients reject the new shared field. Save the chat profile in Settings, then use Save / Sign in / Sync on each PC (or wait for the existing automatic sync). No new checkbox is required; synchronization must already be enabled and configured for your OpenBao server.
The shared data includes the application, visible chat name and ordered Windows language IDs. It includes Telegram Desktop, Telegram Web K in Chrome, Teams and stored inactive Viber profiles; Viber recognition remains disabled. Message contents are not included. Matching still uses application plus visible name, so identically named chats in one application share a profile and a renamed chat needs a new profile.
Different chats merge independently. Conflicting language lists, or deletion on one PC versus editing on another, appear under Resolve individual conflicts... with the chat name. Choosing the local or remote version resolves that chat; deletion propagates. Missing Windows layouts remain stored and are skipped while switching; if none are installed, the global cycle is used. Keep this PC's layouts preserves only the global cycle and layout shortcuts, while chat profiles still synchronize.
Downloading a pre-v0.6.53 shared profile without chat data preserves existing chat profiles. Downloading an explicit empty chat map from the new version removes them. Manual Export/Import still includes chat profiles. The v0.6.53 change added no controls. For current download messages and editor refresh behavior, see the v0.6.59 section above.
Updated 2026-11-09 for v0.6.59; introduced in v0.6.26.
The Sync... button is available in Settings for everyone. Synchronization remains disabled
until you configure your own OpenBao and enable it. Connection configuration is saved separately
in sync.json. The portable data directory is normally data/ beside the executable; installations
without a writable application directory use the existing local-app-data fallback.
No server address or account is included in the application.
The first provider is OpenBao KV v2. The dialog accepts an HTTPS server origin, username,
password, KV mount (default kswitcher), profile path (default personal/settings) and userpass
authentication mount (default userpass). Use the same profile on each of your PCs. This is
administrator-provisioned private access, not public account registration. Non-root namespaces,
reverse-proxy URL prefixes, MFA login flows and other providers are not implemented yet.
Enable synchronization and choose Save / Sign in / Sync. The dialog saves connection changes
immediately; the main Settings window's Save/Cancel does not control this separate configuration.
When synchronization is disabled, connection fields and sync actions are inactive. Check Enable
synchronization to make them available. To disable an existing connection, uncheck it and click
Save; this preserves the saved connection and password without starting a sync request.
Disconnect / forget password remains available while synchronization is disabled.
A blank password keeps the existing Windows credential for that server, login mount and username.
The password is saved in Windows Credential Manager, not in settings exports, logs or the remote
profile. HTTPS certificate validation is mandatory and redirects are refused. Login tokens are
kept in memory for one sync attempt, with best-effort self-revocation afterwards. Configure bounded
token lifetimes on the server as well (for example a 5-minute default and 10-minute maximum).
Disconnect / forget password disables synchronization and removes the current connection's
saved credential. A request already sent to the server may still complete; its downloaded settings
will not be applied after the connection changes. Old credentials for other connection identities
can be removed in Windows Credential Manager under KSwitcher.Sync/.
On the first connection, Save / Sign in / Sync merges the existing profiles without requiring a whole-profile replacement. Independent entries (such as snippets, exclusions and replacement pairs) are combined. Different values for the same setting remain on their respective sides and appear in Resolve individual conflicts...; no value is guessed without a common history. Nonconflicting changes synchronize immediately, and unresolved conflicts survive subsequent syncs.
- Upload local creates the remote profile or replaces it with this PC's saved shared settings.
- Download remote replaces this PC's shared settings with the server profile.
- If the server has no profile yet, choose Upload local to create it.
- Unsaved edits are not synchronized. A successful Download remote refreshes the open Settings window and discards its unsaved edits, as stated in the confirmation.
Once connected, the resident checks at startup, every 10 minutes, and about two seconds after saving settings, on a separate network thread. Errors back off for 15 minutes; the Sync button allows a manual retry. Local use continues offline. Independent changes to different settings fields are merged against the last successful baseline. Resolve individual conflicts... shows the name and local/server values for each conflict. Choose either value for selected settings and apply your choices; unselected conflicts stay pending. Other, nonconflicting changes continue to synchronize. Choices are checked against freshly read values before writing, so a stale dialog cannot overwrite a newer edit. Conflicting shortcuts are separate settings, including bindings for individual keyboard layouts. Exclusions and personal dictionary words merge by membership. Ordered layout/dictionary lists remain single settings because their ordering affects behavior.
Snippets have persistent IDs that survive renaming. Different snippets merge independently; trigger and text edits within a snippet can merge too. Deleting a snippet retains a deletion marker, so an unchanged offline copy cannot bring it back. Deletion versus a concurrent edit is an explicit conflict, offering the deleted or edited version. Duplicate triggers and shortcut collisions created by independent edits are also presented for resolution. Deletion markers are retained without automatic expiry; recreating a snippet in the editor gives it a new ID.
Existing profiles migrate automatically: legacy snippet IDs derive deterministically from the original trigger, then are stored permanently. Sync writes use envelope version 2; older clients refuse this version instead of dropping IDs/deletions. Update all participating PCs before using the new merge behavior. Existing version-1 profiles and local baselines remain readable.
Download/Upload are still available for deliberate whole-profile recovery/initialization, not required for ordinary conflicts. Every server write uses the version just read as a CAS condition, including explicit Upload. A racing write is rejected rather than silently overwritten. Deleted server versions are not silently recreated.
Connection details and credentials stay local. Clipboard history, screenshots and dictionary files are not uploaded. Full synchronization identifies missing keyboard layouts by language (when Windows can identify it) and exact ID. Install the same layout variant, or select Keep this PC's layouts and layout shortcuts (sync other settings) and click Save / Sign in / Sync. This device-local option keeps the local layout cycle and its direct shortcuts unchanged during sync. The server layout cycle and shortcuts are preserved during automatic sync and explicit Upload. Download also keeps the local layout configuration when this option is enabled. Settings are JSON inside OpenBao, accessible to the vault administrator.
The last common profile (sync-base.bin) and the settings preceding the most recent downloaded
change (settings-before-sync.bin) are protected with Windows DPAPI and belong to this Windows
account/machine. Reinstallation recovery uses the remote profile and a fresh login; copying these
local DPAPI files to a new machine does not recover them. For an older server snapshot, use OpenBao
KV version history to restore that snapshot as the latest version, then choose Download remote.
The app does not yet provide a server-history browser. Keep ordinary server backups too.
OpenBao administrator setup:
-
Enable a KV version 2 engine at
kswitcher; enable Require Check-and-Set and set maximum versions to a suitable value, such as 30. -
Create a dedicated userpass account, with a policy restricted to the chosen profile. Do not use the administrator account. For the defaults, the application needs only:
path "kswitcher/data/personal/settings" { capabilities = ["create", "read", "update"] } path "auth/token/revoke-self" { capabilities = ["update"] } -
Set bounded token lifetimes on that account/auth mount and enter its credentials in KSwitcher. Keep the server's address and TLS certificate reachable/trusted on each participating PC.
SyncProvider separates versioned read/conditional-write operations from merging, local state
and UI integration, so another service can be added without replacing the synchronization logic.
Protocol and conflict regressions run with build.ps1 -Test or CMake's sync-regressions test.
Completed-attempt memory — v0.6.35
Temporary snapshots and received payloads are released after successful completion, failure, invalid data and stale replies. Pending work is retained while a text operation is busy. Unresolved conflicts and their local/server values remain available in the conflicts dialog. Connection settings, credentials, encrypted baselines, retry delays and conflict resolution behavior are unchanged.


