Catch bad data before it ships.

Write SQL checks once. Run them on a schedule, read-only, and see what needs attention.

Assay11 checks · 8 need attention

Duplicate orders

Same customer, same total, within 5 minutes

6 found
OrderDuplicateTotal
#12#1501$412.60
#19#1502$96.40
#23#1503$1,208.00
#31#1504$57.99
#44#1505$640.15
#58#1506$233.70

Why Assay

Data checks your team can trust

Read-only by design

Every script is validated before it is saved, and runs inside a read-only transaction with a server-side timeout.

Runs on a schedule

Give a check a cron expression and it runs on its own. Results land in one history you can filter and search.

Reviewed before it runs

New and edited scripts go through approval. Roles decide who can write, approve or only read.

AI in the loop

Generate a check from a sentence, get a review of a query, or an explanation when a run fails.

Write

From question to check in minutes

A check is a query that should return nothing. If it returns rows, someone needs to look.

paid-orders-missing-payment.sqlPostgreSQL
1SELECT o.id, o.customer_id, o.total
2FROM demo.orders o
3WHERE o.status IN ('paid', 'shipped')
4 AND NOT EXISTS (
5 SELECT 1 FROM demo.payments p
6 WHERE p.order_id = o.id
7 );
PassedRead-only, ready to save
DELETE FROM demo.payments …Blocked: DELETE is not allowed

Editor theme: Solarized Light

Monitor

Know what needs attention

Every run is recorded with its status, findings and the rows it returned.

Scheduled checks5 enabled
ScriptCronNext run
Negative inventory*/30 * * * *14:30
Duplicate orders0 * * * *15:00
Future-dated orders0 0 * * *Tomorrow 00:00
Paid, no payment0 9 * * *Tomorrow 09:00
Stale pending orders0 8 * * 1Mon 08:00

Editor theme: Nord

Govern

Safe for the whole team

Built for teams where not everyone should touch production queries.

Approvals2 pending
ChangeRequested byStatus
Create: Refunds larger than paymentalexPending
Update: Duplicate orderssamPending
Update: Negative inventoryrileyApproved
Create: Future-dated orderscaseyApproved

Editor theme: Solarized Dark

Open source

Run it on your own stack

Assay is a Next.js app. Bring a Clerk app, MongoDB for scripts and history, the PostgreSQL database you want to check, and Upstash Redis for caching.

Read the setup guide
Terminal
git clone https://github.com/jma49/sql-script-depoly.git
cd sql-script-depoly && npm install
# Clerk, MongoDB, PostgreSQL and Upstash keys
cp .env.example .env.local
npm run seed:demo # optional demo dataset
npm run dev

Frequently asked questions

Can a check modify my database?+

No. Scripts are validated as read-only when saved and again before running, and every run happens inside a read-only transaction.

Which databases can I check?+

PostgreSQL today. The target is whatever DATABASE_URL points to, including managed services such as Neon or RDS.

What counts as a failed check?+

A check that returns rows needs attention. A check that errors, for example because a column was renamed, is marked failed.

Who can sign up?+

Anyone can create an account and gets the viewer role. An admin assigns higher roles.

Know before your users do.

Turn the queries you already run by hand into checks that run on their own.

Assay · Open source SQL checks for PostgreSQL.GitHub