Try it now in the sandbox

Connect Postgres, Snowflake and Salesforce.
Query with SQL, GraphQL or your AI agent.
In 5 minutes.

Governed from the first query.

Nothing to connect yet? Download and take the demo tour

Sounds too good to be true? Here's how it works →

# psql speaks to Provisa as if it were Postgres — on port 5439
psql -h localhost -p 5439 -U analyst

# One SQL query, joined across Postgres, Mongo, and Elasticsearch
SELECT c.name, o.total, t.trace_id
FROM customers c
JOIN orders o   ON o.customer_id = c.id
JOIN queries t  ON t.actor = c.email
WHERE o.total > 1000;

One model, three languages, and generated REST if you want none of them. RLS, masking, and approval are already applied on whichever tab you pick. There is nothing to re-implement per protocol.

Provisa is a data kernel: a compiler and runtime for your data control plane. Sources, metrics, ontology and governance from one model. Nothing to keep in sync.

Most requirements fall into six problem types, and they rarely arrive on day one. They land late, on a project that is already behind schedule, and upend it:

AI access

Now leadership wants an AI agent on it, and nobody wants to hand it the database.

Point Claude or any MCP client at Provisa instead of the database. The OAuth token maps to a role, so the agent gets the same six access-control layers a person does. No invalid join ever runs on your data: roles are governed by default, and opting out is a deliberate grant.

Governed data for AI →

App backends

Now the app team needs an API over it, and the data lives in sources that don't match.

The app needs Postgres, a document store, and two internal REST services in the same response. Declare the relationships once and the API spans all of them, per role, filtered and paginated, in whichever shape your client wants: GraphQL/OpenAPI, JSON:API, or gRPC. No BFF service to maintain.

The interfaces, and the Hasura path in →

BI across sources

Now the business wants it in Tableau, and the warehouse project is a year away.

Postgres, Mongo, Elasticsearch, a Google Sheet, an S3 prefix of extracts, and the SaaS systems the business runs on, Salesforce, ServiceNow, Jira and Stripe among them. Connect the BI tool over JDBC or pgwire and join across all of them, with no pipeline into a warehouse first and no copy in the middle.

All 73 connectors →

Data science access

Now the data scientists want all of it, and each dataset is a separate request.

Register the sources once and the whole team queries them from a Jupyter notebook (%%sql, %%graphql or %%cypher cells straight into a DataFrame), pandas, Polars, or DuckDB. Arrow Flight streams record batches columnar all the way out, with no row-by-row serialization and nothing materialized server-side while you read, and single-source queries route straight to the driver. To train without PII, point at our auto-generated synthetic data.

Flight, Airport, and pgwire → Synthetic Data → Jupyter →

Data provisioning

Now three other teams need it, and each one wants its own pipeline.

The consuming team writes SQL and gets it back fast: Arrow streams over Flight, typed gRPC, and, past a row threshold, a presigned S3 URL for multi-GB deliveries instead of a timed-out HTTP response. Kafka carries the change notifications, so they pull the delta rather than the snapshot.

How the governance follows the data →

Public data

Now someone wants it joined to public data, and that means another ETL job.

Your database joined by county to NOAA weather, by CVE to CISA's exploited-vulnerability catalog, by LEI to Wikidata's ownership graph, or by NDC to FDA recalls — with no ETL and no pipeline. Every join governed the same way as any other.

See the demos →

With one model, closing each of these gaps is a config change, not a rebuild.

73 connectors, 85+ kinds of source, one API

Enterprise

  • SharePoint
  • Salesforce
  • ServiceNow
  • Jira
  • Cloud Inventory
  • Google Workspace
  • Microsoft 365
  • GitHub
  • GitLab
  • Stripe
  • Splunk

Subscriptions

  • AskAmerica
  • Kaggle

RDBMS

  • PostgreSQL
    • RDS
    • Aurora
    • Cloud SQL
    • AlloyDB
    • Azure
    • Supabase
    • Neon
  • MySQL
  • SingleStore
  • MariaDB
  • SQL Server
  • Oracle
  • DuckDB
  • Exasol
  • SAP HANA
  • CockroachDB
  • YugabyteDB
  • Greenplum
  • TiDB
  • Firebird
  • HiveServer2

Cloud DW

  • Snowflake
  • BigQuery
  • Amazon Athena
  • Databricks
  • Redshift
  • Microsoft Fabric Warehouse
  • Azure Synapse SQL
  • MotherDuck

Analytics

  • ClickHouse
  • Elasticsearch
  • Apache Pinot
  • Apache Druid
  • Trino / Presto

Data Lake

  • Delta Lake
  • Apache Iceberg
  • Hive Metastore
  • Hive on S3

NoSQL

  • MongoDB
  • Azure Cosmos DB
  • Qdrant
  • Cassandra
  • Redis

Code Resolvers

  • Node.js
  • Python

Graph

  • Neo4j
  • SPARQL

File

  • SQLite
  • CSV File
  • Parquet File
  • File Crawler
    • CSV
    • TSV
    • JSON
    • YAML
    • Excel (XLS, XLSX)
    • Parquet
    • Arrow
    • HTML
    • Markdown
    • DOCX
    • PPTX
  • Log files
  • Wikipedia

Other

  • Google Sheets
  • Prometheus
  • Airport

API

  • REST API
  • GraphQL
  • gRPC

Streaming

  • Kafka
  • WebSocket Feed
  • RSS / Atom Feed
  • Ingest

Data Quality

  • Soda
  • Great Expectations
  • Data Profiler

Those are usually four tools, each holding its own description of the same data: a query engine, a metrics layer, a catalog, a policy service. When one changes, the others are wrong until someone catches it. The descriptions drift, and there is no mechanism to keep them in step.

One model: sources, metrics, ontology and governance.

You describe your data once: sources, tables, relationships, who may see what. Everything else is generated from that one description — the APIs, the legal join paths, the governance, and the audit trail. Keep the catalog and lineage tools you have; Provisa publishes to them. Data catalogs that provide a context layer tell an agent what it should do; Provisa enforces what it can do.

One model — what each part covers Every change is versioned, and promoted through environments

Any language, one governed IR

GraphQL, Cypher, and SQL all query the same model and retarget to any source dialect. Domains carve it into namespaces (a domain is the schema a SQL client sees), and governance applies identically across all of them. Add a protocol and the governance follows automatically.

Read and write

Analytical and transactional flows through the same governed API: cross-source reads fan out through the engine; writes and single-source reads route direct to the driver, sub-100ms.

Smart routing

Single-source queries bypass the engine entirely. Materialized views record the transform that built them, so queries rewrite transparently onto a fresh MV.

Query interfaces & wire protocols

Each language and protocol you add is another headache.

Each language-transport stack needs its own governance integration and its own programmers. Data leaks and exfiltration paths appear at every new surface. A change to the access model now touches every interface point, which becomes its own lock-in: you can't change one thing without changing several.

Each stack also kicks off another endless round of tool selection, vendor selection and standards processes, then procurement, contracts, invoices, renewals, disputes, and the debates between teams over where business logic, security and capabilities should live, which end in building yet more integrations. Start a GraphQL API team, for example, and it grows along exactly those lines. If the goal is a bigger team, that plan works.

Every language and wire protocol here compiles to one IR. Governance is applied once at that IR — a change happens once, and the same rules reach every combination of language, transport, and tool.

The result: your BI dashboards and your application APIs share the same semantics and the same governance.

GraphQL

Per-role schemas with field-level visibility, constrained to registered relationships — valid by construction.

SQL

Full SQL across all sources. Single-source queries route direct to the driver, under 100ms.

Cypher

Graph traversals over the model, under identical governance.

SPARQL

SPARQL 1.1 over the model, with your ontology’s classes and properties as the vocabulary, under identical governance.

See how this works for your use case

Relational & BI

Tableau, Power BI, DBeaver, psql, and local analytical engines.

  • pgwire — any Postgres client on port 5439; pg_catalog is answered in-memory, so schema browsers just work.
  • JDBC & REST — the BI tools over JDBC; JSON:API 1.1 for applications.
  • Airport (DuckDB) — any DuckDB client attaches Provisa as a database and pushes filters down.

Graph & search

Neo4j Browser and Bloom, plus application-side traversals.

  • Bolt — the Neo4j tools and official drivers run Cypher over the registered schema.
  • GraphQL over HTTP — the same per-role schema every other surface enforces.

High-performance data

Columnar streaming, microservices, zero-serialization ML — narrower cases, not the common path.

  • Arrow Flight — Arrow record batches over gRPC, columnar all the way out. Accepts GraphQL or SQL.
  • gRPC model API — a .proto generated from your schema; typed query and insert RPCs per table.
  • WebSocket & SSE — subscriptions stream change events: Postgres native, MongoDB native, CDC, or polling.

AI & automation

Agentic tool calls and LLM-driven query generation.

  • MCP server — agents query your governed data as tools. The OAuth token maps to a role, so agents get no bypass.
  • Natural language — natural language to SQL, Cypher or GraphQL on the language model you configure, with a validation loop before anything runs.
Every interface in detail
The Query Language Explorer: a GraphQL query with its live Semantic SQL and Cypher translations in side panels.
Write a GraphQL query; see its live Semantic SQL and Cypher translations, then jump into either editor.

Access control, compiled in

Access rules in every tool are rules nobody can prove, including audit.

When access control is configured per API, every new interface is another integration to get right, and proving to an auditor that no path was missed means checking each one separately. Here access control is compiled into the query plan on every language and every transport. Add a source, a column, or a relationship and every layer applies to it automatically — there is nothing to re-apply per interface. It's one part of governance; where, when and how work runs, and what the data means, are declared in the same model.

Query in GraphQL · SQL · Cypher, over any of the nine protocols
  1. 0

    Introspection filtering

    Schema browsers only ever see what the role is allowed to see.

  2. 1

    Public access

    Anonymous surface is explicit, never accidental.

  3. 2

    Domain access

    Roles reach only the domains registered to them.

  4. 3

    Row-level security

    Per-table, per-role WHERE injection — inherited recursively.

  5. 4

    Column visibility & masking

    Regex, constant, or truncate masking with role-based bypass.

  6. 5

    Predicate guard & approval

    Pre-execution ABAC hook over webhook, gRPC, or unix socket.

Plan out One compiled plan, policy already inside it — plus the audit row

All six are applied while the query is compiled, not checked against a policy list afterwards. What executes is already the controlled query, so no version of it could have run ungoverned.

Relationships are governed too. A JOIN or a graph traversal is legal only if it matches a registered, approved relationship, so people and agents can explore the whole model while every path stays inside what policy approved. It's a right on the role: a trusted role can be granted the way around it.

Governance, in its complete sense

Data sources

Yet another discussion about data ingestion? Skip it.

Every new source usually starts a pipeline project: what to copy, where to land it, how to keep it current. Here, 73 connectors reach 85+ kinds of source where the data already lives, and copying is a declared choice, not a prerequisite. And if a source is unique to you, a code resolver, a Python or Node function, gives it structure as a governed table.

Graph and RDF sources take part in the model like any other. Register REST, GraphQL, gRPC, WebSocket or RSS endpoints as governed tables, and cross-source joins reach them like any table.

See all 73 connectors

Auto-indexing file crawler

Point it at a location. Get a catalog of the data hiding in it.

One of the 73 connectors behaves unlike the other seventy-two: you register a location, not a table. It walks the tree recursively, finds tabular files and the tables inside documents, and catalogs each table — the shared drive nobody has mapped, the S3 prefix of extracts, the SharePoint site a department has been running on for years.

  1. 1

    Point

    A local or network folder, an S3 bucket, a SharePoint site, an HDFS path, or an HTTP, FTP or SFTP host: one location, not one table.

  2. 2

    Crawl

    It walks the tree to whatever depth you allow and searches every file for tables: a CSV or Parquet file is one; in an Excel workbook it finds the regions of each sheet that look like tables and extracts each; in HTML, Markdown, Word and PowerPoint it extracts the tables the document marks as tables. In documents with links it follows them too, down to the same depth limit.

  3. 3

    Register

    You pick which of the discovered tables to register, and they land under the same six access-control layers as everything else.

Crawls
  • Local & network folders
  • S3
  • SharePoint
  • HDFS
  • HTTP(S)
  • FTP · FTPS · SFTP
Reads
  • CSV · TSV
  • JSON
  • Parquet
  • Arrow
  • YAML
  • Excel
  • Word
  • PowerPoint
  • HTML
  • XML
  • Markdown
What it crawls, and what else registers

Code resolvers

A source nobody makes a connector for? Write a function, get a governed table.

Code resolvers are the contract for integrating any data source. A Python or Node function returns typed rows, and that function becomes a table: governed like any other, with visibility, masks and row rules applied to what it returns, joinable to the rest of the model, and served on every language and transport. A function that takes a loader gets every key of a join in one call, and filters can reach it as parameters. Its code is pinned by version, commit or hash, so it is promoted with the model.

In production, code resolvers don't sit in the control plane. Provisa builds each one its own container image, with no Docker daemon: the code at its pinned hash and its dependencies on a minimal base, pushed to your registry or downloaded. Run it wherever it belongs, beside the data, on a GPU box or inside another network, and Provisa pairs with it over mutual TLS.

How code resolvers work
The model explored as a live graph: domain and node labels, relationship types, and variable-length traversals across sources.
The model, explorable as a live graph — domains, node labels, and relationships across every source.

Derived data & your existing stack

Pipelines are code. Code breaks. Declare the dataset instead.

A pipeline is a program that ran; to audit one you read code. When the source changes, the pipeline is wrong until someone finds it and fixes it. The only durable record of what happened is the output table and a log line. Declare the dataset instead and the definition is the record.

Declared datasets, not pipelines

A pipeline is a program that ran; to audit one you read code. Declare the dataset instead and the definition is the record: column-level lineage, the data version consumed, the rules that produced it. No orchestration DAG.

Feeds the catalog you bought

One registration publishes to OpenMetadata, DataHub, Collibra, Atlan, Apache Atlas, OpenLineage, BigQuery Dataplex and Snowflake Horizon, with lineage stitched on business identity, so re-platforming doesn't reset it.

Starts from the model you already have

Bring tables, keys, relationships, and metrics from dbt, Cube, Snowflake, Databricks, and other semantic layers through Apache Ossie. Every imported definition is a proposal you review before it registers.

Every value has an address

Governed values resolve over REST or MCP at a semantic address, optionally as of a point in time. Physical URIs are refused, so a citation can't leak a location.

Enterprise-ready

Does it take three months to stand up an evaluation where you work? Exhausting.

Wouldn't it be refreshing to just try it out, without the hassle? No Docker registry to mirror, no JVM, no root. The embedded profile ships the entire runnable system, precompiled UI included, as a single Python wheel. Regulated and airgapped orgs already trust Artifactory-as-PyPI, so there is no new supply chain to approve.

  • Embedded PostgreSQL control plane + embedded DuckDB engine — no Docker, no daemon
  • Bring your own engine: Trino, Databricks, Snowflake, Postgres, ClickHouse, Oracle — one env var
  • Sigstore-attested on PyPI; no release publishes until a CVE scan of its locked dependency set passes

The platforms you're locked into become engines you can replace

Your model, semantics, and governance live above the infrastructure, not inside it. Swap the engine from embedded to Trino, or to your warehouse, or to Databricks when a new CTO brings a new strategy, and the queries and policies don't change. Re-point a table from Oracle to Postgres and consumers never see it move.

We don't lock you in either: your model is portable declarative config, and the SQL it compiles is yours to read, export, and keep.

The full argument — including domains as products, config promotion, and the compute bill

Get Provisa

Download and run in 5 minutes.

Desktop installers for every OS (the macOS app signed and notarized), or pip install the Sigstore-attested embedded runtime. The whole working system runs on your desktop in about five minutes, with no Docker, no JVM and no cluster. Launch it and pick the guided demo: a sample model is already bundled, so you can run SQL, GraphQL, and Cypher over it before you connect anything of your own. Prefer not to install anything? Connect your own sources in the browser at sandbox.provisa.dev.

Free to evaluate, for any size of organization. License terms →

Or install from PyPI

The whole runnable system, precompiled UI included, as a single wheel. Airgap-ready over an Artifactory PyPI mirror: no Docker, no JVM, no root.

Environments

Dev, test and production never quite match?

Every change is applied by hand in each environment, they drift, and test data is either a risky copy of production or too thin to trust.

Here each environment is a branch of the model. Analysts and developers make changes in their own, merge them back through a request someone approves, and can push to your git repository, so changes go through the release process you already run. Each environment can also carry its own data: production's real rows, a pre-production copy with every sensitive column faked, or generated data for development.

Promote config like code See the test-data demo

Deploy anywhere

Did that junior developer just take dev down again?

Or are you still waiting for someone to stand up the infrastructure? Everyone gets an isolated environment on their own desktop: no shared dev server to break, and no infrastructure to wait for. From a laptop to a cluster, it's the same platform.

Desktop installers

macOS, Windows, and Linux installers (the Linux installer covers Linux and NixOS), each with a one-click demo build that boots a sample stack. The macOS app is signed and notarized; for a signed install on Linux or Windows, pip install provisa installs the Sigstore-attested PyPI package.

Python wheel

pip install "provisa[embedded]" — the whole system, precompiled UI included. Airgap-ready.

Kubernetes · Helm

A production chart deploys the control plane, workers and engine, and the query tier scales horizontally.

Cloud & VM · Terraform

Modules for AWS, Azure, and GCP stand up a VM or cluster deployment end to end.

Questions

Frequently asked

Is Provisa a database, or does it replace my warehouse?

Neither. Provisa is a semantic and governance layer that runs on an engine you choose: Trino, DuckDB, ClickHouse, Postgres, Snowflake, Databricks, BigQuery, or the embedded DuckDB engine in the box. Your warehouse becomes a replaceable execution engine, not the place your semantics live.

How it works in depth
How is this different from Starburst or Denodo?

Starburst is a query engine; Provisa sits above one and can use Starburst as its engine. Denodo is the closest comparison, in the same category: Provisa adds GraphQL and Cypher as peers to SQL, nine wire protocols including pgwire and Bolt, engine choice, and a deployment that starts at one pip install.

Provisa and Starburst
Does Provisa support data mesh?

Data mesh was a governance model, in its most complete sense, and never had a runtime. Provisa is that runtime: each domain owns its namespace and its ODPS data products over the systems it already runs, and where, when, how, for whom and with what meaning data is processed is declared once and compiled into every query, on the engine you already have.

Data mesh, with a runtime
I'm on Hasura v2. Can I migrate?

Yes. Point the converter at your Hasura v2 metadata directory and it emits a Provisa config: sources, tables, per-role permissions as row-level security, relationships, remote schemas, actions, event triggers, and cron triggers. Anything it can't map cleanly is reported as a warning rather than dropped.

The migration path
Can AI agents query my data safely?

An MCP server, over stdio or remote Streamable HTTP, exposes governed tables as tools. The OAuth token maps to a role, so every agent call passes the same six access-control layers as a human query, and traversals are limited to registered relationships. Agents get no bypass and there's no second policy to keep in sync.

Governed data for AI
Does it work in an airgap?

The embedded profile ships the entire runnable system, precompiled UI included, as a single Python wheel. Regulated orgs already trust Artifactory-as-PyPI, so there's no Docker registry to mirror, no JVM, and no root required. Its dependencies are locked with hashes in the repository.

What happens to my model if I stop using Provisa?

You keep it. Provisa is a handful of primitives (domains, tables, relationships, masking, views) compiled deterministically. The model is portable declarative config held in git, and the SQL it compiles is yours to read and export. The semantics you write don't die with the tool.

Our position on lock-in

Describe your data and govern it in the same act.

One governed path for analytical, application, and human data movement.