# Orizon — full documentation for agents Orizon is what people outgrowing shared cPanel hosting switch to. It matches everything a typical shared host gives you — a file manager, real you@yourdomain email with webmail, MySQL/MariaDB plus 8 more database engines, one-click WordPress, switchable PHP versions, DNS/domain management, automatic SSL, and cron + daily backups — in the same price band (plans start at ₦1,500/mo), then adds what shared hosting can't: git push deploys, deploy previews per branch, modern runtimes (Node, Next.js, Bun, Go, Rust, Python, Docker), a dedicated-server tier, and global edge delivery. Import an existing cPanel site (files, database, mailboxes, domains) from the dashboard's Migrations tab, or start fresh from a GitHub repo, a Git URL, a Dockerfile, or an uploaded folder/zip — Orizon detects the stack, builds it, and runs it with a live URL and auto-renewing TLS. Key URLs: - Site / docs: https://orzn.io/docs - Dashboard: https://dashboard.orizon.ng - Migrate from cPanel: https://dashboard.orizon.ng/migrations - API base: https://api.orizon.ng/api/v1 - API keys: https://dashboard.orizon.ng/api-keys - CLI install: curl -fsSL https://cdn.orzn.space/cli/install.sh | sh - Pricing: https://orzn.io/pricing ================================================================================ QUICKSTART ================================================================================ From the dashboard: 1. Sign in at https://dashboard.orizon.ng and open "New". 2. Paste a Git URL (GitHub, GitLab, Bitbucket, any public .git URL), or connect GitHub and pick a repo. 3. Orizon auto-detects the stack (Next.js, Node, Bun, Go, Rust, Python, PHP, Docker, or static). Review the detected build. 4. Press Deploy. Build logs stream live. 5. When the build is "healthy", the app is live at .apps.orizon.ng with TLS already in place. From the terminal: curl -fsSL https://cdn.orzn.space/cli/install.sh | sh orizon login --key orz_pk_your_key_here cd my-app orizon link --project proj_123 orizon deploy THE PORT CONTRACT: server apps must listen on the port from the PORT env var. Orizon runs the container with PORT=3000 and proxies public traffic to it. Bind to 0.0.0.0:$PORT, not localhost. Static sites and PHP apps are served directly and do not need this. Switching from cPanel: open https://dashboard.orizon.ng/migrations, upload a cPanel backup or paste a link, and Orizon imports the files, database, mailboxes, and domains for you. Add environment variables in the dashboard's Environment tab, or: orizon env push .env # triggers a redeploy Values are encrypted at rest and never returned in plaintext from the API. Add a custom domain in the project's Domains tab: an A record for an apex domain or a CNAME for a subdomain. TLS is provisioned and renewed automatically. ================================================================================ CORE CONCEPTS ================================================================================ PROJECT (proj_...): one app — source, production branch, env vars, primary domain, and a deployment history. DEPLOYMENT (dep_...): one build-and-release. Statuses: queued -> building -> deploying -> healthy; or failed (previous healthy release keeps serving); or rolled_back. Builds happen on a build node; the image runs on a runtime node, so a failed build never causes downtime. Roll back to any earlier healthy deploy. ENVIRONMENT VARIABLES: per-project secrets/config injected at build and runtime, encrypted at rest, masked in the UI. Changing them triggers a redeploy. A global view browses/searches vars across all projects; .env export is gated behind an email OTP re-auth. NODES: the servers apps run on. Shared infrastructure on Go plans; a dedicated server on Plus plans. Idle Go-tier apps can auto-sleep and wake on the next request. ================================================================================ DEPLOYING ================================================================================ WAYS TO DEPLOY: - From GitHub: connect a repo; Orizon auto-deploys every push to the production branch and reports each deployment back to GitHub via the Deployments API. - From a Git URL: paste any public .git URL. Point-in-time clone (doesn't watch for pushes). Append ?repo=&branch= to the dashboard /new URL to pre-fill the flow (this powers the Deploy to Orizon button). - Dockerfile: if a Dockerfile is at the source root, Orizon builds it as-is. - Docker Compose: a docker-compose.yml runs your services together; one "web service" (configurable name + port) receives public traffic. - Upload (folder/zip): from the dashboard or `orizon deploy`. The archive is extracted and stack detection runs on the REAL files (including PHP) — uploads are NOT assumed static. - PHP & WordPress: detected from composer.json or .php files; an optional public/ directory is used as the docroot; served on PHP-FPM behind Caddy. - Static sites: a folder with an index.html is served directly; source files are published without a lossy snapshot so asset-heavy sites stay intact. - Bun: detected from a Bun lockfile; runs on the Bun runtime. Single-node Bun deploys serialize (a concurrent deploy returns 409). STACK DETECTION (first match wins): Docker (Dockerfile or docker-compose.yml) -> Next.js -> Go (go.mod / .go) -> Rust (Cargo.toml) -> PHP (composer.json / .php) -> Python (requirements.txt / pyproject.toml / .py) -> Node/Bun (package.json) -> Procfile -> Static (index.html). You can override the detected build before deploying. For anything unusual, add a Dockerfile. ================================================================================ PUBLIC API ================================================================================ Base URL: https://api.orizon.ng/api/v1 AUTH: create a platform API key at https://dashboard.orizon.ng/api-keys. It looks like orz_pk_... and is sent as a Bearer token. Keys are org-scoped and either "full" (read + write) or "read" (GET only). The secret is shown once. curl https://api.orizon.ng/api/v1/projects \ -H "Authorization: Bearer orz_pk_your_key_here" RATE LIMIT: 20 requests/second per key; 429 with Retry-After when exceeded. OpenAPI spec: https://api.orizon.ng/api/v1/openapi.json ENDPOINTS: GET /projects List your projects POST /projects Create a project (write) body: { name, repositoryUrl, productionBranch? } GET /projects/{id} Get a project GET /projects/{id}/deployments List a project's deployments POST /projects/{id}/deployments Trigger a deployment (write) body: { branch? | commitSha? | sourceTarballUrl? } POST /uploads Upload a source archive (write) -> { sourceTarballUrl, framework, fileCount } GET /deployments/{id} Get a deployment's status GET /deployments/{id}/logs Read a deployment's logs (?source=runtime for runtime logs) GET /projects/{id}/env List environment variables PUT /projects/{id}/env Set env vars (write); body: { variables: { NAME: value } } GET /databases List managed databases GET /databases/{id} Get a managed database GET /projects/{id}/domains List a project's domains EXAMPLES: # Deploy curl -X POST https://api.orizon.ng/api/v1/projects/proj_123/deployments \ -H "Authorization: Bearer orz_pk_your_key" \ -H "Content-Type: application/json" \ -d '{"branch":"main"}' # Tail logs curl https://api.orizon.ng/api/v1/deployments/dep_123/logs \ -H "Authorization: Bearer orz_pk_your_key" # Set env (replaces the set, triggers a redeploy) curl -X PUT https://api.orizon.ng/api/v1/projects/proj_123/env \ -H "Authorization: Bearer orz_pk_your_key" \ -H "Content-Type: application/json" \ -d '{"variables":{"NODE_ENV":"production"}}' ================================================================================ CLI ================================================================================ Install: curl -fsSL https://cdn.orzn.space/cli/install.sh | sh Windows binaries: https://cdn.orzn.space/cli/latest Binary name: orizon Auth: `orizon login --key orz_pk_...` saves to ~/.orizon/config.json (mode 0600). The ORIZON_API_KEY env var overrides the saved config (use in CI). Override the endpoint with --api or ORIZON_API_BASE. Default endpoint: https://api.orizon.ng/api/v1 Commands: orizon login --key orz_pk_... Save and verify an API key orizon projects (alias: ls) List your projects orizon link --project Link the cwd to a project (writes .orizon.json) orizon deploy Zip cwd, upload, deploy, stream logs orizon logs --follow Stream a deployment's logs (--project to target one) orizon env pull Print NAME=VALUE for the project orizon env push [file] Set env vars from a .env file orizon open Open the project's URL in a browser orizon mcp Run the MCP server (stdio) for coding agents orizon version (-v) Print the CLI version Global flags (any command): --project , --api , --key ================================================================================ CONNECT CODING AGENTS (MCP) ================================================================================ The CLI ships a stdio MCP server: `orizon mcp`. It reads the API key from the ORIZON_API_KEY env var. Claude Code: claude mcp add orizon --env ORIZON_API_KEY=orz_pk_xxx -- orizon mcp Generic MCP config (Cursor, Windsurf, others): { "mcpServers": { "orizon": { "command": "orizon", "args": ["mcp"], "env": { "ORIZON_API_KEY": "orz_pk_xxx" } } } } Config file locations: Cursor ~/.cursor/mcp.json (or .cursor/mcp.json per project); Windsurf ~/.codeium/windsurf/mcp_config.json; Claude via "claude mcp add" or ~/.claude.json. MCP tools: list_projects List your projects get_project Get one project's details create_project Create a new project deploy_project Trigger a deployment list_deployments List a project's deployments get_deployment Get a deployment's status get_deployment_logs Read a deployment's logs list_env List environment variables set_env Set environment variables list_databases List managed databases get_database Get one managed database list_domains List a project's domains list_emails List recent transactional emails A drop-in AGENTS.md for your repo is at https://orzn.io/AGENTS.md ================================================================================ MANAGED DATABASES ================================================================================ Ten engines (identifiers): postgres, mysql, mariadb, mongodb, redis, keydb, dragonfly, clickhouse, cassandra, sqlite. Selectable versions: postgres 17, 16, 15, 14 (default 16) mysql 8.4, 8.0, 5.7, 5.6 (default 8.4) mariadb 11, 10.11, 10.6, 10.5, 10.4 (default 11) mongodb 8, 7, 6 (default 7) redis 7.4, 7.2, 7 (default 7) keydb latest dragonfly latest clickhouse 25, 24 (default 24) cassandra 5, 4 (default 5) sqlite served via libSQL (Turso sqld), token auth Create (dashboard or API): POST https://api.orizon.ng/v1/databases body: { name, engine, version?, databaseName?, username? } You choose the version at create time. Changing the major version of an existing database is a managed migration, not an in-place toggle. Connection string shapes (exact host/port/creds shown in the dashboard): postgres postgresql://user:pass@:5432/dbname mysql mysql://user:pass@:3306/dbname mariadb mysql://user:pass@:3306/dbname mongodb mongodb://user:pass@:27017/dbname?authSource=admin redis/keydb/dragonfly redis://user:pass@:6379 clickhouse clickhouse://user:pass@:9000/dbname cassandra cassandra://user:pass@:9042 sqlite libsql:// (token-based) Store the connection string as an env var (e.g. DATABASE_URL). EXPLORER & SQL WORKSPACE: for postgres/mysql/mariadb/sqlite — browse tables/views (paginated grid, sorting), run arbitrary SQL, keep history, export CSV/JSON (results capped ~1000 rows; export far more). For redis/keydb/dragonfly — a key browser + run individual commands. Queries run through the control plane over a private network; credentials never reach the browser. IMPORT/RESTORE: SQL engines — upload a .sql dump (up to 16 MB), or for Postgres provide a source database URL to copy across. Redis-family — upload a file of Redis commands. Imports run with a ~2 minute limit and report statements run + duration. LOGS & LATENCY: container logs (newest last, timestamped); live stats — status, storage used vs limit, active connections, and latency p50/p95/p99 (an active reachability probe, not your query latency). Start/stop/restart from the dashboard. Browser DB admin: phpMyAdmin (mysql/mariadb) or Adminer (postgres/mysql/mariadb/ mongo) via short-lived token-authed sessions. ================================================================================ DOMAINS & SSL ================================================================================ Every project is live instantly on a free .apps.orizon.ng URL with TLS already in place. (Slug is derived from the project, e.g. proj_sure_texts_6 -> sure-texts-6.apps.orizon.ng.) Each project has one PRIMARY domain, plus optional ALIAS domains (serve the same app) and REDIRECT domains (301 to the primary). CONNECT AN EXISTING DOMAIN — DNS records (shown per-domain in the dashboard): Apex (example.com): A @ -> Subdomain (www.…): CNAME www -> .apps.orizon.ng Ownership (both): TXT _orizon-challenge. -> orizon-verify= AUTOMATIC TLS: Caddy + Let's Encrypt issue and auto-renew certificates once DNS resolves to Orizon (HTTP challenge — DNS must be live first). Nothing to upload or renew. For Cloudflare-proxied domains, set DNS-only for initial issuance. BUY A DOMAIN: search availability + live pricing in the dashboard, register, and DNS is pointed at your project automatically. Some ccTLDs (e.g. certain .ng variants) use a separate registrar — register elsewhere and connect instead. ================================================================================ EMAIL (transactional) ================================================================================ Send transactional email from a domain you verify. Orizon generates and holds a per-domain DKIM keypair (bring-your-own-DKIM), signs your mail, and tracks delivery. Provider-agnostic: Amazon SES (BYODKIM), Resend, Cloudflare Email, or a "log" provider for development — selected by the operator via EMAIL_PROVIDER. VERIFY A DOMAIN: add a sending domain; Orizon returns four DNS records to publish, then verifies them over DNS-over-HTTPS: DKIM ._domainkey. TXT v=DKIM1; k=rsa; p= (default selector: orizon) SPF send. TXT v=spf1 include: ~all MX send. MX 10 DMARC _dmarc. TXT v=DMARC1; p=none; rua=mailto:dmarc@ SEND: POST https://api.orizon.ng/v1/emails Authorization: Bearer (create one in the dashboard's email section) body: { "from": "Name ", // domain must be verified "to": ["user@example.com"], // string or array; at least one valid "cc": [], "bcc": [], "reply_to": "...", // all optional, string or array "subject": "...", // required "html": "

..

", // html and/or text — at least one "text": "..", "headers": {}, "tags": {} // optional } -> { id: "em_...", status: "sent", suppressed: [] } Recipients on the suppression list are silently dropped (returned in "suppressed"). If every "to" recipient is suppressed, returns 422. Sends are rate-limited per key (~10/sec default). LOGS & DELIVERABILITY: statuses queued -> sent -> delivered / bounced / complained / failed. GET /v1/emails lists recent sends; GET /v1/emails/{id} returns the event timeline. Hard bounces and complaints auto-add to the suppression list. With SES, configure a Configuration Set publishing events to an SNS topic pointed at Orizon's email webhook (signature-verified). ================================================================================ OTHER FEATURES (brief) ================================================================================ CDN & STORAGE (cdn.orzn.space): buckets, presigned direct-to-storage uploads, and on-the-fly image transforms via URL params — width, height, format (auto/avif/webp/jpeg/png), quality (1-100), fit (scale-down/contain/cover/crop/ pad), e.g. /cdn-cgi/image/width=640,format=auto,quality=80///img.jpg Per-tenant bandwidth (stored bytes, egress, requests, transforms) is metered daily. CRON JOBS: standard cron expressions with timezones. A job either makes a signed HTTP request (GET/POST/PUT/PATCH/DELETE, HMAC-signed so you can verify it) or runs a shell command inside your linked project's container. Configurable timeout + retries with backoff; full run history; manual trigger; failures can alert over WhatsApp. TEAMS & AGENCIES: projects belong to a team (organization); invite teammates by email (pending until accepted, auto-activated on sign-in); switch active team. Agency white-label: isolated client orgs, a branded read-only portal on your subdomain/domain, and reselling at cost + markup (agency-wide or per-client). WHATSAPP BOT: link by sending your account email then a 6-digit code from the dashboard. Notifications for deploy/billing/domain/cron. Commands: status [project], deploys, redeploy , mute [type], unmute [type], unlink. BILLING & PLANS: two families — Orizon Go (shared infra, incl. a free tier with auto-sleep) and Orizon Plus (dedicated server, unlimited projects, scaling RAM/ storage/seats; top tier adds white-label). Prepaid wallet; usage metered daily (extra projects, databases, emails, DB storage, CDN egress) and billed as overage; unlimited dimensions never incur overage; monthly invoices with VAT. Current prices: https://orzn.io/pricing