This guide installs the PySide6 desktop client on a workstation and signs in to a Cluster ERP server. It covers the desktop install extra, the start command, the sign-in dialog, and the most common start-up failures. Background is on the desktop client overview. Starting the server itself is described on server start-up and app factory.
Prerequisites¶
- Python 3.12 or later (
pyproject.toml:9). - A reachable Cluster ERP server. The client reads its address from the setting
api_urland uses a local default when the setting is empty (src/cluster_erp/desktop/main.py:167). - A user account on that server. The client signs in with a user name and a password (
src/cluster_erp/desktop/core/api_client.py:134-140).
Steps¶
- Install the package with the
desktopextra from the repository root. The comment inpyproject.toml:68-71names this form for a workstation; the extra adds PySide6 (pyproject.toml:72-74).
powershell
pip install -e .[desktop]
-
If you choose a PySide6 version yourself, use 6.8.3. The comment in
pyproject.toml:70-71names 6.8.3 as known-good on Windows and 6.11.0 as failing with a DLL error. CI checks the client against 6.8.3 (.github/workflows/ci.yml:50). -
Start the client.
main()runs when the module is executed (src/cluster_erp/desktop/main.py:243-244). The same function is installed as the console scriptcluster-erp-desktop(pyproject.toml:88).
powershell
python -m cluster_erp.desktop.main
-
In the sign-in dialog, check the Server field (
src/cluster_erp/desktop/i18n/en.jsonkeyauth.server). It is an editable list of the last ten addresses that signed in successfully, and it starts with the client's current address (src/cluster_erp/desktop/widgets/login_dialog.py:108-124,src/cluster_erp/desktop/widgets/login_dialog.py:274-283). Type the API base address of your server, for examplehttps://erp.example.com/api/v1. -
Optionally pick the interface language and open Accessibility (key
accessibility.title) from the bottom row of the dialog (src/cluster_erp/desktop/widgets/login_dialog.py:214-240). -
Enter the user name and the password, then select Sign In (key
auth.login_button). The client sends the request in a worker thread (src/cluster_erp/desktop/widgets/login_dialog.py:287-309). On success it stores the server address in the settingsserver_urlsandapi_urland closes the dialog (src/cluster_erp/desktop/widgets/login_dialog.py:311-314). -
If you later need another server, change Server URL (key
settings.api_url) in Preferences (keysettings.title) and restart the client. The dialog saves the value and asks for a restart when it changed (src/cluster_erp/desktop/widgets/preferences_dialog.py:117-133).
Verify the result¶
- The main window opens with a sidebar, a welcome tab, and a status bar (
src/cluster_erp/desktop/widgets/main_window.py:69-137). - The status bar shows Connected (key
app.connected) whenGET /healthon the server root answers 200 (src/cluster_erp/desktop/widgets/status_bar.py:56-88,src/cluster_erp/desktop/core/api_client.py:326-333). It checks every 15 seconds (src/cluster_erp/desktop/widgets/status_bar.py:49-51). - The sidebar lists only sections that the server metadata declares, that the user may read, and whose apps the user may use (
src/cluster_erp/desktop/widgets/sidebar.py:159-240). See metadata store and foreign-key cache.
Troubleshooting¶
| Symptom | Cause in code | Fix |
|---|---|---|
The dialog shows the text of auth.login_failed |
The server answered 401 to the sign-in (src/cluster_erp/desktop/widgets/login_dialog.py:328-329) |
Check the user name and the password. |
The dialog shows the text of app.connection_error with a transport message |
The request failed before any HTTP answer; status 0 is used for transport errors (src/cluster_erp/desktop/core/api_client.py:151-156, src/cluster_erp/desktop/widgets/login_dialog.py:330-333) |
Check the Server address and that the server runs. |
A dialog with the text of app.metadata_load_failed and a retry button |
GET /_meta failed after sign-in (src/cluster_erp/desktop/main.py:197-214) |
Select retry. After three failed attempts the client shows app.metadata_load_failed_final and exits with code 1 (src/cluster_erp/desktop/main.py:216-222). |
| A changed Server URL has no effect | The preference is read only at start-up (src/cluster_erp/desktop/main.py:167) |
Restart the client, as the message settings.api_url_restart_required says. |
| Start-up fails with a Qt DLL error on Windows | Not determined from code; the comment in pyproject.toml:70-71 names PySide6 6.11.0 |
Install PySide6 6.8.3. |
A sidebar entry opens a tab with the text of app.section_missing |
The server sent no section metadata for that key (src/cluster_erp/desktop/widgets/main_window.py:353-357) |
Check the server version and its metadata. |
Terms introduced¶
| Term | Code identifier | Definition | Turkish term | Source |
|---|---|---|---|---|
| server address list | server_urls |
The setting that keeps the last ten server addresses that signed in successfully. | sunucu adresi listesi | src/cluster_erp/desktop/widgets/login_dialog.py:274-283 |
| sign-in dialog | LoginDialog |
The modal dialog that collects the server address and the credentials before the main window opens. | giriş iletişim kutusu | src/cluster_erp/desktop/widgets/login_dialog.py:43 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.