# preview-my-app > Temporary, audience-aware preview links for anything you can tunnel. One command creates a disposable HTTPS URL with expiry and revoke; viewers never need an account or seat. Preview-my-app is a developer tool for sharing local apps, staging sites and preview builds through Cloudflare Tunnel. The CLI is published on npm as `preview-cmd`; the hosted control plane is at preview-my.app. ## Pages - [Home](https://preview-my.app/): install, features and pricing summary - [Pricing](https://preview-my.app/pricing): plans, comparison and FAQ - [Pricing markdown](https://preview-my.app/pricing.md): machine-readable plan details - [Privacy](https://preview-my.app/privacy): data, processors and retention ## Plans - Free: $0. One 6-hour link; ten 8-hour links, five invites per link and 1 GB/month after email verification. One ephemeral connector. Links are served from preview-my.work. No viewer accounts. - Pro: $19/mo after a 14-day trial. 10 links, 30-day expiry, 20 GB/month, 20 invites per link, one persistent agent, one custom domain. Links default to preview-my.app or can use preview-my.work. - Team: $59/mo. 50 links, 30-day expiry, 100 GB/month, 100 invites per link, three persistent agents, three custom domains. - All plans include PR previews from GitHub Actions or any CI that can run the CLI. - Free and anonymous links are served from preview-my.work; Pro and Team links default to preview-my.app and may choose either domain. - Preview stacks group several services under one invite, expiry, review decision and revoke. Each service counts as one link. - All plans include optional client review: pinned comments, approve or request changes. - Add-ons: $5/mo per extra persistent agent, $1/mo per extra custom domain. ## Link domains - Free and anonymous links are served from preview-my.work. - Pro and Team links default to preview-my.app; pass `--domain work` (or `{domain:"work"}`) to use preview-my.work. - Custom domains replace either shared domain on Pro and Team. - preview-my.shop redirects to preview-my.app and never serves links. ## Leak protection - `--pin` adds a viewer PIN to a link or stack; only the HMAC is stored. - `preview scan [path]` checks built HTML, JS, JSON and env files for common credentials. - The GitHub Action runs the scan before creating a preview and warns by default. - Free links that kill their budget raise an owner alert and are revoked. ## Install ```text npm i -g preview-cmd preview signup --anonymous preview verify --email you@example.com ``` `preview signup --anonymous` creates a free account and stores the API key; `preview verify` unlocks the verified free limits. The CLI stores credentials under the user config directory. ## CLI ```text preview create --port 3000 [--ttl 8h|24h|7d] [--label pr-123] [--review] [--domain app|work] [--pin 2468] preview stack create --name acme-pr-123 --service web:3000 --service api:8080 [--review] [--pin 2468] preview stack invite [--name Sarah] [--email sarah@example.com] [--opens 1] preview stack review [--approve | --changes] [--comment "text"] preview stack revoke preview scan [path] [--json] preview invite [--name Sarah] [--email sarah@example.com] [--opens 1] preview review [--approve | --changes] [--comment "text"] preview stats [--days 7] preview revoke preview revoke-invite preview revoke-all preview agent enroll --token preview agent install preview mcp serve --stdio ``` `preview create` prints the public URL and the `cloudflared` command. `--review` enables the optional viewer toolbar (comments, approve, request changes). `preview review` reads the status and comments; `--approve` / `--changes` record an owner/agent decision. ## Agent API Base URL: `https://preview-my.app`. Authenticate with `Authorization: Bearer `. ```text POST /v1/auth/anonymous {name} -> {key, tenant} POST /v1/auth/signup {email} -> {sent:true} POST /v1/auth/verify {email, code} -> {tenant, key} POST /v1/links {port, ttlSeconds?, label?, review?, domain?} GET /v1/links list links POST /v1/links/:id/invites {name?, email?, maxOpens?, ttlSeconds?} GET /v1/links/:id/review status, decision and comments POST /v1/links/:id/review {status: "approved"|"changes_requested", comment?} POST /v1/links/revoke-all revoke every live link POST /v1/stacks {name, services:[{name,port,label?}], ttlSeconds?, domain?, review?, pin?} GET /v1/stacks list stacks POST /v1/stacks/:id/invites {name?, email?, maxOpens?} GET /v1/stacks/:id/review stack decision and comment POST /v1/stacks/:id/review {status: "approved"|"changes_requested", comment?} DELETE /v1/stacks/:id revoke the stack and every service GET /v1/billing/quote?plan=pro price and trial days GET /v1/billing/status plan, limits and subscription POST /v1/billing/checkout {plan, trial?} -> {url} POST /v1/billing/spt {plan, spt} -> 30-day agent pass POST /v1/billing/addons {agents, domains} (Stripe subscription only) ``` ## MCP `preview mcp serve --stdio` exposes: `create_link`, `list_links`, `revoke_link`, `create_invite`, `list_views`, `billing_status`, `share_preview`, `get_comments`, `wait_for_feedback`, `approve`, `request_changes`, `revoke_all`, `share_stack`, `list_stacks`, `get_stack_feedback`, `approve_stack`, `request_changes_stack`, `revoke_stack`. `share_preview` creates a link (review enabled by default) and an invite. `wait_for_feedback` polls for a decision or comment (default 120s, max 300s). ## Subscriptions - **Human checkout (recurring):** `preview upgrade pro` prints a Stripe Checkout URL. A human completes it; Pro starts with a 14-day trial and renews monthly. `preview upgrade pro --wait` polls until the plan is active. - **Agent pass (no human):** `preview upgrade pro --spt ` charges one month immediately and activates Pro for 30 days. It does **not** auto-renew; repeat the call with a fresh SPT before expiry. Team works the same way at $59. - **Status:** `preview billing status` or `GET /v1/billing/status`. - **Add-ons:** `POST /v1/billing/addons` requires a Stripe subscription (`stripeSubscriptionId`), so an SPT pass cannot add extra agents or domains. - **Cancel:** email legal@preview-my.app before renewal. There is no billing portal. An SPT pass simply expires after 30 days. ## Source and license The core, CLI, providers and self-host targets are AGPL-3.0-or-later. The hosted app and marketing site are private.