Testate
  1. Get it
  2. Where
  3. Loop
  4. Does
  5. Engines
  6. Agents
  7. Agent
  8. Start
  9. Limits
  10. Demo

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.

loadingthe scene
  • 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.

Where Testate sitsYour test server holds your app and its databases. Testate docks beside them as one binary, takes snapshots and puts them back, and testers, developers, CI/CD, DevOps and AI agents come in through it. YOUR TEST SERVER · DEV, SIT OR UATYour appthe system under testIts data and logsPostgreSQL · MySQL · MariaDBMongoDB · any S3 · SFTP · FTPjournald · Docker · Loki · Elasticreset by hand, until nowreads and writes$ testate setup && testate service installTestatesnapshotcheck outdiffread logsmonitor hostsMCP for agents1 binary · 1 data folderBeside the app. Nothing installs inside it.snapshotput it backTestersthe dashboardDevelopersthe grid and the consoleCI/CDone call before the runDevOpsone binary, a service, a proxyAI agentsMCP, read-only by default

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.

01 · take

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.

02 · break

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.

03 · check out

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.

states

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.

diffs

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.

grid

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.

imports

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.

query

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

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

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.

api

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

Databases
PostgreSQLMySQLMariaDB
view · snapshot · checkout · diff
extract · edit · import

Document

Databases
MongoDB
view · snapshot · checkout · diff
extract

Files

Storage
Object storageSFTPFTP
view · preview · download · insert
rename · delete · batch

Logs

Logs
Log filesPushed linessystemd journalDockerGrafana LokiElasticsearch
read · filter · follow · download
masked 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.

13 engines across four tiers
5 platforms with their own binary, plus the image
0 commands run on your hosts: logs and the monitor only read

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.

Rows per page, default200
Rows per page, maximum1 000
Bytes per reply1 MiB
Seconds per query15
Fixture depth, foreign-key hops3
Rows per fixture500

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.

zsh — ~/shop — 100×34

          

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.

curl -fsSL https://pt-perkasa-pilar-utama.github.io/testate/install.sh | sh
Installed testate 2.0.0 to /home/you/.local/bin/testate
testate setup
Wrote /home/you/.config/testate/testate.env (mode 600)
testate service install
Installed: /home/you/.config/systemd/user/testate.service
 
curl -s -o /dev/null -w '%{http_code}\n' \
localhost:7378/api/v1/health/live
204

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.