The frontend type check now actually runs — and this release fixes everything it had been silently ignoring.
The type check was a no-op
CI's "Type check" step and the build script ran npx tsc --noEmit. --noEmit does not follow project references, and the root tsconfig.json is solution-style ("files": [] plus references) — so it type-checked nothing and always exited 0. Both now run tsc -b.
Running the real check reported 132 errors. All 132 are fixed. Several were genuine defects, not lint noise:
| Where | What was wrong |
|---|---|
ContainerDetails |
TabType had drifted from the rendered tab list — missing processes and activity, while still declaring a metrics tab no panel renders. It is now derived from CONTAINER_TABS, so the tab bar and the panels cannot diverge again. |
Containers |
The container inspect dialog rendered with no heading — every other page passes title to InspectModal, this call site did not. |
StackDetails |
The Publishers type omitted TargetPort and Protocol, both of which the server sends and the table already tried to render. |
ErrorBoundary |
Accepted no name prop although ContainerLogsPage passed one. Now declared, and included in the console output so you can tell which boundary tripped. |
StatsChart |
The tooltip formatter assumed Recharts always hands it a number; it now narrows the documented number | string | (number | string)[]. |
Dead code removed
components/ContainerList.tsx and components/Login.tsx (311 lines) are gone. Nothing imported either, and both referenced containerService / authService exports that services/api.ts has not had for some time — so neither could compile. The live login page is pages/Login.tsx.
Also cleared 76 unused imports and locals. Write-only React state (setter still called, value never read) kept its setter and dropped only the unused binding, so render behaviour is unchanged.
vitest 1.6.1 → 5.0.1
vitest 1.x bundled its own nested vite 5, which collided with the project's vite 7 and made vite.config.ts untypeable (Plugin<any>[] is not assignable to PluginOption). The nested copy is gone. src/test/setup.ts now imports @testing-library/jest-dom/vitest, which is what registers the matchers on vitest's expect.
Verified
go vet + go test (backend and agent), npm ci, tsc -b, vitest 10/10, npm run build, and the Dashboard and Containers pages re-rendered against a seeded demo fleet to confirm the state removals changed nothing on screen.
Known issues
ESLint reports 177 problems, mostly @typescript-eslint/no-explicit-any. ESLint is not part of CI and this release does not address it.
Install
git clone --branch v1.2.2 https://github.com/deziss/conman.git
cd conman
export SECRET_KEY=$(openssl rand -hex 32)
export MASTER_API_KEY=$(openssl rand -hex 32)
docker compose -f docker-compose.simple.yml up -d --buildDashboard on http://localhost:5173, sign in with admin@example.com / admin, and change the password before exposing it to a network.
Full changelog: https://github.com/deziss/conman/blob/v1.2.2/CHANGELOG.md
