Skip to content

Setup wizard re-appears on every visit after a fresh install — installer never writes setup-complete.json #478

@yasinBursali

Description

@yasinBursali

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

  1. Install fresh via the installer (observed on macOS Apple Silicon, apr24 branch with 30 merged PRs).
  2. Open http://127.0.0.1:3001/ — wizard Step 1 "System Check" appears.
  3. Navigate to /extensions, /models, /settings — wizard overlay persists on every route.
  4. 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:

  1. Installer writes setup-complete.json at the end of a successful install (tag the file with installer version + timestamp).
  2. 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.
  3. "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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions