API key required for authenticated endpoints. If unset, auth is skipped.
WORKSTACEAN_PUBLIC_URL
(none)
HTTP server
Public base URL (used for webhook registration and self-links)
WORKSPACE_DIR
./workspace
All loaders
Path to the workspace directory containing agent, goal, action, ceremony, and domain YAML files
PROTOLABS_AGENTS_JSON
(none)
SkillBrokerPlugin
If set, overrides workspace/agents.yaml. Expected shape: { "agents": [ { name, url, auth, ... } ] }. Intended for Infisical-backed deployments where pushing a yaml file to every host is inconvenient — ship the whole registry through a single secret instead.
These env vars describe the HTTP server identity of the protoMaker team runtime (board ops, planning, feature lifecycle). The AVA_* prefix is historical and kept for backwards compatibility with infisical / homelab-iac; the logical agent slug in workspace/agents.yaml is protomaker.
Variable
Default
Plugin
Description
AVA_BASE_URL
(none)
WorldStateEngine, SkillBrokerPlugin
Base URL of the protoMaker team server (e.g. http://ava:3008). Used for domain URL interpolation and A2A agent registration.
AVA_API_KEY
(none)
A2AExecutor, WorldStateEngine
API key sent as X-API-Key when polling protoMaker team domain endpoints or calling its /a2a endpoint.
Discord bot token. If unset, DiscordPlugin is skipped.
DISCORD_GUILD_ID
(none)
DiscordPlugin
Guild (server) ID for slash command registration.
DISCORD_WELCOME_CHANNEL
(none)
DiscordPlugin
Channel ID for welcome/onboarding messages.
DISCORD_DIGEST_CHANNEL
(none)
DiscordPlugin
Channel ID for periodic digest posts.
DISCORD_OPS_WEBHOOK_URL
(none)
DiscordPlugin
Webhook URL for operational alerts.
DISCORD_GOALS_WEBHOOK_URL
(none)
WorldStateEngine
Webhook URL for goal violation/resolution notifications.
DISCORD_CEREMONY_WEBHOOK_URL
(none)
CeremonyPlugin
Webhook URL for ceremony run notifications.
DISCORD_BUDGET_WEBHOOK_URL
(none)
BudgetPlugin
Webhook URL for budget threshold alerts.
DISCORD_WEBHOOK_ALERTS
(none)
Various
General-purpose alert webhook URL (fallback for plugins without a dedicated webhook var).
Agents can declare their own Discord bot tokens via discordBotTokenEnvKey in either workspace/agents.yaml (A2A registry) or workspace/agents/*.yaml (in-process definitions). DiscordPlugin’s agent pool spins up a dedicated Client() per declared bot so users can DM each agent directly. The primary token (DISCORD_BOT_TOKEN) is the shared listener — protoBot — which handles guild messages, slash commands, HITL interactions, and DM fallback.
Variable
Default
Plugin
Description
DISCORD_BOT_TOKEN
(none)
DiscordPlugin
Primary shared client — protoBot. Guild messages, slash commands, HITL interactions, DM fallback. Should be a dedicated protoBot token, not a reuse of any agent-specific token.
DISCORD_BOT_TOKEN_PROTO
(none)
(homelab-iac)
Source of truth for protoBot in infisical; DISCORD_BOT_TOKEN is interpolated from this in docker-compose.yml.
DISCORD_BOT_TOKEN_AVA
(none)
DiscordPlugin
In-process Ava — conversational chat agent with no tools.
DISCORD_BOT_TOKEN_JON
(none)
DiscordPlugin
protoContent — Jon persona for content/GTM dialogue.
DISCORD_BOT_TOKEN_FRANK
(none)
DiscordPlugin
Frank — personal chaos lab runtime (future).
DISCORD_BOT_TOKEN_QUINN
(none)
DiscordPlugin
Quinn — @protoquinn[bot]. Used by the pr-remediator + quinn’s own container for formal PR reviews.
Base URL of the Graphiti sidecar. If unreachable, memory enrichment is skipped silently (the message is still processed).
Graphiti itself (running as a sidecar) reads additional env vars — see User Memory (Graphiti) for the full list, including the required text-embedding-3-small and gpt-4.1-nano gateway aliases.