<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cristian Carlos dos Santos</title>
    <description>The latest articles on DEV Community by Cristian Carlos dos Santos (@cccadet).</description>
    <link>https://dev.to/cccadet</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2104266%2F38945b32-40c6-42ac-af1b-e395e7419be0.jpg</url>
      <title>DEV Community: Cristian Carlos dos Santos</title>
      <link>https://dev.to/cccadet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cccadet"/>
    <language>en</language>
    <item>
      <title>Letting AI agents query my databases without ever giving them the credentials</title>
      <dc:creator>Cristian Carlos dos Santos</dc:creator>
      <pubDate>Tue, 20 Oct 2026 00:13:54 +0000</pubDate>
      <link>https://dev.to/cccadet/letting-ai-agents-query-my-databases-without-ever-giving-them-the-credentials-12nf</link>
      <guid>https://dev.to/cccadet/letting-ai-agents-query-my-databases-without-ever-giving-them-the-credentials-12nf</guid>
      <description>&lt;p&gt;Every time I connect an AI agent to a database, the same question comes up: where does the connection string live? Usually the answer is "in the agent's config file", which means a password sitting in a JSON file next to a tool I don't fully control.&lt;/p&gt;

&lt;p&gt;I took a different route in &lt;a href="https://github.com/cccadet/omni-sql" rel="noopener noreferrer"&gt;omni-sql&lt;/a&gt;, an open-source desktop SQL IDE. The IDE already holds my connections (passwords live in the OS keyring). It also runs a local MCP server, so the agent talks to the IDE, not to the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The MCP server runs over STDIO on loopback. The agent never receives a host, user, password or connection string.&lt;/li&gt;
&lt;li&gt;Reads (&lt;code&gt;getSchemaSummary&lt;/code&gt;, &lt;code&gt;getTableIndexes&lt;/code&gt;, &lt;code&gt;explainSql&lt;/code&gt;, &lt;code&gt;getLatestSqlExecutionError&lt;/code&gt;) work on the connection of the active tab only. There is no tool to list or open other connections.&lt;/li&gt;
&lt;li&gt;Writes are never automatic. &lt;code&gt;proposeSqlEdit&lt;/code&gt; shows a before/after diff in the desktop. &lt;code&gt;executeSql&lt;/code&gt; shows the connection and the exact SQL, and runs only after I approve; the approval is bound to that request and expires after 120 s.&lt;/li&gt;
&lt;li&gt;Results are bounded (default 100 rows, max 1,000, 256 KiB per response).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this does and does not protect
&lt;/h2&gt;

&lt;p&gt;It removes the credential from the agent's configuration. It does not hide data: SQL, schema names and permitted results are visible to the connected MCP client, so use it only when that exposure is acceptable. Approved SQL can still change data, so I use a least-privilege database user for anything important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a desktop approval step
&lt;/h2&gt;

&lt;p&gt;An agent that can run arbitrary SQL on its own is a bigger risk than one that has to ask. The approval dialog keeps a human in the loop for the one action that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also new since my last post
&lt;/h2&gt;

&lt;p&gt;MongoDB (native queries plus read-only SQL via DuckDB), local analysis with DuckDB, CSV/S3 imports and macOS installers (v0.14.0).&lt;/p&gt;

&lt;p&gt;Repo and docs: &lt;a href="https://github.com/cccadet/omni-sql" rel="noopener noreferrer"&gt;github.com/cccadet/omni-sql&lt;/a&gt; (see &lt;code&gt;docs/MCP.md&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Question for readers: would you trust this model for a staging database, and what would you want the approval dialog to show?&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>sql</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>Querying CSV and Parquet exports inside a SQL IDE with DuckDB</title>
      <dc:creator>Cristian Carlos dos Santos</dc:creator>
      <pubDate>Tue, 06 Oct 2026 22:43:17 +0000</pubDate>
      <link>https://dev.to/cccadet/querying-csv-and-parquet-exports-inside-a-sql-ide-with-duckdb-4n7b</link>
      <guid>https://dev.to/cccadet/querying-csv-and-parquet-exports-inside-a-sql-ide-with-duckdb-4n7b</guid>
      <description>&lt;p&gt;Someone sends you a CSV export and asks you to investigate it. You need to check duplicates, group records, or compare it with another export. For a one-off analysis, loading it into a database or writing a separate script can take longer than the query itself.&lt;/p&gt;

&lt;p&gt;I'm building &lt;a href="https://github.com/cccadet/omni-sql" rel="noopener noreferrer"&gt;omni-sql&lt;/a&gt;, an open-source SQL IDE with embedded DuckDB. You can import CSV or Parquet and query it with SQL inside the IDE. A spreadsheet someone sends you fits this workflow when exported as CSV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Joining a file with a database query result
&lt;/h2&gt;

&lt;p&gt;Sometimes the file only contains part of what you need. You can also import a database query result into local DuckDB and join it with the file, without loading the file into the source database.&lt;/p&gt;

&lt;p&gt;The demo uses fictional sales rows from PostgreSQL and a CSV of regional targets. The sales query uses VALUES, so it doesn't create tables or change database data.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the sales query on PostgreSQL and send the full result to local analysis.&lt;/li&gt;
&lt;li&gt;Import targets.csv into the local DuckDB workspace.&lt;/li&gt;
&lt;li&gt;Run the join in the local SQL tab, using the table names shown in your workspace.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsc3rxoc6z1st5hjzl0v9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsc3rxoc6z1st5hjzl0v9.gif" alt="omni-sql demo: importing a PostgreSQL query result and joining it locally with a targets CSV" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This GIF is a sequence of app screenshots showing the workflow.&lt;/p&gt;

&lt;p&gt;The example names the imported query result local_analysis and the CSV table targets. The join is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;revenue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;revenue&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;revenue&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;target_pct&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;local_analysis&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result shows South reaching 84% of its target. &lt;a href="https://github.com/cccadet/omni-sql/tree/main/docs/demo" rel="noopener noreferrer"&gt;The SQL, CSV, instructions, and expected result are in the repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying it with your own export
&lt;/h2&gt;

&lt;p&gt;The app runs locally and doesn't require an account. It is MIT licensed, with installers for Windows x64, Debian/Ubuntu amd64, and macOS 15+ on Apple Silicon and Intel. Node.js and Java runtimes are bundled. The macOS builds use ad-hoc signing and are not notarized; the README explains the first launch.&lt;/p&gt;

&lt;p&gt;The project is still early. Full imports have resource limits, and an imported sample only supports conclusions about that sample. &lt;a href="https://github.com/cccadet/omni-sql/blob/main/docs/LOCAL-ANALYSIS.md" rel="noopener noreferrer"&gt;The local analysis guide&lt;/a&gt; covers those limits and numeric precision constraints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cccadet/omni-sql" rel="noopener noreferrer"&gt;Source code and downloads&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How do you investigate files people send you today? If you try omni-sql, I'd like to hear whether you could import and query a file, and what was missing. There's also a &lt;a href="https://github.com/cccadet/omni-sql/issues/new?template=first_run.yml" rel="noopener noreferrer"&gt;first-run feedback form&lt;/a&gt; for compatibility and installation reports.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>duckdb</category>
      <category>opensource</category>
      <category>database</category>
    </item>
    <item>
      <title>What I added to omni-sql after v0.2.5: local analytics, S3, and more</title>
      <dc:creator>Cristian Carlos dos Santos</dc:creator>
      <pubDate>Tue, 29 Sep 2026 18:45:32 +0000</pubDate>
      <link>https://dev.to/cccadet/what-i-added-to-omni-sql-after-v025-local-analytics-s3-and-more-2ef6</link>
      <guid>https://dev.to/cccadet/what-i-added-to-omni-sql-after-v025-local-analytics-s3-and-more-2ef6</guid>
      <description>&lt;p&gt;My &lt;a href="https://dev.to/cccadet/how-i-built-one-open-source-sql-workspace-for-five-database-engines-d38"&gt;first post about omni-sql&lt;/a&gt; covered the SQL editor, five database engines, and contextual autocomplete. Since v0.2.5, I've added workflows that let me do more with the data after running a query. The current published release is v0.5.1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analyze data locally with DuckDB
&lt;/h2&gt;

&lt;p&gt;I can send a query from the main editor to &lt;strong&gt;Analyze locally&lt;/strong&gt;, check the SQL before importing it, and load either the complete result or an explicit sample. I can also start with a CSV or Parquet file. Each source becomes a dataset in a local DuckDB workspace, where I can join data from different connections and files with SQL.&lt;/p&gt;

&lt;p&gt;The analysis editor completes dataset and column names and can suggest joins from imported foreign-key metadata. Datasets can be added, renamed, and removed without starting over. Local datasets are kept across app restarts, so an analysis can continue later.&lt;/p&gt;

&lt;p&gt;The result grid is only a preview of the analysis. I can page through the result and export the complete query result as CSV or Parquet. Exports also include a &lt;code&gt;.omni.json&lt;/code&gt; file with the datasets, source coverage, and ingestion times. That makes it easier to tell later whether an export came from full sources or samples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Query S3 data in the same workspace
&lt;/h2&gt;

&lt;p&gt;S3 connections now appear in the main IDE. I can browse buckets and supported CSV and Parquet objects, and query them with the SQL editor. Delta and Iceberg tables are supported when the required DuckDB extensions are available. S3 table names and columns also appear in editor completion.&lt;/p&gt;

&lt;p&gt;I can import a bounded result from another configured database into a local dataset and join it with S3 data. For S3 setups that use DuckLake, the object browser can discover catalogs backed by a saved PostgreSQL connection or a SQLite/DuckDB file.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few changes in the day-to-day SQL workflow
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In a &lt;code&gt;JOIN ... ON&lt;/code&gt; clause, autocomplete can suggest predicates based on foreign keys and the aliases in the query.&lt;/li&gt;
&lt;li&gt;From a foreign-key value in query results, I can navigate to its referenced row.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/catalog&lt;/code&gt; opens a searchable list of SQL commands and inserts a template into the editor.&lt;/li&gt;
&lt;li&gt;Generic ODBC connections are available alongside the existing adapters; they require a compatible driver installed on the machine.&lt;/li&gt;
&lt;li&gt;PostgreSQL and MySQL tables can show catalog-backed DDL. Other engines show a labeled partial definition built from cached metadata.&lt;/li&gt;
&lt;li&gt;On Windows, signed updates can be installed from inside the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;omni-sql remains an open-source desktop project. If you work across databases or query files in S3, I'd like to hear which of these workflows would save you time and where they still fall short.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cccadet/omni-sql" rel="noopener noreferrer"&gt;Source and documentation&lt;/a&gt; · &lt;a href="https://github.com/cccadet/omni-sql/releases/tag/v0.5.1" rel="noopener noreferrer"&gt;Download v0.5.1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>opensource</category>
      <category>database</category>
      <category>duckdb</category>
    </item>
    <item>
      <title>How I built one open-source SQL workspace for five database engines</title>
      <dc:creator>Cristian Carlos dos Santos</dc:creator>
      <pubDate>Thu, 10 Sep 2026 17:26:38 +0000</pubDate>
      <link>https://dev.to/cccadet/how-i-built-one-open-source-sql-workspace-for-five-database-engines-d38</link>
      <guid>https://dev.to/cccadet/how-i-built-one-open-source-sql-workspace-for-five-database-engines-d38</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update (Oct 2026):&lt;/strong&gt; this post describes v0.2.5. Since then omni-sql added MongoDB support (native queries and read-only SQL), local DuckDB analysis, S3/CSV imports, a local MCP bridge and macOS installers (now v0.14.0). MongoDB is no longer deferred.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Working with more than one database engine often means maintaining more than one workflow. The SQL is familiar, but the editor, schema browser, result grid, shortcuts, and packaging expectations keep changing. Even small differences accumulate when you move between PostgreSQL, MySQL, SQL Server, and Oracle throughout the week.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/cccadet/omni-sql" rel="noopener noreferrer"&gt;omni-sql&lt;/a&gt; to explore a narrower idea: one focused desktop SQL workspace that behaves consistently across the major relational databases, without trying to become a complete administration suite.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvzrfgcxwup9z7f185vyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvzrfgcxwup9z7f185vyu.png" alt="omni-sql showing contextual autocomplete, schema metadata, and query results" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What omni-sql does today
&lt;/h2&gt;

&lt;p&gt;omni-sql currently supports PostgreSQL, MySQL, MariaDB, SQL Server, and Oracle through native adapters. A generic JDBC adapter is also available experimentally, with a more limited feature set.&lt;/p&gt;

&lt;p&gt;The main workflow includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;browsing schemas, tables, columns, keys, indexes, views, and functions;&lt;/li&gt;
&lt;li&gt;writing SQL in a Monaco-based editor;&lt;/li&gt;
&lt;li&gt;completing metadata objects and columns projected by CTEs;&lt;/li&gt;
&lt;li&gt;running statements and inspecting messages or results;&lt;/li&gt;
&lt;li&gt;filtering, sorting, paging, and exporting result data;&lt;/li&gt;
&lt;li&gt;editing rows only when a primary-key check establishes a safe update path;&lt;/li&gt;
&lt;li&gt;inspecting supported execution plans.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app runs locally and does not require an account. Connections, cached metadata, queries, and results remain in the desktop workflow rather than being sent to a hosted service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contextual completion without an LLM
&lt;/h2&gt;

&lt;p&gt;The autocomplete system combines two kinds of context.&lt;/p&gt;

&lt;p&gt;The first comes from database metadata. Each adapter exposes a unified model for catalogs, schemas, tables, columns, and related objects. That metadata is cached in a local SQLite database and matched against the editor's current SQL context.&lt;/p&gt;

&lt;p&gt;The second comes from the query itself. CTE names and projected columns need statement scope, not just a global list of database objects. omni-sql delegates that resolution to a Kotlin sidecar built with Apache Calcite. If the sidecar is unavailable, times out, or cannot parse the current query, completion falls back to the metadata-based tier.&lt;/p&gt;

&lt;p&gt;There is intentionally no LLM in this path. Suggestions should be deterministic, fast, and explainable from the schema and SQL text already on the user's machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this architecture?
&lt;/h2&gt;

&lt;p&gt;The desktop shell uses Tauri, React, Fluent UI, and Monaco. Database execution and adapter logic live in a Node/TypeScript backend, while the Calcite-based scope resolver runs as a JVM sidecar.&lt;/p&gt;

&lt;p&gt;This is not the smallest possible stack, but each part has a clear role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tauri provides the native desktop shell and packaging;&lt;/li&gt;
&lt;li&gt;React and Fluent UI provide the application interface;&lt;/li&gt;
&lt;li&gt;Monaco provides a mature editing surface;&lt;/li&gt;
&lt;li&gt;TypeScript keeps the protocol, adapters, and UI contracts aligned;&lt;/li&gt;
&lt;li&gt;Calcite provides a real SQL parser and scope model for contextual completion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Release installers bundle the Node and Java runtimes, so users do not need to assemble this toolchain themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned from supporting multiple engines
&lt;/h2&gt;

&lt;p&gt;A shared interface does not mean pretending every database behaves identically. The useful abstraction is a common workflow with explicit dialect boundaries.&lt;/p&gt;

&lt;p&gt;The adapters share contracts for connection management, metadata, execution, and cancellation, but vendor-specific capabilities remain visible. PostgreSQL uses &lt;code&gt;EXPLAIN (FORMAT JSON)&lt;/code&gt;, while SQL Server obtains plans through &lt;code&gt;SET SHOWPLAN_XML&lt;/code&gt; in a separate transaction. Inline editing is available only when a primary key provides a safe update path. Generic JDBC stays experimental because a generic connection alone does not provide the same depth of metadata and execution support.&lt;/p&gt;

&lt;p&gt;That approach is less magical, but it makes unsupported behavior easier to explain and safer to extend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed through v0.2.5
&lt;/h2&gt;

&lt;p&gt;The v0.2 series has focused on making the desktop workflow more coherent and easier to diagnose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;table structure editing now follows a more unified flow;&lt;/li&gt;
&lt;li&gt;execution history is easier to scan and reuse;&lt;/li&gt;
&lt;li&gt;the active connection and database context are more visible;&lt;/li&gt;
&lt;li&gt;responsive behavior and dialog hierarchy are more polished;&lt;/li&gt;
&lt;li&gt;Java and release-verification failures are surfaced more clearly;&lt;/li&gt;
&lt;li&gt;SQL terminology is more consistent across the interface;&lt;/li&gt;
&lt;li&gt;table and index editing provide searchable choices and reviewable SQL;&lt;/li&gt;
&lt;li&gt;connection schema selection works better with large schema lists;&lt;/li&gt;
&lt;li&gt;SQL formatting preserves comments and string literals;&lt;/li&gt;
&lt;li&gt;CSV exports report the number of saved rows and provide direct file actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Version 0.2.4 also documented and refined the local MCP bridge. It lets compatible AI clients inspect safe editor and schema context or propose SQL edits, but it cannot read credentials, access arbitrary files, execute SQL, or bypass the desktop approval flow.&lt;/p&gt;

&lt;p&gt;Version 0.2.5 is the current release containing the improvements above. Its smaller changes—safer CSV file actions, comment-safe formatting, and more reliable connection reordering—reflect the kind of practical polish the project currently needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqfy3k0vi6qgyrywtpsrs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqfy3k0vi6qgyrywtpsrs.png" alt="omni-sql displaying PostgreSQL query results" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deliberate limitations
&lt;/h2&gt;

&lt;p&gt;omni-sql is early-stage software and remains intentionally focused. It does not yet aim to match the breadth of mature database administration tools.&lt;/p&gt;

&lt;p&gt;macOS and ARM installers are not currently published. Generic JDBC has limited metadata and execution support. MongoDB is deferred, and some deeper vendor-specific administration workflows remain outside the present scope.&lt;/p&gt;

&lt;p&gt;Those boundaries are useful: they keep the project centered on the editing, navigation, execution, and result-inspection loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it and help shape the scope
&lt;/h2&gt;

&lt;p&gt;Ready-to-run installers are available for Windows x64 and Debian/Ubuntu amd64. Because the project is still early, use a development database first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cccadet/omni-sql" rel="noopener noreferrer"&gt;Source code and documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cccadet/omni-sql/releases/tag/v0.2.5" rel="noopener noreferrer"&gt;Download v0.2.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cccadet/omni-sql/compare/v0.2.4...v0.2.5" rel="noopener noreferrer"&gt;v0.2.5 changelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cccadet/omni-sql/compare/v0.1.39...v0.2.5" rel="noopener noreferrer"&gt;Complete v0.2 series&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feedback about completion quality, cross-database behavior, packaging, and the chosen product boundaries would be especially helpful.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>sql</category>
      <category>database</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
