shouldertap.yaml file (generated by shtap init). Every command takes --config to point at a different path; it defaults to shouldertap.yaml in the current directory.
Secrets are never stored in the config. Each *_env key names an environment variable that ShoulderTap resolves at runtime, loaded from a local .env file (gitignored) next to the config.
Example
shouldertap.yaml
Settings
org
string
required
Your organization’s display name. Used in expert-facing messages.
string
default:"UTC"
IANA timezone (for example
America/Los_Angeles). Quiet hours are evaluated in this timezone.llm
Optional. Without it, ShoulderTap runs without an LLM: it passes an expert’s reply through verbatim instead of drafting the outbound question or structuring the answer. The provider is resolved by litellm, so any supported model works.string
The model id, for example
claude-sonnet-4-6.string
Name of the environment variable holding the provider API key (for example
ANTHROPIC_API_KEY).slack
Optional; required only for--transport slack. See Connect Slack.
string
Name of the environment variable holding the Slack bot token (for example
SLACK_BOT_TOKEN).string
Name of the environment variable holding the Slack signing secret (for example
SLACK_SIGNING_SECRET).server
integer
default:"8776"
Port the HTTP API and approval UI listen on.
string
default:"SHOULDERTAP_API_TOKEN"
Name of the environment variable holding the static bearer token that consumers, the CLI, and the MCP server use to authenticate. See Authentication.
defaults
Fallback values the router applies to any request that doesn’t set them explicitly in itsrouting_policy.
duration
default:"2h"
How long to wait for a reply before re-asking the expert’s
escalation_to. Shorthand like 2h in YAML; the wire protocol uses ISO-8601 (PT2H).duration
default:"24h"
How long to wait across all asks before failing the request with reason
timeout.array
default:"null"
A
[start, end] pair of local times, for example ["18:00", "09:00"]. No DMs are sent during quiet hours; asks are queued and sent when the window reopens. null disables quiet hours.integer
default:"3"
Hard cap on how many unanswered asks an expert can have at once. Routing skips capped experts.
integer
default:"5"
Hard cap on asks sent to one expert in a single day. The daily count resets at the start of each day.
experts
The expert registry — an array of the humans ShoulderTap can ask. See Experts and routing for how matching works.string
required
The expert’s Slack user ID (any string with the console transport).
string
required
Display name, used in outbound asks and in the answer’s provenance.
array
required
Topics this expert answers. Matched against a request’s normalized topic.
string
default:"null"
The
id of another expert to re-ask if this one doesn’t reply within escalation_after.topics
A map of topic name to per-topic settings.string
default:"null"
The expert
id to route to when no expert exactly or fuzzily matches this topic.Secrets (.env)
Copy .env.example to .env and fill in the values. The variable names are referenced by the *_env keys above; the values live only in .env.
.env
PUT /experts rewrites the experts: section of shouldertap.yaml — the config file stays the source of truth for the registry. See the Experts endpoint.