Every Hoody container includes 19 HTTP services for building, deploying, and operating software. They are already running when the container starts, so there is nothing to install or configure.
Each service is a URL. That URL opens in a browser on a laptop or a phone, embeds in an iframe, goes to a teammate in a chat message, and can be called by an AI. Hoody Agent, the terminal-native AI agent already running in every container, reaches all of them: open it in a browser tab, or type ssh hoody.com for the same agent in your terminal.
Screenshot Coming Soon
Hoody Agent running as a terminal-native TUI in a browser tab, with a multi-pane chat grid beside live terminals, files, and a display preview
Multiple services visible at once through the Hoody Agent
Each service is complete on its own and speaks HTTP, so any service can call any other:
Terminals execute any command. Pair one with Displays and GUI applications appear in the browser.
Files reaches any storage. Combine it with SQLite for indexed metadata, or Exec for automated processing.
Agent orchestrates workflows. Give it Terminal access and it drives the rest of your infrastructure.
Browser automates web tasks. Combine it with cURL for API calls and SQLite for storing results.
One service handles a task; two or more compose into a workflow. Because the interface is HTTP rather than a fixed feature list, the combinations available to you are not limited to the ones documented here. Each service is a primitive, and what you build out of them is your decision.
Hoody Agent includes a Model Context Protocol (MCP) client that connects to external MCP servers and discovers their tools at runtime.
Dynamic tool discovery: the number of available tools depends on which MCP servers you connect. There is no fixed list.
Local and remote servers: local servers over stdio, remote servers over Streamable HTTP or the legacy HTTP+SSE transport.
Spec coverage: built on the official Go SDK. It speaks every revision from 2024-11-05 through 2026-07-28 and negotiates the version with each server.
Managed in place: add, import, enable, disable and reconnect servers from the agent’s Agents ▸ MCP servers mode or over HTTP. There is no settings file to hand-edit and no session to restart. Paste a config from Claude, Cursor or VS Code and it is understood; imported servers land disabled until you review them.
Credentials stay deliberate: a stdio server starts with your provider keys and platform token scrubbed out of its environment, and you share one by naming it. Destructive operations still require confirmation.
An MCP server you configure runs with your privileges, on the same footing as a shell command you run yourself, so add only servers you trust. Full details on the Agent page →
Installing tools locally means setup, configuration, dependencies, and compatibility checks on each machine, repeated every time you switch computers. On Hoody each tool is a URL: open it and the tool is there, on any device with a browser, including a phone, tablet, laptop, or TV.
Open the terminal URL for a shell, the SQLite URL for a database, the code URL for VS Code. Nothing is downloaded, installed, or configured on the device you are working from.
VS Code requires a desktop OS, which normally rules out coding from a phone or tablet. The code, terminal, and display URLs put the whole development environment in a mobile browser:
https://PROJECT-CONTAINER-code-1.SERVER.containers.hoody.com → Full VS Code in mobile browser
https://PROJECT-CONTAINER-terminal-1.SERVER.containers.hoody.com → Run builds and tests
Managing 10+ projects means switching between terminals, editors, and databases. A workspace shows every project at once, with each service one click away:
Prefer exec when the job deserves a script: cd /app && npm test && echo "done" through terminal.run/execute works, but exec.run/test-runner.ts gets you logging, error handling, and structure. Prefer the terminal when the job is one command: creating an exec script just to run ls -la is overhead, so send {"command": "ls -la"} to terminal.run/execute instead.
Yes, when you create a container with hoody_kit: true. If you set hoody_kit: false, you get a plain Linux container without these HTTP services (SSH access only), which suits minimal containers and custom setups.
Currently, all services come together. Unused services activate only when accessed, so a terminal service that never receives requests uses almost no CPU or memory.
How do services communicate within the same container?
They share the same filesystem, processes, and network. A file created via the Files service is immediately readable via Terminal. A database created via SQLite is accessible from Exec scripts. They’re all running on the same Linux computer.
Can multiple users access the same service at once?
Yes. Terminals and Displays support multiplayer, so several users can type in the same terminal or watch the same desktop. Other services (Files, SQLite, Exec) are accessible simultaneously with standard HTTP concurrency.
What happens to services when I snapshot a container?
Snapshots capture the complete container state, including all services and their data. When you restore a snapshot, all services come back exactly as they were, including terminal history, file contents, database state, and daemon configurations.
Do I need different authentication for each service?
No. Proxy permissions control access to all services in a container. Set permissions once at the project or container level, and they apply to terminals, displays, files, SQLite, exec, and the rest.
Yes. Containers on the same server can communicate via internal networking. Use Shared Storage (/hoody/shares/) for file sharing or SQLite Drive (/hoody/databases/) for database sharing across containers.
A service works from your laptop but not from a phone or public WiFi. This usually means proxy permissions restrict access by IP or require authentication. To open access:
Terminal window
# Check current permissions (note the file_version for the If-Match header)
GET/api/v1/containers/{id}/proxy/permissions
# Remove the IP restriction by opening the default policy to "allow".
# Write operations require the If-Match: file:v<current file_version> header.