One schema.
Four building blocks.
Database, auth, realtime, and functions share a single source of truth, so they never disagree.
Database ›
Postgres, with types that follow you.
Tessera manages a real Postgres database and gives you a typed query builder on top. Migrations are planned from schema diffs, and every branch gets its own copy of the data.
Typed queries
Schema branching
Point-in-time recovery
Read replicas (Team)
Read the docs →
queries.ts
const posts = await db.posts
.where({ published: true })
.orderBy(desc.createdAt)
.all()
// posts: Post[]
rules.ts
rules(posts, {
read: () => true,
write: ({ user, row }) =>
row.authorId === user.id,
})
Auth ›
Authentication and permissions in one place.
Add sign-in in a few lines, then write access rules next to the data they protect. There is no separate policy language to learn.
Email, OAuth, and magic links
Roles and row-level rules
Session management
Audit logs (Team)
Read the docs →
Realtime ›
Subscribe to any query.
Get live updates without managing sockets. Presence and broadcast channels cover multiplayer editing and chat.
Query subscriptions
Presence
Broadcast
Automatic reconnect
Read the docs →
live.ts
const room = db.presence(doc)
room.subscribe((people) => {
showCursors(people)
})
notify.ts
export default fn(async (ctx) => {
const { id } = ctx.input
const post = await db.posts.get(id)
return notify(post.authorId)
})
Functions ›
Server code, without the servers.
Write a function, attach a trigger, and deploy it with the rest of your project. Secrets and logs are managed for you.
HTTP, cron, and database triggers
Managed secrets
Live logs
Local emulation
Read the docs →
Also in the box
Type-safe SDKs
TypeScript, Python, and Go clients are generated from your schema, so the types are always current.
A CLI that does it all
Run a local environment, apply migrations, and ship to production from one command.
Ship your first endpoint
in ten minutes.
$ npm create tessera@latest