Releases: deziss/conman
Release list
v1.2.2 — real type checking, 132 errors fixed
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
v1.2.1 — frontend lockfile, CI green
Patch release on top of v1.2.0. Use this tag rather than v1.2.0 — see below.
Fixed: the frontend CI job had never actually run
The root .gitignore carried a bare package-lock.json rule, so frontend/package-lock.json was never tracked. The CI frontend job died at actions/setup-node before installing anything:
##[error]Some specified paths were not resolved, unable to cache dependencies.
and npm ci --legacy-peer-deps had no lockfile to install from either. Every run since the workflow was added was green on the backend and agent jobs only, with the frontend job failing in under 10 seconds.
The lockfile is now tracked (yarn.lock and pnpm-lock.yaml stay ignored — this repo uses npm), and CI passes end to end for the first time.
That fix landed one commit after the v1.2.0 tag, so a checkout of v1.2.0 still has no lockfile and cannot npm ci. This release exists to give you a tag that does.
Also in this release
VERSION,frontend/package.json, and theAPP_CONFIGconstants (which the sidebar and About tab read) bumped to 1.2.1- README package filenames point at 1.2.1
CLAUDE.mddocuments thattsc -bis required — see below
Still open: the CI type check is a no-op
Unchanged from v1.2.0. The root tsconfig.json is solution-style ("files": [] plus references), and tsc --noEmit does not follow project references, so it type-checks nothing and always exits 0. Both the CI "Type check" step and npm run build (tsc && vite build) pass unconditionally.
Use npx tsc -b locally. It currently reports 132 errors (77 unused-local warnings under noUnusedLocals, plus roughly 13 genuine type errors). Switching CI over is deferred until those are cleared.
Install
git clone --branch v1.2.1 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.1/CHANGELOG.md
v1.2.0 — AGPL relicense, dev-server fix, new README
Conman is a self-hosted dashboard for managing containers across many hosts — Docker, Podman, and containerd, from one web UI.
Highlights
Relicensed under AGPL-3.0-or-later
Conman was previously declared MIT in the README, with no LICENSE file backing it. This release ships the full GNU Affero General Public License v3.0 text and updates the license field in both .deb/.rpm package definitions.
The network clause applies: if you run a modified Conman and let others use it over a network, you must offer them the source of your modified version.
Fixed: the frontend did not boot in dev mode
verbatimModuleSyntax is enabled, so a type-only specifier written as a value import (import { ReactNode } from 'react') is emitted as a real runtime import. Vite could not resolve those, and npm run dev rendered a blank page:
SyntaxError: The requested module '/src/types/license.ts'
does not provide an export named 'LicenseInfo'
All 20 affected imports now use the type modifier.
Rewritten README
The README now leads with what Conman is for and who it is not for, and includes a feature table, dashboard/containers/hosts screenshots, an edition comparison, and collapsible production install paths.
Known issue: the CI type check is a no-op
The root tsconfig.json is solution-style ("files": [] plus references). tsc --noEmit does not follow project references, so both the CI "Type check" step and npm run build (tsc && vite build) pass unconditionally — which is how the type-import breakage above reached main.
Use npx tsc -b locally. It currently reports 132 remaining errors (77 unused-local warnings under noUnusedLocals, plus roughly 13 genuine type errors). Switching CI over is deferred until those are cleared.
Install
git clone 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.
Building .deb and .rpm packages from source is documented in the README.
Full changelog: https://github.com/deziss/conman/blob/v1.2.0/CHANGELOG.md


