Hosting for apps an AI wrote

Your AI ships it. It comes up already wired.

Manifest in, live URL out. A database bound, the project id set, and the login callback allowlisted before the app serves its first request. A bucket and a project key the moment you ask for them. Part of Parsons.

$15/mo or $150/yr · 14-day free trial, cancel any time
what you say
you → your AIShip this to Parsons and call it invoice-lens.
No dashboard step in the middle.
You never leave the conversation.
what it calls
1begin_deploymanifest
2PUT ×3 → R2presigned
3finalize_deployverify
Two tool calls and the uploads
between them. That is the whole deploy path.
what comes back
url
https://invoice-lens.parsonsapps.com
env.DB
db_7f2c… · a row in Database you can query and export
callback
/cb → on the project's redirect allowlist
from
noreply@invoice-lens.parsonsapps.com
The evening after the deploy

The deploy was never the hard part.

Your AI wrote the app in ten minutes. Then you became its sysadmin. Every item below is a browser form behind a signup, which is exactly why the assistant that wrote the code cannot do any of it for you.

01redirect_uri_mismatch — paste the callback into the auth vendor's console, exactly, trailing slash and allanother dashboard
02Provision a database somewhere else, then carry DATABASE_URL back by handanother signup
03Verify a sending domain so the password-reset mail isn't filed as spamDNS, then wait
04Discover the reset links point at the auth vendor's host, not at your appfails quietly
05Point a domain at it — and remember the apex and wwwtwo records
06Wire the same four environment variables again for the next appagain next app
07Pay the fourth vendor of the month for an app that gets a few hundred visitsfour invoices
—None of it is code. All of it is the reason the app is still on your laptop.the deployment gap
The turn

We don't host your app. We finish it.

Every host's job ends when the bytes are at a URL. That is the short half of the work, and it is the only half anyone sells. Parsons owns the auth service, the email service and the database service too — so the long half happens inside the same call, keyed to the same slug.

bytes → URL
per-app D1 as env.DB
/cb allowlisted
auth link base
From identity
routes wired
tail logs on
what a host does what finalize_deploy also does, in the same call, before the app serves a request

Why nobody else ships this

It isn't a feature gap they could close next quarter. A hosting layer has no auth product to append a callback to, and no sending identity to point noreply@ at. Doing it on your behalf would mean holding your credentials for three other vendors.

Why we can

The same account owns all of it. Deploy calls Auth, Database and Email over service bindings inside Cloudflare's network — no credentials cross a boundary, because there is no boundary to cross.

The mechanism

Two calls. Here is exactly what each one does.

Bundles never travel inside AI messages, and the bytes never pass through our worker. That is not a performance boast — it is the reason a 40-file app deploys from a chat window without timing out.

Call 1begin_deploy(manifest)

The manifest carries path, size and sha256 — never contents. Deploy compares it against what this app has already stored and answers with two lists.

your AI Deploy
returns
uploads: 3 → presigned R2 PUT URLs
returns
reused: 37 → already stored, send nothing
Between the callsPUT ×3 → the artifact store

Your AI PUTs the three files straight to R2. The Deploy worker is not on that path — so there is no hop to pay for, nothing to buffer, and nothing to time out on a large asset.

your AI Deploy skipped R2
Call 2finalize_deploy()

Every uploaded file is re-checked against the size and sha256 you declared. Then Deploy fans out — and this is the part that is not hosting.

Database
env.DB · a per-app D1, first deploy only
Auth
/cb appended to the redirect allowlist
Auth
email link base → your app's host
Email
noreply@{slug}.parsonsapps.com
returns
the live URL + the exact htmlRoutes map

Also set, always: env.PARSONS_PROJECT_ID and env.PARSONS_DATABASE_ID. On request: env.FILES (a per-app R2 bucket, registered in Storage) and env.PARSONS_KEY (a write-only project key). Runtime is nodejs_compat with a 2026-06-01 compatibility date.

Static assets ship in the same deploy. Files under assets/, public/ or static/ serve with the directory prefix stripped, and .html loses its extension — public/brand.html serves at /brand. You don't have to guess: finalize_deploy hands back the route map it actually built.

create_app · begin_deploy · finalize_deploy · list_deployments · get_app
Content-addressed, across deploys

Change one file of forty. Upload one file.

The manifest is hashed, so begin_deploy already knows which bytes we hold. It hands back presigned URLs for the difference and nothing else — the tool's own instruction is upload only what comes back in uploads.

This is why a redeploy is a few seconds of network instead of a full re-upload, and why an AI can iterate on a running app without you noticing the cost of it.

Straight about this: the upload is seconds — edge propagation still takes about two to three minutes, and old and new versions interleave across locations while it happens. Don't treat one request as proof the new version is live everywhere.

begin_deploy → uploads[] / reused[]
worker.jsa91f…
public/index.html3c07…
assets/app.css77be…
assets/app.js1d40…
assets/logo.svgb284…
public/about.htmlff19…
public/pricing.html4a6c…
assets/hk.woff290d1…
assets/mono.woff22ee8…
assets/hero.webpc530…
assets/card.webp0b7a…
assets/icon-16.pnge6f2…
assets/icon-32.png5581…
assets/icon-180.pngd013…
public/robots.txt7c9e…
public/sitemap.xmlaa40…
assets/print.css3f81…
assets/chart.js6d2b…
assets/table.js19cc…
assets/forms.js82a5…
public/legal.html4e70…
public/terms.htmlb1d8…
assets/empty.svg27f4…
assets/check.svg9a63…
assets/alert.svgc8e1…
assets/menu.svg60ba…
assets/theme.cssfd27…
assets/reset.csse34f…
public/404.html7b05…
assets/og.png2c9d…
assets/avatar.webpa70e…
assets/blank.webpde52…
assets/util.js8f36…
assets/dates.js1607…
assets/money.jsb9a2…
public/help.html34dc…
assets/help.css50e9…
assets/sprite.svgc7f0…
assets/tour.jseb18…
assets/i18n.json96a7…
uploads: 1 → presigned PUT reused: 39 → nothing sent 40 files declared
Auth and sending identity

The login works on deploy one. So does the reset email.

Both the transactional From address and the link inside the mail are derived from the same slug at finalize time. They are not two settings that can drift apart, because they are not two settings.

Your users get password-reset mail from your app, with links back to your app — not from a hostname they have never seen. On deploy number one, with nothing to configure.

slug: invoice-lens From domainlink domain
pipeline: auth link base · email sender identity · redirect allowlist
Fromnoreply@invoice-lens.parsonsapps.com Toyou@example.com SubjectReset your password
Someone asked to reset the password for your account. If that was you, use the link below. https://invoice-lens.parsonsapps.com/reset?token=…
project redirect allowlist
https://ledger-notes.parsonsapps.com/cb
https://pacstow-quotes.parsonsapps.com/cb
https://invoice-lens.parsonsapps.com/cb appended

Appended idempotently on every deploy, and re-appended for each custom domain you attach.

Custom domains

Point your own domain at it. Apex and www.

Attach a deployed app to a real domain and the DNS records, the worker routes and TLS are created for you — the zone lives in the platform's own account. Buy the domain through Parsons Domains and there is no registrar tab to open at all; bring one you already own and you delegate its nameservers once, with no registrar transfer.

The cutover fans out to three planes at once. The third is the one everybody forgets.

ROUTESThe dispatcher's hostname map, so the request reaches your worker at all.
app_domainsThe app's own record of every hostname it answers on — used by every lifecycle op afterwards.
auth allowlisthttps://yourdomain.com/cb — miss this one and hosted login breaks on the domain your customers actually use, while the .parsonsapps.com URL you tested keeps working.

Domains are sold by Parsons Domains at wholesale + $4, always — a $10.88/yr .com is $14.99. Renewals price from the renewal list, so a cheap first year can't ambush you at year two.

🔒 invoice-lens.parsonsapps.com
the URL every app gets — no domain to buy, no DNS to write
🔒 invoicelens.com
apex — attached, proxied, certificate issued
🔒 www.invoicelens.com
www — attached in the same operation
typenamestate
Ainvoicelens.comproxied
CNAMEwww.invoicelens.comproxied

Takedown and every lifecycle operation fan out to all of an app's hostnames, custom domains included — an app can't be half-disabled.

The fuse

We turn the app off. We do not turn the meter up.

This is the part of the category that has gone unanswered since a static site on a metered host produced a six-figure invoice after a traffic spike. Every host meters past the included allowance — open-ended, on an invoice. Here, going past the allowance draws from prepaid credits you loaded on purpose, at roughly wholesale-plus-half — and high above sits a hard safety cap where the app stops serving instead of running up a bill.

a metered host
8,412,960
requests this month · past your included allowance
Still serving. Still counting.What it costs, you find out on the invoice.
Parsons · Base $15/mo
1,000,000
requests included · reconciled every 15 minutes
Past the allowance · prepaid creditsThe extra draws from your balance at $0.70 per million requests. At the hard safety cap the dispatcher serves a branded 410 instead of an invoice.
Read this before you decide it's a feature: a safety-cap breach disables every active app in the account, not only the one that blew the budget. That is the honest cost of a hard stop — the cap sits high above the allowance as a fraud stop, with an ask-us-to-raise-it path in the billing console — and we would rather you knew it here than at 11pm.
set_limits · per request
Defaults are 100 ms CPU and 64 subrequests. Raise them to at most 30,000 ms and 256 when an app genuinely needs it.
set_limits · per month
Your own monthlyRequests and monthlyCpuMs ceilings, below the plan's. Same behaviour: the app is disabled, not billed.
set_egress
open — the public internet, logged. Or strict — a host allowlist of up to 100. Private, loopback and cloud-metadata addresses are denied in both modes.
app_usage
Requests and CPU-ms for any YYYY-MM, straight from the reconciler's hourly buckets. Ask before the month ends, not after.

Egress verdicts are made on the hostname. DNS rebinding — a public name that resolves to a private address — is an open gap we have written down rather than papered over.

The data plane

When something is wrong, it says which thing.

A dedicated dispatcher answers every request to every tenant app. It never hands back a blank 500 and leaves you guessing which of five things broke — each cause has its own status code and its own branded page.

your-app.parsonsapps.com
404
No app on this hostname
The name isn't in the route map. Usually a typo, or a domain detached.
your-app.parsonsapps.com
410
App disabled
Someone called disable_app, or a monthly cap tripped. Reversible.
your-app.parsonsapps.com
402
Account not entitled
The subscription lapsed. The app comes straight back when it's current.
your-app.parsonsapps.com
429
Rate limited, or CPU exceeded
Abuse protection, or your per-request CPU ceiling was hit by this request.
your-app.parsonsapps.com
502
Your worker threw
Everything else. app_logs has the exception, newest first.

Logs stream off the running worker into a project-scoped store, filterable by log · warn · error · exception, up to 200 at a time, and retained for 7 days. Your AI reads them the same way you do — so "why is it 500ing" is a question it can answer without you pasting anything.

Drive it from your AI

22 tools. Every app tool takes a slug or an id.

Deploy lives in the assistant you already talk to — Claude, ChatGPT, Cursor, anything that speaks MCP. The model that wrote the code is the one that ships it, reads its logs and rolls it back.

Destructive tools are two-phase on purpose. rollback refuses without confirm and first tells you both versions — the one you are leaving and the one you are going to — because dep_ ids are indistinguishable at a glance.

one connection · minted for you at sign-inGET YOURS →
whoamidocsget_sdkcreate_appbegin_deployfinalize_deploy list_appsget_applist_deploymentsrollbackdisable_appenable_app delete_appset_secretlist_secret_namesdelete_secretset_limitsset_egress app_logsapp_usagetakedownlist_all_apps

The last two are platform-admin only — the abuse plane that can take an app down across every hostname it answers on. They are listed here because pretending they don't exist would be the dishonest choice.

› app_logs slug:"invoice-lens" level:"error" limit:3
3 entries · newest first · 7-day retention
› app_usage slug:"invoice-lens" period:"2026-08"
requests 412,880
cpu_ms 1,904,220
› rollback slug:"invoice-lens" confirm:false
PREVIEW — leaving dep_9c41… → going to dep_7a02…
call again with confirm:true
› list_secret_names slug:"invoice-lens"
STRIPE_SECRET_KEY · WEBHOOK_SIGNING_SECRET
names only — values are never readable back

Secrets survive redeploys and are readable in the app as env.<NAME> — and by nobody else, including you.

Vendored, not installed

The client library comes from the platform.

Call get_sdk and it hands back the full source and its type definitions to write into your project — about 28 kB of code plus 26 kB of types, with zero dependencies.

It is deliberately not on npm. A build session has no registry credential and Deploy runs no build step, so the library is served by the platform itself — which also means the copy in your repo always matches the platform that is live. No SDK-versus-platform skew.

@parsons/app-kit
Verify end-user logins, manage users and call models from inside your worker. Reach for it especially on token verification — a hand-rolled JWT check that misses a claim is the classic way another project's token starts working in yours.
@parsons/mcp-kit/tenant · /core
Ships in the same call, which means the app you deploy can itself be an MCP server — not only a website or an API. A site, an API, or a tool surface your own users connect their AI to.

Selling to your own customers runs on your own Stripe, through the parsons_billing tools — not through the app kit and not through us.

› get_sdk packages: ["app-kit"]
invoice-lens/
  worker.js
  public/
    index.html
  lib/parsons/
    app-kit.js 27,942 B
    app-kit.d.ts 25,895 B

Both files come from the same call. The tool insists you write the types next to the source, so the editor knows what the platform knows.

The honest list · nothing moves in this section

Read this before you switch.

You would find all of it out in the first hour. Better here.

Not built

  • No build step. You bring built bytes; your AI runs the bundler.
  • No preview deployments and no per-branch URLs. This is the rivals' best workflow feature and we do not have it.
  • No git integration. Nothing watches a repo.
  • No cron, queues, Workflows or Durable Objects inside your code. Point Parsons Scheduler at a URL your app serves instead — that is the supported pattern, and it is signed.
  • No choice of region.
  • The console is a watch surface. Deployments, rollback, logs, usage, secrets, disable, enable, delete. There is no create-app form and no deploy flow in it — shipping happens in the AI.

Hard limits and sharp edges

  • Ten apps per account. Flat. An anti-abuse ceiling, not an upsell.
  • Bundle caps: 5 MB modules · 2,000 asset files · 50 MB total · 25 MB per file.
  • Edge propagation takes about 2–3 minutes and is not atomic.
  • notFoundHandling: "single-page-application" silently breaks the /cb callback. Cloudflare's asset router answers HTML navigations before your worker runs — and curl still works, so a smoke test won't catch it. The tool warns you when you set it.
  • Egress verdicts are hostname-based. DNS rebinding is an acknowledged open gap.
  • delete_app retires the slug forever. Nobody, including you, can claim it again. Artifacts and the per-app database are deliberately retained.
  • Deploy is in beta.
Compare

Where we win, and where we don't.

Five of these rows go against us and they are marked in red, at the same size as the wins. A table that only flatters the vendor who built it is not evidence of anything.

 
Parsons Deploy
Vercel
Railway
Entry price, one person
$15/mo
Yearly: $150 — two months free
Hobby $0 · Pro $20/mo
Free $0 · Hobby $5 a month · Pro $20/mo per workspace
Cheapest way to put one small app online
No — we lose. $15/mo, and there is no free tier to fall back to
Hobby $0 — free, non-commercial use
Hobby $5 a month
Charged per developer seat
No seats exist
$20/mo per deploying seat — one included in the $20 fee, read-only viewers free
Seats included
What the price actually buys
An allowance — 1,000,000 requests, 10,000,000 CPU-ms, 1 GB
1 TB transfer + 10M edge requests included, then $20 of monthly credit, then metered
$5 of monthly usage credit on Hobby, $20 on Pro — then metered
Past the allowance
Prepaid credits — $0.70 per million requests, with a hard safety cap instead of an open meter
Metered — edge requests from $2 per million, Fast Data Transfer $0.15/GB after 1 TB
Metered — $0.00000772 per vCPU-second, egress $0.05/GB
A second project
Unlimited, free — own data, own members, own spend caps
Priced per seat, not per project
Projects are unlimited inside a workspace — but a second Pro workspace is another $20/mo
Database bound by the deploy call
Always — env.DB, a registry row you can query, export and migrate
You add and wire it yourself
You add and wire it yourself
Login callback allowlisted by the deploy
Yes — /cb, on every hostname
No auth product to allowlist into
No auth product to allowlist into
Transactional From on the app's own host
Yes — noreply@{slug}.parsonsapps.com
Bring an email vendor
Bring an email vendor
Drivable end to end by an AI
22 MCP tools, no dashboard step
CLI and dashboard
CLI, dashboard and an MCP surface
Build step run for you
No — we lose. Bring built bytes
Yes
Yes
Preview / per-branch URLs
No — we lose. A second app is your staging
Yes
Yes
Git-triggered deploys
No — we lose. Nothing watches a repo
Yes
Yes
Apps per account
10 — a ceiling they don't have
Not capped this way
Not capped this way
Same subscription covers 20+ other products
Yes — auth, database, email, storage, scheduler, phone and the rest. Base is $15; either rival charges $20 for hosting on its own
No
No

Every Vercel and Railway figure above is that vendor’s published list price, checked against vercel.com/pricing and railway.com/pricing on 2026-08-22 — go and check them yourself. Netlify and Render publish plan prices too (Render moved to flat, seat-free tiers on 2026-04-23) and simply aren’t compared here; Fly.io has no plan tier to compare at all — its compute is pay-as-you-go. A comparison table with a guess in it is worth less than one with a gap.

Pricing

One plan. It includes the other twenty-odd products.

Monthly or yearly, no seats, no free tier. The numbers below are the actual allowances the platform enforces — not headline figures with a meter tucked into a subpage. Going past one is welcome: the extra draws from prepaid credits at roughly wholesale-plus-half, so building stays free and the bill starts when real usage does.

Base
$15 / month
or $150 / year — two months free
requests included1,000,000
61% of the allowance
CPU-ms included10,000,000
app storage1 GB
  • Ten apps per account, each with its own database
  • Rollback, logs, write-only secrets, usage
  • Custom domains — apex and www (the domain itself is priced separately)
  • Every other Parsons product, same login
drag the traffic you expect 610,000

Base covers this. $15/month, and the apps keep serving.

Projects are unlimited, and free.

One for the business, one for the client, one for the thing you are not sure about yet — each with its own data, its own members and its own spend caps, at no extra cost. There is nothing to upgrade and there are no seats to buy. Vercel prices a second deploying developer at $20/month; Railway prices a second workspace at $20/month — both their published list prices, checked 2026-08-22. We price a second project at nothing. Those are charges that grow with your team and your client list; ours is the same number in year one and year three.

One subscription, the whole platform.

Deploy is one product on it. The same $15 is also your auth service, your database, your object storage, your outbound email, your scheduler and the rest — and one subscription covers all of it across unlimited projects.

DeployAuthDatabaseStorageEmailSchedulerNotificationsDomainsMoneyCRMTrackerJournalRadarFitnessPhoneAssistantsMusic+ more

Metered, but not capped.

Some things we measure and deliberately never limit, because they don't drive our cost: monthly active users on Auth, MCP tool calls, and databases created. Auth0 and Clerk meter MAU. We watch it and leave it alone.

The ones we do cap are the ones that cost us per unit — requests, CPU time and stored bytes. Every allowance on this page comes from the same table the platform enforces.

14-day free trial on your first subscription · billed monthly or yearly · cancel any time

The obvious question

Is it worth $15? Here is the arithmetic.

One hosting plan, on its own, costs more than this.

Vercel Pro is $20/month. A Railway Pro workspace is $20/month. Both are hosting, and hosting only — their published list prices, checked 2026-08-22. Base is $15, and Deploy is one of twenty-two products on it. Compare the whole subscription to the one tool it replaces first, then to the other twenty-one.

The charges that turn a $20 plan into an $80 bill aren't here.

Vercel Pro with four people deploying is four seats at $20 — $80/month. A second Railway Pro workspace is another $20. Here there is no seat to buy, so a contractor costs nothing, and projects are unlimited and free — each with its own data, its own members and its own spend caps. No per-MAU fee on Auth and no per-call fee on MCP tools either. The number you sign up at is the number in year three.

Consumption is separate, prepaid and capped.

The things that genuinely cost money per unit don't hide inside the subscription — they run on a prepaid wallet with its own ceiling. AI is provider cost × 1.5; voice is $0.03/minute; an outbound SMS segment is $0.02; a US phone number is $3.99/month. You top it up on purpose. Nothing draws down without you having put it there.

And past the allowance, credits — never an invoice.

There is no invoice waiting behind the $15. Overage draws from the same prepaid wallet, at $0.70 per million requests, and a hard safety cap high above stops the apps rather than run open-ended. The subscription is access, not a loss-leader with a meter hidden behind it.

Parsons · Basemonthly
Subscription — every product, one account$15.00
Deploy — 1,000,000 requests, 10,000,000 CPU-ms, 1 GBincluded
A database per app, queryable and exportableincluded
Auth — unlimited monthly active usersincluded
MCP tool calls — uncapped, across every productincluded
Second project — own data, own members, own caps$0.00
Third project$0.00
A seat for your contractorno seats
Overage past the allowancefrom prepaid credits
Total$15.00 / mo

Paid yearly the top line reads $150 — two months off. Committed extras — a phone number, a domain, an extra bank connection — are priced individually and always approved by you before they appear.

Questions people actually ask

Before you start the trial.

What happens when I hit 1,000,000 requests?

The extra draws from prepaid credits at $0.70 per million requests — nothing is disabled and nothing surprises you on an invoice. Usage is reconciled every 15 minutes. A hard safety cap still sits high above as a fraud stop — it disables every active app in the account, and you can ask us to raise it in the billing console, or set your own lower per-app ceilings so you find out early.

Does the free trial take a card?

Yes. It is a Stripe Checkout subscription with 14 trial days, so Checkout collects a payment method. Cancel any time inside the trial and you are not charged. The trial is first-subscription-only.

Is there an annual plan?

Yes: $150/year, against $180 paid a month at a time. That is exactly two months free, and you can check the arithmetic yourself. You pick the interval at checkout. There is still no free tier.

Can I use my own domain?

Yes — apex and www, with DNS, worker routes, TLS and the auth callback all attached in the same operation. Buy the domain through Parsons Domains at wholesale + $4, or bring one you already own by delegating its nameservers — no registrar transfer required.

Is there a build step?

No. You bring built bytes — your AI runs the bundler and Deploy accepts what it produces. Modules up to 5 MB; assets up to 2,000 files, 50 MB in total and 25 MB each.

Can I get my data out?

The per-app database is provisioned through the Database service, so it is a registry row you can list, query, export and migrate like any other. Same for the R2 bucket in Storage when you ask for one. There is also a purge endpoint wired into account deletion.

What if I delete an app?

The worker and its routes go. The slug is retired permanently and can never be claimed again, by you or by anyone. Artifacts and the per-app database are deliberately retained.

Can I use this without an AI?

You can watch and operate everything in the console — deployments, rollback, logs, usage, secrets, disable, enable, delete. But there is no create-app form and no deploy flow in it. Shipping happens in the AI.

How many apps do I get?

Ten per account. It is an anti-abuse ceiling rather than an upsell — if you genuinely need more, ask us to raise it in the billing console.

Manifest in, live URL out, wired on the way.

url
https://invoice-lens.parsonsapps.com
env.DB
db_7f2c… · a row in Database you can query and export
callback
/cb → on the project's redirect allowlist
from
noreply@invoice-lens.parsonsapps.com
$15/mo or $150/yr · 14-day free trial, cancel any time