Integrating an AI provider the usual way puts a real API key inside the container, where it lands in environment variables, config files, and logs. Anyone with container access can read it, including freelancers and AI-generated code.
Containers using Hoody AI hold no provider API key. They authenticate by container identity instead, and the real key stays on the host.
constauth='container-dev-env';// Only proves "I am this container"
// Or: 'container-1', 'container-2' for numbered containers
// This auth token:
// - Doesn't work outside your infrastructure
// - Dies when container is deleted
// - Can't be used by freelancers elsewhere
// - Is useless if exfiltrated
container-X is not an API key, and the gateway never parses the X. Any bearer token starting with container- tells the gateway to authenticate by container identity, which it resolves from the request’s source address on your server (IP-to-container mapping). Numbered identities like container-1 and descriptive ones like container-dev-alice are treated identically, so the suffix is a label for your own readability.
The gateway attributes usage to the resolved container and its owning account regardless of the token suffix. Per-container usage tracking is not implemented yet. When it ships it will key off the resolved container id rather than the token string, and per-container attribution will let you track AI consumption by workload, attribute costs to individual clients or projects, and generate billing reports.
Prompts travel from the container to the gateway on your server, and from there to the AI provider:
Container → Hoody AI (your server) → AI Provider → Response
The Hoody platform knows:
You created a container
The container has AI enabled
Aggregate spend and request counts, for billing
It does not know:
Your AI prompts
AI responses
What you’re building
The AI gateway runs on your own server. When shadow logging is configured it records request metadata (method, path, source address, status, duration) but never prompt or response bodies, and never your keys. Hoody provisions the upstream provider key for your account, so aggregate spend and request counts are visible for billing. On paid models the upstream provider receives your prompts and responses; free-tier requests reach the same upstream providers through Hoody-operated accounts.
AI access is a per-container flag. You can toggle it on a single container, revoke access immediately by deleting the container, and list containers to audit which ones have AI enabled.
cURL runs inside your container and can wrap any HTTP
request into a single GET URL. The call stops being something you need a client
for and becomes something you can paste into a browser, send in a chat, bookmark,
schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever
credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
Toggles AI on one container and off another, deletes a third to revoke access instantly, and lists all containers so you can audit which have AI enabled.
# Enable AI
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/containers/PROD_ID&method=PATCH&bearer_token=TOKEN&json={"ai":true}&response=transparent
# Disable AI
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/containers/UNTRUSTED_ID&method=PATCH&bearer_token=TOKEN&json={"ai":false}&response=transparent
# Delete container
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/containers/FREELANCER_ID&method=DELETE&bearer_token=TOKEN&response=transparent
# Audit containers
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/containers&method=GET&bearer_token=TOKEN&response=transparent
The link carries a credential and executes with it, so it is as sensitive as
the credential itself — and it passes through the cURL service's request log
on the way, not just the target's. Share it only where you would share the
secret, and prefer a delegated token with minimal permissions and an expiry:
see API tokens.
There is no container token to rotate: deleting the container ends its identity. The host-side upstream provider key is separate and follows a normal rotation process.
Beyond container-level access control, the Hoody Kit agent service (hoody-agent) ships hooks that let you enforce policy at the prompt level. A SessionStart hook’s output is injected into the system prompt for the life of the session, for example “Never execute destructive commands without asking first”. A UserPromptSubmit hook can append context to a prompt before it is sent, or block the prompt outright. Treat this as a strong default, not a hard boundary: a system prompt steers a model; it does not constrain it the way a firewall constrains a packet.
You can also monitor what an AI agent reads and writes inside one session. A PostToolUse hook matching Read runs your own logging command every time that agent reads a file. Hooks are session-scoped, not a server-wide monitor, and writing one is a fail-closed two-step: mint a single-use nonce, then spend it.
--name'Log agent reads'--description'Log every Read tool call'
Each hook is a lifecycle event, a matcher, and a shell command you supply, defined in plain JSON. There is no JavaScript to write and no proxy or URL change involved.
Give each container a name that records its purpose and intended access level:
Terminal window
container-prod-api# Production workload
container-dev-alice# Developer-specific
container-client-acme# Client-specific
container-untrusted-test# Limited permissions
Names are for your own readability. The gateway does not parse the suffix, so treat naming as documentation rather than an access-control or audit mechanism.
cURL runs inside your container and can wrap any HTTP
request into a single GET URL. The call stops being something you need a client
for and becomes something you can paste into a browser, send in a chat, bookmark,
schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever
credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
Turns AI off for a container that is already running untrusted or third-party code. Route it through a trusted container’s curl-1 — the link carries your Hoody API token, and the untrusted container should never see it.
The link carries a credential and executes with it, so it is as sensitive as
the credential itself — and it passes through the cURL service's request log
on the way, not just the target's. Share it only where you would share the
secret, and prefer a delegated token with minimal permissions and an expiry:
see API tokens.
cURL runs inside your container and can wrap any HTTP
request into a single GET URL. The call stops being something you need a client
for and becomes something you can paste into a browser, send in a chat, bookmark,
schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever
credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
Creates a snapshot before letting AI touch the container, then restores it by name if the result is bad. Route them through a different container’s curl-1 — a restore reboots CONTAINER_ID from the captured disk, so it can’t serve its own restore. Swap the snapshot name in the restore link for the one your create call actually returns.
The link carries a credential and executes with it, so it is as sensitive as
the credential itself — and it passes through the cURL service's request log
on the way, not just the target's. Share it only where you would share the
secret, and prefer a delegated token with minimal permissions and an expiry:
see API tokens.
cURL runs inside your container and can wrap any HTTP
request into a single GET URL. The call stops being something you need a client
for and becomes something you can paste into a browser, send in a chat, bookmark,
schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever
credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
The link carries a credential and executes with it, so it is as sensitive as
the credential itself — and it passes through the cURL service's request log
on the way, not just the target's. Share it only where you would share the
secret, and prefer a delegated token with minimal permissions and an expiry:
see API tokens.
You own the infrastructure, so you can configure your own AI providers directly on the host instead of using Hoody AI credits. You would then manage those API keys yourself, which brings back the exposure this page describes.
If an attacker gains root access to your server, they can read the Hoody AI configuration. Threat model:
Containers remain isolated from each other
Attacker still needs to know which containers exist
You can instantly revoke by deleting containers
Your provider/gateway API keys are stored on the host (in host-side config, plaintext by default); root on the host can read them, just as with any self-hosted AI gateway
This is still better than scattering the same keys across every container that needs AI access, but treat the host filesystem as part of the key’s trust boundary. The host’s LUKS full-disk encryption is already on and covers the machine being stolen; it does nothing for root on a running host, which is the threat here. Rotate on suspicion rather than relying on the disk layer.
No. Container-level rate limiting is not implemented. AI access is controlled at the container level by the ai boolean flag, which is enabled or disabled and nothing more.