Pilotbase brand card with screenshots of Adminer, pgweb, CloudBeaver and Pilotbase showing the same orders table

The database is on a server. You're on a laptop, or a tablet, or a colleague's machine without your SSH keys. You want to look at one table. The usual answers are an SSH tunnel and a desktop client, or psql in a terminal. The other answer is a database client that runs on the server and shows up in a browser tab.

There are four open-source ones worth knowing, and we make one of them. So we did the fair thing: started all four in Docker on the same machine, pointed them at the same Postgres 17 database with a 200,000-row orders table, opened that table in each, and wrote down what Docker said. Pilotbase did not win on size. It isn't close.

The numbers first

text
                 version     download   on disk   memory in use        restart to first response
Adminer          6.1.1       44 MB      164 MB    14-19 MB             about 1 s
pgweb            0.17.0      69 MB      265 MB    8-11 MB              about 1 s
CloudBeaver CE   26.2.2      409 MB     1.14 GB   300-345 MB           about 5 s
Pilotbase        edge        357 MB     1.62 GB   265-290 MB           about 7 s
                                                  + 41-49 MB for its own Postgres

Download is the compressed image size, on disk is what docker images shows afterwards, and memory is docker stats read twice: after a restart, and after using each one. Adminer, pgweb and Pilotbase each showed the first page of rows in well under a second (in CloudBeaver we got as far as the open connection, not the data grid), so speed isn't what separates them. Size and what they can do are.

Adminer: one file, most of what you need

bash
docker run -d --name adminer -p 127.0.0.1:8080:8080 adminer

Adminer is a single PHP file that has been around since 2007. Open the page, pick the database type, type the server, user and password, and you're in. There's no setup and no account: the login form is your database login. It reads and edits rows, alters tables, runs SQL, imports and exports. It handles MySQL, MariaDB, PostgreSQL, SQLite, SQL Server and Oracle, with plugins for a few more.

Adminer 6.1.1 showing the orders table of a PostgreSQL database with edit links, paging and an export link for about 200,000 rows
Adminer 6.1.1 on our orders table. Plain, fast, and everything is a link.

It looks like 2007 too, and nothing is saved between visits: no connection list, no query history. For "I need to fix one row on the staging box" it's hard to beat at 14 MB. Pick it when you want the smallest thing that edits data across the common SQL databases.

pgweb: Postgres only, and proud of it

bash
docker run -d --name pgweb -p 127.0.0.1:8081:8081 sosedoff/pgweb \
  --url "postgres://user:password@your-db-host:5432/yourdb?sslmode=require"

pgweb is one Go binary. Give it a connection string and it opens straight onto your tables: rows, structure, indexes, constraints, a query tab with history, activity, and CSV, JSON or XML export. It was the lightest of the four at 8 to 11 MB, and the cleanest to read.

pgweb 0.17.0 showing the orders table with tabs for rows, structure, indexes, constraints, query, history, activity and connection, and table size information
pgweb 0.17.0. The table's size and row estimate sit in the bottom-left corner.

Notice what's missing in that command: a login. Started with --url, pgweb gives the database to anyone who can reach the port. Add --auth-user and --auth-pass for a basic password prompt, and --readonly if people should look but not touch. Pick it when you run Postgres and nothing else, and want a read-mostly window onto it.

CloudBeaver: DBeaver's server edition

bash
docker run -d --name cloudbeaver -p 127.0.0.1:8978:8978 \
  -v cloudbeaver-data:/opt/cloudbeaver/workspace dbeaver/cloudbeaver:latest

CloudBeaver comes from the DBeaver team and is a Java server. The first visit is a setup wizard where you name the server and create an administrator. After that you get what a team needs: users, shared connections that people can use without knowing the password, a proper SQL editor, an entity diagram, data export. The community edition listed 18 drivers on our install, among them PostgreSQL, MySQL, MariaDB, SQL Server, Oracle, SQLite, ClickHouse, DuckDB, Db2 and Trino.

CloudBeaver Community 26.2.2 signed in as an administrator with a shared PostgreSQL connection called shop and its connection details
CloudBeaver Community 26.2.2 after the wizard, with the shared connection in the left panel.

It's the heaviest here: a 409 MB download and 300 to 345 MB of memory before anyone runs a query. One thing surprised us. After the wizard, a second browser that had never signed in still got the app, not a login page. It saw no connections, but anonymous access is on until you switch it off in the administration settings. Pick it when several people need the same connections with their own logins, and you'd rather give the server 400 MB than give everyone the database password.

Pilotbase: ours, and the reason it isn't small

bash
docker network create pilotbase

# Pilotbase keeps its saved connections and settings in its own Postgres
docker run -d --name pilotbase-db --network pilotbase \
  -e POSTGRES_DB=pilotbase -e POSTGRES_USER=pilotbase -e POSTGRES_PASSWORD=change-me \
  -v pilotbase-db:/var/lib/postgresql/data postgres:16-alpine

docker run -d --name pilotbase --network pilotbase -p 127.0.0.1:8000:8000 \
  -e SECRET_KEY=$(openssl rand -hex 32) \
  -e ENCRYPTION_KEY=$(python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())") \
  -e DATABASE_URL="postgresql+psycopg2://pilotbase:change-me@pilotbase-db:5432/pilotbase" \
  -e STATIC_DIR=/app/api/static \
  ghcr.io/icedsg/pilotbase:edge

That's three commands, not one, and you should write the two keys down: saved database passwords are encrypted with ENCRYPTION_KEY and can't be read back without it. The repository has a docker compose file that does the same in one go.

Pilotbase in a browser: connection tree on the left with the shop database and its two tables, a SQL editor with SELECT * FROM orders LIMIT 500, 500 result rows with a CSV button, and the AI agent panel on the right
Pilotbase on the same table. Right-click a table, View All Rows; the query it ran stays in the editor.

What you get for 265 to 290 MB plus a small Postgres: one tool for 19 engines, and not only SQL ones. PostgreSQL, MySQL and SQL Server sit next to MongoDB, Redis and vector databases such as Qdrant, each shown the way it's shaped (documents as documents, keys as keys). There's backup and migration between databases, a generated REST API for the tables you choose, and an AI agent that writes a query and waits for your approval before anything that changes data. It's MIT-licensed.

What you don't get: lightness, and a locked door by default. Out of the box Pilotbase runs in anonymous mode. The first browser that opens it becomes the administrator; later visitors get an empty workspace and can't add connections, but there is no password prompt. If you only have one Postgres to look at, pgweb or Adminer will do it in a twentieth of the memory, and we'd rather tell you that here than have you find out. Pick it when you have more than one kind of database, or you want the API, the backups or the agent in the same place.

Whichever you pick: don't leave the port open

Every command above binds to 127.0.0.1, on purpose. A database client on a public port is a login page for your data that the whole internet can try, and two of these four don't even show a login page by default. Three ways to reach it safely, from least to most work:

bash
# 1. SSH tunnel: nothing is exposed, works today
ssh -N -L 8081:127.0.0.1:8081 you@your-server
# then open http://localhost:8081 on your laptop

# 2. A private network (WireGuard, Tailscale): bind the port to the VPN address only

# 3. A reverse proxy with HTTPS and its own login in front (nginx basic auth, or an identity proxy)

And give the client a database user that fits the job. A read-only role for looking, a separate one for changes. None of these tools can stop a DROP TABLE that the database itself allows.

Short version

One Postgres, mostly reading: pgweb. A few SQL databases, quick edits, smallest footprint: Adminer. A team with separate logins and shared connections: CloudBeaver. SQL, document, key-value and vector databases in one place, with backups, an API and an AI agent: Pilotbase. All four are open source, and each one is a single command away on a spare port this afternoon (three commands, for ours).

Pilotbase runs in Docker on your server or as a desktop app on Windows, macOS and Linux. Open source under MIT.

Get Pilotbase

How we measured

10 October 2026, Docker Desktop on Windows 11 Pro (Intel i5-12500H, 32 GB RAM). Images pulled that morning: adminer:latest (Adminer 6.1.1, PHP 8.4), sosedoff/pgweb:latest (0.17.0), dbeaver/cloudbeaver:latest (26.2.2), ghcr.io/icedsg/pilotbase:edge (built 27 September 2026) with postgres:16-alpine for its own data. Target: postgres:17-alpine with 5,000 customers and 200,000 orders. Download size from docker image inspect, on-disk size from docker images, memory from docker stats --no-stream, read about a minute after a restart and again after opening the orders table once in headless Chrome (for CloudBeaver, after the setup wizard and opening the connection). Restart time is docker restart until the first HTTP 200, so it includes shutting down. One machine, one run each: treat the numbers as a guide to scale, not a benchmark. Projects: Adminer, pgweb, CloudBeaver, Pilotbase.