Skip to the content.

build-main

sqlui-native

64

sqlui-native is a cross-platform desktop SQL/NoSQL database client and REST API client built with Tauri v2 and a Node.js sidecar. It supports MySQL, MariaDB, Microsoft SQL Server, PostgreSQL, SQLite, Cassandra, MongoDB, Redis, Azure CosmosDB, Azure Table Storage, Salesforce (SFDC), and REST APIs (curl/fetch).

It supports multiple windows, so you can run different sets of queries and connections side by side. Connections and queries are stored locally and persist across sessions.

Downloads

Sqlui Native Homepage

Supported Platforms

Portal Mode (Web)

Run sqlui-native as a self-contained web portal — phpMyAdmin / sqlite-web style — no desktop install needed. One Node script, one port, every supported dialect.

Requires Node.js 22+ on the host.

Quick start (download from a release)

One tarball, two flows. The release ships a single sqlui-portal.tar.gz whose contents work for both curl | tar and npx. Pick whichever you prefer — same file, same result:

Option A — npx (auto-cached, single command, Windows-friendly)

npx https://github.com/synle/sqlui-native/releases/latest/download/sqlui-portal.tar.gz ./mydata.sqlite

npx downloads the tarball, caches it under ~/.npm/_npx/, and runs in one step. Subsequent invocations are instant. npm/pacote strips the top-level portal/ directory and finds the package.json at the root, so .tar.gz works just like .tgz would.

Option B — curl | tar (no npm involved)

curl -fsSL https://github.com/synle/sqlui-native/releases/latest/download/sqlui-portal.tar.gz \
  | tar -xz \
  && ./portal/sqlui-portal ./mydata.sqlite

Pin a specific version

The latest/download/sqlui-portal.tar.gz URL is a versionless alias that always resolves to the current release. To pin:

VERSION=3.1.4
# Either flow:
npx "https://github.com/synle/sqlui-native/releases/download/v${VERSION}/sqlui-portal-${VERSION}.tar.gz" ./mydata.sqlite
curl -fsSL "https://github.com/synle/sqlui-native/releases/download/v${VERSION}/sqlui-portal-${VERSION}.tar.gz" | tar -xz \
  && ./portal/sqlui-portal ./mydata.sqlite

Build from source

git clone https://github.com/synle/sqlui-native
cd sqlui-native
npm install
npm run build:portal

This produces three files under dist/portal/:

Copy the whole dist/portal/ directory anywhere; it has no other dependencies besides a system Node.js 22+.

Run

# Open a SQLite file (auto-opens browser at http://127.0.0.1:19378)
./portal/sqlui-portal ./mydata.sqlite

# Multiple connections, any dialect, in one shot
./portal/sqlui-portal \
  ./work.sqlite \
  postgres://user:pass@db.example.com:5432/mydb \
  mongodb://localhost:27017 \
  redis://localhost:6379

On boot, the portal:

  1. Adds each input as a connection (deduped by canonical connection string — running twice is a no-op)
  2. Prints the URL it’s running on (e.g. http://127.0.0.1:19378)
  3. Opens your default browser

Options

Flag Default Description
--port <n> 19378 Listen port. Falls back to a random port if the requested one is busy. 0 = random.
--host <h> 127.0.0.1 Bind host. Use 0.0.0.0 to expose on the LAN.
--home-dir <path> ~/.sqlui-portal Storage directory override. Highest priority.
--config-path <path> Alias for --home-dir.
--use-desktop-storage Share storage with the desktop app (~/.sqlui-native). Connections show up in the desktop app under a “Portal” session.
--no-open Don’t auto-open the browser.
-h, --help, -?, /? Show full usage with examples and exit.

Dialect support

Portal mode supports every dialect the desktop app does — SQLite, PostgreSQL, MySQL, MariaDB, Microsoft SQL Server, Cassandra, MongoDB, Redis, Azure CosmosDB, Azure Table Storage, Salesforce (SFDC), REST, and GraphQL. Pass connection strings in their native format (postgres://…, mongodb://…, aztable://DefaultEndpointsProtocol=…, etc.).

A bare path like ./mydata.sqlite is auto-resolved to sqlite:///<absolute-path>.

Storage

Portal mode keeps its data in ~/.sqlui-portal/ so it never touches the desktop app’s ~/.sqlui-native/ — true regardless of how it’s launched (npx, curl-tar, raw node sqlui-portal.js).

Override priority (highest first):

  1. --home-dir <path> (or --config-path <path>) CLI flag
  2. --use-desktop-storage (sugar for --home-dir ~/.sqlui-native)
  3. SQLUI_HOME_DIR environment variable
  4. ~/.sqlui-portal (default)
# Per-invocation, throwaway session
./portal/sqlui-portal --home-dir /tmp/work-session ./mydata.sqlite

# Share with the desktop app — connections appear in your .app under a "Portal" session
./portal/sqlui-portal --use-desktop-storage ./mydata.sqlite

# Or via env var (handy for shell aliases)
SQLUI_HOME_DIR=/tmp/work-session ./portal/sqlui-portal ./mydata.sqlite

# Or fully isolated, never persists
./portal/sqlui-portal --home-dir "$(mktemp -d)" ./mydata.sqlite

Run sqlui-portal --help for the full list of flags, examples, and dialect-specific connection-string formats.

When to use portal vs desktop

Supported Database Adapters

Refer to the query guides for dialect-specific syntax and examples.

Features

Overall Demo

demo-full

Import and Export

Import and Export can be used to share connections across different machines and users. Below is a sample import config.

[
  {
    "_type": "connection",
    "id": "connection.1643485516220.4798705129674932",
    "connection": "postgres://postgres:password@localhost:5432",
    "name": "sy postgres"
  },
  {
    "_type": "query",
    "id": "query.1643561715854.5278536054107370",
    "name": "Employee Query on Postgres",
    "sql": "SELECT\n  *\nFROM\n  employees\nLIMIT\n  10",
    "connectionId": "connection.1643485516220.4798705129674932",
    "databaseId": "music_store"
  }
]

You can also drag and drop the file directly into sqlui-native application. At the moment, we only support drag and drop for a single file.

demo-import-export

Session Management

The app supports multiple windows and instances. Each session persists its own connections and queries locally, so you can pick up where you left off.

demo-session

Dark Mode

Dark mode will be turned on automatically with respect to your OS Preference. You can update settings to prefer Dark Mode or Light Mode if desired.

demo-darkmode

Query Tabs

Query Tab Orientation

When there are more than 20 tabs, the query tabs wrap vertically.

image

Reordering Query Tabs

Drag and drop query tabs to reorder them.

tab-ordering

Resizing the Sidebar

Drag the divider between the sidebar and the query editor to resize the sidebar.

sidebar-resize

Command Palette

Open the command palette with Cmd+P (Mac) or Ctrl+P (Windows/Linux) to quickly access commands.

image

Connection Hints

Click Show Connection Hints on the New/Edit Connection page to see sample URI connection strings. Click any sample to use it as a starting point.

image

Settings

Access settings via the menu icon in the top right corner to configure editor preferences, color theme, and more.

image

image

SQLite-based Storage

Application data (connections, queries, sessions, settings, caches) is stored in a single SQLite database file (sqlui-native-storage.db) in the app data directory. This makes import/export simpler compared to the previous approach of many individual JSON files.

On first launch after upgrading, existing JSON storage files are automatically migrated into the SQLite database. The original JSON files are moved to a backup/ subdirectory (not deleted) so you can restore them if needed by moving them back to the parent directory.

Data Migration

Use Data Migration to move data between database engines. Access it from the top right hamburger menu. You can migrate from:

image

image

Migration of Real Existing Connection

Use this data migration option to move data from an existing connection

image

Migration of Raw JSON Data

Use this data migration option to move raw JSON data

image

Bookmarks

The system allows you to bookmark connections and queries. Bookmarked items can be applied to any workspace.

Adding a Bookmark

Right-click a connection name or query tab and choose Add to Bookmark. Enter a name and click Save.

image

image

Opening a Bookmark

Open the hamburger menu (top right) > Bookmarks, then click a bookmark name to apply it.

image

image

Recycle Bin

Deleted connections and closed queries are moved to the recycle bin. Access it via the hamburger menu (top right) > Recycle Bin.

image

image

Hard Delete

To bypass the recycle bin and permanently delete items immediately, set Delete Mode to hard delete in Settings.

image

Relationship Chart (FK Visualization)

Visualize foreign key relationships for relational databases (MySQL, MariaDB, MSSQL, PostgreSQL, SQLite). Right-click a table name and choose Show Relationships.

Code Snippets

Generate ready-to-use connection code snippets for your database in Java, JavaScript, and Python. Access code snippets from the query script dropdown for any connection.

Record Pages

New Record Page

  1. Click New Record below the query editor
  2. Select the Connection, Database, and Table
  3. Fill in the form fields
  4. Click Generate Script to generate the INSERT query

image

image

Record Details / Edit Record Page

Click any row in the query results to open the Record Detail page. Toggle edit mode to modify fields, then click Generate Script to generate the UPDATE query.

Contributing

Dev Notes

See CONTRIBUTING.md for how to run the app locally and contribute.

Adding a New Database Adapter

Want to add support for a new database engine? The project uses an adapter pattern where each database engine implements a standard interface (IDataAdapter). A starter template is provided at src/common/adapters/_SampleDataAdapter_/.

The high-level steps are:

  1. Add a new dialect to typings/index.ts
  2. Copy the sample adapter template and implement the adapter class (index.ts) and script generator (scripts.ts)
  3. Register your adapter in DataAdapterFactory.ts and DataScriptFactory.ts
  4. Add a dialect icon PNG in your adapter directory and import it in scripts.ts
  5. Add snapshot tests in DataScriptFactory.spec.ts

For the full step-by-step guide with code examples, see the Adding new adapters section in CONTRIBUTING.md.

Roadmap

Troubleshooting

Mac Apple Silicon (M-Series) - “App is damaged” Error

On macOS 26+ with Apple Silicon (M1/M2/M3/M4), you may see the following error when attempting to open the app:

“sqlui-native.app” is damaged and can’t be opened. You should move it to the Trash. image

This is caused by macOS quarantine attributes applied to unsigned apps. To fix this, open Terminal and run:

xattr -cr /Applications/sqlui-native.app

After running the command, you should be able to open sqlui-native normally.

Limitations

SQLite Limitations

SQLite does not support multiple statements in a single query. Use bulk insert syntax instead:

INSERT INTO
  art (Name)
VALUES
  ('Queen'),
  ('Kiss'),
  ('Spyro Gyra')

CockroachDB Limitations

CockroachDB connects via the PostgreSQL driver. Replace ?sslmode=require with ?sslmode=no-verify in the connection string:

postgres://demo:demo26472@127.0.0.1:26257/movr?sslmode=no-verify

Cassandra Limitations

Cassandra keyspaces map to sqlui-native databases, and column families map to tables.

CosmosDB with Cassandra API Connection String

Go to Connection String in the Azure CosmosDB Cassandra resource:

image

Sample Connection String
cassandra://USERNAME:PRIMARY PASSWORD@CONTACT POINT:PORT

MongoDB Limitations

MongoDB collections map to sqlui-native tables. The schema is inferred by scanning the first 5 documents.

Create a New MongoDB Database

db.createDatabase("new-database-name");

Redis Limitations

Not all keys are displayed due to potentially large key sets. For SSL connections, use the rediss:// scheme.

Azure Redis Cache Connection String

Go to Access Keys in the Azure Redis Cache resource: image

Format: rediss://<username>:<password>@<host>:<port>

The username field must be a non-empty string (any value works):

rediss://azure:Primary_Or_Secondary_Access_Key@syredis1.redis.cache.windows.net:6380

Azure CosmosDB Limitations

CosmosDB databases map to sqlui-native databases, and containers map to tables. The schema is inferred by scanning the first 5 items. Tested with CosmosDB Core SQL API.

CosmosDB Core SQL API Connection String

Open your CosmosDB resource > Keys, then copy the PRIMARY CONNECTION STRING or SECONDARY CONNECTION STRING:

image image

Sample Connection String
cosmosdb://<your_primary_or_secondary_connection_string>

Salesforce (SFDC) Limitations

Salesforce SObjects are mapped to sqlui-native Tables, and Salesforce Fields are mapped to sqlui-native Columns. Each connection represents a single Salesforce Org (mapped as a single database).

The adapter supports three query modes:

Setting up connection string

  1. Sign up for a free Developer Org at developer.salesforce.com/signup
  2. Get your Security Token: Avatar > Settings > My Personal Information > Reset My Security Token
  3. Use JSON format for the connection string:
sfdc://{"username":"you@yourcompany.dev","password":"your_password","securityToken":"your_token","loginUrl":"login.salesforce.com"}

OAuth2 Client Credentials Flow

For orgs using Connected Apps, you can authenticate without a username/password by providing clientId and clientSecret:

sfdc://{"clientId":"your_connected_app_client_id","clientSecret":"your_connected_app_client_secret","loginUrl":"your-org.my.salesforce.com"}

Sessions are automatically refreshed when they expire — no manual reconnection needed.

Sample queries

-- SOQL: Select accounts
SELECT Id, Name, Industry FROM Account LIMIT 10

-- SOSL: Search across objects
FIND {keyword} IN ALL FIELDS RETURNING Account(Id, Name), Contact(Id, Name) LIMIT 20
// JS API: Insert a record
conn.sobject("Account").create({ Name: "New Account", Industry: "Technology" });

// JS API: Update a record
conn.sobject("Account").update({ Id: "001xxx", Name: "Updated Name" });

// JS API: Delete a record
conn.sobject("Account").destroy("001xxx");

Azure Table Storage Limitations

Azure Table Storage tables map to sqlui-native tables. The schema is inferred by scanning the first 5 items.

Setting Up Connection String

image image

aztable://<your_connection_string>

REST API Features

REST API Limitations

Feedback

File a bug or suggestion