QueryProxy
Open sourceSelf-hostedAGPL-3.0

Production data access, without production credentials.

QueryProxy sits between your team and your databases. Developers submit SQL, DBAs approve from the web or Slack, and results come back limited, masked and fully audited.

$ docker compose up
Works withPostgreSQLMySQLMariaDBSQL ServerSQLite

How it works

Every query takes the same safe path

No shared passwords, no ad-hoc tunnels, no "can you run this for me?" — one flow for every read and write.

1

Submit

Developers write SQL in a guarded editor against connections a DBA granted them — credentials never leave the vault.

2

Guard

The AST inspector rejects WHERE-less UPDATE/DELETE, injects and clamps LIMITs, and blocks admin statements outright.

3

Approve

DBAs decide from the web queue or straight from Slack / Teams. Self-approval is blocked; every decision is signed and recorded.

4

Execute

A queue worker streams results row-by-row, masks PII before it touches disk, and writes the full story to the audit log.

Features

Everything between "can I run this?" and the result

SQL guards, enforced by parsing

Statements are inspected, not pattern-matched. Destructive queries without a WHERE never reach a database, and runaway SELECTs are capped at a hard limit.

Approvals where your team lives

Interactive Approve / Reject buttons in Slack and Teams cards. Every callback is HMAC-SHA256-verified with replay protection — a forged click changes nothing.

Dynamic data masking

Column-pattern and content-regex rules mask emails, cards and secrets while results are written — unmasked PII is never stored, so it can never be shown.

Teams & roles, isolated

Admin, DBA, Developer and Auditor roles per team. Connections, requests and audit trails never cross team boundaries, and access to each connection is granted per developer.

Async and memory-safe

Approved queries run on a worker, never in a request cycle. Cursor streaming keeps memory flat whether a result has ten rows or ten thousand.

An audit log you can't edit

Who asked, who approved, what ran, how long it took, what it touched. Immutable by construction, filterable by auditors, exportable as CSV.

Security

Security isn't a feature here. It's the product.

QueryProxy exists so that nobody needs standing access to production. Every layer assumes the request in front of it might be hostile.

Found something? See oursecurity policy.

AES-256-encrypted credentials

Hosts, usernames and passwords are encrypted at rest — never in logs or error messages.

Signed chat callbacks

HMAC-SHA256 with a ±5-minute replay window on every Slack and Teams action.

No self-approval

Nobody green-lights their own query. Admin overrides exist — and are flagged in the audit log.

Masked at write time

Masking runs inside the result stream — the unmasked version is never stored anywhere.

Immutable audit trail

Audit rows can be inserted and read — update and delete throw, by construction.

Rate-limited everywhere

Login and webhook endpoints are throttled; failed logins back off automatically.

Quick start

Running before your coffee cools

One compose file starts the portal, the queue worker and the scheduler. SQLite by default, zero external services — swap in MySQL/PostgreSQL and Redis with environment variables when you outgrow it.

  • No Redis, no external queue — database-backed by default
  • Docs cover Slack & Teams setup step by step
  • Demo team seeded on first boot — explore every role
Read the docs
terminal
$ git clone https://github.com/QueryProxy/QueryProxy.git
$ cd QueryProxy
$ docker compose up
$ open http://localhost:8000
 portal · worker · scheduler running

Put an approval in front of every production query.

Free, open source, yours to host. Star it, fork it, run it tonight.

Arrow keys to move, Enter to open.