import { createClient } from '@pipilot/client'
const pp = createClient(import.meta.env.VITE_PIPILOT_ANON_KEY)
// Per-user data — the gateway enforces the policy, not your component.
await pp.auth.signIn()
const notes = await pp.from('notes').select({
sort: [{ field: 'createdAt', dir: 'desc' }],
})
// AI, keyless — no provider account to set up.
const { text } = await pp.ai.generate({ prompt: 'Summarize these notes' })One SDK. Not six dashboards.
Use one piece or all of it — every table, file, channel, and AI call goes through the same client, gated by the same policy engine.
Database
Schemaless rows with real query power — equality, comparison operators, multi-key sort, cursor pagination, and joins. No SQL to write, no schema to design first.
Auth
End-user accounts out of the box — OAuth (Google/Apple/X) or first-party email/password. Sessions refresh silently; you never write a token-refresh timer.
Storage
Upload a File or Blob straight from an <input>. Signed download URLs, policy-gated access, a 25MB/file cap enforced before your user waits on a slow upload.
AI — keyless
pp.ai.generate() runs server-side with no provider account, no API key, no billing relationship to set up. This is the one no database company can bolt on.
Realtime
Live channels for presence and broadcast — multiplayer cursors, chat, live dashboards — without standing up a WebSocket server yourself.
Functions
Deploy custom backend routes for Stripe webhooks or anything server-only. Raw-body signature verification included, not left as an exercise.
Notifications
Web push, our own VAPID stack — register a device and send from the server with pp.notifications, no separate push provider.
Invites
Invite-code lifecycle and access gating as a first-class primitive, not a table you hand-roll every time.
Every table starts denied.
No policy, no access — that's the default. Set one in plain language and the gateway enforces it server-side on every call, never in your component.
publicAnyone with your anon key can read or write.
authedAny signed-in end user — no anonymous access.
ownerEach signed-in user sees only their own rows. The gateway stamps and filters by owner — never trust a client-supplied id.
noneAnonymous access denied outright. Service key only. This is every table's default.
Not a Postgres alternative. A faster start.
We don't out-feature a mature Postgres platform, and we won't pretend to. What we remove is the setup between an idea and a working backend.
| Capability | PiPilot BaaS | Stitched together |
|---|---|---|
| Database + auth + storage | ||
| Time to a working backend | One tool call — no signup to start | Account, project wizard, connection strings |
| AI generation in the SDK | Keyless — no provider account | Bring your own OpenAI/Anthropic key |
| Realtime, push, invites | Built in | Usually separate services |
| SDK surface | One thin package | Multiple dashboards, multiple SDKs |
| Query language | Operators + sort + cursor pagination + joins | Full SQL |
| Agent-native provisioning |
If your app needs SQL, complex joins across large tables, or a contractual uptime SLA, we're not the right fit yet — see our docs for the full list of limits.
From nothing to a working backend, in four moves.
Create a backend
One name, no config. A database, auth, storage and AI exist within seconds — no signup wizard to get through first.
npm i @pipilot/client
One package. Point it at your anon key from any frontend — Vite, Next.js, Expo, or a static page.
Set a policy
Every table defaults to denied. Pick public, authed, or owner in plain language, and the gateway enforces it server-side.
Ship
Read, write, upload, generate, and push — from one SDK, in a handful of lines, with nothing else to provision.
Locked down by default, not by convention.
Every table starts denied. Access is opt-in, enforced on the server — never something a client can talk its way around.
Policy-enforced, server-side
authed/owner policies are checked on the gateway, not trusted from the client — a browser can never fake another user's identity.
Anon vs. service, clearly separated
The anon key does nothing without a policy allowing it. The service key never belongs in browser code, and we say so at the point you copy it.
Export, not lock-in
Take your data out whenever you want. We'd rather earn the renewal than make leaving hard.
Predictable pricing, designed to scale.
Start for free. Pay for what you use past that. No seats, no surprise invoice — free plans hard-stop at the limit instead of billing you.
Free
Passion projects & side builds.
- Unlimited API requests
- 1,000 monthly active users
- 500 MB database storage
- 1 GB bandwidth
- 500 MB file storage
- 50 AI calls/day
- Community support
- 2 active backends
Pro
Production apps that need room to grow.
- Everything in Free, plus:
- 50,000 MAU, then $0.00325/MAU
- 5 GB DB, then $0.125/GB
- 50 GB bandwidth, then $0.09/GB
- 10 GB storage, then $0.0213/GB
- 5,000 AI calls/day, then metered
- Email support
- Data export anytime
Enterprise
Custom quotas and terms beyond self-serve.
- Everything in Pro, plus:
- Custom MAU / storage / bandwidth
- Priority support
- Custom onboarding from Supabase/Firebase
- 14-day+ log retention
Read the docs for full plan details.