# Hosait > Hosting for AI-built applications: connect a GitHub repository, Hosait deploys it — a static site, a Node app, or a whole docker-compose stack with its database — on its own address, from a Norwegian data centre. Every push deploys. Hosait is operated by a European company; the one region is Oslo, Norway. A plain docker-compose.yml runs unmodified (databases included), one service is public, the rest are private to the stack, and every push to the tracked branch deploys. ## The skill (start here) - [Hosait skill — SKILL.md](https://hosait.com/skills/hosait/SKILL.md): everything an agent needs to make a repository deployable on Hosait and to operate it — detection, hosait.json, compose conventions and what is refused, variables, deploys and rollback, every MCP tool, every error code. Markdown, versioned. Install for Codex: `mkdir -p ~/.agents/skills/hosait && curl -fsSL -o ~/.agents/skills/hosait/SKILL.md https://hosait.com/skills/hosait/SKILL.md`. Install for Claude Code: use `~/.claude/skills/hosait/` instead. ## Docs - [Documentation](https://hosait.com/docs): the human-readable version of the same conventions, in 16 languages, with an operations reference (outbound IP 213.184.208.76, prebuilt and private images, memory/CPU per service and plan, deploying from CI, build cache, private services, health checks, data-service snippets, custom and wildcard domains, backups). - [MCP server](https://hosait.com/docs#mcp): `codex mcp add hosait --env HOSAIT_TOKEN=… -- npx -y hosait-mcp-server` or the same command with `claude`. Tools: get_hosait_guide, get_project_status, list_deploys, get_deploy, get_deploy_log, get_env, set_env (merge by key; a masked value means keep), delete_env, redeploy (returns deployId), rollback, restart, set_maintenance, get_runtime_logs, run_task (a command inside a compose service, time-limited), get_task, list_services, get_deploy_diagnostics (why a deploy failed, in one answer), check_live_site, get_domain_diagnostics, get_usage (disk, memory, CPU), analyze_repository and connect_repository (repo to first deploy on a blank project, owner approves); get_runtime_logs filters by grep and level. - [Error codes](https://hosait.com/docs#errors): stable codes on every failed deploy (compose_unsafe, no_web_service, web_service_unhealthy, branch_not_found, github_connection_expired, github_rate_limited, …). The MCP API adds `error: {code, text, retryable}` in English to every deploy. ## Before you push - Build locally with Docker first (`docker compose -f build`, or `docker build .`), from a clean checkout of what will be pushed. A deploy is a production build on a clean machine; type errors, an out-of-sync lockfile and uncommitted files otherwise surface as a failed deploy. - Until a compose stack has been live once, a failed deploy removes its volumes too, so the next attempt initialises the database with the current variables. After the first success, volumes are kept. The first live database is empty — local users and data do not come along. ## API - REST base: `https://hosait.com/api/mcp/v1`, `Authorization: Bearer ` (created under the project's Settings → API tokens; scoped to one project). Paths: /project, /deploys, /deploys/:id, /deploys/:id/log, /env (GET, PATCH with mode merge|replace), /env/:key (DELETE), /redeploy, /rollback, /restart, /maintenance (POST `{on: boolean}`), /logs (GET `?service&tail&since`), /tasks (POST `{service, command, timeoutSeconds?}` → 202 with the task; GET list), /tasks/:id. Errors are JSON `{ok:false, code, error}` in English. - Deploying prebuilt images from CI: turn off push deploys (Settings → Advanced), tag images with the commit and use `image: …:${HOSAIT_COMMIT_SHA}` in the compose file, then `POST /redeploy {"ref": ""}` (the branch tip; `ref_not_latest` for an older one unless `allowOlder: true`). A pinned run that starts after a newer commit went live is recorded as skipped. - Holding pages carry `X-Hosait-Placeholder: queued|provisioning|failed|maintenance|available|unknown_address|upstream_down` and answer JSON on `Accept: application/json`; a running app is proxied untouched. ## Custom domains - Project page → Settings → Domains. Apex or subdomain, several per project, the hosait.com address is permanent. Ownership: TXT `_hosait.`. Pointing: A `213.184.208.76` (apex) or CNAME `custom.hosait.com`. Add these records and change nothing else in the zone. One primary; aliases 308 to it. Certificate before DNS moves (Domeneshop API token → automatic DNS-01; DNS delegation — CNAME `_acme-challenge.` to a target under `acme.hosait.com`, Hosait issues and renews; or manual `_acme-challenge` TXT). Wildcards: `*.example.com` serves every name one level under it with the Host intact (TXT `_hosait.example.com`, CNAME `*.example.com` → `custom.hosait.com`, plus the delegation CNAME); an exact name wins over a wildcard. `GET /project` in the MCP API lists `domains` read-only. ## Storage - S3-compatible object storage in Oslo: endpoint https://s3.hosait.com, path-style, region `oslo`, one bucket and one key per project scoped to Get/Put/Delete/Head, private objects, unversioned (deletes delete). ## Resources, images and backups - Memory and CPU per compose service come from the file (`deploy.resources.limits`, or `mem_limit`/`cpus`; 1 GB / 1 CPU when undeclared), capped by the account's plan per service and per project: Starter 2 GB / 2 CPU, Pro 4 GB / 4 CPU, Scale 16 GB / 8 CPU. Over a cap: `compose_limits_exceeded`. - Every deploy pulls `image:` services again. Private images: a login per registry and project under Settings → Private registries (`registry_auth_required` when it is missing). - Nightly encrypted dumps of every Postgres/MySQL/MariaDB/MongoDB service, 7 daily + 4 weekly (Scale 14/8/6 monthly); restore and download on the project page. Stored in Norway on Hosait's servers; not yet off-site.