- 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)