Download Latest Version walkerOS v4.9.0 source code.zip (13.2 MB)
Home / v4.9.0
Name Modified Size InfoDownloads / Week
Parent folder
README.md 2026-11-04 54.3 kB
walkerOS v4.9.0 source code.tar.gz 2026-11-04 11.1 MB
walkerOS v4.9.0 source code.zip 2026-11-04 13.2 MB
Totals: 3 Items   24.4 MB 0

Changes

The breaker description in the destination config now says which failures open the breaker: retryable ones such as a network error, a timeout or a 429 or 5xx answer, never any other 4xx, a missing setting or a runtime failure. The Segment and RudderStack failure examples carry their event timestamps in milliseconds.

The browser source's setting descriptions now match what the source does: scope takes a DOM node (an Element, Document or ShadowRoot), not a selector; elbLayer takes a queue name, true or false, and an array is not adopted; name has no effect. They appear in the docs settings table and in MCP package_get.

The bundler's dependency mismatch warning now points to config.bundle.overrides in the flow file. examples/flow-complete.json reads its two salts and the Meta access token as $secret. values, the example flows server-collect.json, web-serve.json and flow-selfhost-test.json pass validate --strict, and the telemetry contract says telemetry is opt-in.

The package no longer ships examples/web-serve.js, a stale prebuilt bundle that still sent the old order complete shape, nor examples/test.html, the page that loaded it. Build the browser example yourself with walkeros bundle examples/web-serve.json, as the examples README shows.

walkeros validate checks each step's settings against the package version walkeros bundle installs, inline @version specs on other steps included. Steps that name one package at two inline versions are reported as skipped, since the bundle refuses them.

Strictly necessary cookies no longer grant functional. CookieFirst's necessary category and CookiePro's C0001 are now reported as necessary, so functional follows the visitor's choice for functional cookies. Steps that require functional, such as the session source with consent: 'functional', now wait for that choice. When several categories map to the same group, the group is now granted only if all of them are, as in the Usercentrics source. CookiePro maps C0005 (Social Media) to its own social group instead of marketing, so a step for social media cookies requires social. CookieFirst and Usercentrics match categoryMap keys case-insensitively, like the other CMP sources.

The Usercentrics source no longer declares a ucEvent window event type it never listens to, and its docs name the events it reads, UC_UI_INITIALIZED and UC_UI_CMP_EVENT. The CookieFirst example mock of elb is typed without a cast.

The minimal check of conformance accepts a setting the schema leaves optional when the step needs it under the minimal example's config, such as a site ID that only loadScript: true requires. It starts the step without that setting and keeps it only when init refuses with a config error.

conformance from @walkeros/collector/dev now checks the minimal example of every destination. Pass minimal (the package's examples.minimal, published from src/examples/minimal.ts), or withoutMinimal with the reason the package publishes none. A destination's conformance test that does neither fails until it adds one of the two.

runExamples and conformance from @walkeros/collector/dev always run every example the way walkerOS.json publishes it: each function in the example runs from its source text, without the module it was written in. A function that needs an import fails the package test and names the example. The published option is gone.

An event JSON cannot serialize, such as one with a circular reference, is refused as invalid input. Invalid events are now logged as errors, once per source and minute, and Observe shows the push result's failure code. The conformance kit expects network failures thrown as a StepError, as sendServer and sendWeb do; a raw fetch error fails it. The web bundle walker.js grows by 157 bytes to 39,643 bytes, measured as gzip -9.

buildDev fails the build with a message naming the package when it cannot generate walkerOS.json: a missing or broken dist/dev.mjs, no schemas, or output that is not valid JSON. It used to warn and skip the file. toSerializable moved from @walkeros/config/tsup to @walkeros/core/dev.

buildDev writes the $meta of walkerOS.json with packageMetaOf from @walkeros/core/dev, the same reading the conformance kit uses, so the two cannot disagree. The output is unchanged; a package.json without a name or a version now fails the build with a message instead of publishing a $meta without them.

The gtag and d8a destinations now set analytics_storage from analytics consent instead of functional by default, matching what the Cookiebot, CookieFirst and CookiePro sources report. With the Usercentrics source, map your measurement category to analytics in its categoryMap. If your consent commands report measurement consent as functional, map it yourself, like como: { functional: 'analytics_storage', marketing: ['ad_storage', 'ad_user_data', 'ad_personalization'] }. When several consent keys map to one parameter, the parameter is granted only if all of them are granted in the current consent state; before, the key that came last won.

New Cookiebot consent source. It reads the visitor's choice from window.Cookiebot and Cookiebot's accept and decline events, and maps preferences, statistics and marketing to functional, analytics and marketing. Strictly necessary cookies are reported as necessary and grant no consent group. Implied consent is skipped unless explicitOnly is false, so by default a visitor Cookiebot never asks sends no consent.

The CookieFirst step example for a stored choice now describes what it shows: CookieFirst already holds the visitor's choice when the source starts, and the source emits it from its read at init.

Corrected schema descriptions and type docs: init: true marks a step as already initialized and skips its init(), an open breaker fails events with breaker-open, a timed-out on() handler blocks the destination after one more window, a server flow's observe block has no effect, and the source ingest example wraps its fields in map.

The mapping rule descriptions shown in property tables and package_get now match the behaviour: a condition that returns false moves on to the next rule, batch works only on a destination with pushBatch, extend applies only in @walkeros/transformer-ga4's settings.mapping, and the mappingKey and batch key examples are "product view".

A destination package can publish examples.minimal from src/examples/minimal.ts (MINIMAL_EXAMPLE_FILE): the settings it needs to deliver, credentials named as secrets. composeQuickstart from @walkeros/core/dev turns it into the install line, the integrated code and a complete flow reading each credential as $secret, and throws when they cannot be built. packageMetaOf writes a package's $meta, a single platform as a list.

null is a valid event value; mapping is unchanged and still skips a value that is or contains null. filterValues keeps null and turns a date into its timestamp, so MCP flow_simulate keeps null inputs. A TypeError, RangeError or ReferenceError is now a non-retryable runtime failure instead of transport; Node's fetch failed stays transport. deepMerge and clone ignore __proto__ keys.

New core helpers matchMappingRule, getMappingCandidates, getRequiredConsent and checkConsent (with its ConsentCheck type). processEventMapping takes an optional selected rule, and queued destination entries carry the rule they were selected with (match). The unused Destination.Push type is removed.

Schema descriptions now match the behaviour: setup on destinations, stores and flow steps runs only through walkeros setup; an event cache's stop defaults to true on sources, and update changes only a source's response, on HIT and MISS. They appear in the flow JSON Schema and in MCP.

The source config descriptions of require, setup and ingest now match the behaviour: require delays only on() calls, not init or event capture; setup runs only through walkeros setup; ingest resolves against the normalized request scope of server sources.

@walkeros/core/dev exports toSerializable, which turns a value into what walkerOS.json publishes: functions become { $code } objects with their source text, Zod schemas are left out, and everything else is copied. The package build and the step example runner both use it, so tests run what is published.

The sample events from getEvent now use the standard event names: checkout start replaces checkout view, an order carries tax and total, a promotion names its placement slot, and product events carry currency. Order value is now the merchandise value: the order complete sample goes from 555 to 462, and the gross amount charged is total (467.22). The destination examples read data.tax, data.slot and the search keys data.term and data.results, and gross fields such as Matomo grandTotal read data.total first, then data.value. The CLI ships default event contracts for common site types in examples/contracts/.

The purchase example's item condition works as published, so the example no longer throws when a tool evaluates it from the package metadata. The send_page_view description says d8a sends a page view when the tracker starts unless it is set to false.

The dataLayer source copies only event values: DOM elements such as gtm.element, functions and other non-data values in a push are left out, and a date arrives as its timestamp. The page's own dataLayer.push never fails because of the source. A name key in a push stays in the event data instead of replacing the event name.

The prefix and filter setting descriptions now match the behaviour: the prefix is the entity of every event name and filters nothing, and a filter that returns true skips the entry. The package metadata links the documentation page at its exact path; the old link returned 404.

Step examples carry event timestamps in milliseconds, as the walkerOS event model defines them, instead of seconds that read as a date in January 1970. Where an example's output repeats the timestamp, such as event_timestamp in the gtag include example or the event a transformer example returns, the output shows the same value.

The route path description now names the patterns Express 5 accepts, /api/:id and /api/*path. A bare /api/*, which the old text suggested, is rejected at startup because the wildcard has no parameter name. Only the description text changed, not the route handling.

A file step now answers 503 when its store read fails, and a step with a prefix answers 404 for a missing file inside it, instead of passing on to the tracking pixel. A flow without a usable store stops at startup. Without a prefix a missing file still passes on; "prefix": "/" claims every routed path.

An ip input that is not one address, such as a forwarded chain, is now reported as an error and left out of the hash, instead of a warning that said it was empty. The event is still delivered. The complete example flow reads the visitor IP from a header the proxy sets.

The salt description, the hints and the step examples write the salt as $secret.FINGERPRINT_SALT, as the docs do. The reference keeps the salt out of the flow file, and a bundled flow whose secret is not set stops at start with required secret "FINGERPRINT_SALT" is not set.

The flow-complete example flow gains a /demo/products/:id lookup route that serves product data from its file store, and a missing walker.js now answers 404 with Cache-Control: no-store instead of the tracking pixel.

The disableTextCapture, secureCookie and heapConfig descriptions now say that these settings apply only with loadScript: true, where the destination writes them into the config the classic Heap SDK reads when it loads. With your own Heap snippet, set these options in the snippet.

The walkeros/flow and walkeros/cli images now run Node.js 24.22.1, which fixes the vulnerabilities of the Node.js security release of 21 October 2026; one of them can be triggered by a request to a flow's HTTP source. Rebuild images based on walkeros/flow with this version and redeploy. Flows that run on their own Node.js need 22.23.4, 24.22.1, 26.12.1 or later in the same line.

The conversion mapping description now says what happens when the conversion resolves to no id: no lintrk call is made and the push fails with missing-input. It no longer says such events are ignored, and it names the server LinkedIn destination as the deduplication partner of eventId.

flow_examples reads a step's package examples at the version or local path the flow pins, the package flow_bundle installs, and names that version on each package example. A step whose package cannot be read is listed in the warnings instead of being left out unseen.

The eventKey rule setting is described as having no effect: Optimizely receives the rule's name or the event name. The attributes description says the user context, and with it the attributes, is created again whenever the user ID differs from the previous event's.

The userId description shows a working fallback, ["user.id", "user.device"], instead of a { key, value } form that sent the literal text user.device as the user id of every anonymous visitor. The attributes description says the attributes apply when the user context is created.

The Express path setting is described as a single route path that paths overrides, and it is no longer marked deprecated. The validate_tagging tool description lists all its checks, empty entity names first. The demo transformer's docs link points to the transformers page, which also shows in MCP package_get.

The identify description matches the destination: init calls pintrk('load', tagId) without an identity, which is sent with pintrk('set', ...) when it changes, and the tag takes a plain or hashed email. The checkout example's condition works as published, and the commerce examples send product fields inside line_items, with product_name taken from the product name.

The PushResult.error description now says when it is set: for a rejected event or a failure before the destinations. A destination's failure is reported in failed, under its id with a reason, and leaves error unset.

A mapping rule's consent is enforced on top of the destination's: matched events wait (web) or are skipped (server) until both are granted; a source drops them. Destinations select the rule as the event enters, so before chains, state and policy no longer change it; a before rename onto another rule logs ERROR rule-not-applied. walker.js grows about 1.3 KB.

The cdnURL description now matches the behaviour: Analytics.js fetches its settings from the host you set there, so a self-hosted proxy works. The description no longer claims that the setting is ignored and that settings always come from https://cdn.segment.com.

The step examples that depend on destination config now name it in their descriptions (settings.identify, settings.eventOptions, include and consent), and their timestamps are in milliseconds. The optOut description now says that each event the destination receives then fails with a transport error.

The package publishes a minimal example: the project API key, read as the AMPLITUDE_API_KEY secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The package publishes a minimal example: the endpoint URL. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The Firehose and SNS step examples carry event timestamps in milliseconds, as the walkerOS event model defines them, so the published records and messages show realistic dates. The delivery hint describes the dead letter queue without promising a later replay.

The Firehose step examples now state their expected record bytes as literals instead of computing them with the destination's own encoder, so the examples check the delivered record rather than agree with the code by construction. Published behavior is unchanged.

The package publishes a minimal example: a stream name for Firehose and a topic ARN for SNS, one example per export, with the region and credentials taken from the AWS environment. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The Bing step examples now send the visitor's anonymous ID in userData, as Microsoft requires an identifier in every event, and the purchase example no longer sends the raw user ID as externalId. The user_data description names Microsoft's keys and says that only em and ph are hashed; the url description says the custom URL must end in /.

The package publishes a minimal example: the UET tag ID and an access token, read as the BING_ACCESS_TOKEN secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

Step examples no longer depend on a helper imported at the top of the file, so the example conditions published in walkerOS.json run on their own with the same result.

The package publishes a minimal example: the HTTP endpoint URL. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The package publishes a minimal example: the partner ID and the caller ID. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

Step examples no longer depend on a helper imported at the top of the file, so the example conditions published in walkerOS.json run on their own with the same result.

Step examples use millisecond timestamps, so the tracked time is a real date. The page description says that only the url is sent, suppress and unsuppress describe what they do in Customer.io, and sendEmail and sendPush say that they fail today. The minimal example's site ID is a placeholder.

The package publishes a minimal example: the site ID and an API key, read as the CUSTOMERIO_API_KEY secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The Data Manager settings batchSize and batchInterval now say they have no effect: every event is sent in its own request. The consent description now says that request-level consent applies to each event without consent of its own, and the credentials, userData, destinations and productDestinationId descriptions are corrected. They appear in the docs settings table and in MCP package_get.

The package publishes a minimal example: one destination account with its conversion action, with authentication taken from the Google environment. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The package publishes a minimal example: the path of the JSON Lines file. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The TSV step example is named tsvLog and writes to logs/access.tsv, a neutral access-log path, in the published examples, the docs and MCP package_get. Its selected fields and its output line are unchanged.

The BigQuery location setting is described as not read: walkeros setup creates the dataset in config.setup.location. The client description says it serves setup only. The hints cover BigQuery authentication with config.credentials, the default dataset walkerOS, the setup command and how repeated failures are counted. The Pub/Sub default storage regions carry their full names, and example timestamps are in milliseconds.

The package publishes a minimal example: a project ID for BigQuery and a project ID and topic for Pub/Sub, one example per export, with credentials taken from the Google environment. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The identify descriptions say that the destination updates the contact with the resolved email rather than upserting it, and email states its default. Step examples use millisecond timestamps and name the settings they depend on. The minimal example's event name prefix is a placeholder.

The package publishes a minimal example: the event name prefix and an access token, read as the HUBSPOT_ACCESS_TOKEN secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The package publishes a minimal example: the broker addresses and the topic. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The Kafka settings descriptions match what the destination does: sasl no longer names AWS MSK IAM, the aws fields belong to kafkajs's own AWS mechanism and authorizationIdentity is required for it, oauthbearer cannot authenticate without a token provider, and snappy, lz4 and zstd need a codec registered in kafkajs. The step examples carry event timestamps in milliseconds.

Step examples use millisecond timestamps, so each event time is a date Klaviyo accepts. The destination identify example says that the profile is updated on the first push and when its values change, and the revenue example names the currency setting it depends on.

The package publishes a minimal example: the private API key, read as the KLAVIYO_API_KEY secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The package publishes a minimal example: the conversion rule ID and an access token, read as the LINKEDIN_ACCESS_TOKEN secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The LinkedIn destination's documentation link in its package metadata now points to the existing docs page, and the url setting description says the custom URL must end in /. Both show in MCP package_get and the docs settings table.

The Conversions API examples map value, currency, order id and contents into custom_data, where Meta reads them; the old purchase example put them at the top level of the server event, so check mappings copied from it. The examples also send the client IP, user agent and a hashed external id, which website events need.

The package publishes a minimal example: an access token and a Pixel ID, with the token read as the META_ACCESS_TOKEN secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The step examples that depend on destination config now name it in their descriptions, including that a track call carries no distinct_id without settings.identify and that /import needs settings.secret. Their timestamps are in milliseconds. The include setting description now says that it has no effect: use include in the destination config.

The package publishes a minimal example: the project token, read as the MIXPANEL_API_KEY secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

Step example descriptions name the settings.userIdentities mapping their output depends on (customer_id from user.id, plus email from user.email where shown), so each example says where the batch's user_identities come from.

The package publishes a minimal example: the API key and secret, read as the MPARTICLE_API_KEY and MPARTICLE_API_SECRET secrets. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The step examples carry event timestamps in milliseconds, as the walkerOS event model defines them, so the published requests show a realistic event_time instead of a date in 1970. The url description says the custom base URL must end in /, and the package's docs link points to its documentation page.

The package publishes a minimal example: the ad account ID and an access token, read as the PINTEREST_ACCESS_TOKEN secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

Step examples no longer depend on a helper imported at the top of the file, so the example conditions published in walkerOS.json run on their own with the same result.

The ecommerce methods send the currencyCode of their options argument as the Tracking API cur parameter, so a web mapping with a currency works unchanged on the server. Before, the currency was dropped and Piwik PRO booked the order in the app's default currency. The examples now also show the client IP and user agent.

The package publishes a minimal example: the account URL and the app ID. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The pageUrl setting description and the batch hint now match the behaviour: an event without a page URL, or one the rule cannot turn into a hit, fails the push with missing-input. They no longer claim that such events are skipped. In a batch, the other events are still sent.

The package publishes a minimal example: the project API key, read as the POSTHOG_API_KEY secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The flushAt and flushInterval descriptions now say that every push and batch flushes the SDK, personalApiKey and featureFlagsPollingInterval say that the destination evaluates no feature flags, and disableGeoip states its default of true. Step examples that depend on destination config name it, with timestamps in milliseconds.

The step examples carry event timestamps in milliseconds, as the walkerOS event model defines them, so the published requests show a realistic event_at instead of a date in 1970. The action_source description says the setting has no effect, and the url description says the custom base URL must end in /.

The package publishes a minimal example: the pixel ID and an access token, read as the REDDIT_ACCESS_TOKEN secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

Step examples no longer depend on a helper imported at the top of the file, so the example conditions published in walkerOS.json run on their own with the same result.

The Redis step examples carry event timestamps in milliseconds, as the walkerOS event model defines them, so the examples published in the docs and in MCP package_get show realistic dates instead of days in January 1970.

The package publishes a minimal example: the stream key events are appended to. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The package publishes a minimal example: the data plane URL and a write key, read as the RUDDERSTACK_WRITE_KEY secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The identify and group descriptions now say when a call is skipped, and integrations says that it has no effect. The page and screen mapping descriptions now say that the name is optional, the alias description that the call needs the event's userId, and the maxQueueSize description gives its 450 KB default. Example timestamps are in milliseconds.

The package publishes a minimal example: the write key, read as the SEGMENT_WRITE_KEY secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The identify and group descriptions now say that a call is skipped when its userId (or groupId) and traits match the previous call of that kind; the anonymousId and the user are not compared. The integrations description says that the setting has no effect. Example timestamps are in milliseconds.

The threadTs and user descriptions say that both are fixed values, not read from the event, and retryConfig describes each policy and that retries go on after the destination timeout has failed the push. Step example descriptions name the fixed values and settings they use, and the examples' events carry millisecond timestamps.

The package publishes a minimal example: the incoming webhook URL, read as the SLACK_WEBHOOK_URL secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The package publishes a minimal example: the pixel ID and an access token, read as the SNAPCHAT_ACCESS_TOKEN secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

The page view step example maps the event to Snapchat's PAGE_VIEW, so the published example no longer sends the walkerOS name page view, which is not a Snapchat event name. The url description says the custom base URL must end in /.

Step examples no longer depend on a helper imported at the top of the file, so the example conditions published in walkerOS.json run on their own with the same result.

The settings.sqlite.schema description states what each value does: auto creates the table at the first push with the columns every insert writes, and manual skips the table check. The step examples carry event timestamps in milliseconds.

The package publishes a minimal example: the pixel code and an access token, read as the TIKTOK_ACCESS_TOKEN secret. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

Step examples no longer depend on a helper imported at the top of the file, so the example conditions published in walkerOS.json run on their own with the same result.

The purchase step example sends TikTok's Purchase event instead of CompletePayment, and the suggested standard event names follow TikTok's current list (Purchase added; ClickButton, CompletePayment and PlaceAnOrder removed). Any other name is still accepted. The partner_name description names its default, walkerOS.

The X destination's rule setting currency now says it has no effect: X receives no currency from this destination. The purchase step examples no longer set it, and the url setting description says the custom URL must end in /. Both show in the docs settings table and in MCP package_get.

The package publishes a minimal example: the pixel and event IDs and the four OAuth credentials, read as the TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET, TWITTER_ACCESS_TOKEN and TWITTER_ACCESS_TOKEN_SECRET secrets. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings.

Package descriptions and hints now match what the destinations do. The API custom headers example names settings.headers. Piwik PRO's ingest hint warns that behind a proxy ip is the proxy's address, and its examples use one app ID placeholder. Segment lists the calls it sends, and HubSpot updates contacts rather than upserting them.

The SQS examples now send name in the message body; with event the collector rejected every message as an event without a name, and it was deleted. The Lambda GET example uses name and data[...] query parameters. The SQS decoder description says that text and raw forward the body as data.payload and need a before transformer that sets the name.

The pixel GET example now sends name and data[...] query parameters, the form the source turns into an event. The previous example used e and d parameters, which the collector rejects as an event without a name, so the request answered with the GIF and nothing was delivered.

The pixel GET example now sends name and data[...] query parameters, the form the source turns into an event. The previous example used e and d parameters, which the collector rejects as an event without a name, so the request answered with the GIF and nothing was delivered.

The Pub/Sub decoder descriptions say what text and raw forward and that those events need a before transformer that sets the event name, otherwise the collector rejects them. The setup ackDeadlineSeconds description states that an unset value leaves Pub/Sub's own default of 10 seconds. The push projectId description no longer claims the value appears in error messages.

New read-only store for third-party HTTP APIs. Each key is one GET to a URL template with a {key} placeholder, with an optional bearer token. A 404, a 204 or a null body is a miss and every other failure is reported at ERROR. Pair it with the store cache to cut repeated requests.

The GCS, Sheets and S3 store examples now reference their credentials with $secret. instead of $env.. A missing secret stops the flow at startup with required secret "<NAME>" is not set; a missing $env service account makes the GCS and Sheets stores fall back to the metadata server credentials.

The settings schema now accepts parameters, the map of additional URL parameters to capture, so walkeros validate no longer rejects a setting the source reads. The pulse description says what it refreshes, and the package metadata links the documentation page directly.

The Fetch path setting is described as a single route path that paths overrides, and it is no longer marked deprecated. The Criteo Quickstart uses a numeric partnerId placeholder. Type docs now say that an open breaker fails events with breaker-open and that server bundles target Node 20. Example env mocks are typed without casts.

The mapping schema lists the rule settings data (the self-describing event data) and struct (a structured event), which the destination reads, so they appear in the generated documentation. The contexts setting accepts browser, the browser context entity the Snowplow tracker supports.

The source cache no longer keeps a 5xx answer. A short store failure behind a cached route is no longer served for the whole cache time. A 404 or 200 answer is still cached for the ttl.

@walkeros/core exports the StepType type, the kind of a step package (source, transformer, destination or store), read from STEP_TYPES on @walkeros/core/dev. StepKind, FlowStepType and stepId use it, as do the step kinds resolveExportName in @walkeros/cli and the simulate tool of @walkeros/mcp take, so the kinds are listed in one place.

The GA4, bot and fingerprint hints now say that a config.ingest without the map operator is rejected by walkeros validate and logged at runtime, and that a missing fingerprint salt stops the flow. The GA4 mapping description names the mapping features a GA4 rule does not run. The validate hints say the step must be wired into a chain.

With format: true, an event holding null values now passes the format check, because null is a valid walkerOS event value. Before, such an event got the verdict false: in pass mode it was marked invalid, and in strict mode it was dropped.

The test page page from @walkeros/web-core/dev now answers each vendor script a step inserts with load, as a browser does, so a destination that waits for its script delivers in the examples runner and the conformance kit instead of timing out. failScripts still fails those scripts on demand.

The package publishes a minimal example: the project API key is all Amplitude needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The headers setting no longer suggests an Authorization: Bearer token. Every visitor's browser receives a web destination's config, so a header may carry a public key but never a secret. To authenticate with a secret, send to your own server endpoint and add the credential there.

The package publishes a minimal example: the endpoint URL is all API destination needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The package publishes a minimal example: the Clarity project ID is all it needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The package publishes a minimal example: the property ID and the collector URL is all d8a needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The Segment and Plausible step examples name their vendor calls as a simulation records them: analytics.load.track, analytics.load.identify and the other methods of the instance load() returns, and window.plausible. Running the examples now matches their expected calls.

The package publishes a minimal example: the organization ID is all FullStory needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The failure example for a FullStory SDK that throws while it starts says what is reported: the push fails and can be retried. A blocked or unreachable fs.js script throws nothing, so it is not reported.

The Consent Mode v2 example says which setup it shows: without config.consent the first consent command sends the denied default before the update; with config.consent the denied default goes out before config, when the destination starts.

The gtag examples show the GA4 recommended events for page view, product view, product add and order complete, with the calls as window.gtag records them. The GA4 init example sets pageview: false: without it, gtag sends its own page_view on config and every walkerOS page view counts twice.

The gtag settings say what they do: gtm.domain is the URL the container ID is appended to, up to ?id=; ga4.pageview: false stops gtag's own page_view (history-change page views still fire); ads.currency defaults to EUR and mapped data replaces it; and an Ads label sends a conversion only when its rule also has a name.

The package publishes a minimal example: the Heap App ID, with the Heap SDK loaded by the destination. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same setup, so the setup a reader copies is the one that was tested.

The package publishes a minimal example: the site ID is all Hotjar needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The package publishes a minimal example: the LinkedIn Partner ID, with the Insight Tag script loaded by the destination. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same setup, so the setup a reader copies is the one that was tested.

The package publishes a minimal example: the Matomo site ID and instance URL, with matomo.js loaded by the destination. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same setup, so the setup a reader copies is the one that was tested.

The package publishes a minimal example: the Pixel ID, with the Pixel script loaded by the destination is all Meta Pixel needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The Meta Pixel examples cover page view, product view, product add and order complete as PageView, ViewContent, AddToCart and Purchase with content_type, contents, currency, value and the event id for deduplication, recorded as window.fbq calls. Their mapping functions now also work when copied from the published examples.

The package publishes a minimal example: the project token is all Mixpanel needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The Consent revoked step example names the consent config it runs with, config.consent { analytics: true }. The rendered example shows only the consent command and its output, so without that a reader cannot tell which destination the revoke stops.

The package publishes a minimal example: the SDK key and the mapping that resolves the user ID. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same setup, so the setup a reader copies is the one that was tested.

settings.userId is required: the schema and init now say so. A flow without it used to pass walkeros validate and then fail every event with missing-input; it now fails validation and refuses to start with a config error naming userId.

The package publishes a minimal example: the Piano Analytics site ID and collection domain, with the SDK loaded by the destination. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same setup, so the setup a reader copies is the one that was tested.

The package publishes a minimal example: the Tag ID is all Pinterest needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The Piwik PRO examples pass { currencyCode } as the last argument of the ecommerce methods, as the Piwik PRO JavaScript API documents, so an order is booked in its own currency instead of the app default. The examples cover page view, product view, product add and order complete, recorded as window._paq.push calls.

The Piwik PRO goal examples use a goal UUID as goalId instead of goal_1: Piwik PRO identifies a goal by its UUID or a legacy integer id, so a copied example now shows the id format that Piwik PRO accepts.

The package publishes a minimal example: the Piwik PRO site ID and account URL, with ppms.js loaded by the destination. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same setup, so the setup a reader copies is the one that was tested.

With loadScript: true, a missing settings.domain now stops the destination with a config error naming domain. Before, the script loaded without its data-domain, every push counted as delivered, and Plausible dropped each event because it could not attribute it to a site.

The package publishes a minimal example: the site domain, with the Plausible script loaded by the destination. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same setup, so the setup a reader copies is the one that was tested.

The package publishes a minimal example: the project API key is all PostHog needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The package publishes a minimal example: the source write key is all Segment needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The appId setting states its default: without it, every event is sent with the app_id walkerOS. Set appId to name your application in Snowplow.

The package publishes a minimal example: the collector URL, with the tracker script loaded by the destination is all Snowplow needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The identify setting and the Settings type say how Advanced Matching values travel: the destination passes them to ttq.identify() unhashed, and TikTok states that its Pixel hashes email and phone number. auto_config and limited_data_use no longer state a TikTok default. The StandardEventNames type suggests Purchase instead of CompletePayment, PlaceAnOrder and ClickButton, and links TikTok's list.

The package publishes a minimal example: the Pixel ID is all TikTok needs to deliver. The docs page renders the install line, the integrated code and the flow from it, and the package test runs the same settings, so the setup a reader copies is the one that was tested.

The order example maps to TikTok's current Purchase standard event instead of CompletePayment. Every example names its vendor call as a simulation records it (window.ttq.track, window.ttq.identify, window.ttq.enableCookie), and the include, identify and consent examples say which config they run with. The explorer's destination mapping demo shows Purchase for TikTok too.

Published Packages

Source: README.md, updated 2026-11-04