<?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: Shubhesh Shukla</title>
    <description>The latest articles on DEV Community by Shubhesh Shukla (@shubhesh07).</description>
    <link>https://dev.to/shubhesh07</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%2F3910806%2Fcf67c9a9-fb07-4542-af3a-21bb1875e150.png</url>
      <title>DEV Community: Shubhesh Shukla</title>
      <link>https://dev.to/shubhesh07</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shubhesh07"/>
    <language>en</language>
    <item>
      <title>DB Connect: a database IDE that lets your AI assistant actually query your database</title>
      <dc:creator>Shubhesh Shukla</dc:creator>
      <pubDate>Fri, 14 Aug 2026 18:59:43 +0000</pubDate>
      <link>https://dev.to/shubhesh07/-db-connect-a-database-ide-that-lets-your-ai-assistant-actually-query-your-database-4ea5</link>
      <guid>https://dev.to/shubhesh07/-db-connect-a-database-ide-that-lets-your-ai-assistant-actually-query-your-database-4ea5</guid>
      <description>&lt;p&gt;Most database GUIs were designed before "AI coding assistant" was a category. You'd find a bug, realize it might be a data problem, and then spend five minutes exporting a table or pasting query output into a chat window just so the assistant could see what you were looking at.&lt;/p&gt;

&lt;p&gt;DB Connect is a free, cross-platform desktop IDE for MySQL, Amazon Redshift, and DynamoDB — built to close that gap instead of ignoring it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Three separate frustrations, one tool:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Most GUI database clients are Electron apps — slow to start, heavy on memory, for something that's fundamentally a schema browser and a text box.&lt;/li&gt;
&lt;li&gt;Useful features (backup/restore, user management, performance monitoring) are often paywalled or missing entirely on the free tier.&lt;/li&gt;
&lt;li&gt;None of them know an AI coding assistant might want to look at the same database you're looking at.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What DB Connect does
&lt;/h2&gt;

&lt;p&gt;It's built with Go + Wails v2 + React instead of Electron, so it starts instantly and has a tiny footprint. Beyond the query editor, it has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stored routine/trigger/event visibility (list procedures/functions/triggers/events, view &lt;code&gt;SHOW CREATE ...&lt;/code&gt; definitions)&lt;/li&gt;
&lt;li&gt;Real backup/restore via &lt;code&gt;mysqldump&lt;/code&gt;/&lt;code&gt;mysql&lt;/code&gt;, not just an app-config export&lt;/li&gt;
&lt;li&gt;Full user and privilege management — create/alter/drop user, grant/revoke, built as validated SQL builders that run through the same execution path as everything else, so production/read-only safety checks always apply&lt;/li&gt;
&lt;li&gt;Connection-string paste-to-parse, table relations (foreign keys in both directions), saved result-grid filters, a CSV import field-mapper&lt;/li&gt;
&lt;li&gt;Native performance panes for all three engines: slow queries, live activity, lock analysis, index health — and for DynamoDB specifically, capacity/throttle/hot-partition signals with zero CloudWatch dependency&lt;/li&gt;
&lt;li&gt;Context-aware SQL autocomplete: &lt;code&gt;FROM&lt;/code&gt; suggests tables, &lt;code&gt;WHERE&lt;/code&gt; suggests columns scoped to what's actually in your query, and it distinguishes a bare column (suggest an operator) from an already-complete condition (suggest &lt;code&gt;AND&lt;/code&gt;/&lt;code&gt;OR&lt;/code&gt; and the next column)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where AI fits in
&lt;/h2&gt;

&lt;p&gt;This is the part I think is worth a deeper look: DB Connect runs a local MCP (Model Context Protocol) server. Any MCP-aware tool — Claude Code, Cursor, others — can call it directly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;list_connections&lt;/code&gt;, &lt;code&gt;list_databases&lt;/code&gt;, &lt;code&gt;list_tables&lt;/code&gt;, &lt;code&gt;describe_table&lt;/code&gt;, &lt;code&gt;run_query&lt;/code&gt; for MySQL and Redshift connections&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dynamo_list_tables&lt;/code&gt;, &lt;code&gt;dynamo_describe_table&lt;/code&gt;, &lt;code&gt;dynamo_scan&lt;/code&gt;, &lt;code&gt;dynamo_query&lt;/code&gt;, &lt;code&gt;dynamo_get_item&lt;/code&gt; for DynamoDB, since it isn't SQL and doesn't fit the same tool shape&lt;/li&gt;
&lt;li&gt;Write tools (&lt;code&gt;dynamo_put_item&lt;/code&gt; and friends, or non-&lt;code&gt;SELECT&lt;/code&gt; SQL) only activate if you explicitly enable "Allow writes" — off means genuinely read-only, not read-mostly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security posture is deliberately narrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Off by default — you opt in per install, it's not silently listening&lt;/li&gt;
&lt;li&gt;Binds to &lt;code&gt;127.0.0.1&lt;/code&gt; only, never any other interface&lt;/li&gt;
&lt;li&gt;Never dials a new database connection and never returns or logs credentials — it only reaches connections you've already opened and authenticated through the app itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice this means an AI assistant debugging your code can also just check the data. "Is this off-by-one actually a data problem?" stops being a question you answer by memory and becomes a query the assistant runs itself, in the same session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS, via Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; shubhesh07/db-connect/db-connect

&lt;span class="c"&gt;# macOS, no Homebrew&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://github.com/shubhesh07/db-connect/releases/latest/download/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows installers and portable builds are on the &lt;a href="https://github.com/shubhesh07/db-connect/releases/latest" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Free forever, no telemetry, no account required.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/shubhesh07/db-connect" rel="noopener noreferrer"&gt;https://github.com/shubhesh07/db-connect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Site: &lt;a href="https://shubhesh07.github.io/db-connect" rel="noopener noreferrer"&gt;https://shubhesh07.github.io/db-connect&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I'd genuinely like feedback on the MCP security model in particular — is off-by-default-and-localhost-only enough, or is there an appetite for an auth token even for a loopback-only server? Open an issue or find me in the repo discussions.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>software</category>
      <category>tools</category>
    </item>
    <item>
      <title>Why I Built a Database Client in Go Instead of Electron</title>
      <dc:creator>Shubhesh Shukla</dc:creator>
      <pubDate>Sun, 03 May 2026 18:55:33 +0000</pubDate>
      <link>https://dev.to/shubhesh07/why-i-built-a-database-client-in-go-instead-of-electron-cmd</link>
      <guid>https://dev.to/shubhesh07/why-i-built-a-database-client-in-go-instead-of-electron-cmd</guid>
      <description>&lt;p&gt;Most mornings at work I had three database tools open. DataGrip for MySQL, a Redshift-compatible client, and the AWS console for DynamoDB. That's three windows, three sets of saved credentials, three different query histories, and about 1.5GB of RAM just to look at tables.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://shubhesh07.github.io/db-connect/" rel="noopener noreferrer"&gt;DB Connect&lt;/a&gt; to replace all three. It's a free desktop database IDE for MySQL, Amazon Redshift, and DynamoDB. The installed binary is 18MB. It opens in under two seconds. And it does not bundle Chromium.&lt;/p&gt;

&lt;p&gt;This post covers the technical decisions behind it — what worked, what was painful, and what I would change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;If you work at a company that runs MySQL for transactional data, Redshift for analytics, and DynamoDB for high-throughput key-value access, you know the tool fragmentation problem. Every database client either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports relational databases well but ignores DynamoDB entirely&lt;/li&gt;
&lt;li&gt;Is built on Java and takes 15 seconds to show you a cursor&lt;/li&gt;
&lt;li&gt;Costs $25/month per seat for features you use 10% of&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted one tool that could connect to all three, store credentials securely, and not make my laptop fan spin up just by existing in the dock.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use what exists
&lt;/h2&gt;

&lt;p&gt;I tried everything. Here's an honest comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Install Size&lt;/th&gt;
&lt;th&gt;Startup&lt;/th&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;DynamoDB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DataGrip&lt;/td&gt;
&lt;td&gt;$25/mo&lt;/td&gt;
&lt;td&gt;~800MB&lt;/td&gt;
&lt;td&gt;10-30s&lt;/td&gt;
&lt;td&gt;Java/IntelliJ&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DBeaver&lt;/td&gt;
&lt;td&gt;Free (community)&lt;/td&gt;
&lt;td&gt;~400MB&lt;/td&gt;
&lt;td&gt;5-15s&lt;/td&gt;
&lt;td&gt;Java/Eclipse&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TablePlus&lt;/td&gt;
&lt;td&gt;$89 (license)&lt;/td&gt;
&lt;td&gt;~80MB&lt;/td&gt;
&lt;td&gt;&amp;lt;3s&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB Connect&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;18MB&lt;/td&gt;
&lt;td&gt;&amp;lt;2s&lt;/td&gt;
&lt;td&gt;Go + Wails&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;DataGrip is genuinely excellent if you live in relational-only land and your company pays for JetBrains. But no DynamoDB, and the cold start time on a Monday morning is painful.&lt;/p&gt;

&lt;p&gt;DBeaver is the community workhorse. It does a lot. It also runs on Eclipse, which means it does a lot slowly. No DynamoDB support in the free tier.&lt;/p&gt;

&lt;p&gt;TablePlus is the closest to what I wanted — it's native, fast, and supports DynamoDB. But the DynamoDB experience is basic, it's not free, and I wanted features like EXPLAIN visualization and parameterized saved queries that it doesn't offer.&lt;/p&gt;

&lt;p&gt;None of them solved my specific problem: a fast, lightweight, free tool that treats MySQL, Redshift, and DynamoDB as equal citizens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech stack decision
&lt;/h2&gt;

&lt;p&gt;The first question was Electron vs. something else. Electron is the safe choice — massive ecosystem, battle-tested, every tutorial on the internet. But Electron means bundling Chromium, which means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;400MB+ installed size minimum&lt;/li&gt;
&lt;li&gt;150-300MB RAM just for the shell before your app does anything&lt;/li&gt;
&lt;li&gt;A full browser process even though you're building a desktop app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I went with &lt;a href="https://wails.io" rel="noopener noreferrer"&gt;Wails&lt;/a&gt; instead. Wails uses the system's native WebView (WebKit on macOS, WebView2 on Windows) and a Go backend. The tradeoff is real: you lose some cross-browser consistency and the Chrome DevTools you're used to. But you gain a single compiled binary, native performance, and an 18MB install.&lt;/p&gt;

&lt;p&gt;Go was a natural fit for the backend. Database drivers are mature in the Go ecosystem (&lt;code&gt;database/sql&lt;/code&gt;, &lt;code&gt;go-sql-driver/mysql&lt;/code&gt;, &lt;code&gt;aws-sdk-go-v2&lt;/code&gt;). Goroutines make it trivial to run queries without blocking the UI — every query execution spawns a goroutine, and the frontend gets results via Wails' binding system. No thread pools to manage, no callback hell.&lt;/p&gt;

&lt;p&gt;The frontend is React 18 with TypeScript. Nothing exotic. The interesting piece is Monaco — the same editor engine that powers VS Code — which gives you autocomplete, syntax highlighting, multi-cursor editing, and bracket matching without building any of that from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture overview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------------+
|  React + TypeScript + Monaco      |  &amp;lt;- UI layer
|  (runs in system WebView)         |
+-----------------------------------+
|  Wails v2 bridge                  |  &amp;lt;- function bindings, events
+-----------------------------------+
|  Go backend                       |
|   +- Connection manager           |  &amp;lt;- pool management, SSH tunnels
|   +- Query executor               |  &amp;lt;- goroutine per query
|   +- Credential store             |  &amp;lt;- AES-256-GCM + OS keychain
|   +- DynamoDB client              |  &amp;lt;- scan/query/GetItem abstraction
+-----------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wails generates TypeScript bindings from Go structs and methods automatically. You export a Go method, and it becomes callable from JavaScript. No REST API, no WebSocket protocol, no serialization layer to maintain. The Go backend owns all database connections, all encryption, and all credential storage. The frontend never touches raw connection strings or passwords.&lt;/p&gt;

&lt;p&gt;One quirk worth mentioning: PostHog analytics are routed through the Go backend as a proxy. Wails' WebView doesn't let you make arbitrary cross-origin requests the way a normal browser tab would, so the Go layer handles the HTTP calls to PostHog's ingest endpoint. It's a small thing, but the kind of thing you don't discover until you're debugging why your analytics silently fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  The DynamoDB challenge
&lt;/h2&gt;

&lt;p&gt;Most database tools ignore DynamoDB because it doesn't speak SQL and its data model is genuinely different. You can't just bolt a SQL editor onto it.&lt;/p&gt;

&lt;p&gt;DynamoDB has partition keys, sort keys, global secondary indexes, and a type system that includes String (S), Number (N), Binary (B), List (L), Map (M), String Set (SS), Number Set (NS), and Binary Set (BS). Building a query means specifying key conditions, optional filter expressions, selecting an index, and understanding the difference between a Query (which requires a partition key) and a Scan (which reads the entire table and should terrify you in production).&lt;/p&gt;

&lt;p&gt;DB Connect has a visual query builder that handles all of this. You pick your table, choose Query or Scan or GetItem, select a GSI if needed, build filter expressions with a form-based UI, and see results with proper type annotations.&lt;/p&gt;

&lt;p&gt;The type system was the hardest part. A single DynamoDB item can have nested Maps containing Lists containing Maps containing Number Sets. The frontend needs to render this recursively, and the Go backend needs to marshal and unmarshal it correctly through the AWS SDK. I spent more time on DynamoDB type handling than on the entire MySQL integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security decisions
&lt;/h2&gt;

&lt;p&gt;Credentials are encrypted with AES-256-GCM before being stored. The encryption key lives in the OS keychain — macOS Keychain on Mac, Windows Credential Manager on Windows. Your database passwords never exist as plaintext on disk.&lt;/p&gt;

&lt;p&gt;This matters more than people think. I've seen popular database tools that store passwords in plaintext JSON files or use reversible encoding that any script can decode. If someone gets read access to your home directory — through a compromised dependency, a shared machine, or a backup that wasn't encrypted — they get every database credential you have saved.&lt;/p&gt;

&lt;p&gt;SSH tunnel support is built in for MySQL connections. You configure the tunnel parameters alongside your connection details, and the Go backend establishes the tunnel before connecting to MySQL through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance tricks
&lt;/h2&gt;

&lt;p&gt;Three things keep DB Connect fast with large data:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Virtual scrolling.&lt;/strong&gt; Result sets render using virtualized rows. Only the visible rows plus a small buffer exist in the DOM at any time. You can scroll through hundreds of thousands of rows without the browser choking on DOM nodes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goroutine-per-query.&lt;/strong&gt; Every query execution runs in its own goroutine. The Wails event system pushes results back to the frontend when they're ready. Long-running Redshift analytics queries don't freeze the UI — you can switch tabs and run a quick MySQL lookup while waiting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Binary size optimization.&lt;/strong&gt; Go 1.25 with Wails produces a single binary. No JVM, no Node runtime, no native module compilation. The universal macOS build (Intel + Apple Silicon in one binary) is still under 20MB.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently
&lt;/h2&gt;

&lt;p&gt;Wails' WebView inconsistencies are real. WebKit on macOS and WebView2 on Windows don't behave identically. CSS that works perfectly on one platform occasionally needs tweaks for the other. I'd still choose Wails for the size and performance benefits, but budget time for platform-specific testing.&lt;/p&gt;

&lt;p&gt;I underestimated the DynamoDB type system. I thought it would be a weekend project to add DynamoDB support. It took weeks. If I were starting over, I'd prototype the DynamoDB UI first since it was the riskiest piece.&lt;/p&gt;

&lt;p&gt;Monaco is powerful but heavy for a WebView. Monaco is around 2-3MB of JavaScript. In a WebView-based app where you're optimizing for fast startup, it's noticeable. It's still worth it — rebuilding a code editor from scratch would be absurd — but I explored lighter alternatives before accepting the tradeoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL support — the most requested feature&lt;/li&gt;
&lt;li&gt;MongoDB support — another NoSQL engine that most SQL-focused tools handle poorly&lt;/li&gt;
&lt;li&gt;Linux builds — Wails supports Linux, I just need to set up the CI pipeline&lt;/li&gt;
&lt;li&gt;ER diagram visualization — auto-generated from foreign key relationships&lt;/li&gt;
&lt;li&gt;Query plan diff — compare EXPLAIN output before and after index changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;DB Connect is free. I built it for my own workflow and am releasing it because the database tool space shouldn't require a subscription or a gigabyte of disk space for basic functionality.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download: &lt;a href="https://shubhesh07.github.io/db-connect/" rel="noopener noreferrer"&gt;https://shubhesh07.github.io/db-connect/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/shubhesh07/db-connect" rel="noopener noreferrer"&gt;https://github.com/shubhesh07/db-connect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Runs on: macOS (Intel + Apple Silicon) and Windows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you work with MySQL, Redshift, or DynamoDB and are tired of juggling multiple tools, give it a shot. Issues and feature requests are welcome.&lt;/p&gt;

</description>
      <category>database</category>
      <category>go</category>
      <category>performance</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
