A database browser for PostgreSQL and MySQL/MariaDB that runs on your own machine. Browse and edit tables, draw a whole database as a diagram, run SQL, and keep the databases in shape.
It is plain PHP and plain JavaScript: no Composer, no npm, no build step. Put the folder behind any PHP server and open it in the browser.
It is meant for local development. It only answers on localhost and should not be
deployed to a server.

The screenshots are of shop, a small sample store database with 12 tables and about
19,000 rows.
git clone https://github.com/Shivam7414/Sqlaris-Studio.git
cd Sqlaris-Studio
cp .env.example .env
cp config.example.php config.php
php -S 127.0.0.1:8765 router.php
Fill in .env first (see Setup), then open http://127.0.0.1:8765/.

| Editing an enum column | Row details |
|---|---|
![]() | ![]() |
Every write to many rows (a paste, an import, a bulk update) runs in one transaction. If one row fails, nothing is kept and the error names the row.



A diagram of every table and foreign key in the database, in three layouts: Flow, Families (grouped by the first word of the table name) and Constellation (linked tables pull together). Zoom, pan, drag tables where you want them, and use the minimap to move around a big database. The browser remembers where you put each table.

A SQL editor (CodeMirror) with autocomplete for tables, columns and aliases, EXPLAIN and a history of the last 50 queries. It runs read only unless you turn on "Allow changes".
| Health | Live activity |
|---|---|
![]() | ![]() |

pdo_pgsql, pdo_mysql, or both.Copy .env.example to .env and fill it in: a username and password for the viewer
itself, and the host, port and login of your database servers. Leave a server's host
empty to leave it out.
Copy config.example.php to config.php. It works as it is, and it is where you can
group and colour your databases later.
Start PHP's built-in server from this folder:
php -S 127.0.0.1:8765 router.php
and open http://127.0.0.1:8765/. Under XAMPP or any Apache with PHP, a copy inside
htdocs works without the router.
The viewer refuses every sign-in until both the username and password are set. Changing either one signs everyone out.
config.php builds the list of servers from .env. It holds no passwords, but it does
name your databases, so git ignores it. Each option is described in config.example.php.
| Option | What it does |
|---|---|
only, hide | Show only some of a server's databases, or hide some. * is a wildcard. |
databases | Rules that put databases into groups and give each a note and a colour. |
color | The accent colour for every database on a server. |
label_columns | Which columns a foreign key search shows to identify a row. |
audit_columns | The columns that "Hide audit columns" hides. |
edit_warning | A message of your own shown above every edit form. |
sql_row_limit, export_row_limit, import_row_limit | Row limits for the SQL tab, exports and imports. |
Your own arrangement of the sidebar (custom groups, order, hidden databases) is saved in
layout.json next to config.php. It is ignored by git too.
The page is dark by default. The switch in the top bar picks Dark, Light or Follow Windows. The palette button next to it picks the page colours, each in dark and light. Database, the default, paints the whole page in the colour of the database you are in, so you can see at a glance which one you are about to change. Midnight, Graphite, Ocean, Forest, Plum and Sand paint it in their own colour instead, and the database button, its label and a line along the top keep the database colour. When the system asks for reduced motion, nothing animates.
Press ? or F1 to see them all. Click one in that list and press new keys to change it.
The change is kept in your browser, and Reset brings back the defaults. Ctrl also means
Cmd on a Mac.
| Keys | Action |
|---|---|
Ctrl+P, Ctrl+K | Jump to a table, a database or an action |
/ | Filter the table list |
Ctrl+F | Search the rows, or find a table in the diagram |
F | Fit the diagram to the screen |
Enter, F2 | Edit the cell |
Shift+Enter | Open the row details |
Ctrl+C | Copy the cell, or the selected rows |
Delete | Set the cell to NULL |
Space | Select the row |
Ctrl+A | Select every row on the page |
Ctrl+S, Ctrl+Enter | Save the row form |
Ctrl+Enter, F5 | Run the SQL, or only the selected part |
Ctrl+Space | Suggest a table or column in SQL |
Ctrl+/ | Comment out a SQL line |
The grid moves like Excel: arrow keys, Tab, Home/End, Ctrl+Home/Ctrl+End and
Page Up/Page Down. Shift+click selects a range of rows and Ctrl+click adds or removes
one.
Everything works on both systems, with a few differences:
tinyint(1) is shown as true or false. Binary and spatial columns are shown but cannot
be edited.uuid(), MySQL cannot say
which row was created, so the form closes and the row shows up in the list.ON UPDATE and AUTO_INCREMENT. A generated column's expression is changed in the SQL
tab.Edits go straight to the table, so none of your application's own logic runs: no events, no audit entries, no validation that only lives in code. That is fine for local and test data, which is what this is for.
A column change here is made on this one database only. If your project keeps its schema in migrations, the next migration run will not know about it, so put the same change in a migration too. The copy, rename and drop operations are meant for local data you can rebuild.
When a column's type changes, every value is converted. If one cannot be, the database refuses and nothing changes. On PostgreSQL the whole change, rename and comment included, runs in one transaction.
On PostgreSQL, copying or dropping a database first closes every other connection to it,
because PostgreSQL will not copy or drop a database that is in use. The database named in
the server's database setting is used to read the list, so it cannot be dropped from
here.
localhost, and the Host header is checked, so a web
page cannot reach the viewer by pointing its own domain at 127.0.0.1..env and layout.json are never served. .htaccess blocks them under Apache, and
router.php serves only the page, the API and assets/ under PHP's built-in server.postgres or mysql can never be dropped.If you find a way around any of this, please report it privately through GitHub's security advisories rather than in a public issue.
index.php the page and the sign-in form
api.php every call the page makes
router.php for PHP's built-in server
src/lib.php sign-in, the localhost check and config loading
src/actions.php what the API does, written once for every database
src/drivers/ what differs between PostgreSQL and MySQL
src/libraries.php downloads the bundled libraries
assets/app.js the whole front end
assets/diagram.js the diagram layouts, also loaded by the tests
assets/app.css
tests/ tests for the diagram layouts
The diagram layouts have tests that use Node's own runner, so there is nothing to install. From the project folder:
node --test
Issues and pull requests are welcome. A few things that keep the project the way it is:
assets/app.js as it is.assets/vendor through src/libraries.php, with their license file.assets/diagram.js, run node --test before sending it.These are kept in assets/vendor, each with its license file:
| Library | Version | License | Used for |
|---|---|---|---|
| Tom Select | 2.6.2 | Apache-2.0 | Searchable dropdowns |
| flatpickr | 4.6.13 | MIT | Date and time picker |
| CodeMirror 5 | 5.65.21 | MIT | SQL editor and autocomplete |
| Inter | 5.3.0 | OFL-1.1 | Interface font |
| JetBrains Mono | 5.3.0 | OFL-1.1 | Values, ids and SQL |
To change a version, edit it in src/libraries.php and run this from the viewer's folder:
php src/libraries.php
JavaScript
52.8%
PHP
29.0%
CSS
18.3%
A database browser for PostgreSQL and MySQL/MariaDB that runs on your own machine. Browse and edit tables, draw a whole database as a diagram, run SQL, and keep the databases in shape.
It is plain PHP and plain JavaScript: no Composer, no npm, no build step. Put the folder behind any PHP server and open it in the browser.
It is meant for local development. It only answers on localhost and should not be
deployed to a server.

The screenshots are of shop, a small sample store database with 12 tables and about
19,000 rows.
git clone https://github.com/Shivam7414/Sqlaris-Studio.git
cd Sqlaris-Studio
cp .env.example .env
cp config.example.php config.php
php -S 127.0.0.1:8765 router.php
Fill in .env first (see Setup), then open http://127.0.0.1:8765/.

| Editing an enum column | Row details |
|---|---|
![]() | ![]() |
Every write to many rows (a paste, an import, a bulk update) runs in one transaction. If one row fails, nothing is kept and the error names the row.



A diagram of every table and foreign key in the database, in three layouts: Flow, Families (grouped by the first word of the table name) and Constellation (linked tables pull together). Zoom, pan, drag tables where you want them, and use the minimap to move around a big database. The browser remembers where you put each table.

A SQL editor (CodeMirror) with autocomplete for tables, columns and aliases, EXPLAIN and a history of the last 50 queries. It runs read only unless you turn on "Allow changes".
| Health | Live activity |
|---|---|
![]() | ![]() |

pdo_pgsql, pdo_mysql, or both.Copy .env.example to .env and fill it in: a username and password for the viewer
itself, and the host, port and login of your database servers. Leave a server's host
empty to leave it out.
Copy config.example.php to config.php. It works as it is, and it is where you can
group and colour your databases later.
Start PHP's built-in server from this folder:
php -S 127.0.0.1:8765 router.php
and open http://127.0.0.1:8765/. Under XAMPP or any Apache with PHP, a copy inside
htdocs works without the router.
The viewer refuses every sign-in until both the username and password are set. Changing either one signs everyone out.
config.php builds the list of servers from .env. It holds no passwords, but it does
name your databases, so git ignores it. Each option is described in config.example.php.
| Option | What it does |
|---|---|
only, hide | Show only some of a server's databases, or hide some. * is a wildcard. |
databases | Rules that put databases into groups and give each a note and a colour. |
color | The accent colour for every database on a server. |
label_columns | Which columns a foreign key search shows to identify a row. |
audit_columns | The columns that "Hide audit columns" hides. |
edit_warning | A message of your own shown above every edit form. |
sql_row_limit, export_row_limit, import_row_limit | Row limits for the SQL tab, exports and imports. |
Your own arrangement of the sidebar (custom groups, order, hidden databases) is saved in
layout.json next to config.php. It is ignored by git too.
The page is dark by default. The switch in the top bar picks Dark, Light or Follow Windows. The palette button next to it picks the page colours, each in dark and light. Database, the default, paints the whole page in the colour of the database you are in, so you can see at a glance which one you are about to change. Midnight, Graphite, Ocean, Forest, Plum and Sand paint it in their own colour instead, and the database button, its label and a line along the top keep the database colour. When the system asks for reduced motion, nothing animates.
Press ? or F1 to see them all. Click one in that list and press new keys to change it.
The change is kept in your browser, and Reset brings back the defaults. Ctrl also means
Cmd on a Mac.
| Keys | Action |
|---|---|
Ctrl+P, Ctrl+K | Jump to a table, a database or an action |
/ | Filter the table list |
Ctrl+F | Search the rows, or find a table in the diagram |
F | Fit the diagram to the screen |
Enter, F2 | Edit the cell |
Shift+Enter | Open the row details |
Ctrl+C | Copy the cell, or the selected rows |
Delete | Set the cell to NULL |
Space | Select the row |
Ctrl+A | Select every row on the page |
Ctrl+S, Ctrl+Enter | Save the row form |
Ctrl+Enter, F5 | Run the SQL, or only the selected part |
Ctrl+Space | Suggest a table or column in SQL |
Ctrl+/ | Comment out a SQL line |
The grid moves like Excel: arrow keys, Tab, Home/End, Ctrl+Home/Ctrl+End and
Page Up/Page Down. Shift+click selects a range of rows and Ctrl+click adds or removes
one.
Everything works on both systems, with a few differences:
tinyint(1) is shown as true or false. Binary and spatial columns are shown but cannot
be edited.uuid(), MySQL cannot say
which row was created, so the form closes and the row shows up in the list.ON UPDATE and AUTO_INCREMENT. A generated column's expression is changed in the SQL
tab.Edits go straight to the table, so none of your application's own logic runs: no events, no audit entries, no validation that only lives in code. That is fine for local and test data, which is what this is for.
A column change here is made on this one database only. If your project keeps its schema in migrations, the next migration run will not know about it, so put the same change in a migration too. The copy, rename and drop operations are meant for local data you can rebuild.
When a column's type changes, every value is converted. If one cannot be, the database refuses and nothing changes. On PostgreSQL the whole change, rename and comment included, runs in one transaction.
On PostgreSQL, copying or dropping a database first closes every other connection to it,
because PostgreSQL will not copy or drop a database that is in use. The database named in
the server's database setting is used to read the list, so it cannot be dropped from
here.
localhost, and the Host header is checked, so a web
page cannot reach the viewer by pointing its own domain at 127.0.0.1..env and layout.json are never served. .htaccess blocks them under Apache, and
router.php serves only the page, the API and assets/ under PHP's built-in server.postgres or mysql can never be dropped.If you find a way around any of this, please report it privately through GitHub's security advisories rather than in a public issue.
index.php the page and the sign-in form
api.php every call the page makes
router.php for PHP's built-in server
src/lib.php sign-in, the localhost check and config loading
src/actions.php what the API does, written once for every database
src/drivers/ what differs between PostgreSQL and MySQL
src/libraries.php downloads the bundled libraries
assets/app.js the whole front end
assets/diagram.js the diagram layouts, also loaded by the tests
assets/app.css
tests/ tests for the diagram layouts
The diagram layouts have tests that use Node's own runner, so there is nothing to install. From the project folder:
node --test
Issues and pull requests are welcome. A few things that keep the project the way it is:
assets/app.js as it is.assets/vendor through src/libraries.php, with their license file.assets/diagram.js, run node --test before sending it.These are kept in assets/vendor, each with its license file:
| Library | Version | License | Used for |
|---|---|---|---|
| Tom Select | 2.6.2 | Apache-2.0 | Searchable dropdowns |
| flatpickr | 4.6.13 | MIT | Date and time picker |
| CodeMirror 5 | 5.65.21 | MIT | SQL editor and autocomplete |
| Inter | 5.3.0 | OFL-1.1 | Interface font |
| JetBrains Mono | 5.3.0 | OFL-1.1 | Values, ids and SQL |
To change a version, edit it in src/libraries.php and run this from the viewer's folder:
php src/libraries.php
JavaScript
52.8%
PHP
29.0%
CSS
18.3%