Skip to main content

Install

Until the crate registry release is available, vendor the production artifact:

Configure once

Construct the layer inside a Tokio runtime:
The last Axum layer added executes first. Keep product authentication outermost so it inserts the verified account/user and product-owned visitor/journey extensions before Epode resolves the accessors. Never derive identity or grouping from names, emails, prompts, request fields, or agent arguments.

Server-rendered HTML

Return finite JSON and HTML handlers through buffered_response(...) to mark their already-materialized bodies as eligible. Axum erases concrete body types before Tower layers run, so every unmarked body remains untouched, including exact-size delayed streams and trailers. A marked body that fails while being read returns an explicit non-empty 500 instead of disguising the body failure as a success.

Shared caching

The default HttpCacheMode::Safe leaves explicitly shared-cacheable responses unchanged. Request mode instruments only callers sending Agent-Feedback-Request: 1 and adds Vary: Agent-Feedback-Request to both ordinary and opted-in responses. Use private mode only when disabling shared caching for every included response is intentional. Eligible ordinary 2xx GET and HEAD responses also advertise a same-path-and-query Link for one authenticated Companion refetch; redirects and non-safe methods never advertise it.

Verify

Send one request to each included surface, then verify the response contract and Setup telemetry. Call feedback.shutdown().await during graceful shutdown; it has a two-second bound and returns delivery failures.

Customer-agent coverage

Your Tower layer creates the HTTP/HTML feedback contract; it cannot make an independent customer agent act on it. For reliable Codex and Claude Code handling, customers install Epode Companion once for all Epode-instrumented products. This is a user-side plugin, not another company crate or product key. View the runnable Rust example