release notes/v2.1.0.md
k6 v2.1.0 is here 🎉! This release includes:
--features, the K6_FEATURES environment variable, and a k6 features discovery command — shipping with experimental native histograms for trend metrics as its first flag.proxy option for browser contexts.k6 x, so binaries can report which extension commands they expose.There are no breaking changes in this release.
k6 cloud test list command #6007A new k6 cloud test command group has been added, with a k6 cloud test list subcommand that lists the load tests of a Grafana Cloud k6 project. It complements the k6 cloud project list command introduced in v2.0.0.
The project to list tests for is resolved in the following order:
--project-id flag.K6_CLOUD_PROJECT_ID environment variable (cloud config projectID).k6 cloud login.Output defaults to a human-readable table. Pass --json to emit a JSON array instead, mirroring the format established by k6 cloud project list.
k6 cloud test list
k6 cloud test list --project-id 12345
k6 cloud test list --json
k6 now has an opt-in feature-flag mechanism for trialing new, not-yet-stable behavior without affecting existing runs. Flags can be enabled on k6 run and k6 cloud run through the --features flag (comma-separated or repeated), the K6_FEATURES environment variable, or the features key in config.json. Enabled flags are surfaced as metric tags and propagated into archives and cloud workers so a run behaves consistently wherever it executes.
Use k6 features (or k6 features --json) to discover the available flags and their lifecycle:
$ k6 features
FEATURE LIFECYCLE DESCRIPTION
native-histograms Experimental Use native histograms for trend metrics
The first flag shipped is native-histograms, an experimental flag that makes k6 use native histograms for trend metrics:
k6 run --features native-histograms script.js
# or
K6_FEATURES=native-histograms k6 run script.js
k6 x #5972Running k6 x now lists the available subcommands — both the ones baked into the binary and those advertised by the extension registry (official and community). Tab-completion surfaces the same set once the catalog has been cached locally by a prior k6 x run, so completion never blocks on the network.
$ k6 x
...
Available Commands:
agent Bootstrap an AI-assisted k6 testing workflow in any editor
docs CLI k6 docs for AI agents and users
explore Explore k6 extensions for Automatic Resolution
mcp An MCP server for k6 for AI agents
This makes a k6 binary self-describing — particularly useful for AI agents driving k6, which previously had no way to introspect which extension subcommands were available.
Browser contexts can now be configured with a context-level proxy option, letting you route a context's traffic through a proxy without launching a custom-built binary or relying on environment proxy variables (which only affected k6's DevTools WebSocket connection). The option is wired to Chromium through Target.createBrowserContext, and invalid proxy configuration now fails early when proxy.server is missing. Thanks, @nightt5879!
const context = await browser.newContext({
proxy: {
server: 'http://proxy.test:8080',
bypass: 'localhost,127.0.0.1',
},
});
locator.isInViewport() #6023A new locator.isInViewport() method reports whether an element intersects the browser viewport. It accepts an optional ratio (0 to 1) that sets how much of the element must be visible, defaulting to 0 so any visible pixel counts, matching Playwright's toBeInViewport semantics. The call waits for the element to attach, honoring the timeout option, then measures the intersection once. Thanks, @Anuragp22!
const button = page.locator('button#submit');
if (await button.isInViewport()) {
await button.click();
}
The OpenTelemetry output's HTTP exporter can now send HTTP Basic Auth credentials. Set them through the K6_OTEL_HTTP_EXPORTER_USERNAME and K6_OTEL_HTTP_EXPORTER_PASSWORD environment variables, or the username and password keys in the output config.
K6_OTEL_HTTP_EXPORTER_USERNAME=user \
K6_OTEL_HTTP_EXPORTER_PASSWORD=secret \
k6 run --out opentelemetry script.js
single() selection helper in k6/html #6002Selection.single(selector) returns at most one matching element, backed by goquery's Single matcher for a faster lookup than find() when you only need the first match. Thanks, @rohan-patnaik!
import { parseHTML } from 'k6/html';
const doc = parseHTML(content);
const title = doc.single('h1').text();
module=browser so that browser errors surfaced in Grafana Cloud Logs can be filtered separately from other log sources.--vus flag work as a standalone execution shortcut instead of being silently ignored when a script defines scenarios. Running k6 run script.js --vus N now creates a shared-iterations scenario with N VUs and N iterations, overriding any script-defined scenarios with a warning — consistent with how --iterations, --duration, and --stages already behave. Thanks, @Reranko05!NaN) now fails parsing with a clear message instead of being silently accepted. Thanks, @immanuwell!0o600, inside a 0o700 directory). The file can hold the Grafana Cloud API token (collectors.cloud.token), so tightening it keeps other local users on shared hosts (CI runners, multi-user boxes, sidecar containers) from reading the token. Existing configs are upgraded on the next write, for example the next k6 cloud login.s3cmd via apt instead of pip to fix the k6packager image build.logrus, improving test isolation.TestPageScreenshotFullpage browser test.setup-go workflows.golang.org/x/net to v0.55.0 [security].golang.org/x/crypto to v0.52.0 [security].google.golang.org/grpc to v1.81.1.grafana/shared-workflows/get-vault-secrets to v1.3.2.grafana/shared-workflows/azure-trusted-signing to v1.0.2.github/codeql-action to v4.35.4.grafana/shared-workflows/dockerhub-login to v1.0.4.PageScreenshotOptions parsing into the mapping layer.openspec/.x/net/http2 implementation on the gotip CI test job.Dockerfile on the v1.x branch.go.opentelemetry.io/otel to v1.44.0.golang.org/x dependencies (crypto to v0.53.0, net to v0.56.0, term to v0.44.0).golang.org/x/sync to v0.21.0.github.com/tidwall/gjson to v1.19.0.github.com/mccutchen/go-httpbin/v2 to v2.23.0.github.com/mattn/go-colorable to v0.1.15.1.26.4.3.24.0.trixie-20260518.A huge thank you to the external contributors who helped during this release: @nightt5879, @Reranko05, @rohan-patnaik, @immanuwell, and @Anuragp22! 🙏