Catch bad data before it ships.
Write SQL checks once. Run them on a schedule, read-only, and see what needs attention.
Duplicate orders
Same customer, same total, within 5 minutes
| Order | Duplicate | Customer | Total |
|---|---|---|---|
| #12 | #1501 | 88 | $412.60 |
| #19 | #1502 | 141 | $96.40 |
| #23 | #1503 | 7 | $1,208.00 |
| #31 | #1504 | 162 | $57.99 |
| #44 | #1505 | 23 | $640.15 |
| #58 | #1506 | 105 | $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.
From question to check in minutes
A check is a query that should return nothing. If it returns rows, someone needs to look.
1SELECT o.id, o.customer_id, o.total2FROM demo.orders o3WHERE o.status IN ('paid', 'shipped')4 AND NOT EXISTS (5 SELECT 1 FROM demo.payments p6 WHERE p.order_id = o.id7 );
Editor theme: Solarized Light
Know what needs attention
Every run is recorded with its status, findings and the rows it returned.
| Script | Cron | Next run |
|---|---|---|
| Negative inventory | */30 * * * * | 14:30 |
| Duplicate orders | 0 * * * * | 15:00 |
| Future-dated orders | 0 0 * * * | Tomorrow 00:00 |
| Paid, no payment | 0 9 * * * | Tomorrow 09:00 |
| Stale pending orders | 0 8 * * 1 | Mon 08:00 |
Editor theme: Nord
Safe for the whole team
Built for teams where not everyone should touch production queries.
| Change | Requested by | Status |
|---|---|---|
| Create: Refunds larger than payment | alex | Pending |
| Update: Duplicate orders | sam | Pending |
| Update: Negative inventory | riley | Approved |
| Create: Future-dated orders | casey | Approved |
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 →git clone https://github.com/jma49/sql-script-depoly.gitcd sql-script-depoly && npm install# Clerk, MongoDB, PostgreSQL and Upstash keyscp .env.example .env.localnpm run seed:demo # optional demo datasetnpm 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.