License
OpenTrader requires a license key to operate for tracking active users. It is free.
License server
https://otauth.skywirex.com
Add to .env:
LICENSE_SERVER_URL=https://otauth.skywirex.com
Getting a license key
Option 1 — Via Dashboard (recommended)
After docker compose up, open your browser at http://localhost:8000/dashboard.
If no license exists, a setup modal appears automatically:
- Enter your Email and Name
- Click “Get free license key”
- The key is activated and saved to the Docker volume immediately
Option 2 — Via API
curl -X POST http://localhost:8000/license/register \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]", "name": "Your Name"}'
Option 3 — Via environment variable (Docker / CI)
If you already have a key, set it in .env — the app activates it automatically on startup:
OPENTRADER_LICENSE_KEY=OT-XXXX-XXXX-XXXX-XXXX
Checking status
curl http://localhost:8000/license/status
{
"status": "active",
"plan": "free",
"features": { "max_positions": 3, "max_watchlist": 10, ... },
"expires_at": null,
"validated_at": "2026-04-15T08:00:00+00:00"
}
How it works
| Machine ID | UUID generated on first run, stored at /app/state/machine_id in the Docker volume |
| License cache | Stored at /app/state/license.json — persists across restarts and image rebuilds |
| Re-validation | App calls the license server every 24h to revalidate |
| Offline grace | If the server is unavailable, the app continues running for up to 72h from the last validation |
Delete key
Windows PS
Remove-Item "\app\state\license.json" -ErrorAction SilentlyContinue
Remove-Item "\app\state\machine_id" -ErrorAction SilentlyContinue
Docker
The cache file lives in the Docker volume at /app/state/license.json. Three ways to reset:
Option 1 — Delete cache file only (keeps machine_id)
The app will re-activate with the same key from the env var on next startup.
docker compose exec opentrader rm /app/state/license.json
Option 2 — Delete machine_id too (full reset)
Treated as a “new machine” — a new machine_id is generated, and the old key will no longer bind (a different key is needed).
docker compose exec opentrader rm /app/state/license.json /app/state/machine_id
Option 3 — Delete entire volume (nuclear option)
docker compose down
docker volume rm opentrader_state
If you only want to force re-validate with the server, Option 1 is sufficient.