| Name | Modified | Size | Downloads / 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
- @walkeros/cli
- @walkeros/collector
- @walkeros/config
- @walkeros/core
- @walkeros/destination-demo
- @walkeros/explorer
- @walkeros/mcp
- @walkeros/mcp-source-browser
- @walkeros/runner
- @walkeros/server-destination-amplitude
- @walkeros/server-destination-api
- @walkeros/server-destination-aws
- @walkeros/server-destination-bing
- @walkeros/server-destination-clickhouse
- @walkeros/server-destination-criteo
- @walkeros/server-destination-customerio
- @walkeros/server-destination-datamanager
- @walkeros/server-destination-file
- @walkeros/server-destination-gcp
- @walkeros/server-destination-hubspot
- @walkeros/server-destination-kafka
- @walkeros/server-destination-klaviyo
- @walkeros/server-destination-linkedin
- @walkeros/server-destination-meta
- @walkeros/server-destination-mixpanel
- @walkeros/server-destination-mparticle
- @walkeros/server-destination-pinterest
- @walkeros/server-destination-piwikpro
- @walkeros/server-destination-posthog
- @walkeros/server-destination-reddit
- @walkeros/server-destination-redis
- @walkeros/server-destination-rudderstack
- @walkeros/server-destination-segment
- @walkeros/server-destination-slack
- @walkeros/server-destination-snapchat
- @walkeros/server-destination-sqlite
- @walkeros/server-destination-tiktok
- @walkeros/server-destination-twitter
- @walkeros/server-source-aws
- @walkeros/server-source-express
- @walkeros/server-source-fetch
- @walkeros/server-source-gcp
- @walkeros/server-store-api
- @walkeros/server-store-gcs
- @walkeros/server-store-s3
- @walkeros/server-store-sheets
- @walkeros/server-transformer-bot
- @walkeros/server-transformer-file
- @walkeros/server-transformer-fingerprint
- @walkeros/transformer-demo
- @walkeros/transformer-ga4
- @walkeros/transformer-validate
- @walkeros/web-core
- @walkeros/web-destination-amplitude
- @walkeros/web-destination-api
- @walkeros/web-destination-clarity
- @walkeros/web-destination-d8a
- @walkeros/web-destination-fullstory
- @walkeros/web-destination-gtag
- @walkeros/web-destination-heap
- @walkeros/web-destination-hotjar
- @walkeros/web-destination-linkedin
- @walkeros/web-destination-matomo
- @walkeros/web-destination-meta
- @walkeros/web-destination-mixpanel
- @walkeros/web-destination-optimizely
- @walkeros/web-destination-piano
- @walkeros/web-destination-pinterest
- @walkeros/web-destination-piwikpro
- @walkeros/web-destination-plausible
- @walkeros/web-destination-posthog
- @walkeros/web-destination-segment
- @walkeros/web-destination-snowplow
- @walkeros/web-destination-tiktok
- @walkeros/web-source-browser
- @walkeros/web-source-cmp-cookiebot
- @walkeros/web-source-cmp-cookiefirst
- @walkeros/web-source-cmp-cookiepro
- @walkeros/web-source-cmp-usercentrics
- @walkeros/web-source-datalayer
- @walkeros/web-source-session