Skip to content

Configuration

Desktop app

Backend URL

The app looks for the backend in this order and uses the first one that is set:

  1. the -Dqclm.api.url=… JVM option
  2. the QCLM_API_URL environment variable
  3. Customize → Backend → Server URL in the app
  4. the default, http://localhost:8080/api/v1

The value must include the /api/v1 suffix. A change in Customize applies immediately, without restarting.

Options 1 and 2 are useful for scripted or managed installs:

QCLM_API_URL=http://lab-server:8080/api/v1 open -a QCLM
$env:QCLM_API_URL = "http://lab-server:8080/api/v1"
& "$env:LOCALAPPDATA\QCLM\QCLM.exe"
QCLM_API_URL=http://lab-server:8080/api/v1 /opt/qclm/bin/QCLM

Where settings are stored

The app stores its settings with Java Preferences:

OS Location
macOS ~/Library/Preferences/com.apple.java.util.prefs.plist
Windows Registry, HKEY_CURRENT_USER\Software\JavaSoft\Prefs\edu\uiuc\qclm
Linux ~/.java/.userPrefs/edu/uiuc/qclm/

The batch job queue is stored in ~/.qclm/.

Backend

Set these in a .env file next to docker-compose.yml, then run docker compose up -d again.

Variable Default Meaning
QCLM_VERSION latest Image tag to run, for example 2026.1.0
QCLM_BIND 127.0.0.1 Interface the gateway listens on. Use 0.0.0.0 to allow other machines; see Using a shared lab server.
QCLM_PORT 8080 Gateway port on the host

Advanced

Each service is a Spring Boot application, so any setting in its configuration can be overridden with an environment variable in docker-compose.yml. For example:

Service Variable Meaning
data-service QCLM_STORAGE_TYPE local (Docker volume, the default) or s3. With s3, also set QCLM_STORAGE_S3BUCKET, QCLM_STORAGE_S3REGION and, for S3-compatible stores, QCLM_STORAGE_S3ENDPOINT.
acquisition-service QCLM_HARDWARE_MODE simulated (the only mode available today)
api-gateway QCLM_GATEWAY_SECURITY_ENABLED true requires a JWT on every request. You also need an OAuth2/OIDC provider, set with QCLM_JWT_ISSUER_URI and QCLM_JWT_JWK_SET_URI.
api-gateway QCLM_GATEWAY_RATELIMIT_REQUESTSPERSECOND Rate limit, 50 by default

Ports

Only the gateway is published on the host. The other services talk to each other on Docker's internal network.

Service Internal port
api-gateway 8080 (published)
metadata-service 8081
data-service 8082
acquisition-service 8083
processing-service 8084
inference-service 8085
experiment-service 8086
kafka 9092
postgres 5432