Using myrt
Everything you can do with myrt in your browser — no code, no terminal, nothing to install. Writing code instead? The Building on myrt track (the toggle above) is the full API guide.
Start here#
myrt is an AI employee that actually does the work: it browses the web, clicks, types, researches and creates — in a live viewport you can watch. It runs entirely at myrt.cloud: nothing to install, nothing to configure before your first task.
Getting going takes about a minute: create a free account (no credit card) and the Get Started wizard walks you through your first run, step by step. Or just open the chat and try it without an account — the conversation stays in that browser until you sign in.
Talk to your agent#
The chat is the fastest way in: ask questions, draft text, plan a trip, think out loud. You can speak to it out loud too — and you decide when it talks back (never automatically unless you ask).
Chats you finish while signed in are saved to your account and listed in the side panel; as a visitor, everything stays in the browser you used.
Give it real work#
The Agent App is where tasks happen. Describe what you want done — research, filling a form, watching a page, a recurring chore — and myrt shows you what it plans to do and what it will cost before anything runs. Then watch every step live in the viewport: the pages it opens, the buttons it presses, the text it writes.
Anything that spends money waits for your approval first. Finished runs are kept with their full history and an honest per-run cost, so you always know exactly what your agent did — and what it cost.
Make things#
Five studios, one account — every one of them starts you off with example prompts, so you never face a blank page:
| Studio | What it makes |
|---|---|
| Image | Pictures from a sentence — art, edits, logos, mockups. |
| Music | Short clips and full tracks, with or without vocals. |
| Video | Short video clips from a prompt. |
| Motion | Describe what should move — myrt animates the scene. |
| Characters | Reference pictures, a description, a bound voice — then consistent scenes and talking avatars. |
All of them work on the free daily allowance. Later, if you want more engines or your own accounts, plug them in under Settings → Integrations.
What myrt remembers#
The agent remembers your preferences and open threads so it never asks you twice — and everything it remembers is visibly yours: each memory shows its source and age, and can be edited or forgotten on the spot. Deleting a conversation also offers to forget what it learned from it (on by default — you can say no).
See it all under Settings → Memory & history. You can download everything myrt holds about you from the same place, any time.
Your plan and spend#
The free tier includes $0.50 of compute and 25 agent runs every day — enough to try everything on this page for real. Allowances reset at 00:00 UTC; what you have left is always visible on the Billing page, and Usage shows the per-day charts.
No surprises, by design: before any run that costs money, the pre-flight card shows the price and waits for you.
Going further#
When the free allowance starts feeling small, three honest paths:
- Bring your own model — if you have a computer with a GPU (or want to rent one by the hour), point myrt at it and pay $0.00 per token. Set up under Settings → Integrations; the full guide is BYO brain on the Building track.
- Connect your machines — a second computer or your phone can join your myrt and lend its power (or its browser). Pair it from Settings → Inference node.
- Upgrade when it earns it — plans and invoices live on the Billing page; nothing ever charges you silently.
myrt API docs
Run code and drive an AI agent over HTTP — sandboxed, metered, honest. Everything below talks to the API endpoint …; the examples fill it in automatically for this deployment.
Quickstart#
- Create an account — sign up free, no credit card. Prefer a guided start? 60-second Get Started.
- Create an API key — Keys page → Create key.
- Run your first task — POST the key and your code to
/execute:
curl -X POST BASE/execute \
-H "X-API-Key: myrt_sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"code": "6*7"}'Response (v:2 contract):
{
"v": 2,
"result": 42,
"stdout": ""
}http:// — that is the API load balancer on port 9090, and it is the connection your tools make, unrelated to how this page reached your browser. Server-side clients (curl, Python, Node) use it exactly as shown. Calling from browser code instead? Use the same-origin proxy POST /api/my/execute (your login session authenticates it — an https page cannot fetch a plain-http endpoint). TLS on the API itself arrives with the myrt.cloud domain.myrt_sk_live_… and are shown once — save it somewhere safe. Lose it? Create a new one on the Keys page; the old key keeps working until you delete it.code field is JavaScript. Console output is captured into stdout; the value of the last expression is result. Pin the contract version with ?v=1 if you want the legacy shape.Authentication#
Two kinds of credential, two jobs:
| Credential | Looks like | Use for |
|---|---|---|
| send thisAPI key | myrt_sk_live_… | Calling /execute, checking your quota — one header: X-API-Key |
| Session JWT | (stored by the dashboard) | Creating / listing / revoking keys in the dashboard — Authorization: Bearer … |
API keys are scoped to your account, hashed at rest (only the SHA-256 is stored), revocable in one call, and rotatable with a 5-minute grace window so rotation never drops traffic. Never put an API key in client-side code — it is a server-side secret.
POST /execute#
Runs JavaScript in a sandboxed runtime and returns the answer.
| Request field | Meaning |
|---|---|
code | JavaScript source (required; requests are capped at 64 KiB) |
tenant_id | Your tenant id (optional — derived from the key when omitted) |
| Response field | Meaning |
|---|---|
v | Contract version — currently 2 |
result | Value of the last expression (JSON-serializable) |
stdout | Everything console.log() printed |
curl -X POST BASE/execute \
-H "X-API-Key: myrt_sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"code": "console.log(\"hello\"); [1,2,3].map(x => x*x)"}'{
"v": 2,
"result": [1, 4, 9],
"stdout": "hello\n"
}Check your remaining allowance any time with GET /wasm-quota (WASM component invocations) using the same X-API-Key header.
Key lifecycle#
These routes use your login session (the dashboard sends the JWT for you — on the Keys page everything below is one click):
| Route | What it does |
|---|---|
POST /api/keys {"label":"…"} | Create a key — the plaintext is returned exactly once (HTTP 201) |
GET /api/keys | List your keys (labels + SHA-256 hashes, never the secret) |
POST /api/keys/revoke {"key_hash":"…"} | Revoke immediately — revocation is enforced at the gateway |
POST /api/keys/rotate {"key_hash":"…"} | Mint the new key first; the old one gets a 5-minute grace expiry |
401 on the next call — instantly when revoked through the dashboard, within 60 s at most otherwise.Tiers & limits#
| Tier | Included compute / day | Agent runs / day | Runaway ceiling / run |
|---|---|---|---|
| free | $0.50 | 25 | $3.00 |
| pro | $5.00 | 200 | $15.00 |
Allowances reset at 00:00 UTC. The runaway ceiling is an emergency per-run cost stop, far above a normal task's cost — if a run ever loops out of control it is stopped there, and you keep the answer up to that point. Editor runs via the dashboard are free and never count against the allowance.
Rate-limited responses (429) carry a Retry-After header. Your remaining daily allowance is available any time from the quota endpoints — GET /api/agent/quota with your login session, or the quota line under the app composer — so you can back off before hitting the wall.
Errors (and what to do)#
| Status | Means | What to do |
|---|---|---|
| 400 | Bad request shape | Check the JSON body / field names |
| 401 | Missing, invalid, revoked or expired key | Create or rotate a key from the dashboard |
| 403 | Valid key, not allowed for this route | You are hitting an admin route with a user key |
| 429 | Rate limit reached | Wait for the Retry-After header (seconds), then retry. Not an error in your code — just slow down or upgrade your tier |
| 500 | Server error | Retry after a moment; if it persists, check /health |
Retry-After header tells you exactly how long to wait (it can be several minutes after repeated admin-auth failures — repeated failures on admin routes trigger an exponentially growing lockout). Your dashboard shows friendly copy for all of this.More examples#
Python (requests)
import requests
API = "BASE"
KEY = "myrt_sk_live_YOUR_KEY"
r = requests.post(f"{API}/execute",
headers={"X-API-Key": KEY},
json={"code": "6*7"},
timeout=15)
r.raise_for_status()
print(r.json()) # {'v': 2, 'result': 42, 'stdout': ''}
# Retry-After-aware error handling
if r.status_code == 429:
wait = int(r.headers.get("Retry-After", "60"))
print(f"Rate limited — retry in {wait}s")Node.js (built-in fetch, Node 18+)
const API = "BASE";
const KEY = "myrt_sk_live_YOUR_KEY";
const res = await fetch(`${API}/execute`, {
method: "POST",
headers: { "X-API-Key": KEY, "Content-Type": "application/json" },
body: JSON.stringify({ code: "console.log('hi'); 6*7" }),
});
const data = await res.json();
if (res.status === 429) {
const wait = res.headers.get("Retry-After") ?? "60";
console.log(`Rate limited — retry in ${wait}s`);
} else {
console.log(data); // { v: 2, result: 42, stdout: 'hi\n' }
}In the browser (from the dashboard origin)
// From dashboard pages, the /api/my/execute proxy avoids CORS
// and forwards your key (server-scoped to your account).
const res = await fetch("/api/my/execute", {
method: "POST",
headers: { "Content-Type": "application/json", "X-API-Key": KEY },
body: JSON.stringify({ code: "6*7" }),
});
console.log(await res.json()); // { v: 2, result: 42, stdout: '' }BYO brain — your own models, $0.00/token#
The most common cloud objection is the bill: "AI APIs are expensive — why can't I use my own local model?" You can — three ways, and every one ends in the same card: Settings → Integrations & credentials → BYO brain. myrt live-verifies the endpoint on save (a real /v1/models call — never on faith), and the pre-flight card prices runs that ride it at $0.00.
1. Same machine or LAN
Any OpenAI-compatible endpoint — Ollama, LM Studio, llama.cpp llama-server, LocalAI, vLLM — at http://localhost:11434 or a LAN address. Position First = local-first with cloud failover; Fallback = cloud-first with your endpoint catching cloud outages.
2. The mesh inference node — your home GPU, no open ports
The machine next to your GPU pairs onto the myrt mesh as a locked-down inference node (Settings → Inference node → Pair a node; single-use code, one binary, no root, NAT-proof). It is reachable only inside the tailnet — never exposed to the internet — and myrt verifies it live by probing it through the mesh. Media lanes ride the same node: image (A1111-compatible), STT and TTS (OpenAI-compatible), each live-verified on its own canonical port.
3. A tunnel — cloudflared, Tailscale Funnel or frp
Put a public URL in front of your home server and paste it into the same card. Each recipe's honest security posture is in the full guide (repo: docs/BYO-BRAIN.md) — the short version: a public URL is public; run a key-enforcing server behind it.
Honest split-routing — no parity promises
Local-first for mechanical lanes (summarize, extract, classify, reformat, drafts), cloud escalation for judgment lanes (debugging, refactoring, API design). Not vibes — receipts: on the cloud workhorse model the reproducible ceiling is 5/9 floor, 6/9 observed (the L1-L9 agent benchmark, pinned temp 0.2 / seed 42; full method in docs/EVAL_BASELINE.md), with debugging / refactoring / API design the stable failures even on the cloud model. A local model will not clear a bar the cloud workhorse misses — so myrt promises no local-cloud parity, ever. The chain position (First / Fallback) is the policy knob, and the pre-flight card shows the price per run before it happens.
Self-hosting & go-live#
Running your own myrt.cloud deployment? This is the operator checklist — everything below is already true for this deployment except the two steps that need a domain owner (DNS and the Polar product).
1. Point the domain
Create an A record for myrt.cloud (and www) pointing at this VPS. Once DNS resolves, Caddy issues a Let’s Encrypt certificate automatically on the first request — ports 80 and 443 are already open and the HTTPS site block (HSTS, SSE-safe timeouts, www redirect) is already configured. No certificate files to manage.
2. Turn on card billing
Billing runs on Polar.sh (Stripe was replaced — checkout and webhooks are already implemented). Create the products in Polar, then fill in the empty values the service unit already reserves:
# /etc/systemd/system/myrt-dashboard.service Environment=POLAR_ACCESS_TOKEN=polar_at_... Environment=POLAR_WEBHOOK_SECRET=whsec_... # endpoint: https://myrt.cloud/api/billing/webhook Environment=POLAR_PRODUCT_STARTUP=productid # maps the 'startup' plan Environment=POLAR_PRODUCT_PRO=productid # maps the 'pro' plan # then: systemctl daemon-reload && systemctl restart myrt-dashboard
Until those are set, the billing API answers honestly in dev mode: POST /api/billing/webhook with {"email","tier"} simulates a payment so you can test upgrades end-to-end. Signatures are verified with Polar’s Webhook-Id / Webhook-Timestamp / Webhook-Signature headers (HMAC-SHA256) once a secret is configured.