Full-stack apps coding agents can ship.

Declare an entity once. Pylon derives the table, the access rules, the API, and the typed React client from it, so a schema change fails at compile time instead of in production.

Typed schema

Entities and fields in TypeScript. Pylon creates the tables and migrates on save.

const Order = entity("Order", {
customer: field.string(),
total: field.float(),
paid: field.boolean().default(false),
});
migration applied · 3 columns

Live queries

db.useQuery opens a subscription. Every write pushes a diff — no polling, no refetch.

db.useQuery("Order")live
ord_9f2aSarah Chen$1,240
ord_7c41Marcus Lee$880
ord_5b88Priya Nair$2,100
ord_3d10Elena Duarte$640
diff streamed to 47 clients

Row-level policies

Access rules sit next to the schema. Every read and write is checked; default deny.

readauth.userId != nullallow
insertauth.userId == data.ownerIdallow
delete— no ruledeny
unmatched operations fall through to deny

Auth, included

Magic link, 25+ OAuth providers, OIDC, and API keys.

Magic linkGoogleGitHubAppleOIDC
session · auth.userId set

File uploads

Presigned uploads to local disk or any S3-compatible bucket.

invoice.pdf248 KB
avatar.png64 KB
export.csv1.2 MB
presigned · S3-compatible

Rooms & presence

Cursors, typing, and who is online over the same server.

Sarah
Marcus
Priya
room · 3 online

Faceted search

Full-text queries with live facet counts, updated in the same transaction as your writes.

linen shirt312 hits
Apparel184
In stock96
Sale32
indexed in the same transaction

SQLite or Postgres

Start on a single SQLite file. Point DATABASE_URL at Postgres and nothing above the driver changes.

DATABASE_URL
SQLite
file:./pylon.db
Postgres
postgres://…/app
schema12 tables
policies8 rules
app codeunchanged

Server-rendered React

Queries and policies run on the server for first paint, then the same typed client hydrates and subscribes.

GET/orders200 · 14ms
server renderquery + policy run server-side
html streamedfirst paint, no client fetch
hydratesame typed client takes over
subscribedlive diffs from here on
one schema · server and client

Server functions

Queries, mutations, and actions in TypeScript files, validated and called through the typed client.

getOrdersquery4ms
createOrdermutation11ms
sendReceiptaction62ms
v.* validated · typed end to end

Reactive server queries

Joins and derived data. The server tracks what it read and re-runs when those rows change.

reads Order · Region
us-east$48,120
eu-west$31,904
ap-south$12,470
Order inserted → re-ran

Scheduled & deferred work

runAfter, runAt, and cancel. Delays and retries run in the same process — no separate worker.

sendReceiptrunAfter 30sdone
retryPaymentrunAt 09:00done
sweepCartsevery 5mrunning
retries run in-process

Admin studio

Browse tables, inspect live queries, and tail logs at /studio. Admin-gated in production.

TablesLive queriesLogs
Order1,284
Customer412
Invoice980
/studio · admin-gated in prod

Pick what you need. Every piece shares one schema and one runtime.

Explore the product →

Your app model stays in TypeScript.

Declare an entity and its access policy. Pylon creates the table, REST and realtime API, row-level checks, and typed React client. That keeps resolvers, an ORM layer, and a separate backend service out of your stack.

app.ts
// one entity → a synced table + typed client
const Order = entity("Order", {
customer: field.string(),
total: field.float(),
paid: field.boolean().default(false),
});
// access rules next to the schema — deny by default
policy({ entity: "Order",
allowRead: "auth.userId != null",
allowInsert: "auth.userId == data.ownerId",
});
// the React side — live, typed, no fetch
const { data } = db.useQuery("Order");

Deploy from GitHub or the CLI.

Connect GitHub

Install the Smallware GitHub App once. Pushes to the default branch deploy; pull requests get previews that disappear after merge.

  1. 1.Create a project and connect a repo.
  2. 2.git push origin main triggers a deploy.
  3. 3.Live at your-app.smallware.run.

pylon deploy

Use the CLI for CI, locked-down environments, or a manual release. It reaches the same Cloud runtime as the GitHub flow.

my-app — pylon deploy
$ pylon login
$ pylon deploy --target cloud
✓ Build · 12s
✓ Schema synced
✓ Cutover · 0 errors
→ https://acme.smallware.run

Scale from one dashboard.

Every app sits behind a global edge network. Resize machines, add replicas and regions, or expand storage from the same dashboard, without pre-provisioning or per-seat pricing.

pylonsync.com/dashboard
Smallware dashboard — project overview with deployments, machine status, and live metrics

Global edge network

Cloudflare's edge provides CDN caching, TLS, and DDoS protection worldwide with no extra configuration.

Resize on demand

Add RAM up to 64 GB, choose performance CPUs, and expand the volume without redeploying.

Replicas

Run up to 32 load-balanced replicas per region.

Global regions

Deploy in US, EU, APAC, and South America regions.

Up to 500 GB volume

Grow storage live when the app needs room.

Managed Postgres — private beta

Bundled SQLite by default; co-located managed Postgres is in private beta.

Autostop on idle

Scale to zero when idle, or keep a project always warm.

Custom domains + TLS

Bring your domain; Pylon handles TLS.

SSO — OIDC + SAML

Configure org-level SSO from the dashboard.

Audit log + snapshots

Activity log, one-click volume restore.

Common questions.

Everything else is in the docs.

Which database does it use?

SQLite by default — one file, nothing to provision. Set DATABASE_URL to a Postgres connection string and the same schema and application code target Postgres instead. On Cloud, bundled SQLite is the default and co-located managed Postgres is in private beta.

Do I have to use Smallware?

No. The runtime is a single open-source binary — run it on your own box or container platform with a volume for SQLite, or point it at your own Postgres. Cloud is the managed path, not a requirement, and it runs the same binary.

How do migrations work?

Your schema is TypeScript. In development Pylon diffs it and applies the change on save, so the tables follow the file. On deploy the schema is applied as part of the release, before traffic cuts over.

How do I deploy?

Two ways into the same runtime. Install the GitHub App and pushes to your default branch deploy, with pull requests getting preview environments. Or run pylon deploy from your machine or CI when you want a manual release.

Which clients can talk to it?

A typed React client with server-side rendering, and a Swift SDK for mobile. Every entity also gets a REST and realtime API, so anything that can speak HTTP or WebSocket can read and write subject to the same policies.

What does auth cover?

Magic-link email, 25+ OAuth providers, generic OIDC discovery, guest sessions, and API keys. Whatever the caller signed in with, policies read the same auth.userId, so access rules do not change per provider.

Can it run background work?

Yes — ctx.scheduler.runAfter, runAt, and cancel schedule follow-up work, and delays and retries run in the same process as the rest of your app. There is no separate queue or worker to deploy.

What happens to my data if I leave?

It is a SQLite file or an ordinary Postgres database, with no proprietary storage layer in between. Take a dump and it opens in any client. What you would rewrite on the way out is the SDK calls, not the data.

Create a Pylon app.

The framework is free to self-host. Smallware runs it for you — connect GitHub or deploy from the CLI.