Prototype: wireframe for copy and calls to action. Not a final design.

Your own database and back office. €0.99 a month.

A Postgres database, an admin panel your whole team can work in, and an AI assistant that builds it with you. Open source, in our cloud or on your own servers.

Get your own database

€0.99 a month · 1,000 free credits to build your first version

npm create protobase

Self-host for free. Apache-2.0.

$ npm create protobase my-shop && cd my-shop
$ protobase scaffold postgres://admin@db.example.com:5432/shop
✔ Connected to "shop" (read-only)
✔ Found 14 tables, 9 foreign keys, 3 enums
✔ Wrote config/order/data.ts, config/customer/data.ts and 12 more
$ protobase dev
✔ Admin ready at http://localhost:4321
The generated admin: an orders list with a daily chart, filters and a sidebar of resources.

Map any database

Bring your database, or start with ours

Describe the tables once. The screens follow. Nothing in your database changes.

// config/order/data.ts
export const order = resource('order')
  .table('sales.orders')
  .fields({
    number: f.text().readOnly(),
    customer: f.relation('customer'),
    total: f.decimal({ precision: 10, scale: 2 }),
    status: f.enum(['open', 'paid', 'shipped']),
  })
  .primaryKey((r) => r.id)
An order record generated from the order config, with a read-only number, a customer link, the total and a status choice.
Connect your Postgres

Already have a database? Use it as it is. (Pro and up)

Big tables

Ten million rows, still instant

Filters, facets and a daily chart, all on indexes.

// config/stock-move/ui.ts
export default view<typeof stockMove>('stockMove')
  .list((r) => ({
    columns: [r.movedAt, r.product, r.quantity, r.warehouse],
    sort: [[r.movedAt, 'desc']],
  }))
  .filters((r, w) => [
    w.dateRange(r.movedAt, { presets: ['7d', '30d'] }),
    w.facets(r.warehouse),
    w.range(r.quantity, { histogram: true }),
  ])
  .chart((r) => ({ field: r.movedAt }))
The stock moves list scrolled deep into 10 million rows, with facet counts in the filter panel.

Record view

Built for the people who do the work

Help text where it is needed, autosave on long fields, avatars for who is editing.

// config/invoice/ui.ts
.layout((r) => [
  l.section('Invoice', [r.customer, r.issuedAt, r.lines], {
    help: 'Lines are saved together with the invoice.',
  }),
  l.sidebar([r.status, r.total]),
])
.fields((r) => ({
  notes: r.notes.input(richText).autosave({ debounce: '2s' }),
}))
.saveFeedback('button')
An invoice record with help text under each field, inline lines, an autosave status, two editors' avatars and one conflict warning.

Build mode

Change it by asking

Your request becomes a small diff and a preview you click through first.

# "Add a discount to invoices and show it in the list"

  // config/invoice/data.ts
  .fields({
+   discount: f.decimal().default('0'),
  })

  // config/invoice/ui.ts
- columns: [r.number, r.customer, r.total],
+ columns: [r.number, r.customer, r.discount, r.total],
The invoices list with the assistant panel open and the new discount column highlighted.

When the AI gets it wrong

It checks its own work

Every change is tested before you see it. Retries after a failed check are free.

$ protobase assistant run
✖ typecheck   ui.ts:12  Property 'discout' does not exist
↻ retry 1     no credits used
✔ typecheck
✔ tests       48 passed
✔ load guard  no table scans
→ preview     https://pr-12.my-shop.protobase.app
The assistant panel showing a failed typecheck, the free retry, the passing checks and a preview with the migration SQL and an Approve button.

Permissions

Your rules, enforced everywhere

Written once, checked on every request, including the assistant’s.

// permissions/orders.ts
export const ownOrders = ({ user }) =>
  user.roles.includes('admin') || { field: 'owner', op: 'eq', value: user.id }

// config/order/data.ts
.access({ read: ownOrders, update: ownOrders, delete: isAdmin })

// config/employee/data.ts
salary: f.decimal().access({ read: isHr }),
A sales rep's order list, filtered to their own orders with a locked filter chip.

No lock-in

Leave whenever you like

Your repository, your database, the same open-source code on your own servers.

$ git clone git@github.com:you/my-shop.git && cd my-shop
$ protobase export --admin-store ./backup
✔ users, audit log, files and drafts exported
$ docker compose up
✔ Admin running at http://localhost:4321

For freelancers and agencies

A back office per client, in minutes

Start from the sample ERP and keep only the modules the client needs.

$ npm create protobase acme-backoffice -- --template erp --modules sales,inventory
✔ sales, inventory, contacts, catalog and core added
$ protobase deploy --region eu --domain admin.acme.com
✔ Live at https://admin.acme.com
The console listing three client projects, each with its own domain, region and plan.
Start a client project

One project per client, with its own repository and domain (Pro and up)

For developers

Anything missing, your own team can build

Custom fields, actions and webhooks are plain TypeScript. No waiting on a vendor.

A custom field

phone: r.phone.input(phoneInput)

An action

export const publish = action('publish')
  .handler(async ({ record, write, ui }) => {
    await write.update(record, { status: 'published' })
    return ui.toast('Published')
  })

A webhook

.webhook(env.SHIPPING_URL, { secret: env.SHIPPING_SECRET })

For whoever pays the bill

Your whole team, one price

What a team of 30 people with 3 builders pays each month.

ProductPer monthHow
Protobase Business€49Unlimited users
Retool Businessabout €5163 builders at €46, 27 users at €14, billed yearly
Directus Team$499Billed yearly

From each vendor’s public pricing page, October 2026.

Pricing

A euro a month to start

Database, hosting, admin panel and AI credits included. Unlimited users and SSO on every plan.

$ protobase deploy --region eu
✔ Postgres database   500 MB, never paused
✔ Admin panel         https://my-shop.protobase.app
✔ Credits             1,000 to build your first version
  Starter             €0.99 a month
See pricing

Open source stays free forever.

Questions people ask before they start

What happens when the AI gets stuck?

Every change is checked (types, tests, query plans) before you see it. When a change fails its own checks, the retries cost you no credits, and you can always roll back with one click.

Will my project be paused if I don’t use it?

No. An idle database sleeps and wakes on the first request, so a project you leave alone for months still opens.

Can I get a surprise bill?

Spend caps are on by default, you get an email at 80% of your credits or storage, and the assistant shows an estimate before large tasks. There are no per-project compute fees.

Is what the AI builds secure?

Who can see and change what is enforced by the framework on every request. The assistant configures those rules; it cannot write code that bypasses them.

Am I locked in?

No. It is your code in your own repository, on your own Postgres if you like. Export everything at any time, or run the same open-source code on your own servers.

Can a developer take over later?

Yes. It is plain TypeScript in small files, documented per feature. Any React developer can pick it up.

Where is my data stored?

In the EU or the US, your choice per project. Contracts are always with our EU company, with a GDPR data processing agreement.

Stop running your business from spreadsheets.

Your own database and back office, ready today.

Get your own database

€0.99 a month · 1,000 free credits to build your first version

npm create protobase

Self-host for free. Apache-2.0.