Docker Desktop on Windows can return null for c.Ports / c.Labels / c.Names
in the listContainers response (Linux returns empty array/object). The
mapping in discoverServices() assumed array, so .filter() crashed and the
refresh loop kept retrying every 5s, filling the logs.
Closes#7
- Header indicator (pulsating dot + "NEW VERSION") when a newer release
is published on GitHub. Replaces the version subtitle without growing
the header.
- Modal with current → latest version, release notes preview (parsed
from GitHub release body), copy-paste update command, link to repo
and release notes, current star count, and "versions behind" badge.
- Auto-detects deploy mode (GHCR image vs source build) by inspecting
the running container. Shows the matching update command, but always
exposes both via tabs.
- Backend caches the GitHub API response for 6h (~8 calls/day per
instance, far under the rate limit).
- New: per-project color picker (palette popover, 6 colors, persisted)
- Layout: groups center their content horizontally + vertically; drag-end recenters and keeps margins symmetric
- Layout: COMPOSE_FILE merges (multi-file) resolve to the override file as the compose key
- UI: standalone group renamed to "docker" with Container icon; compose suffix hidden
- UI: group footer shows compose filename with hover tooltip when truncated
- UI: styled tooltips for header buttons (rename, reset, color)
Adds human-readable aliases for project groups (the wrapping label
around services), useful when orchestrators like Coolify or Dokploy
generate cryptic project keys.
- New server module `src/server/project-aliases.ts` with load/save
helpers, a 64-char max, and control-char sanitization.
- New endpoints: GET /api/project-aliases, PUT /api/project-aliases,
DELETE /api/project-aliases/:project. Aliases also returned in
/api/init for first-paint hydration.
- GroupNode header is now click-to-edit: short names prefill so users
can tweak them, long cryptic names start blank for a fresh alias.
The compose suffix (PROD/DEV/etc) stays visible and is not part of
the alias. Reset icon appears only when an alias differs from the
original project key.
- App.tsx wires the alias state, the project filter dropdown shows
the alias plus the compose suffix list joined by " - ".
- MonitoringPage uses the alias in: project filter dropdown, the
totals card title, and per-service card subtitles (which show only
THAT service's compose, not the whole project list).
- engine/layout.ts exports getComposeKey and stores the raw `project`
key in group node data so the same alias scope matches the filter.
- i18n: 4 new keys (EN + ES) for rename / reset / save / cancel.
Adds a download button to the bottom-left React Flow controls that
exports the current canvas view as a PNG with the dot grid preserved.
- New util src/client/utils/exportPng.ts: html-to-image capture +
manual canvas composition (solid bg + dot grid + captured layer).
Works around html-to-image's SVG <pattern> limitations and produces
a deterministic 3x retina PNG.
- During capture, temporary CSS disables ring-shadow halos and forces
service node bodies to a solid dark fill so the dot grid doesn't
bleed through. State is still indicated by border colors and the
inner state dot. Group node headers are excluded so their outlines
stay intact.
- New component src/client/components/ExportPngButton.tsx integrated
as a custom ControlButton inside <Controls> (bottom-left).
- App.tsx: id="dashboard-canvas" + data-no-export on project filter.
- i18n: 4 keys (EN + ES) for the button and 3 error states.
- New dependency: html-to-image@1.11.13
Adds a GitHub Actions workflow that builds and pushes the Docker image
to ghcr.io/rgjorge/containerflow on every tag push, so end users can run
ContainerFlow without cloning the repo or building locally.
- New workflow: .github/workflows/docker-release.yml
- docker-compose.yml: uses the prebuilt image from GHCR by default
- New docker-compose.local.yml: override for building from source (devs)
- .env.example: simplified + adds COMPOSE_FILE toggle for local build
- README EN + ES: quick-start updated to no-clone flow
- .gitignore: ignore task/ planning notes dir
Addresses feedback from multiple reviewers on the launch thread asking
for non-Spanish primary documentation. Also adds a framing quote from
community feedback (u/dashingsauce on Reddit) that captures the project
positioning better than prior phrasing.
- README.md now in English with language switcher to Spanish version
- README.es.md preserves the original Spanish content with switcher to English
- Added missing references in structure section (i18n.tsx, watcher.test.ts, events-db.ts)
- Added Discussions link to community section
Closes#1
- ServiceNode: cap card width at 240px, native tooltip on name and image
- App: project filter dropdown capped at 280px with scroll, names truncate
- DetailPanel header: proper flex layout (min-w-0 flex-1 + shrink-0),
Tooltip with (?) shows full name on hover; same fix for logs modal header
- Re-enable CI workflow (was paused for GitHub billing)