Self-hosted · v2.0.0 · MIT
Git for your test database.
Snapshot the databases behind a system under test. Break them. Put them back in seconds, and see exactly what changed.
- Databases, files and logs behind one dashboard: PostgreSQL, MySQL, MariaDB, MongoDB, any S3, SFTP, FTP, and six kinds of log source (every engine →)
- Snapshots, credentials and logs stay on your own server. No account, no telemetry.
- One binary for Linux, macOS and Windows, with a setup and a service built in
Get it
Install the binary on Linux or macOS, then run testate setup
$ curl -fsSL https://pt-perkasa-pilar-utama.github.io/testate/install.sh | sh
Or run the container
$ docker run -d --name testate -p 7378:7378 \
-v testate-data:/data \
-e TESTATE_SECRETS_ACTIVE_KEY="$(openssl rand -base64 32)" \
-e TESTATE_ADMIN_PASSWORD=change-me-now-1234 \
ghcr.io/pt-perkasa-pilar-utama/testate:2.0.0
Or connect your agent, with an agent token from the dashboard
$ claude mcp add --transport http testate \
https://testate.example.internal/api/v1/mcp \
--header "Authorization: Bearer tst_YOUR_TOKEN"
Or no install at all: try it in your browser, on sample data.
Windows: testate_windows_amd64.zip from the
releases.
Every download is signed and carries build provenance.
Where it sits
Beside the system it tests. Never inside it.
Your test server already has the app, its databases and its logs. Testate docks next to them as one binary, and everyone who needs a clean database comes in through it.
The loop
Take a state. Break it. Check it out.
A state is a data-only snapshot of every database in a project, taken at one moment. A checkout puts the one you pick back and reports what happened per database.
One snapshot, every database
PostgreSQL, MySQL, MariaDB and MongoDB, captured together. It says who took it and what it cost in bytes. HEAD marks where you are.
Run the test. Dirty the data.
Edit rows in the grid, load a fixture, or let the suite do its worst. Testate stashes before your first write, so even a hand edit is reversible.
Back in seconds, with a diff
One click or one API call restores the state and reports per database. Compare any two states and drill into the rows that moved.
What it does
A reset you can trust, and a record of what moved.
Snapshots
Data, not schema. A timeline per project with HEAD marked, one protected starting point, and a quota so the volume never fills without warning.
Row-level diffs
Two states, or a state against the live database. The summary counts what moved; a table opens to the rows, before and after, and a changed cell opens its value.
The grid
Filter, sort, page by keyset, follow a foreign key into the next table. Turn on write mode and edit with the types the column really has.
Fixtures
Upload a CSV or XLSX, map the columns, dry-run it, then import. Rejected rows come back as a file you fix and send again.
Read-only console
Saved queries, so the check you run after every reset stays where you left it instead of in someone's notes.
Logs beside the data
Read the app's log files, its journal, its containers, Loki or Elasticsearch next to the database. Filter, follow, download. Secrets are masked for viewers and agents.
Monitor
CPU, memory, disk and network of the hosts, each pm2 app, and the database servers, sampled every 30 seconds and drawn as graphs. Read over SFTP; nothing installed.
Pipelines
Every screen sits on the REST API. One call resets a database before a test run, and the running instance serves its own OpenAPI contract.
Engines
Every one of these is real, not a stand-in.
Each speaks its own protocol to the real server. A tier is a menu in the dashboard, across every project.
Tabular
Databasesextract · edit · import
Document
Databasesextract
Files
Storagerename · delete · batch
Logs
Logsmasked for viewers and agents
Object storage is anything S3-compatible: Amazon S3, Cloudflare R2, Google Cloud Storage, Backblaze B2 and MinIO: one adapter, any endpoint. Log files come over SFTP or S3; Elasticsearch includes OpenSearch. Database adapters also read their server's own logs.
Agents
An agent can look. Only a tester token can touch.
Testate speaks MCP. Point Claude or any MCP client at the endpoint with an agent token and it reads schemas, pages rows, runs read-only queries, extracts fixtures and reads logs. A Guest token has no write path at all. Queries run inside a read-only transaction, and column policies mask values before the agent sees them.
It does not have to be taught how. The first tool it sees is help: how the
pieces relate, the order to call things in, and the limits that refuse a call.
Lower than the dashboard's caps, because an agent loops.
Agent integration
One command to wire it up. Then ask.
Register the endpoint with an agent token, and the agent reads the guide, finds the database, and answers in rows. Masked columns stay masked.
Start
Running in about a minute.
Install and set up. The script puts testate in
~/.local/bin and checks the download. testate setup asks for a
port and the first admin's password, and writes a new sealing key. Keep that file.
Keep it running. testate service install makes a user service
that starts at boot. testate update fetches the next release when you ask.
Sign in. Open localhost:7378 as admin. Testate
makes you change the password on the first login.
Point it at a database. Add an adapter, take a snapshot, break something, put it back. Where to aim the host is the one thing that catches people out, so the README spends a section on it.
Before you install it
What it does not do.
Databases go one at a time
Even inside one project, Testate snapshots and restores them in sequence. Each is correct alone; the set is not guaranteed to line up. Keep the app idle while it runs.
It only resets what you add
An untracked database survives a reset, and Testate cannot warn you, because it has never heard of it.
Microservices are untested
Every limit above compounds. Stay inside one service and add the rest as read-only adapters.
It needs a real connection
Firebase, Firestore and DynamoDB hand you an SDK rather than a connection, so they cannot be added. Supabase, Neon, RDS and Cloud SQL work.