Runarks · Governed access to production databases
My own product: every query against a production database is reviewed, approved, run once and logged, and nobody sees a password.
- Founder
- Aug 2026 – now
- runarks.com
Overview
Runarks is my own SaaS for teams that need to read or fix data in production. Instead of sharing a database password, people raise a request with the statement and a reason, a colleague approves it, and they run it once. I founded it and build it on my own.

The problem
Most teams fix production by pasting a query from chat into a database client.
- No review. Nobody sees the statement first, so one missing filter can change every row.
- No record. Afterwards nobody can say who ran what, or what changed.
- Passwords spread. Everyone who ever needed production keeps the credential.
- Data leaks by accident. A quick
SELECT *puts customers' emails and card details on screen.
The solution
Review first. A colleague approves each statement on what it will actually do, and only the requester runs it, once.
A record of everything. Every step is written to a log that can be added to but never edited.
No passwords to share. Runarks holds the credentials and opens the connection itself.
Masked by default. Sensitive fields are masked before rows leave Runarks.
What I did
- Defined the product and its security model: who may ask and approve, what may run and what is never shown.
- Designed the executor, the only component allowed to open a connection to a customer's database.
- Built the analyzer that describes a statement the same way for five database engines.
- Designed masking that follows the data, and the append-only activity log.
- Split the code into domains behind contracts, and wrote down each design decision with its reasons.
- Wrote the skills and agents that the coding agents follow in this codebase.
What it offers
- Every statement is read firstEach statement is described and checked against grants before anyone is asked to approve it.
- Two people for every changeReads need one approval and writes two by default, and nobody approves their own request.
- Writes are measured firstA dry run counts the rows a write will change, and that count caps the real run.
- Masking that follows the dataSensitive columns stay masked through aliases, functions and joins.
- No shared passwordsCredentials are encrypted and used only by the executor; nobody is ever shown one.
- A trail nobody can editEvery step goes to a log that the application and the database both keep append-only.
System design
Its domains talk only through each other's contracts, and the back office sees metadata only. A queue and a scheduler expire lapsed requests, check connections and send notifications.
How a request moves
There is no path from pending approval straight to executing, and rejecting takes the same permission as approving. Reads needed during an incident use a separate bypass: reads only, and flagged in the log.
One door to production
Every path to a customer's database goes through the executor, and a test fails the build if anything else opens a connection. The analyzer has no credentials or network, and anything it cannot describe is refused.
Approving what a write will do
The approver judges the rows a write would really change, and that count is a hard cap when it runs: if more rows change, it rolls back.
Masking that follows the data
Masking rules are written per column but follow the data, so SELECT ssn AS x and CONCAT(first_name, ssn) stay masked. Filtering on a masked column is refused, so nobody can recover a value one LIKE at a time.
In the product





