Quickstart
Four steps from nothing to a live full-stack app with its own Postgres database. You need a GitHub account and a project folder; no card, no config file.
Sign in
Go to rivtor.com/login and sign in with GitHub. New accounts start on Pro for 14 days, then move to Free unless you upgrade. Nothing you deploy has to move either way.
Create a token
Open /dashboard/tokens and create an API token. It looks like rvt_ followed by 40 characters and is shown once, so copy it now. Agents and the CLI send it as Authorization: Bearer rvt_….
Connect your agent, or use the CLI
Option A: your agent
For Claude Code, run this once, replacing rvt_... with your token. Cursor, Codex and other clients are on Connect an agent.
claude mcp add --transport http rivtor https://api.rivtor.com/mcp --header "Authorization: Bearer rvt_..."Then, inside your project, ask:
Deploy this app to Rivtor.The agent calls the deploy tool. For a folder on your disk the local server uploads it directly; the remote server can deploy a Git URL, a starter, or up to 2 MB of files passed inline.
Option B: the CLI
From the root of your project:
npx rivtor loginnpx rivtor deploylogin asks for your token and stores it in ~/.config/rivtor/config.json. In CI, set RIVTOR_TOKEN instead.
What you get back
About two minutes later for a typical Next.js + FastAPI + Postgres app (static sites in under 30 seconds), one response with every URL, the status of every service and data service, the database connection string and a dashboard link. The password in databaseUrl is masked unless you ask for it.
{
"status": "live",
"deploymentId": "dpl_7h2k9x",
"project": "my-app",
"urls": {
"web": "https://my-app.rivtor.com",
"api": "https://my-app-api.rivtor.com"
},
"services": [
{ "name": "web", "kind": "web", "runtime": "container",
"status": "live", "framework": "nextjs",
"url": "https://my-app.rivtor.com" },
{ "name": "api", "kind": "api", "runtime": "container",
"status": "live", "framework": "fastapi",
"url": "https://my-app-api.rivtor.com" }
],
"data": [
{ "kind": "postgres", "status": "ready",
"sizeBytes": 8388608, "limitBytes": 1073741824 },
{ "kind": "redis", "status": "ready",
"sizeBytes": 0, "limitBytes": 52428800 }
],
"databaseUrl": "postgresql://p_my_app:••••@host.docker.internal:6432/p_my_app",
"dashboardUrl": "https://rivtor.com/dashboard/projects/my-app",
"durationMs": 118400
}Your app already has DATABASE_URL, REDIS_URL and any S3_* variables it needs, and the frontend's NEXT_PUBLIC_API_URL points at the API. See Data services.
If a secret is missing
When your code reads a variable such as STRIPE_SECRET_KEY that has no value, deploy stops before building and returns needs_input with each name and the line that reads it:
{
"status": "needs_input",
"stage": "plan",
"code": "missing_secrets",
"cause": "The app reads a secret that is not set: STRIPE_SECRET_KEY",
"fix": "Ask the user for STRIPE_SECRET_KEY, call env_set with them, then call deploy again.",
"retryable": true,
"missing": [
{ "name": "STRIPE_SECRET_KEY", "service": "api",
"usedIn": ["api/payments.py:3"] }
]
}Your agent asks you once, calls env_set, and deploys again. From the CLI:
npx rivtor env set STRIPE_SECRET_KEY=sk_live_...Secret values are encrypted at rest, injected only at runtime and never echoed back in tool results.
Redeploy
Change code and call deploy again, or run npx rivtor deploy. Each service is fingerprinted by a hash of its files, and only services whose files changed are rebuilt, so redeploys take under a minute. The previous release keeps serving until the new one passes its health check.
No code yet?
Deploy a starter app: a Next.js frontend, a FastAPI backend and Postgres, wired together. Ask your agent for the Rivtor starter, or call the remote deploy tool with:
{ "project": "my-first-app", "starter": "nextjs-fastapi-postgres" }Next
- MCP tools: logs, rollback, read-only database queries, custom domains.
- Frameworks & deploy.toml: what detection found, and how to override it.
- Errors: how failed deploys explain themselves.