Elyra
Elyra The coding agent eTerm The terminal that knows where each command ends Starf An activity monitor for Apple silicon that never invents a number etrans An SSH and SFTP client for macOS Elyra VM Virtual machines for macOS, Linux and Windows on your Mac Litr A small, native web browser for macOS Notr A notebook for macOS e The native code editor Elyra Grove Native local development environment Askr The real server for Laravel & PHP Elyra Framework Rust + Svelte 5 framework for desktop apps Elyra Conductor Local project conductor Refr Local-first PDF workspace for macOS Elyra Workspace A desktop workspace for coding agents Elyra SQL Server MySQL-compatible SQL server in Rust Elyra Félagi Agents as teammates on one board Elyra SQL Client Native desktop SQL workbench Elyra SQL Anywhere Replication-ready SQL engine Elyra Sjá SEO & GEO workspace for macOS Elyra DataGrid Server-driven data grid for Laravel
Release notes
Changelog
Elyra

Security

ElyraSQL Client is designed so that your data and credentials stay under your control.

Credentials

  • Connection passwords are stored in the OS keychain — macOS Keychain, Windows Credential Manager, or the Linux Secret Service — and are never written to disk in cleartext.
  • Removing a connection also deletes its keychain entry.

Where queries run

  • Queries execute in the Rust core; the UI (webview) only receives results.
  • The core reads credentials from the keychain and opens connections on demand.

How writes are authorized

Every mutating operation goes through a single choke point in the connection broker. A write cannot execute without a write authorization, and obtaining one is the only place the policy is checked:

  • read-only connections are refused outright;
  • production connections require an explicit confirmation, which the app asks for and then retries with.

Because the authorization is required by the type system, a newly added feature cannot accidentally bypass the rails — it won't compile without one. Server commands that don't touch user data (BACKUP TO, KILL) are the only documented exceptions.

Correct SQL quoting

All SQL is generated through one central, engine-aware quoting layer, so identifiers and values are escaped per dialect (MySQL/ElyraSQL processes backslash escapes in strings; SQLite does not). Values are always quoted — never inlined as bare numbers — so text like 007 cannot be altered in transit. This layer is unit-tested, including LIKE metacharacter escaping.

Safety rails

  • Destructive actions preview their SQL (inline edits, table designer, truncate/drop) and require confirmation before running.
  • Read-only connections refuse writes and DDL.
  • Production connections require an explicit confirmation for writes and draw a red window frame.
  • The client only ever narrows access — the server's own privileges always apply.

Transport

  • TLS is used opportunistically and can be required per connection. Require TLS is enabled automatically for any non-local host, so a connection that leaves your machine is encrypted by default (you can still override it).
  • The app reports the actual transport state, asked of the server rather than inferred from your settings: an encrypted session shows a 🔒, and a remote connection carrying data in clear text is flagged ⚠ unencrypted in the toolbar and in the Test connection result.
  • SQLite connections are local files with no network transport, so they are never flagged.

The AI assistant

Off unless you turn it on, and it needs your own API key — from Anthropic, OpenAI or Google Gemini — stored in the OS keychain like every other credential here. Each provider has its own keychain entry, so one service's key is never sent to another.

When you ask it something, what leaves your machine is the engine and dialect, the database name, the table you are looking at, and — unless you switch it off in Settings → AI Assistant — the table and column names of the open database. No row data is sent: not the grid, not a sample, not a query result. It goes to the provider you selected and only to that one, and the panel shows the scope in force above the transcript.

Nothing it writes is executed on its own. Running a statement it proposed goes through the same confirmation as one you typed, production guard included. See AI Assistant.

Error help

Off unless you add a TypeSafe key, which is stored in the OS keychain like every other credential here.

When a query fails, the error message and the engine's name are sent to TypeSafe to be classified into a cause. Your statement is not sent, nor your schema, nor any row — the server's message already names whatever was missing.

Nothing about this decides anything. The write rails, the production confirmation and the read-only refusal are all enforced in code and stay that way: they have to work when the service does not. A classification only ever adds a suggestion to a failure that has already happened, and the server's own message is always shown alongside it. See SQL Editor.

Licensing privacy

License validation sends only your key, the app name/version and an opaque per-install id to elyracode.com. No database contents are transmitted. See Editions & Licensing.

Reporting a vulnerability

Please report privately — see the repository's SECURITY.md. Do not open a public issue for security reports.