Turn the desktop client into a system tray application

Started without a command, keeporg now shows a padlock in the system tray
with a menu like midi-webhook's: a status line, the mirror folder, each
database with its state, Sync Now, browser sign-in and sign-out, the web
interface, the configuration, the log, Start at Login, About and Quit. The
commands are unchanged.

config.json now carries every client setting (device_label,
request_timeout_seconds, ca_file, log_file, notifications), is written in
full on first start and is reloaded by the tray when saved.

A lock in the mirror directory admits one agent at a time, since the tray,
`keeporg run` and a service unit could otherwise race each other.

The tray uses fyne.io/systray: pure Go on Linux, BSD and Windows, cgo on
macOS only. The server keeps no third-party dependencies.

Desktop versions go to 0.5.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Reactorcoremeltdown
2026-11-02 12:30:28 +01:00
co-authored by Claude Opus 5.5
parent d314188247
commit ead82dc777
37 changed files with 2301 additions and 108 deletions
+13
View File
@@ -1,3 +1,16 @@
keeporg (0.5.0) unstable; urgency=medium
* KeepOrg is now a system tray application: started without a command (or
from the applications menu) it shows a padlock whose menu signs in
through the browser, lists each database's state, opens the mirror
folder, the web interface, the settings and the log, and starts at
login. The configuration file now holds every setting (device_label,
request_timeout_seconds, ca_file, log_file, notifications), is written
in full on first start, and is reloaded when saved. Only one agent
synchronizes a mirror directory at a time.
-- Azer Abdullaev <github@reactorcoremeltdown.anonaddy.com> Mon, 02 Nov 2026 11:22:07 +0100
keeporg (0.4.0) unstable; urgency=medium
* keeporg db -delete now asks for your account password
+9 -2
View File
@@ -3,6 +3,8 @@ Version: @VERSION@
Section: utils
Priority: optional
Architecture: @ARCH@
Recommends: libnotify-bin
Suggests: keepassxc, zenity | kdialog
Maintainer: tiredsysadmin <rcmd@garage.rcmd.space>
Homepage: https://garage.rcmd.space/keeporg
Description: KeePass database synchronization client
@@ -13,5 +15,10 @@ Description: KeePass database synchronization client
Each save is pushed to the server and changes other people push are applied
locally. The client never opens a database and never sees a master password.
.
A systemd user unit is included: enable it with
`systemctl --user enable --now keeporg`.
KeepOrg starts as a system tray application from the applications menu; its
menu signs in, shows each database's state and opens the settings. The tray
needs a StatusNotifierItem host: KDE, XFCE, Cinnamon and most panels have
one, GNOME needs the AppIndicator extension.
.
Without a desktop, `keeporg run` is the same agent, and a systemd user unit
is included for it: `systemctl --user enable --now keeporg`.
+11
View File
@@ -0,0 +1,11 @@
[Desktop Entry]
Type=Application
Name=KeepOrg
GenericName=Password database synchronization
Comment=Keep shared KeePass databases in step with a KeepOrg server
Exec=keeporg tray
Icon=keeporg
Terminal=false
Categories=Utility;Security;
Keywords=keepass;kdbx;password;sync;
StartupNotify=false
+3 -1
View File
@@ -15,10 +15,12 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleExecutable</key>
<string>keeporg</string>
<key>CFBundleIconFile</key>
<string>KeepOrg</string>
<key>LSMinimumSystemVersion</key>
<string>11.0</string>
<!-- The agent has no window: it syncs in the background. -->
<!-- A menu-bar application: no Dock icon, no main window. -->
<key>LSUIElement</key>
<true/>
<key>NSHighResolutionCapable</key>
+38 -12
View File
@@ -1,27 +1,53 @@
KeepOrg for Windows
===================
keeporg.exe is the synchronization agent and the administration command.
keeporg-tray.exe is the tray application. keeporg.exe is the same program for a
command prompt: administration commands, and the agent without a tray.
First run
---------
1. Copy both files to %LOCALAPPDATA%\Programs\KeepOrg and start keeporg-tray.exe.
A padlock appears in the notification area.
2. Choose Open Config from its menu, set "server_url" to your server, for
example "https://keeporg.example.com", and save.
3. Choose Sign In... and approve the code in the browser that opens, with
your password or single sign-on.
Your databases appear in %UserProfile%\KeepOrg. Open them with KeePass,
KeePassXC or any compatible application: every save is pushed to the
server, and changes made by other people are applied to the files. The
Databases submenu shows each one's state and opens it.
Tick Start at Login to start KeepOrg when you sign in to Windows.
Settings
--------
%AppData%\keeporg\config.json holds every setting, and the tray applies an
edit as soon as it is saved:
server_url the server, as a browser sees it
device_label this computer's name in the server's session list
mirror_dir where the .kdbx files are kept
poll_seconds how often local saves are looked for
request_timeout_seconds the limit on one request to the server
ca_file a PEM bundle, for a server behind a private CA
log_file the log; empty means keeporg.log beside config.json
notifications desktop notifications (not shown on Windows yet)
username, token written by signing in
Without the tray
----------------
keeporg.exe login -server https://keeporg.example.com -user you
keeporg.exe run
`login` stores its configuration in
%AppData%\keeporg\config.json and mirrors your databases into
%UserProfile%\KeepOrg by default. Pass -dir to choose another directory.
Open the .kdbx files in that directory with KeePass, KeePassXC or any
compatible application. Every save is pushed to the server, and changes made
by other people are applied to the files.
Keeping it running
------------------
Import keeporg-task.xml into Task Scheduler to start the agent at logon:
keeporg-task.xml starts `keeporg.exe run` at logon through Task Scheduler,
for a machine where nobody uses the tray:
schtasks /create /tn KeepOrg /xml keeporg-task.xml
Only one agent synchronizes a directory at a time; a second one reports
that the first is running and stops.
Conflicts
---------
If someone else saved first, your save is kept beside the file as