Run the Open SWE dashboard locally against real GitHub data, signed in with the `gh` CLI instead of a per-machine GitHub App. Use when asked to run the app locally, test a dashboard change against real PRs, reproduce something a screenshot shows, or when local login fails with "GITHUB_APP_CLIENT_ID not configured".
72
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
The dashboard's per-user reads — the PR list, one PR's details, a PR preview — run on
the signed-in person's own OAuth token. gh already holds one, so local development
needs no GitHub App: /dashboard/api/auth/dev-login turns gh's credentials into a
session. It is refused unless langgraph dev is the runtime, and the
ALLOWED_GITHUB_USERS gate still applies.
Confirm gh is logged in. gh auth status — if not, gh auth login.
Check the ports. The backend wants 2024 and Vite wants 3000:
lsof -nP -iTCP:3000,2024 -sTCP:LISTENOther worktrees run their own backends and E2E harnesses on 2024. Never kill one
without asking. Use another port instead and point Vite at it — every command below
takes PORT for exactly that reason.
Make sure .env has these. The GitHub App keys are not needed; these are:
| Key | Why |
|---|---|
DASHBOARD_JWT_SECRET | signs the session; any random string |
ALLOWED_GITHUB_USERS | your gh api user --jq .login |
POSTGRES_URI | skips the container step when one is already up |
DASHBOARD_BASE_URL | http://localhost:3000 |
DASHBOARD_API_BASE_URL | http://localhost:3000 |
Startup aborts with ALLOWED_GITHUB_ORGS or ALLOWED_GITHUB_USERS must be configured
when the allowlist is missing.
Start the backend. make dev covers this when 2024 is free and you want its
postgres container; otherwise run it directly:
uv run langgraph dev --no-browser --port 2026 --n-jobs-per-worker 10Start Vite against it:
DASHBOARD_API_URL=http://127.0.0.1:2026 pnpm run devOpen http://localhost:3000 and press Continue with GitHub. With no App
configured it redirects to the gh login and lands you signed in. To skip the page,
go straight to /dashboard/api/auth/dev-login?redirect_to=/agents/reviews.
make dev starts an open-swe-postgres container unless POSTGRES_URI is set, and
fails with a name conflict when another worktree already started one. Reuse it:
docker ps --filter name=open-swe-postgres --format '{{.Names}} {{.Status}} {{.Ports}}'It binds 127.0.0.1:5433, so POSTGRES_URI=postgresql://postgres:postgres@127.0.0.1:5433/postgres.
Anything reading through an App installation token rather than the caller's:
/reviews/{owner}/{repo}/{number} and /diff)These answer 503 GitHub App token unavailable. That is expected locally, not a
regression. The reviews list and each PR's preview do work, because they read
as you.
Use the ego-browser skill — it drives a real browser and keeps the session cookie.
curl gets a 401 or the login redirect, because it has no session.
Measure rather than eyeball when the question is about layout or density:
await page.evaluate(() => {
const r = (e) => e && e.getBoundingClientRect()
return { viewport: [innerWidth, innerHeight], first: r(document.querySelector('li')) }
})Vite hot-reloads ui/src. Python changes need the backend restarted — langgraph dev
watches files, but a failed import leaves it down, so check it came back:
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:2026/dashboard/api/me401 is healthy: the server is up and asking for a session. 000 means it is down —
read the backend log.
a51694c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.