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 upHow 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.
Submit
Developers write SQL in a guarded editor against connections a DBA granted them — credentials never leave the vault.
Guard
The AST inspector rejects WHERE-less UPDATE/DELETE, injects and clamps LIMITs, and blocks admin statements outright.
Approve
DBAs decide from the web queue or straight from Slack / Teams. Self-approval is blocked; every decision is signed and recorded.
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
$ 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.