Your team already has a database. Build the app on it.
Point Supero at PostgreSQL, MySQL or SQL Server, pick what it reads, and get a governed app over data that never moves.
Most teams evaluating Supero already have their data somewhere. You do not have to migrate it. Connect the database, choose per table whether Supero copies it or reads it live, and build the app on top.
The question that stops most evaluations
"Do we have to move our data?" No. A connector points Supero at a database you already run. Once tables are bound, they behave like native Supero data — typed records, CRUD API, pagination, aggregates, SDKs, role enforcement — and your app is built on top of them the same way it would be built on anything else.
The one decision that matters is per table, not per database: does Supero keep a copy, or read yours live?
Copy it in, or read it live
| Mode | Copy in Supero? | Reads | Writes |
|---|---|---|---|
sync (default) | Yes — refreshed on a schedule, webhook or manual run | From the local copy | Full CRUD against the copy |
live_read | No | Real time from your database, up to 10,000 rows per query | Blocked — writes return 403 |
live_readwrite | No | Real time from your database | Passed straight through |
Pick `sync` when
The source is slow or occasionally offline, you want the app to keep working when it is, or you need full CRUD and history through Supero.
Pick `live_read` when
Policy forbids a copy, freshness matters, the table is too large to replicate sensibly, or the source must stay the system of record.
live_readworks on PostgreSQL, MySQL and SQL Server. Write-through (live_readwrite) is PostgreSQL and MySQL only — a SQL Server write returns 501.- Warehouses (Snowflake, Databricks, ClickHouse, BigQuery, Redshift, Microsoft Fabric) are always
live_read— no write-back path for an analytical source. - Oracle and MongoDB connect in
syncmode. - For database sources the decision is reversible — flipping a table keeps the same bound schema and the same app. Warehouse tables cannot be flipped; an explicit
syncorlive_readwriteon one is rejected.
Four steps to an app on your data
Create a read-only database user
Do this first and the rest of the conversation with your DBA goes quietly. Grant exactly what the app needs and nothing more.
CREATE ROLE supero_reader LOGIN PASSWORD '••••••••';
GRANT CONNECT ON DATABASE prod TO supero_reader;
GRANT USAGE ON SCHEMA public TO supero_reader;
GRANT SELECT ON public.projects, public.clients, public.time_entries
TO supero_reader;⏱ ~10 minutes
Connect the database
A connector is created with four parts: a name, the source below, a target naming which tables to bind and in which mode, and a trigger. The credential is stored as a secret and returned masked — it never enters your app bundle.
{
"name": "prod-timesheets",
"source": {
"plugin": "database",
"config": {
"db_type": "postgresql",
"host": "db.internal.example.com",
"port": 5432,
"database": "prod",
"schema": "public",
"username": "supero_reader",
"password": "REDACTED",
"ssl_mode": "require",
"query_type": "table",
"table_names": ["projects", "clients", "time_entries"]
}
},
"target": {
"tables": [
{"source": "projects", "schema": "project", "mode": "live_read"},
{"source": "clients", "schema": "client", "mode": "live_read"},
{"source": "time_entries", "schema": "time_entry", "mode": "live_read"}
]
},
"trigger": { "type": "manual" }
}⏱ ~10 minutes
Discover, then bind
Discovery introspects the source and proposes schemas. Binding maps a table onto a Supero schema — and that is the moment your rows become ordinary records with typed fields, references, pagination, aggregates and SDK access.
From an AI editor over MCP the same path is a handful of tools: build_connect_data_source → build_discover_source → build_bind_data_source → build_list_bound_schemas.
⏱ ~20 minutes
Write the access policy, then build the app
This is the step that turns a database viewer into a product. Roles, tenant isolation and field hiding apply to connector-backed data exactly as they do to native data.
POLICIES = [
PolicyDef(role="tenant_admin", default_access="full", rules=[]),
PolicyDef(role="viewer", default_access="none", rules=[
PolicyRule(entity="projects", can_read=True),
PolicyRule(entity="time_entries", can_read=True),
PolicyRule(entity="clients", can_read=True,
hidden_fields=["billing_contact_email", "tax_id"]),
]),
]From here it is an ordinary Supero app: generate the screens from the bound schemas, or hand-build the UI against the same CRUD API. Filters, sorts and aggregates are pushed down and run on your database — so a status breakdown across a very large table is a query your database is already good at.
⏱ ~20 minutes
Three properties that make this safe to hand over
Scoping is compiled in
Tenant and role rules become part of the query before it is sent. There is no code path that forgets to add the filter.
It fails closed
A request that cannot resolve a scope is refused. The failure mode of a missing rule is "no data", never "all data".
Hidden columns never travel
A query referencing a field the caller may not see is refused at the boundary, before your database is asked.
And on live_read, no row contents are stored on the Supero side. Each row gets a stable identity derived from the connector, stream and row key so drill-downs and references work — that identity is computed, not persisted.
What to plan for
- Live reads are as fast as your database. For PostgreSQL, MySQL and SQL Server there is no cache in front of them, so repeated reads mean repeated load on your source. Warehouse and REST sources do get a short result cache.
- Write-through is a bigger conversation than read. It is the highest-consequence place for a scoping mistake and deserves its own review, not a ride-along on a read-only one.
- Flipping a mode is not a pure flag flip. Going live needs a discovery-confirm pass so the table has its field mapping and tenant binding; going back to sync needs one sync run before the copy has data.
- File and webhook sources are sync-only. HTTP-API sources support live reads but not write-through.
Where to go from here
- Data in a warehouse rather than a database? A governed analytics portal over Snowflake and BigQuery.
- Want the full depth on live mode, including the query path? A live ops console on the PostgreSQL you already run.
- Now make it do something: Adding payments, email and SMS.
Build this on Supero
Describe it and get schemas, APIs, SDKs and a governed multi-tenant backend — or point your own AI editor at Supero over MCP and build it there.