Point Lizard at one or many databases — mix engines freely — and get an auto-generated CRUD UI, natural-language querying, and prompt-driven charts across the fleet. 100% self-hosted, zero schema pollution.
Stop sacrificing data privacy to SaaS tools or cluttering production databases with vendor tables.
Lizard keeps all metadata completely isolated in its own local SQLite store and connects to Postgres, MySQL, and MongoDB side by side.
Your database credentials, query results, and generated SQL never pass through a third-party SaaS proxy.
Purpose-built to inspect, edit, relate, and visualize microservice data without writing custom internal tools or compromising database security.
Connect Postgres, MySQL, and MongoDB databases side by side in one console — mix engines freely across one or many services.
Auto-generates a browsable, editable UI from schema introspection alone — filters, search, and inline record editing, with zero configuration.
Declare virtual foreign keys between tables across different connections or engines — no DB constraints added, no DDL ever written to your databases.
Save any result as a dashboard block — one query plus how to read it, switchable between table, chart, kanban, and gallery. Panel edits are a draft until you hit Save, which snapshots a restorable version, and each panel may pull from a different database.
Grant a connection to a team once instead of person by person — members inherit read/write access automatically. Admin/editor/viewer roles, private/team/everyone dashboard sharing, and an audit log of every query and write with tiered, configurable retention.
Ask a question in plain English. An on-demand agent (Claude by default — OpenAI and Gemini also supported) explores only the tables it needs, streams its progress live, and can be stopped mid-run. The SQL is always shown and editable.
No manifest files, no code generation. Lizard derives everything from your live schema.
Set two required env vars and start the server, then register connections in Settings — Postgres, MySQL, and MongoDB side by side.
npm install
export LIZARD_ENCRYPTION_KEY=$(openssl rand -base64 32)
export ANTHROPIC_API_KEY=sk-ant-...
npm run dev # → http://localhost:3111Auto-detects tables, types, and constraints. Declare virtual foreign keys to link tables that live in different microservice databases.
// Declared in the table "Customize" panel
orders.customer_id
→ users_service.public.customers.idGet auto-generated CRUD grids, run natural-language queries with the generated SQL always visible, and pin charts to dashboards.
Prompt: "top 5 customers by revenue this quarter"
Agent explores: search_schema → describe_table → get_relations
Guard: read-only SELECT, verified → executed → chart renderedReal product screenshots — the fastest way to know what you're actually running.
Browse, filter, and edit every table across every connected database — auto-generated from the schema.
Ask a question, watch the agent explore the schema live, and review the generated SQL before it runs.
One-click visualize a result, or describe a chart in words. Pin panels from different databases to one dashboard.
Saving a result gives you a dashboard: a page of blocks, where a block is one query plus how to read it. Switching between table, chart, kanban, and gallery never means rewriting the query — and each block can point at a different microservice database, or span several at once.
Variables live in the URL
Text, single- or multi-select, and date range. Multi-select has an optional "All" that means no filter, not every option expanded into an IN list. Wrap a clause in [[ ... ]] and it drops out of the query whenever the variable inside it is empty.
Grid or solo — your call
One block can fill the whole page instead of sitting in a grid cell, which is what a saved query or a kanban board actually is. Adding a second block promotes it to a grid automatically.
An optional date range
Enabled per dashboard rather than forced on every one — and wired to the same whole-day semantics as table filters.
Tags, search, and JSON export
The library stays navigable past a few dozen dashboards. Every dashboard is also a portable JSON document you can export, edit, or apply from elsewhere.
One block, four ways to read it
Shareable state
/dashboards/revenue?region=emea&datetime.from=2026-01-01&datetime.to=2026-01-31
No time on either end, so the range runs from the start of 1 Jan to the end of 31 Jan — in your timezone, not the server's.
Timestamp filters have a date picker and a separate, optional time picker. Leave the time blank and "= 1 Jan" means all of 1 Jan; a between-range runs from the start of the first day to the end of the last.
The browser's IANA zone is validated server-side and applied as a session setting on the connection itself — Postgres, MySQL, and the federation engine alike. It is part of the cache key, so two zones never share a result.
The whole-day expansion is a half-open range, not DATE(created_at) = …. Wrapping the column in a function makes the predicate unsargable and throws away the index — on a large table that is the difference between a seek and a full scan.
Microservice databases have no real foreign keys between them. Lizard lets you declare those relationships virtually, in a per-table "Customize" panel — nothing is ever written to your production databases.
The only path to a cross-DB AI join
The AI never guesses a join across connections — a declared virtual relationship is required.
Powers cross-DB reference pickers
Linked columns render as searchable pickers and readable labels in the CRUD UI, not raw ids.
Example virtual relationship
orders.customer_id
public.customers.id
The design assumption is a database per microservice, thousands of them. That rules out anything that walks the fleet — so every list, cache, fan-out, and pool has a ceiling.
Introspection takes a list of connections and refuses an empty one — there is no "read the whole fleet's schema" call to make by accident. Global search is scoped the same way, by connection and table.
Hand-written, AI-generated, and federated queries alike run through one Guard with an enforced limit, a read-only transaction, and a server-side statement timeout — 30s for reads, 45s federated.
Introspecting a thousand hosts in one tick is a thundering herd. Lizard walks them 8 at a time with a 20s budget each; a slow database becomes one failed entry, not a stalled request.
Counting columns instead of connections holds across fleet shapes — a hundred enormous schemas and ten thousand tiny ones settle at a similar footprint. Past its TTL the cache serves the last known schema instantly and refreshes behind you.
Browsing five hundred databases used to leave five hundred live pools behind for the life of the process. Idle pools are now closed and forgotten, swept on access rather than on a timer.
An endpoint that fills a dropdown has no business shipping thousands of rows, so connection lists page (100 max) and every picker searches server-side.
Lizard is built so that letting an LLM near a live database doesn't mean handing it write access or an escape hatch.
Deploy Lizard wherever your databases already live. There is no vendor proxy in the request path — database credentials and query results never leave your infrastructure.
Every AI, chart, and federated query is parsed and validated: single SELECT only. Multi-statements, DML/DDL, comments, and dangerous functions are rejected, a hard LIMIT is applied, and the query runs in a read-only transaction with a statement timeout. Verified by an adversarial test suite of 30+ injection vectors.
AI/chart/browse queries run on a read-only lizard_read role; writes use a separate lizard_write role with parameterized queries only. Stored database passwords are encrypted at rest with AES-256-GCM.
The generated SQL and the databases it touched are always shown, editable, and re-runnable. Every query and write is recorded in an audit log with configurable, tiered retention.
Lizard is open source and designed to run entirely on your own infrastructure. No outbound database traffic ever leaves your servers.
npm install
export LIZARD_ENCRYPTION_KEY=$(openssl rand -base64 32) # required — encrypts stored DB passwords at rest
export ANTHROPIC_API_KEY=sk-ant-... # or set LIZARD_AI_PROVIDER=openai/google
npm run dev # → http://localhost:3111Self-host Lizard and inspect, edit, relate, and query your Postgres, MySQL, and MongoDB databases — on your own infrastructure.