Summary
After a fresh install, the dashboard setup wizard overlays every route on every page load, even when all services are already healthy (11/11 online). Navigating away and back resets the wizard to Step 1 of 6. Local storage has no completion flag. The only way to dismiss it is to click through all 6 wizard steps.
Reproduction
- Install fresh via the installer (observed on macOS Apple Silicon, apr24 branch with 30 merged PRs).
- Open http://127.0.0.1:3001/ — wizard Step 1 "System Check" appears.
- Navigate to /extensions, /models, /settings — wizard overlay persists on every route.
- API check:
API_KEY=$(grep '^DASHBOARD_API_KEY=' ~/dream-server/.env | cut -d= -f2-)
curl -s -H "Authorization: Bearer $API_KEY" http://127.0.0.1:3002/api/setup/status
# → {"first_run":true,"step":0,"persona":null,"personas_available":[...]}
Root cause
dream-server/extensions/services/dashboard-api/routers/setup.py:40-41:
setup_complete_file = SETUP_CONFIG_DIR / "setup-complete.json"
first_run = not setup_complete_file.exists()
setup-complete.json is only written by POST /api/setup/complete (line 87-99), which the UI calls when the user reaches wizard Step 6.
The installer never writes this file. Grep across installers/ and scripts/ returns zero matches for setup-complete — so after a successful installer run, first_run stays true indefinitely until the user clicks through the wizard.
Not a regression
git blame shows this logic was introduced by c3e54d23 which is already on upstream/main. Pre-dates the current batch of open PRs.
Expected behaviour
At least one of:
- Installer writes setup-complete.json at the end of a successful install (tag the file with installer version + timestamp).
- Dashboard detects "install is healthy" heuristically (e.g. all core services healthy +
.env contains GPU_BACKEND + LLM_MODEL) and defaults to first_run: false, making the wizard opt-in.
- "Skip setup" UI control in the wizard that calls
POST /api/setup/complete and dismisses permanently.
Option 1 is the lowest-risk and closest to user expectation — if the installer succeeded, the first-run experience is already done.
Workaround
API_KEY=$(grep '^DASHBOARD_API_KEY=' ~/dream-server/.env | cut -d= -f2-)
curl -X POST -H "Authorization: Bearer $API_KEY" http://127.0.0.1:3002/api/setup/complete
Summary
After a fresh install, the dashboard setup wizard overlays every route on every page load, even when all services are already healthy (11/11 online). Navigating away and back resets the wizard to Step 1 of 6. Local storage has no completion flag. The only way to dismiss it is to click through all 6 wizard steps.
Reproduction
Root cause
dream-server/extensions/services/dashboard-api/routers/setup.py:40-41:setup-complete.jsonis only written byPOST /api/setup/complete(line 87-99), which the UI calls when the user reaches wizard Step 6.The installer never writes this file. Grep across
installers/andscripts/returns zero matches forsetup-complete— so after a successful installer run,first_runstaystrueindefinitely until the user clicks through the wizard.Not a regression
git blameshows this logic was introduced byc3e54d23which is already onupstream/main. Pre-dates the current batch of open PRs.Expected behaviour
At least one of:
.envcontains GPU_BACKEND + LLM_MODEL) and defaults tofirst_run: false, making the wizard opt-in.POST /api/setup/completeand dismisses permanently.Option 1 is the lowest-risk and closest to user expectation — if the installer succeeded, the first-run experience is already done.
Workaround