Changelog¶
This page mirrors the CHANGELOG.md in the repository.
All notable changes to this project will be documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.4.0] - 2026-07-24¶
Fixed¶
- Sorting containers by CPU, memory, network, block I/O or PIDs compared zeros. Stats are streamed one container at a time by design, so the collector held no sample for any unselected row. A new one-shot sampler fills every running container while a stats sort is active.
- Failed operations reported success.
docker composeexit codes and stderr were discarded at every call site, so a faileduprendered the success toast. Clipboard failures reported "Copied N lines" with no clipboard tool installed. VSCode discarded prune results and could not report reclaimed space. - Networks never listed their containers. Docker's
GET /networksomits the container map, so every network reported zero attachments — which also meant the "cannot remove a network in use" guard never fired. Attachments are now derived from the container listing. - Compose actions ran in the wrong directory (CLI). The panel used the process's working directory for every project instead of the project's own recorded location.
--socketand thesocketPathsetting were ignored by spawneddockerprocesses. Compose and exec inherited the ambient environment, so they could target a different daemon than the one on screen.- VSCode log and stats streams never recovered. A container restart ended them permanently while the pane still looked live.
console.debugcorrupted the TUI. Nine call sites wrote to stdout while Ink owned the screen. Diagnostics now go to stderr behindSIDEKICK_DEBUG_STREAMS.- Detail tabs could sit on "Loading…" forever. Env, Files and Layers swallowed fetch errors; they now show what failed.
- Tab bars wrapped into three rows at 80 columns, and every list row silently lost its leading character to an off-by-one in the width budget.
- Moving through the list no longer resets the detail pane to Logs.
- Doubled
⚡in the TUI brand mark.
Added¶
sidekick-docker images,volumes,networks,stats,dfandinspect— scriptable commands following the existingpscontract.- Container prune in both surfaces; images, volumes and networks already had it.
DockerClient.diskUsage()(docker system df), including build cache, which was reported nowhere.- Labels tab for containers, and network addressing (subnet, gateway, IPAM, per-container IPs) in the Networks Info tab.
- Volume Info lists the containers mounting each volume.
- VSCode:
Exec into Container...andShow Container Logs...commands, reachable from the tree and the command palette. Exec was previously reachable only from inside the webview, despite a documentedexec.defaultShellsetting. - VSCode: clicking a tree item opens it; unhealthy and starting containers are now visually distinct.
Changed¶
- BREAKING (CLI): requires Node >= 22.12.0. Ink 7 and Commander 15 need it, and Node 20 is end-of-life.
- Dependencies: Ink 7, Commander 15, dockerode 5, TypeScript 6.0.3, Vitest 4,
ESLint 10,
@types/dockerode4. TypeScript 7 is deferred while typescript-eslint's peer range excludes it. - Removed the unused
js-yamlruntime dependency from the shared package. @types/vscodeis pinned to matchengines.vscode, which it previously floated 24 minor versions above.- VSCode declares
extensionKind: workspace, so Remote-SSH and dev-container sessions target the remote daemon; and ships a minified bundle via avscode:prepublishhook that was missing. - VSCode runs in an untrusted workspace with
untrustedWorkspaces: "limited". Containers, images, volumes and networks behave normally; compose is disabled, becausedocker compose config/upreads and executes a compose file the workspace itself controls. Previously the extension was disabled outright in Restricted Mode. - Accessibility: the webview list now takes focus so screen readers announce selection, decorative glyphs are hidden, mouse-only affordances became real buttons, and modal overlays manage focus.
- Both surfaces work outside a dark theme: hardcoded status colours became theme variables, and the TUI inherits the terminal's own foreground.
[0.3.0] - 2026-07-10¶
Added¶
CLI¶
ps --format <table|json>and-q/--quietfor scripting; table output is width-aware on a TTY and uses natural widths when pipedlogs --no-follow;-fnow defaults on only when attached to a terminal, so pipedlogsoutput terminates instead of hanging — non-follow output is demultiplexed with correct stderr tagging- Root
--no-colorflag; colored output honorsNO_COLOR,FORCE_COLOR, and TTY detection — no more raw escape codes in piped/CI output - Root
--verboseflag — errors print one friendly line by default, full details with--verboseorDEBUG --socketacceptsunix://andtcp:///http:///https://URLs in addition to bare socket paths, and is now honored bypsandlogs(previously silently ignored outside the dashboard)- Paging keys:
PgUp/PgDnscroll a full page,Ctrl+D/Ctrl+Ua half page;l/→enters the detail pane (vim symmetry withh) - Log follow-pause — scrolling up on a logs tab pauses tailing (
⏸ follow paused — G to resume); reaching the bottom orGresumes - Stacked toasts — up to 3 recent toasts render below the tab bar instead of overwriting each other; failure toasts carry the actual Docker error text
- Mouse support — click to select items and switch panel/detail tabs, clickable overlay buttons (confirm Yes/No, menu and sort rows), right-click opens the actions menu; clicking outside cancels
- Connection-aware empty states (
Connecting to Docker…,Docker daemon unreachable) and actionable daemon-unreachable hints mapped fromEACCES/ENOENT/ECONNREFUSED/ETIMEDOUT - Pressing a global key that isn't available in the current context shows a
Not available heretoast instead of silently doing nothing
VSCode¶
- Extension settings —
sidekick-docker.socketPath(socket path,unix://, ortcp://host:port),refreshIntervalSeconds,statusBar.visible, andexec.defaultShell; socket/refresh changes apply live without a reload, and an invalidsocketPathwarns instead of silently connecting to the default - Dashboard survives window reloads — active panel, selection, detail tab, sort, layout, and filter are restored
Sidekick Docker: Open Dashboard to the Sidecommand; default keybindings —Ctrl+Alt+Dopens the dashboard (all platforms),Ctrl/Cmd+Alt+Rrefreshes the tree- Tree view: per-state context menus (Restart, Pause, Unpause, Remove with a naming modal), compose project sub-groups with container counts, and welcome states — "Docker daemon is not reachable" with a Retry button, and a real "No containers found" view
- Dashboard mouse actions — right-click a row or click its
⋯button to open the actions menu at the pointer; clickable status-bar hint chips; overlays close on outside click - Keyboard parity with the TUI —
mpins the compare pane,ffocuses the log filter,Shift+J/Shift+Kscroll the compare pane,F5refreshes,PgUp/PgDnandCtrl+D/Ctrl+Upage - Connection-aware dashboard — skeleton rows and a pulsing
connecting…dot while connecting; a persistent banner with Retry when the daemon is down - Health badges on container rows (
✓/✗/◌); sticky error toasts with Copy and dismiss buttons - Accessibility — ARIA roles and selection states,
aria-livetoasts and connection status, visible focus outlines,prefers-reduced-motionsupport, and a text band on stat bars so color is not the only overload signal
Shared¶
parseDockerEndpoint()— parses bare socket paths,unix://, andtcp:///http:///https://URLs into client options;httpsis selected for thehttps://scheme or the scheme-ambiguoustcp://on port 2376describeDockerEndpoint()andexplainDockerUnreachable()— human-readable endpoint descriptions and errno-mapped one-line hints for connection failuresDockerClient.pingDetailed()— preserves the underlying error so callers can explain why the daemon is unreachable;errorCode()extracts Node errno codesdockerCliEnv()—DOCKER_HOST/DOCKER_TLS_VERIFYoverrides so spawneddockerCLI processes (compose) target the same endpoint as the API clientComposeClientaccepts environment overrides for spawneddocker composeprocesses;ComposeDetectorrecords each project's source directory and config files from compose labelsprotocol?: 'http' | 'https'option onDockerClientOptionsfor TLS connections to remote daemons
Changed¶
CLI¶
- Confirm modals are safe by default —
Enterandqcancel, No is the visually-safe default, the destructive Yes button is red; confirms name their target (Remove container "web-1"?) and prune confirms show live counts - Prune actions report results (
Pruned — 1.2 GB reclaimed); Copy Logs reports the copied line count; toast lifetimes tuned (info 2.5s, errors 6s) zcycles three layout modes (Normal → Wide → Expanded); Wide adapts to terminal width instead of starving the detail pane- Log filter (
f) works on any tailing logs tab including Services; pinning a compare target (m) jumps to the logs tab so the split view appears immediately - Help overlay and status-bar hints are generated from the keybinding registry (
ink/keyRegistry.ts), so they can no longer drift from the actual bindings - Dependency refresh — TypeScript 5.9, React 19.2, esbuild 0.28, node-pty 1.1;
npm auditreports 0 known vulnerabilities
VSCode¶
- One feedback voice for all Docker actions — progress notifications for slow operations, success toasts naming the item, error toasts with the real message; uniform across tree, quick picks, and dashboard
- Confirmation dialogs name their target, destructive/batch confirms are styled red, and
Enteractivates the focused button (Cancel by default) - All commands categorized under "Sidekick Docker"; tree-only commands hidden from the palette
- Clicking a container in the tree no longer force-opens the dashboard (an inline icon does); tree items keep stable identities so collapse state survives refreshes
- Keyboard-opened actions menu (
x) anchors at the selected row instead of screen center
Fixed¶
CLI¶
- Actions-menu confirmations — choosing a destructive action from the
x/right-click menu now shows the confirm modal; previously the menu close clobbered it and the action silently did nothing - Dashboard compose actions (up/down/restart/stop) run against the
--socketdaemon viaDOCKER_HOSTinstead of always the local default context - Compare mode can reach the newest log lines — the column-header row was double-budgeted against the viewport, permanently hiding the last two lines
- Clicks and right-clicks on the
▼indicator row or blank rows below the side list no longer select or act on off-screen items qcan finally be typed into the filter and log-filter inputs (rabbitmq,sqlite, …);Ctrl+Calways quits, even with an overlay open- Dual-stack port bindings no longer listed twice (
18080:80/tcp, 18080:80/tcpcollapses to one entry) inpsand the TUI --tailis validated up front;ps --format json | headexits 0 on a closed pipe instead of printing a stack trace- Side-list click off-by-one (the panel title row was a live click target); status bar no longer wraps on 60–80-column terminals;
▲/▼indicator rows are budgeted inside bordered panes xno longer opens an empty actions menu for items with no applicable actions
VSCode¶
- Global shortcuts no longer fire while an input has focus — typing in the log filter previously switched panels on digits and could start/stop/remove containers on letter keys
- Compose actions run in the compose project's own directory (resolved from the working dir and config files Docker recorded for the project), falling back to the workspace folder — instead of whatever directory the extension host started in
- Daemon-down state is reported correctly at startup and mid-session — the tree shows the retry welcome instead of "No containers found" with a healthy status bar
- Rapid Retry clicks or live settings changes can no longer leak a duplicate Docker connection (orphaned event stream + refresh timer) or crash the dashboard initialization — init is now single-flight
F5/refresh retries the connection when the dashboard is disconnected instead of silently doing nothing- No more red
disconnectedflash on first paint and no misleading "No containers" empty state while the first connection attempt is in flight - Log filter text containing double quotes no longer breaks the filter input (attribute escaping applied to all HTML attribute interpolations)
Shared¶
- An explicit
socketPathpins the endpoint even whenDOCKER_HOSTis set — docker-modem silently preferred the environment host, so--socket /pathand the VSCodesocketPathsetting targeted the wrong daemon - An explicit
http://endpoint on port 2376 stays plain HTTP (TLS is only inferred for the scheme-ambiguoustcp://form) formatPorts()deduplicates mappings Docker reports once per bind address (IPv4 + IPv6)- Non-follow log fetches from non-TTY containers demultiplex Docker's frame format (no leaked headers, correct stderr tagging); TTY output with CRLF line endings parses timestamps and strips trailing carriage returns
[0.2.6] - 2026-03-29¶
Fixed¶
CLI¶
- Fix persistent heap OOM crash when running in slow terminals (e.g. VSCode integrated terminal) — stdout backpressure from Ink renders now skips frames when the write buffer exceeds the high-water mark instead of accumulating indefinitely
- Debounce event-driven refreshes in
DockerState(500ms) — health_status, start, create, and other rapid Docker events no longer each trigger their own overlappingrefresh()call - Bound the compose log entries queue at 1000 — previously unbounded, the queue between the
docker compose logschild process and the async generator could grow without limit
Shared¶
- Copy
Bufferremainder instead ofsubarrayview inDockerClient.streamLogs()—subarray()kept the entire parent buffer alive; now usesBuffer.from()to create an independent copy so the large combined buffer can be GC'd immediately
Changed¶
CLI¶
SIDEKICK_DEBUG_STREAMS=1diagnostics now include stdout buffer fill level (writableLength/writableHighWaterMark), external memory, and array buffer usage
[0.2.5] - 2026-03-28¶
Fixed¶
CLI¶
- Fix JavaScript heap out-of-memory crash after extended use (~2-3 hours) caused by multiple memory leaks
- Clean up
inspectedEnv,containerChanges, andimageLayerscaches on container destroy and periodic refresh — previously entries were never removed, leaking indefinitely - Cap
LogTemplateEngineat 500 template groups globally — previously unbounded, accumulating thousands of groups for containers with highly variable log patterns - Prune
StatsCollectorhistory entries for non-running containers on periodic refresh - Deterministic stream teardown using
AbortSignal— switching containers or stopping streams now immediately destroys the underlying Docker HTTP connection instead of waiting for the next chunk - Eliminate unnecessary shallow array copies in
getMetrics()called every render cycle — return direct references since consumers never mutate - Cache colorized log output with
WeakMap— avoids re-tokenizing and re-colorizing all 1000 log lines every render, reducing per-render allocations from ~100K objects to near zero - Eliminate
join('\n')→split('\n')round-trip in log tab rendering — log tabs now returnstring[]directly
Shared¶
- Add
signal?: AbortSignalparameter toDockerClient.streamLogs(),DockerClient.streamStats(), andComposeClient.streamLogs()for immediate stream teardown - Add
StatsCollector.prune()method to remove history for non-active containers - Add
LogTemplateEngine.getDiagnostics()for group count, dropped groups, and total lines
Changed¶
CLI¶
- Render throttle increased from 100ms to 200ms (10fps → 5fps) — still smooth for a TUI and halves GC pressure
DetailTab.render()return type widened tostring | string[]to avoid wasteful string conversionsBaseStreamManagernow usesAbortControllerper stream with a generation counter to prevent stale reconnects
Added¶
CLI¶
SIDEKICK_DEBUG_STREAMS=1environment variable enables periodic memory and template diagnostics (every 60s) for debugging long-running sessions
[0.2.4] - 2026-03-26¶
Fixed¶
CLI¶
- Fix crash on startup:
Cannot access 'renderTimer' before initialization—renderTimerdeclaration was after its first usage via React effect mount chain (onViewStateChange→flushLogsNow→scheduleRender); moved declaration before stream manager callbacks
[0.2.3] - 2026-03-26¶
Added¶
Dual-Log Compare Mode¶
- Side-by-side log comparison — pin a second container or service to view both log streams simultaneously in left/right columns
mkey pins/unpins a compare target on Containers and Services panels (CLI)Shift+J/Shift+Kscrolls the secondary (right) compare pane when in detail focus (CLI)- Pin button on side list items in VS Code extension (hover-visible) to toggle compare mode
- Per-panel pin memory — each panel remembers its compare target independently when switching panels
- Auto-clear compare when the selected item matches the pinned item
- Log filter applies to both compare panes independently
- Severity count badges shown per-pane in compare mode
CLI¶
- New
CompareDetailPanecomponent rendering two fixed-width log columns with ANSI-safe clipping clipAnsi()utility for truncating ANSI-colored strings to a visible character width- Shared
renderLogLines()helper extracted from panel log rendering, used by both primary and secondary panes m:Comparecontextual hint in status bar when on Logs tab
VS Code Extension¶
- Side-by-side CSS layout (
.log-compare-container) with independently scrollable panes toggleCompareItemwebview→extension message with Zod schema validation- Secondary log and compose log stream lifecycle in
DockerService(demand-driven, stops when not viewing Logs tab)
[0.2.2] - 2026-03-24¶
Fixed¶
- Copy logs (
ckey) now works on the Services panel — previously only worked on Containers panel (both CLI and VS Code) - VS Code extension copy logs function now correctly reads compose logs when on the Services panel
[0.2.1] - 2026-03-24¶
Improved¶
- Debounced log rendering with 100ms flush window, reducing re-renders during high-throughput log output
- View-state-driven streaming — stats and log streams now activate based on which detail tab is visible and which sort field is active, instead of starting on every selection
- VS Code extension stops all background streams when the dashboard webview is hidden, restarting on focus
- Smart stream demand in VS Code: logs only stream on Containers panel, compose logs only on Services panel, stats only when the Stats tab is active or sorting by live metrics
Fixed¶
- Add missing
zoddependency to VS Code extension package for CI build
[0.2.0] - 2026-03-14¶
Added¶
Container Filesystem Inspector¶
- New Files detail tab on the Containers panel showing all filesystem changes made inside a container
- Color-coded change markers: green
Afor added, yellowCfor changed, redDfor deleted files - Uses Docker's
container.changes()API — works on both running and stopped containers - Available in both TUI and VS Code extension
Image Layer Explorer¶
- New Layers detail tab on the Images panel showing the full layer history of an image
- Displays layer number, size, and the Dockerfile instruction that created it
- Shows total image size and highlights the largest layer
- Uses Docker's
image.history()API - Available in both TUI and VS Code extension
Docker API Layer (sidekick-docker-shared)¶
DockerClient.getContainerChanges(id)— returns typedFilesystemChange[]DockerClient.getImageHistory(nameOrId)— returns typedImageLayer[]- Zod schemas for container changes and image history API responses
VS Code Extension¶
- Network I/O rate sparklines (RX/TX bytes/sec) in Stats tab
- Block I/O rate sparklines (read/write bytes/sec) in Stats tab
- Log severity sparkline in Stats tab
Improved¶
- Comprehensive Zod runtime validation for all Docker API responses
- Modular shared package with enforced import DAG and integration tests
- Sub-path exports eliminating code forks in VSCode package
BaseStreamManagerextracted from three identical stream manager implementations- Async action feedback, contextual hints, and tiered confirmation modals in TUI
[0.1.5] - 2026-03-08¶
Added¶
Docker API Layer (sidekick-docker-shared)¶
DockerClient.pauseContainer(id)andDockerClient.unpauseContainer(id)methods- Health status parsing from Docker
Statusstring — extractshealthy,unhealthy, orstartingfrom status text (e.g., "Up 5 minutes (healthy)") healthStatusfield onContainerInfotype- Block I/O stats extraction —
blockReadandblockWritefields onContainerStats, parsed fromblkio_stats.io_service_bytes_recursive StatsCollector.getNetworkRxRateSeries()/getNetworkTxRateSeries()— compute bytes/sec from consecutive cumulative sample deltasStatsCollector.getBlockReadRateSeries()/getBlockWriteRateSeries()— compute block I/O bytes/sec rates- 3 new unit tests for rate series computation (network and block I/O)
TUI Dashboard¶
- Pause (
p) and Unpause (u) container actions in the Containers panel - Show all / running-only toggle (
akey) — filters container list to show only running/paused containers when toggled off - Health status indicator in container list items — colored badge (green=healthy, red=unhealthy, yellow=starting) appended to container name
- Health status in Config detail tab
- Network I/O sparklines — RX/TX rate sparklines (bytes/sec) below the Net line in the Stats tab
- Block I/O stats line in Stats tab showing cumulative read/write bytes with rate sparklines
- Container sorting (
okey opens sort overlay) — sort by state, name, CPU%, memory%, network I/O, block I/O, or PIDs - Reverse sort toggle (
Rkey) — reverses current sort direction - Sort overlay with j/k navigation, Enter to apply, R to reverse within overlay
- New keybindings added to Help overlay:
a,o,R
VS Code Extension¶
- Pause and Unpause container actions in context menu and action handler
- Health status display in Config detail tab (colored: green/red/yellow)
- Block I/O stats row in Stats detail tab (read/write bytes)
[0.1.4] - 2026-03-07¶
Added¶
TUI Dashboard¶
- 3-state layout cycle (
zkey): Normal → Wide → Expanded → Normal. Wide mode uses a 42-column side panel so full container/resource names are visible without truncation - Copy logs to clipboard (
ckey on Containers panel) — copies buffered log text to system clipboard, respects active log filter. Uses platform-native clipboard (pbcopy, xclip, xsel, wl-copy)
VS Code Extension¶
- Tooltip on hover for side list items — shows full untruncated name for containers, images, volumes, networks, and services via HTML
titleattribute - Copy logs to clipboard (
ckey or Copy button in log filter bar) — copies buffered log text to clipboard viavscode.env.clipboard, respects active log filter
Changed¶
- Side panel truncation limits increased across all CLI panels to accommodate Wide layout mode (SideList already clips to available width in Normal mode)
[0.1.3] - 2026-03-03¶
Improved¶
Code Quality & Reliability¶
- Extract
ReconnectSchedulerutility replacing three identical reconnect implementations across stream managers - Add
errorMessage()helper eliminating 10 repeatedinstanceofchecks - Consolidate
MAX_LOG_LINESconstant to shared package - Extract
withDockerClienthelper in VSCode extension removing five identical command handler bodies - Extract
useKeyboardHandleranduseMouseHandlerhooks from Dashboard.tsx (887 → ~370 lines) - Extract shared types to reduce duplication across dashboard panels
- Replace silent
.catch(() => {})with descriptive debug logging across all packages - Wire AbortController signal through EventWatcher → DockerClient.streamEvents for proper stream teardown
- Add 24 new tests: DockerState (13), LogStreamManager (6), StatsStreamManager (5)
Security & Error Handling¶
- Replace
Math.random()withcrypto.randomBytes()for CSP nonce generation - Fix redundant ternary that always evaluated to
'running'in DockerState - Extract magic numbers to named constants (toast durations, log buffer limits, reserved UI rows, reconnect delays)
- Add error logging to all stream manager catch blocks (previously silent)
- Add bounded retries with exponential backoff to Log/StatsStreamManager
- Add auto-reconnect to ComposeLogStreamManager (previously missing)
- Eliminate non-null assertions in ServicesPanel via discriminated union type
- Fix DockerClient resource leaks in VSCode extension commands (try/finally)
- Fix DockerService leak on failed initialize in DockerDashboardProvider
- Fix ComposeLogStreamManager missing exponential backoff (was retrying forever at fixed 2s)
- Make EventWatcher sleep cancellable on stop()
TUI Dashboard UX¶
- SideList: preserve icon color in focused selection (no longer lost to uniform cyan inverse)
- StatusBar: color-code destructive actions red, add focus indicator, condense navigation hints, visual separators between sections
- ContextMenuOverlay: add j/k/Enter/Esc keyboard hints, destructive actions shown in red, brand color border
- ConfirmOverlay: warning icon header, "cannot be undone" hint, colored button badges, "or Esc to cancel" hint
- FilterOverlay: brand-blue background with search icon, Enter/Esc help text
- LogFilterOverlay: use brand color instead of generic blue
- DetailTabBar: show tab label for single-tab panels, clarify hint to "[/] cycle tabs"
- TabBar: color-code container count badges (green=all running, yellow=partial)
- TooSmallOverlay: show exactly how much wider/taller the terminal needs to be, added branding
- ToastNotification: severity-specific icons, colored background instead of text-only, readable warning contrast
- HelpOverlay: keyboard keys rendered as colored badges, horizontal rule dividers, danger indicators on destructive actions
- VersionOverlay: horizontal rule dividers, brand-blue version text
- SideList empty states: styled no-match indicator, command hints with brand-blue highlight
VS Code Extension¶
- Inject version from package.json at build time instead of hardcoded value
Fixed¶
bump-version.shnow includes rootpackage.json
[0.1.2] - 2026-03-01¶
Added¶
Log Analytics Engine (sidekick-docker-shared)¶
- Token-level log syntax highlighting — HTTP methods, status codes, URLs, IPs, timestamps, JSON keys, state keywords, and paths each get distinct colors (replaces whole-line severity coloring)
- Log content search and filtering with two modes: exact substring (case-insensitive) and fuzzy (AND-of-words), with match highlighting and match count display
- Severity counting — running tallies of ERROR, WARN, INFO, DEBUG, and OTHER per log stream, displayed as colored badges in the Logs tab header
- Structured log parsing — auto-detects JSON, logfmt, and plain text formats; extracts level, message, timestamp, and structured fields from JSON and logfmt logs
- Severity time-series — 60-bucket ring buffer tracking per-severity counts over time (1-minute buckets), rendered as a color-coded sparkline in the Stats tab
- Log pattern clustering — Drain-like algorithm groups similar log lines into templates with
<*>wildcards, displayed in a new Patterns detail tab ranked by frequency
TUI Dashboard¶
fkey opens log filter overlay when viewing the Logs tab (exact/fuzzy mode toggle withTab,Escto clear)- Severity counts header row in Logs tab (
E:n W:n I:n D:n, each colored by severity) - Log severity sparkline in Stats tab below CPU/Memory charts (colored by dominant severity per time bucket)
- New Patterns detail tab on Containers panel showing top log templates with frequency counts
VS Code Extension¶
- Log filter search bar with mode toggle and match count in Logs tab
- Severity count badges in Logs tab header
- New Patterns detail tab with template frequency ranking
- Token-level syntax highlighting CSS classes for all log token types
[0.1.1] - 2026-02-28¶
Added¶
VS Code Extension — Sidebar & Tree View¶
- Activity bar icon with dedicated "Sidekick Docker" view container
- Container tree view grouped by state (Running / Stopped / Other)
- Tree view badge showing running container count
- Inline Start/Stop buttons on container tree items (contextual per state)
- Refresh and Open Dashboard buttons in tree view title bar
- Welcome view with "Open Dashboard" button when no containers are present
- Status bar indicator (right-aligned) showing running/total container counts
- Status bar shows "Docker offline" warning when daemon is unreachable
- Click container in tree to open dashboard focused on that container
VS Code Extension — Quick Pick Commands¶
Sidekick Docker: Start Container...— pick from stopped containersSidekick Docker: Stop Container...— pick from running containersSidekick Docker: Restart Container...— pick from running containers
VS Code Extension — Stats Sparklines¶
- CPU and memory sparkline charts (Unicode block characters) below progress bars
- History data from StatsCollector (60 samples) sent to webview
Compose Log Streaming¶
ComposeClient.streamLogs()async generator for real-time compose log streaming- CLI Services panel now shows live logs (replaces placeholder)
- VS Code Services panel Logs tab with real-time compose log streaming
- Selection-driven streaming: starts on select, stops on deselect
Fixed¶
- Panel tab clicks not working in VS Code webview (mousedown handler was destroying DOM before click fired)
- Double-spaced log lines in VS Code webview (whitespace: pre + display: flex + newline join)
[0.1.0] - 2026-02-28¶
Added¶
Terminal Dashboard (TUI)¶
- Five-panel layout: Containers, Compose Services, Images, Volumes, Networks
- Vi keybindings:
j/knavigation,g/Gjump,1-5panel switch,[/]detail tab cycling - Context menus with per-resource actions (start, stop, restart, remove, exec, up, down, prune)
- Filter/search with
/across all resource lists - Confirmation modals for all destructive actions (remove, prune)
- Help overlay (
?) with full keybinding reference - Mouse support: click to select, scroll to navigate
- Toast notifications for action feedback
- Expanded layout toggle (
z) for detail pane focus
Real-Time Streaming¶
- Live log streaming with stdout/stderr coloring (1000-line ring buffer)
- Stats sparklines for CPU and memory usage (60-sample ring buffer)
- Docker event watching with auto-reconnect on connection loss
Compose Support¶
- Automatic project detection from container labels (
com.docker.compose.*) - Fallback detection via
docker compose config - Merged view showing running containers and planned services
- Per-project actions: up, down, restart, stop
Interactive Exec¶
- Drop into a running container shell via
node-pty - Supports bash, sh, and ash
CLI Commands¶
sidekick-docker ps— list containers (non-interactive)sidekick-docker logs <container>— stream container logs--socket <path>flag for custom Docker socket--versionflag
Docker API Layer (sidekick-docker-shared)¶
DockerClientfacade wrapping dockerode with typed methodsComposeDetectorfor label-based and file-based project discoveryComposeClientwrappingdocker composeCLI commandsEventWatcherwith auto-reconnect and typed callbacksStatsCollectorper-container ring buffer with CPU/memory time series- Full type system:
ContainerInfo,ImageInfo,VolumeInfo,NetworkInfo,ComposeProject,DockerEvent, and more - Utility formatters:
formatBytes,formatCpu,stateIcon,stateColor,truncate
VS Code Extension¶
- Webview-based Docker dashboard with the same panel layout as the TUI
- Typed message protocol for extension-to-webview communication
- Command palette integration:
Sidekick Docker: Open Dashboard
Build System¶
- tsc for shared library (CommonJS + declarations)
- esbuild for CLI (single ESM binary) and VS Code (dual CJS + IIFE output)
bump-version.shscript for synchronized version updates across all 3 packages