<?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>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;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>
