Your queries are fine.Probably.

A database IDE that reads your SQL back to you, and says what is wrong with it. PostgreSQL, MySQL, SQLite and Redis.

bunx @datagripe/cli personal # or: npx @datagripe/cli personal

Free and open source, MIT · no account · answers nothing but this machine

particles
140
lines drawn
0
insights
0
relevance
0.00%
Impressiveness: 1x

Attitude

It complains at a volume you choose

Every finding is analysis, not a sentence. The wording is picked when it is shown, so turning the dial re-words the same finding and never re-analyses. This is one gripe — a join with no condition — at all four levels.

This join has no condition. That is a cross product.

notice · dry, and still critical

This join has no condition. I'll allow it. I won't forget it.

warning · the default

No join condition. You've asked for every row times every row. Absolute state of this.

fatal · swears. opt in.

NO JOIN CONDITION. Every row. Times every row. I want you to sit and think about what that number is.

panic · a joke, deliberately

Gripes criticise the query, never the person who wrote it. Anything you disagree with is dismissable for that occurrence, that table, or the whole project — and it always tells you it is hiding something. How the dial works.

Rules

Eighteen rules, none about formatting

A rule earns its place by knowing something the query text does not say, or by being about damage rather than tidiness. Style filler is a formatter's job, and the fastest way to get the whole thing switched off.

routine.definer-no-search-path

Security definer, no search_path. Anyone who can add a schema owns this.

blockerobject

column.nullable-inequality

status can be null, and null is not <> anything. Those rows vanish here.

warningstatement + schema

view.select-star

The star in this view is expanded once, at creation. New columns never appear.

warningstatement

All 18, plus 5 not built yet

The rest of it

It is also a database IDE

The complaining is the part with a name on it. The other nine tenths is the tool you would have opened anyway.

Editor

Movable tabs and splits, one model per document, drafts and layout recovered across reloads.

Query execution

Run a selection, the statement at the cursor, or the whole file. Streamed results, reliable cancellation, CSV and JSON out.

Table view

Sort, filter, page, edit cells, insert and delete rows. A side panel for the JSON column you cannot read in a grid.

Object view

Columns, indexes, constraints, triggers, grants, statistics and DDL from one catalog call. Column edits show you the SQL first.

Four engines, honestly

Each adapter declares what it can actually do. SQLite's narrow ALTER is reflected in the UI rather than failing at runtime.

Shared, if you want

Workspace files, presence, follow mode, and queries other people ran — each under their own identity, with an audit trail.

The complete surface, including the parts with no banner, is what it can do.

Install

Run it in about twenty seconds

Nothing to install, no Docker, no accounts, no configuration. It starts its own PostgreSQL and opens without a login.

Just you

bunx @datagripe/cli personal

Then open localhost:3001. The npx version works with no Bun on the machine — it fetches one, because the server runs on it. Or download the desktop app: the same thing in a window.

Everyone else

docker run -p 3001:3001 -v datagripe:/data \
  ghcr.io/datagripe/datagripe

The same server, a PostgreSQL you own, accounts switched on. The first person to open it creates the first account; after that signup is closed until you say otherwise.

Compose, Helm and plain manifests too — the deployment guide has all four, and every setting, starting with the one nothing can guess for you: WEB_ORIGIN, the exact origin browsers use.

Agents

Every page here is also a file

Append .md to any URL and you get that page as Markdown, with links to every other page. No scraping, no rendering, no JavaScript. The whole site is indexed in /llms.txt, and /llms-full.txt is all of it in one request.

DataGripe itself speaks MCP: a project can expose an endpoint an agent connects to, read-only until an owner says otherwise, with every call in the history under the token's name.

Version 0.0.x

What a 0.0.x means

It works and it is tested. Nothing in it is promised to stay put, and it keeps its own list of what is wrong with it — in the same voice it uses on your schema.

Gripes stop at the query text. Nothing yet complains about how a query actually turned out.

being writtenengine · server-side-gripes

The danger zone states real consequences and then does nothing. Truncate and drop are decoration.

acceptedobject-view · danger-zone-inert

All of them — accepted, unscheduled, unfiled, and the ones deliberately declined, which stay on the page because the reason something was refused is the useful part. What has shipped is in the release notes.