Release Notes
What's new in each release.
v0.5.3
Staged bootup order
Items now accept an optional stage property (non-negative integer, defaults to 0) that controls deployment order. Stage N+1 containers don't start until all stage N items are healthy — no more custom entrypoint scripts with wait loops.
items:
- $ref: ../shared/postgres.yaml
stage: 0
- $ref: ../shared/redis.yaml
stage: 0
- $ref: ../shared/lago-api.yaml
stage: 1Stage 0 boots and becomes healthy, then stage 1 deploys. Works on SERVICE, DATABASE, and BROKER items. Existing definitions are unaffected — items without stage default to stage 0 (all parallel, same as before). Stage numbers are sort keys, not indices — gaps are fine. See the Staged bootup order docs for details.
Build-time {{VAR}} in item fields
{{VAR}} references now resolve at build time in item fields (env values, images, passwords, etc.), not just at runtime in test steps. The resolver builds a merged variable map: config.yaml env entries as baseline, then definition-level variables merged on top.
variables:
REDIS_PASSWORD: changeme
items:
- type: DATABASE
name: my-redis
database: redis
dbPassword: '{{REDIS_PASSWORD}}'
- type: SERVICE
name: my-server
port: 3000
healthCheck: /health
env:
- name: REDIS_URL
value: 'redis://:{{REDIS_PASSWORD}}@my-redis:6379'Shared fragments referenced via $ref also pick up definition-level variables — fragments stay generic and reusable across definitions. Unresolved {{VAR}} in items is an error. See Build-time vs runtime variables for the full resolution rules.
Other
- Broker items now included in test-agent's item ID → name mapping for health log readability
v0.5.2
Mount files
SERVICE items now support a mountFiles field that mounts local files into the container at a specific path (read-only). This eliminates the need for wrapper Dockerfiles that exist solely to COPY config files, keys, or scripts into an image.
items:
- type: SERVICE
name: my-service
image: my-service:latest
port: 3000
healthCheck: /health
mountFiles:
- source: ../configs/app.toml
target: /etc/app/config.toml
- source: ../scripts/entrypoint.sh
target: /app/scripts/entrypoint.shEach entry has a source (relative path from the definition file) and a target (absolute path inside the container). See the Services docs for details.
Entrypoint override
SERVICE items now support an entrypoint field to override the Docker image's ENTRYPOINT. Combined with mountFiles, this lets you inject custom startup scripts into any off-the-shelf image without a wrapper Dockerfile.
Custom database images
DATABASE items now support an image field for using custom or extended database images (e.g. Postgres with pg_partman). This is mutually exclusive with version — use one or the other.
items:
- type: DATABASE
name: lago-postgres
database: postgres
image: getlago/postgres-partman:15.0-alpineBug fixes
stopOnFailure: false— fixed a bug where settingstopOnFailure: falseon a step had no effect. Failed assertions now log a warning and continue to the next step instead of stopping the test.
v0.5.1
Broker proxies (AMQP & Kafka)
New Go sidecar proxies that capture message broker traffic for test assertions, the same way the interceptor captures HTTP and the DB proxies capture database queries.
- AMQP proxy — parses the AMQP 0-9-1 wire protocol at the frame level, tracking channel state machines through method frames, content headers, and body frames. Extracts exchange names, routing keys, queue names, and delivery metadata.
- Kafka proxy — parses the Kafka wire protocol, tracking correlation IDs to match requests with responses. Extracts messages from Produce requests and Fetch responses, handling flexible-version headers and record batch decoding.
Both proxies forward captured messages to Control Tower for storage and to the test-agent for inline assertion evaluation.
Definition syntax
items:
- type: BROKER
name: rabbitmq
broker: amqp
- type: BROKER
name: kafka
broker: kafkaBroker items support optional image, port, healthCheck, env, and command fields for custom broker configurations. The proxy sidecar is deployed alongside the broker container automatically, and your application services connect through the proxy transparently. See the Brokers docs for the full reference.
Message log pipeline
Captured messages flow through a complete pipeline: broker proxy capture → Control Tower ingestion and storage → test-agent document assembly within step time windows → assertion evaluation against message content and metadata.
The dokkimi dump command now includes message logs in its output for debugging.
Elasticsearch support
Elasticsearch works as a standard SERVICE item with its REST API doubling as both application endpoint and health check:
items:
- type: SERVICE
name: elasticsearch
image: elasticsearch:8.17.0
port: 9200
healthCheck: /_cluster/health
env:
- name: discovery.type
value: single-node
- name: xpack.security.enabled
value: 'false'Gzip decompression
The interceptor now detects Content-Encoding: gzip on HTTP responses and decompresses bodies for logging. The original compressed bytes are forwarded to the client unchanged, so application behavior is unaffected while traffic logs show readable content.
Bug fixes & hardening
- AMQP frame size cap — 100MB maximum frame size to prevent overflow panics on malformed frames, matching the Kafka proxy's existing limit
- Kafka configmap port —
getNativeBrokerPortwas returning AMQP's port (5672) for all broker types; Kafka now correctly returns 9092 - Express body limit — changed from
Infinityto100mb - Step validator reset —
ResetStepTime()clears the previous step's time window between tests, preventing assertion time window leakage - Kafka content type detection — message log records now detect JSON vs plaintext content types instead of leaving the field empty
- Broker field validation —
validateBrokerItemnow validatesport,healthCheck,command, andenvfields with the same checks as SERVICE items - GHCR publish workflow — broker proxy images are now published to the GitHub Container Registry alongside all other Go sidecar images
New test definitions
- Broker tests —
amqp-publish-consume,amqp-multi-instance,kafka-produce-consume - Load tests —
full-infrastructure,high-volume-parallel,large-payloads,microservice-mesh
v0.5.0
Ground-up rearchitecture of the test engine, a new expression language, and loop support across the entire definition format.
Unified root context ($)
All assertion paths, extract paths, and variable references now resolve against a single document root:
$.response.— HTTP response data$.variables.— extracted and global variables$.request.— the original request$.database.— database query results
This replaces the previous fragmented context where different path prefixes resolved against different objects.
forEach loops
Loops are now supported at every level of a test definition:
- Test level —
tests[].forEach - Step level —
steps[].forEach - Action level —
action.forEach - Assertion block level —
assertions[].forEach - UI substep level
Loop items can be an inline array or a variable reference. as/name bindings with an index property enable dynamic variable names in extract keys.
Inline validation (test-agent rewrite)
Assertion validation now runs inline in the Go test-agent against in-memory logs instead of round-tripping through Control Tower's TypeScript service. This eliminated ~8,900 lines of CT code, replaced with ~4,900 lines of focused Go, and cut average test runtime to ~110s by removing HTTP round-trips and DB queries from the hot path.
- Interceptors and GELF forward logs directly to the test-agent
- Visual matching (go-pixmatch) also moved to test-agent
- Control Tower's new role is slim: receive pre-validated results, store them, update run status
Assertion engine enhancements
transformfield on assertions (e.g.length,keys,values,flatten,unique,lowercase)- Scope-level
forEachandextracton assertion blocks - New operators and tighter validation
- Fixed
countassertion retry logic forgtoperator
JUnit XML reports & CI integration
- Generate JUnit XML reports per test run with per-test timing data
- Post test results as a PR comment (update-in-place) with in-progress indicator
- Write to
$GITHUB_STEP_SUMMARYfor the Actions job summary tab - Aggregate results across multiple
dokkimi runinvocations via--dirflag - Enrich failure output with console logs and test execution errors
- New
dokkimi junitstandalone command (--summary,--dir,--run,--failed)
Test-agent refactor
Broke apart the monolith Go files into focused, testable modules with ~4,000 lines of new unit test coverage.
Definition resolver & validator
- Extracted
config-loader.ts,env-substitution.ts,glob-resolver.tsfrom the monolithresolve.ts - New
validate-loops.tsandvalidate-ui-substeps.tswith ~1,600 lines of loop validation tests validate-helpers.tsfor shared validation utilities
CLI improvements
- Extracted
run-executor.ts,baselines-ops.ts,baselines-views.tsfrom monolith command files - Improved
inspectstep-detail formatting
Docs & landing site
- New Loops docs page
- Updated variable, assertion, and action docs for the unified root syntax
- Two new design docs: unified root context and loops
Other
- VSCode extension: expanded JSON schema and snippets for loops and new assertion fields
- Docker: database config service improvements for concurrent database groups
- GitHub Action:
junit-dirandreportinputs for multi-project support
v0.4.2
Bug fixes
- Fixed hanging CI runs: sidecars now correctly resolve
host.docker.internalwhen Control Tower binds to0.0.0.0, preventing containers from connecting to an unreachable bind address - Fixed stale runs that never clean up: added
RunCleanupServiceto detect and terminate runs stuck in non-terminal states - Fixed test validation race condition:
POST /test-completenow acquires a per-run lock and rechecks completion status, preventing duplicate validation when multiple test agents report simultaneously
New features
- Added
dokkimi stopcommand (CLI + MCP tool) to manually halt a running test suite - Control Tower now binds to the configured host instead of hardcoded
localhost, controlled viaCONTROL_TOWER_HOSTenv var
Improvements
- Simplified service URL builder: split
buildServiceUrl(service, forCluster)boolean flag into two explicit functions - Added unit tests for service URL builders and expanded test-validation controller coverage
- CI pipeline: added
CONTROL_TOWER_HOST: 0.0.0.0env override for integration tests, added config package test step
v0.4.1
Bug fix
- Console log assertions now use Docker's real timestamps instead of Control Tower's wall-clock time, fixing intermittent
consoleAssertionsfailures
Improvements
- Removed all vestigial Fluent Bit references; console logs are now collected via Docker API streaming
- Faster CI pipeline: parallelized Docker builds, added dependency caching, BuildKit cache mounts for Go services
- Bumped Control Tower to Node.js 22, pinned Alpine 3.21 across Go Dockerfiles, bumped db-proxy Go to 1.26
- Fixed CI warnings (Go cache path, upload-artifact v5)
- Updated CI docs page, npm README, and Node.js prerequisite to 22+
v0.4.0
MCP server
Dokkimi now ships with a local MCP server, giving LLMs interactive access to the CLI. Tools include run_tests, dump_results, validate_file, get_reference, and more.
Run history & per-project isolation
- Scoped teardown —
prepareForNewRunstops and prunes runs per-project; other projects' data is never touched - Per-run filesystem layout — snapshots, artifacts, and dump files stored under
~/.dokkimi/runs/{timestamp}/instead of a flat global directory - Configurable retention — completed runs kept up to
maxRunHistory(default 2) per project, with per-project config overrides in~/.dokkimi/config.json - 5 new MCP tools —
diagnose,diff_traffic,watch_run,get_run_history,get_container_status get_trafficfilters — method, statusCode, pathContains, mockedOnly- Restart resilience —
RunStorageServicederives paths from DB on cache miss instead of throwing after a CT restart
MCP config tools & run history browsing
get_config/set_configMCP tools with per-project overrides and source annotations--runflag forinspectanddumpwith interactive run pickerrunIndexparam for MCPdump_resultsto target older runs- Doctor/clean improvements: run storage size check, VACUUM after bulk deletes
Docker-only environments
Removed Kubernetes support — Dokkimi now uses Docker environments exclusively.
VSCode extension updates
Integration with the VSCode Test Explorer. Install locally via scripts/reinstall-ext.sh.
Other
- Updated
llms.txtwith full content - Added GA4 analytics
- AI crawler entries in
robots.txt
v0.3.7
- Fixed a console log race condition that could cause garbled output during concurrent logging
- First public open-source release under the Elastic License 2.0
- Added SECURITY.md and CODE_OF_CONDUCT.md