<?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: SN</title>
    <description>The latest articles on DEV Community by SN (@snss5312).</description>
    <link>https://dev.to/snss5312</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%2F3964966%2Fdd3492c6-e0a3-4e7b-a17c-789d84aba448.png</url>
      <title>DEV Community: SN</title>
      <link>https://dev.to/snss5312</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/snss5312"/>
    <language>en</language>
    <item>
      <title>TextRecast v0.2.0: User-Controlled Local AI Model Selection</title>
      <dc:creator>SN</dc:creator>
      <pubDate>Sat, 01 Aug 2026 18:11:06 +0000</pubDate>
      <link>https://dev.to/snss5312/textrecast-v020-user-controlled-local-ai-model-selection-5db5</link>
      <guid>https://dev.to/snss5312/textrecast-v020-user-controlled-local-ai-model-selection-5db5</guid>
      <description>&lt;p&gt;I’ve released &lt;strong&gt;TextRecast v0.2.0&lt;/strong&gt;, a major update to my local-first Windows writing assistant.&lt;/p&gt;

&lt;p&gt;TextRecast lets you select text in another Windows application and improve it, shorten it, expand it, summarize it, or change its tone using a small language model running locally on your computer.&lt;/p&gt;

&lt;p&gt;There is no account, API key, Ollama installation, Python environment, or cloud text-processing service involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in v0.2.0?
&lt;/h2&gt;

&lt;p&gt;The main addition is explicit, user-controlled model selection.&lt;/p&gt;

&lt;p&gt;Before TextRecast makes any model-download request, it now displays the available models along with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Their intended role&lt;/li&gt;
&lt;li&gt;Download size&lt;/li&gt;
&lt;li&gt;Hardware compatibility&lt;/li&gt;
&lt;li&gt;English-language status&lt;/li&gt;
&lt;li&gt;Known limitations&lt;/li&gt;
&lt;li&gt;Whether the model is experimental&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TextRecast downloads only the exact model the user confirms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Available models
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Download&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fast/default&lt;/td&gt;
&lt;td&gt;Qwen 2.5 1.5B Q4_K_M&lt;/td&gt;
&lt;td&gt;1.04 GiB&lt;/td&gt;
&lt;td&gt;Established default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balanced&lt;/td&gt;
&lt;td&gt;Qwen 3.5 2B Q5_K_M&lt;/td&gt;
&lt;td&gt;1.34 GiB&lt;/td&gt;
&lt;td&gt;Experimental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best quality&lt;/td&gt;
&lt;td&gt;Qwen 3.5 4B Q5_K_M&lt;/td&gt;
&lt;td&gt;2.93 GiB&lt;/td&gt;
&lt;td&gt;Experimental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alternative&lt;/td&gt;
&lt;td&gt;Granite 4.1 3B Q5_K_M&lt;/td&gt;
&lt;td&gt;2.27 GiB&lt;/td&gt;
&lt;td&gt;Experimental&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The smaller Qwen 2.5 model remains the fast default. The additional models are clearly marked as experimental because local language models can still alter facts, roles, conditions, or deadline wording.&lt;/p&gt;

&lt;p&gt;All current profiles are intended for English rewriting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model-specific behavior
&lt;/h2&gt;

&lt;p&gt;Different model families do not always respond well to the same prompt or sampling configuration.&lt;/p&gt;

&lt;p&gt;For this release, I added separate adapters for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qwen 2.5&lt;/li&gt;
&lt;li&gt;Qwen 3.5&lt;/li&gt;
&lt;li&gt;Granite 4.1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each adapter can define its own prompt format, chat template, stop sequences, and sampling profile while sharing the same installation and inference infrastructure.&lt;/p&gt;

&lt;p&gt;This keeps the application architecture extensible without requiring a separate model server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safer model downloads
&lt;/h2&gt;

&lt;p&gt;The download process remains user-controlled and verifiable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TextRecast shows the available choices.&lt;/li&gt;
&lt;li&gt;The user selects a model.&lt;/li&gt;
&lt;li&gt;The exact model and size are shown for confirmation.&lt;/li&gt;
&lt;li&gt;Only the confirmed model is downloaded.&lt;/li&gt;
&lt;li&gt;The final file must match its expected size and SHA-256 checksum.&lt;/li&gt;
&lt;li&gt;Interrupted downloads can resume instead of restarting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A valid installed model is reused on later launches.&lt;/p&gt;

&lt;p&gt;Public release archives remain model-free, so users do not download several gigabytes of models they may never use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware-aware selection
&lt;/h2&gt;

&lt;p&gt;TextRecast inspects available memory, CPU capabilities, and storage before recommending a model.&lt;/p&gt;

&lt;p&gt;The recommendation is guidance rather than a hidden automatic decision. The user still sees the available choices and controls which compatible model is installed.&lt;/p&gt;

&lt;p&gt;Only one model is loaded at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local Windows integration
&lt;/h2&gt;

&lt;p&gt;TextRecast uses Windows UI Automation, clipboard fallback, and input APIs to work with selected text in other applications.&lt;/p&gt;

&lt;p&gt;Before replacement, it verifies the source window, process, capture age, and selected content. The selected and generated text are not intentionally written to application logs or history.&lt;/p&gt;

&lt;p&gt;Model inference runs locally on the CPU through LLamaSharp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing and packaging
&lt;/h2&gt;

&lt;p&gt;For v0.2.0, I expanded the English qualification corpus and added model-specific benchmark tooling covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Output quality&lt;/li&gt;
&lt;li&gt;Semantic preservation&lt;/li&gt;
&lt;li&gt;Operation intent&lt;/li&gt;
&lt;li&gt;Latency&lt;/li&gt;
&lt;li&gt;Time to first token&lt;/li&gt;
&lt;li&gt;Generation throughput&lt;/li&gt;
&lt;li&gt;Peak memory usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository currently passes all &lt;strong&gt;126 automated tests&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Windows x64 build is self-contained, so users do not need to install .NET 10 separately. The release also includes the applicable project, dependency, icon, .NET runtime, and WPF legal notices.&lt;/p&gt;

&lt;p&gt;The Microsoft Visual C++ x64 Redistributable may still be required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try TextRecast
&lt;/h2&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/snss10/TextRecast" rel="noopener noreferrer"&gt;https://github.com/snss10/TextRecast&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;v0.2.0 release:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/snss10/TextRecast/releases/tag/v0.2.0" rel="noopener noreferrer"&gt;https://github.com/snss10/TextRecast/releases/tag/v0.2.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download the complete &lt;code&gt;TextRecast-v0.2.0-win-x64.zip&lt;/code&gt;, extract it, and run &lt;code&gt;TextRecast.exe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The application will ask you to choose and confirm one compatible model during setup.&lt;/p&gt;

&lt;p&gt;TextRecast is open source under the Apache License 2.0.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>ai</category>
      <category>opensource</category>
      <category>windows</category>
    </item>
    <item>
      <title>Building a Hardware-Aware Multi-Model Foundation for TextRecast</title>
      <dc:creator>SN</dc:creator>
      <pubDate>Thu, 30 Jul 2026 06:12:10 +0000</pubDate>
      <link>https://dev.to/snss5312/building-private-hardware-aware-local-ai-for-windows-1hjk</link>
      <guid>https://dev.to/snss5312/building-private-hardware-aware-local-ai-for-windows-1hjk</guid>
      <description>&lt;p&gt;TextRecast is an open-source Windows writing assistant that rewrites selected text using a language model running entirely on the user’s computer.&lt;/p&gt;

&lt;p&gt;There is no cloud API, separate Ollama installation, or external model service. Users select text in another application, choose a formatting operation, and TextRecast replaces the original selection with the generated result.&lt;/p&gt;

&lt;p&gt;I recently completed the model foundation planned for TextRecast v0.2.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why TextRecast needs multiple models
&lt;/h2&gt;

&lt;p&gt;TextRecast currently uses Qwen 2.5 1.5B Instruct. It is small enough to run on many Windows computers while still producing useful results.&lt;/p&gt;

&lt;p&gt;However, one model cannot provide the best experience for every computer.&lt;/p&gt;

&lt;p&gt;A lightweight laptop may need a smaller and faster model, while a system with more memory can safely run a larger model with better output quality.&lt;/p&gt;

&lt;p&gt;The goal for v0.2.0 is therefore to support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple local model families&lt;/li&gt;
&lt;li&gt;Automatic selection based on hardware&lt;/li&gt;
&lt;li&gt;Manual model selection&lt;/li&gt;
&lt;li&gt;Resumable and verified model downloads&lt;/li&gt;
&lt;li&gt;Model-specific prompts and generation settings&lt;/li&gt;
&lt;li&gt;A repeatable qualification process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No additional model has been exposed to users yet. Models must first pass the TextRecast qualification process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vendor-neutral model adapters
&lt;/h2&gt;

&lt;p&gt;The original implementation contained behavior designed specifically for Qwen and its ChatML format.&lt;/p&gt;

&lt;p&gt;That behavior is now behind a model adapter contract. Each model family can define its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt format&lt;/li&gt;
&lt;li&gt;Sampling configuration&lt;/li&gt;
&lt;li&gt;Stop sequences&lt;/li&gt;
&lt;li&gt;Output cleanup&lt;/li&gt;
&lt;li&gt;Expected output length&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The existing Qwen behavior remains unchanged, but future models no longer need to copy or modify the main inference workflow.&lt;/p&gt;

&lt;p&gt;This also makes it possible to support model families such as Phi, Granite, Ministral, or other suitable small language models without coupling the application to one vendor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local model qualification
&lt;/h2&gt;

&lt;p&gt;I added a development-only benchmark runner that tests an existing local GGUF model. It never downloads a model and is excluded from the published application.&lt;/p&gt;

&lt;p&gt;The corpus currently covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improve writing&lt;/li&gt;
&lt;li&gt;Shorten&lt;/li&gt;
&lt;li&gt;Lengthen&lt;/li&gt;
&lt;li&gt;Summarize&lt;/li&gt;
&lt;li&gt;Every supported tone&lt;/li&gt;
&lt;li&gt;Short, medium, and long text&lt;/li&gt;
&lt;li&gt;Punctuation-heavy text&lt;/li&gt;
&lt;li&gt;Adversarial instructions&lt;/li&gt;
&lt;li&gt;English, Hindi, Spanish, French, German, and Japanese&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The evaluator checks output presence, required information, length, repetition, protocol leakage, and language preservation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the first benchmark found
&lt;/h2&gt;

&lt;p&gt;I ran the qualification suite against the current Qwen 2.5 1.5B model.&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;18 cases completed&lt;/li&gt;
&lt;li&gt;9.0/10 overall score&lt;/li&gt;
&lt;li&gt;No inference failures&lt;/li&gt;
&lt;li&gt;No protocol leakage&lt;/li&gt;
&lt;li&gt;No repetition failures&lt;/li&gt;
&lt;li&gt;Strong English performance&lt;/li&gt;
&lt;li&gt;Good Japanese result&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The benchmark also exposed an important limitation: Hindi, Spanish, French, and German inputs were translated into English instead of preserving their original languages.&lt;/p&gt;

&lt;p&gt;This is exactly why a project-specific qualification suite is valuable. A good general-purpose model is not automatically the best model for a specific application.&lt;/p&gt;

&lt;p&gt;The score is a TextRecast-specific measurement, not a universal model benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware-aware recommendations
&lt;/h2&gt;

&lt;p&gt;TextRecast can now inspect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total and currently available memory&lt;/li&gt;
&lt;li&gt;Logical processor count&lt;/li&gt;
&lt;li&gt;Process architecture&lt;/li&gt;
&lt;li&gt;AVX2 availability&lt;/li&gt;
&lt;li&gt;Free model-storage space&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The recommendation engine only accepts models with measured requirements. It rejects models that fail memory, storage, architecture, responsiveness, or minimum-quality requirements.&lt;/p&gt;

&lt;p&gt;Memory recommendations include a 30% reserve over the measured peak requirement plus an additional 512 MiB safety allowance.&lt;/p&gt;

&lt;p&gt;Among the safe profiles, TextRecast selects the highest-quality option.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safe model settings
&lt;/h2&gt;

&lt;p&gt;Automatic or Manual selection and the active model identifier can now be stored under the user’s local application-data directory.&lt;/p&gt;

&lt;p&gt;Settings writes are atomic, and the application safely recovers from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing settings&lt;/li&gt;
&lt;li&gt;Corrupt JSON&lt;/li&gt;
&lt;li&gt;Outdated schemas&lt;/li&gt;
&lt;li&gt;Unknown model identifiers&lt;/li&gt;
&lt;li&gt;Interrupted replacement attempts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selected or generated user text is never stored in the settings file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation
&lt;/h2&gt;

&lt;p&gt;The completed foundation currently passes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;52 automated tests&lt;/li&gt;
&lt;li&gt;Release formatting checks&lt;/li&gt;
&lt;li&gt;A zero-warning Release build&lt;/li&gt;
&lt;li&gt;Self-contained Windows publishing&lt;/li&gt;
&lt;li&gt;Package validation with no bundled GGUF files&lt;/li&gt;
&lt;li&gt;A real-model benchmark run&lt;/li&gt;
&lt;li&gt;A foreground selection-to-replacement test&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the foreground test, TextRecast captured:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;teh report dont include the final deadline&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It generated and replaced the selection with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The report does not include the final deadline.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The workflow completed in 4.79 seconds, and the previous clipboard contents were restored successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;The next phase is to benchmark candidate models and select the best options for Fast, Balanced, and Best Quality profiles.&lt;/p&gt;

&lt;p&gt;A candidate must reach at least 8.0/10 in the TextRecast qualification suite and satisfy language, memory, and responsiveness requirements before it can be shipped.&lt;/p&gt;

&lt;p&gt;After qualification, I will add model installation, switching, deletion, automatic recommendations, and model-management UI.&lt;/p&gt;

&lt;p&gt;TextRecast is open source, and you can follow its development here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/snss10/TextRecast" rel="noopener noreferrer"&gt;https://github.com/snss10/TextRecast&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>ai</category>
      <category>opensource</category>
      <category>windows</category>
    </item>
    <item>
      <title>I Built TextRecast: A Local Windows Writing Assistant with .NET and an SLM</title>
      <dc:creator>SN</dc:creator>
      <pubDate>Tue, 28 Jul 2026 18:52:12 +0000</pubDate>
      <link>https://dev.to/snss5312/i-built-textrecast-a-local-windows-writing-assistant-with-net-and-an-slm-51gi</link>
      <guid>https://dev.to/snss5312/i-built-textrecast-a-local-windows-writing-assistant-with-net-and-an-slm-51gi</guid>
      <description>&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%2F6y7a0wwxjjd1ti1ry10l.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%2F6y7a0wwxjjd1ti1ry10l.png" alt="The TextRecast application icon" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Writing tools are useful, but I did not want to copy text into a separate website every time I needed to improve a sentence. I also wanted an option that did not send the selected text to a cloud inference API.&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;TextRecast&lt;/strong&gt;, an open-source Windows utility that rewrites selected text inside the application where I am already working.&lt;/p&gt;

&lt;p&gt;Select some text, click the floating TextRecast button, choose an operation, and apply the result back to the original selection. The language model runs locally on the CPU.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/snss10/TextRecast" rel="noopener noreferrer"&gt;github.com/snss10/TextRecast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Releases: &lt;a href="https://github.com/snss10/TextRecast/releases" rel="noopener noreferrer"&gt;github.com/snss10/TextRecast/releases&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;License: &lt;a href="https://github.com/snss10/TextRecast/blob/main/LICENSE" rel="noopener noreferrer"&gt;Apache License 2.0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What TextRecast can do
&lt;/h2&gt;

&lt;p&gt;TextRecast currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving grammar, spelling, punctuation, wording, and clarity&lt;/li&gt;
&lt;li&gt;Making selected text shorter or longer&lt;/li&gt;
&lt;li&gt;Summarizing longer selections&lt;/li&gt;
&lt;li&gt;Changing the tone to Professional, Casual, Friendly, Formal, or Direct&lt;/li&gt;
&lt;li&gt;Replacing the original selection without requiring a manual copy-and-paste cycle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no account, API key, or text-processing cloud service involved. Normal formatting runs locally after the model has been installed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why local inference?
&lt;/h2&gt;

&lt;p&gt;The main goal was not to build another chat interface. It was to create a focused editing tool that stays close to the text being edited.&lt;/p&gt;

&lt;p&gt;Local inference provides a few useful properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selected text is not submitted to a model API.&lt;/li&gt;
&lt;li&gt;The tool continues working without an internet connection after model installation.&lt;/li&gt;
&lt;li&gt;There is no per-request API cost.&lt;/li&gt;
&lt;li&gt;The model lifecycle is controlled by the application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TextRecast itself does not maintain a formatting history or write selected and generated text to log files.&lt;/p&gt;

&lt;p&gt;There is still an important Windows-specific caveat: the fallback capture and replacement paths temporarily use the clipboard. Windows clipboard history, clipboard synchronization, or third-party clipboard managers may retain that content. Users working with sensitive text should disable those features.&lt;/p&gt;

&lt;h2&gt;
  
  
  The technology stack
&lt;/h2&gt;

&lt;p&gt;TextRecast is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WPF and .NET 10&lt;/strong&gt; for the Windows desktop application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLamaSharp&lt;/strong&gt; for local GGUF inference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen2.5-1.5B-Instruct-GGUF&lt;/strong&gt; as the initial small language model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows UI Automation&lt;/strong&gt; for reading selected text when supported&lt;/li&gt;
&lt;li&gt;Native Windows clipboard, window-focus, and input APIs for fallback capture and replacement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MSTest&lt;/strong&gt; for workflow, prompt, chunking, and clipboard integration tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The default model uses the &lt;code&gt;Q4_K_M&lt;/code&gt; quantization. It is small enough to be practical on ordinary x64 Windows computers while still being useful for focused rewriting tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the architecture replaceable
&lt;/h2&gt;

&lt;p&gt;Although TextRecast currently ships with a Qwen model profile, the infrastructure is named around the more general concept of an SLM rather than one model family.&lt;/p&gt;

&lt;p&gt;The solution is split into three main projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TextRecast.App ----------&amp;gt; TextRecast.Core
       |
       +-----------------&amp;gt; TextRecast.Infrastructure
                                   |
                                   +------&amp;gt; TextRecast.Core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;TextRecast.App&lt;/code&gt; contains WPF presentation and application composition. &lt;code&gt;TextRecast.Core&lt;/code&gt; contains formatting requests, workflows, contracts, results, and platform-independent models. &lt;code&gt;TextRecast.Infrastructure&lt;/code&gt; contains LLamaSharp inference, model installation, and Windows integrations.&lt;/p&gt;

&lt;p&gt;This separation means a future model can reuse installation, checksum verification, storage, chunking, inference lifecycle, and application workflow components. A model with a different chat format only needs an appropriate model profile and prompt builder.&lt;/p&gt;

&lt;h2&gt;
  
  
  First launch without bundling a 1.1 GB model
&lt;/h2&gt;

&lt;p&gt;I did not want every source clone or application download to include a large model binary.&lt;/p&gt;

&lt;p&gt;When TextRecast starts, it looks for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A valid model packaged beside the application&lt;/li&gt;
&lt;li&gt;A valid model previously installed for the current Windows user&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If neither exists, a setup window downloads the model. The download can be cancelled or retried, and the UI reports both transfer and verification progress.&lt;/p&gt;

&lt;p&gt;The installer does not trust a completed HTTP request by itself. It downloads to a uniquely named partial file, checks the expected file size and SHA-256 digest, and only then moves the file into its final location:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%LOCALAPPDATA%\TextRecast\Models
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A failed or cancelled partial download is never treated as an installed model.&lt;/p&gt;

&lt;p&gt;After installation, the first formatting request loads the model into memory. Later requests reuse the same model instance, so they usually begin faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replacing text safely is harder than pasting
&lt;/h2&gt;

&lt;p&gt;Generating text is only half of this application. Replacing the correct selection without damaging unrelated text or clipboard contents requires more care.&lt;/p&gt;

&lt;p&gt;The replacement flow is approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Capture selected text
        |
        v
Generate locally with the SLM
        |
        v
Revalidate window, process, age, and selected text
        |
        v
Snapshot clipboard formats
        |
        v
Paste the replacement
        |
        v
Restore and verify the clipboard snapshot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before replacement, TextRecast verifies that the original window still exists, belongs to the same process, and contains the expected selection. Captured selections expire after a limited period instead of remaining valid indefinitely.&lt;/p&gt;

&lt;p&gt;The clipboard snapshot owns deep copies of its captured formats rather than retaining a live Windows data object. After replacement, TextRecast rebuilds the clipboard and reads every captured format back to verify restoration. If replacement succeeds but restoration cannot be verified, the result window remains open and displays a warning instead of immediately disappearing.&lt;/p&gt;

&lt;p&gt;The integration test for this path runs on a Windows STA thread. It captures Unicode text and a custom binary stream, temporarily replaces the clipboard, restores both formats, verifies their contents, and finally restores the clipboard that existed before the test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Packaging the application
&lt;/h2&gt;

&lt;p&gt;The Windows x64 release is published as a self-contained .NET application. Users do not need to install .NET 10 separately.&lt;/p&gt;

&lt;p&gt;I chose a complete ZIP rather than distributing only one executable because the application also depends on native inference libraries and legal notice files. Every file in the archive needs to remain together.&lt;/p&gt;

&lt;p&gt;The release package does not include the model, so the initial application download remains much smaller. The model is obtained through the verified first-launch flow described above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying TextRecast
&lt;/h2&gt;

&lt;p&gt;The packaged application requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows 10 or Windows 11 on x64 hardware&lt;/li&gt;
&lt;li&gt;The current Microsoft Visual C++ x64 Redistributable&lt;/li&gt;
&lt;li&gt;Approximately 1.5 GB of available disk space&lt;/li&gt;
&lt;li&gt;An internet connection for the first model download&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To try it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the complete Windows x64 ZIP from the &lt;a href="https://github.com/snss10/TextRecast/releases" rel="noopener noreferrer"&gt;Releases page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Extract the complete archive.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;TextRecast.exe&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Allow the verified model installation to finish.&lt;/li&gt;
&lt;li&gt;Select editable text in another application and click the floating TextRecast button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because early builds are not code-signed, Windows SmartScreen may display a warning. Always verify that the archive came from the official repository release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building from source
&lt;/h2&gt;

&lt;p&gt;Development requires the .NET 10 SDK. From the repository root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;restore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TextRecast.slnx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TextRecast.slnx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Release&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--no-restore&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TextRecast.slnx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Release&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--no-build&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--project&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;src/TextRecast.App/TextRecast.App.csproj&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CI workflow also verifies formatting, runs the complete test suite, builds in Release configuration, and publishes the self-contained Windows artifact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current limitations
&lt;/h2&gt;

&lt;p&gt;TextRecast is an early release, and its boundaries are intentional:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It currently targets Windows x64 only.&lt;/li&gt;
&lt;li&gt;Inference is CPU-only, so large selections take longer.&lt;/li&gt;
&lt;li&gt;The first model download is approximately 1.1 GB.&lt;/li&gt;
&lt;li&gt;The source application must support UI Automation selection or standard copy-and-paste shortcuts.&lt;/li&gt;
&lt;li&gt;Windows may block simulated input when the source application runs as administrator and TextRecast does not.&lt;/li&gt;
&lt;li&gt;Local inference improves privacy, but clipboard history and third-party clipboard managers remain outside the application's control.&lt;/li&gt;
&lt;li&gt;The application is not yet code-signed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are useful constraints to state explicitly. "Local" should describe what the application actually does, not become a vague promise that ignores the operating system around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next?
&lt;/h2&gt;

&lt;p&gt;The SLM abstraction leaves room for additional local model profiles and prompt formats. I also want to continue improving performance, compatibility across Windows applications, accessibility, and the first-run experience based on real usage.&lt;/p&gt;

&lt;p&gt;For now, the goal is deliberately focused: select text, transform it locally, verify that the original selection is still safe to replace, and return the result to the application where the work is happening.&lt;/p&gt;

&lt;p&gt;If that workflow sounds useful, take a look at &lt;a href="https://github.com/snss10/TextRecast" rel="noopener noreferrer"&gt;TextRecast on GitHub&lt;/a&gt;. Issues and technical feedback are welcome while the project is still taking shape.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>windows</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>SN</dc:creator>
      <pubDate>Sun, 21 Jun 2026 10:31:57 +0000</pubDate>
      <link>https://dev.to/snss5312/-3dd7</link>
      <guid>https://dev.to/snss5312/-3dd7</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/snss5312/dbeast-mcp-pk5" class="crayons-story__hidden-navigation-link"&gt;DBeast MCP&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/snss5312" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3964966%2Fdd3492c6-e0a3-4e7b-a17c-789d84aba448.png" alt="snss5312 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/snss5312" class="crayons-story__secondary fw-medium m:hidden"&gt;
              SN
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                SN
                
              
              &lt;div id="story-author-preview-content-3955317" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/snss5312" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3964966%2Fdd3492c6-e0a3-4e7b-a17c-789d84aba448.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;SN&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/snss5312/dbeast-mcp-pk5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 21&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/snss5312/dbeast-mcp-pk5" id="article-link-3955317"&gt;
          DBeast MCP
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/snss5312/dbeast-mcp-pk5" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/snss5312/dbeast-mcp-pk5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>DBeast MCP</title>
      <dc:creator>SN</dc:creator>
      <pubDate>Sun, 21 Jun 2026 10:31:45 +0000</pubDate>
      <link>https://dev.to/snss5312/dbeast-mcp-pk5</link>
      <guid>https://dev.to/snss5312/dbeast-mcp-pk5</guid>
      <description>&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%2Fw67iib204y9pvtm36pq3.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%2Fw67iib204y9pvtm36pq3.png" alt=" " width="557" height="742"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SQL access gives AI the data. DBeast gives it the investigation.</title>
      <dc:creator>SN</dc:creator>
      <pubDate>Sun, 14 Jun 2026 09:10:37 +0000</pubDate>
      <link>https://dev.to/snss5312/sql-access-gives-ai-the-data-dbeast-gives-it-the-investigation-gip</link>
      <guid>https://dev.to/snss5312/sql-access-gives-ai-the-data-dbeast-gives-it-the-investigation-gip</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Ft5dwyw47aclvsyc09904.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.amazonaws.com%2Fuploads%2Farticles%2Ft5dwyw47aclvsyc09904.png" alt="SQL access gives AI the data. DBeast gives it the investigation." width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/snss10" rel="noopener noreferrer"&gt;
        snss10
      &lt;/a&gt; / &lt;a href="https://github.com/snss10/DBeast" rel="noopener noreferrer"&gt;
        DBeast
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Expert-level PostgreSQL database analysis MCP server for AI assistants.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/snss10/DBeast/assets/logo.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsnss10%2FDBeast%2FHEAD%2Fassets%2Flogo.svg" alt="DBeast" width="720"&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;A PostgreSQL MCP server that gives AI assistants expert DBA capabilities.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.python.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/93b0119e5af0deec355bef584c49ecce132ce78afb17c2779a7b9df194a1c572/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31312b2d3337373661623f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python 3.11+"&gt;&lt;/a&gt;
&lt;a href="https://www.postgresql.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/eb8d25fef0cbc9d190a62e385026cc5f98f6586b20720cd94dfab59b38379ef3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706f737467726573716c2d31322b2d3333363739313f6c6f676f3d706f737467726573716c266c6f676f436f6c6f723d7768697465" alt="PostgreSQL 12+"&gt;&lt;/a&gt;
&lt;a href="https://modelcontextprotocol.io/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3df7f4861785ab167058784590ca7f8bf4f0dcdda6703fc1c8d1e9debdc3414c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d43502d636f6d70617469626c652d366534306339" alt="MCP Compatible"&gt;&lt;/a&gt;
&lt;a href="https://github.com/snss10/DBeast/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3dbbde5f79a33abd50d80ee2476ee9236804a30aea2f11009a427a50ac6ef76c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d323263353565" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/snss10/DBeast#quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt; · &lt;a href="https://github.com/snss10/DBeast#demo" rel="noopener noreferrer"&gt;Demo&lt;/a&gt; · &lt;a href="https://github.com/snss10/DBeast#tools" rel="noopener noreferrer"&gt;Tools&lt;/a&gt; · &lt;a href="https://github.com/snss10/DBeast#safety-model" rel="noopener noreferrer"&gt;Safety&lt;/a&gt; · &lt;a href="https://github.com/snss10/DBeast#configuration" rel="noopener noreferrer"&gt;Configuration&lt;/a&gt; · &lt;a href="https://github.com/snss10/DBeast#documentation" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;DBeast connects AI assistants such as Claude, Cursor, Windsurf, and VS Code Copilot to PostgreSQL through the &lt;strong&gt;Model Context Protocol&lt;/strong&gt;. Instead of exposing one broad &lt;code&gt;execute_sql&lt;/code&gt; escape hatch, DBeast provides &lt;strong&gt;21 focused tools&lt;/strong&gt; for schema discovery, safe query execution, impact analysis, performance review, security checks, maintenance reporting, replication monitoring, and data quality inspection.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Watch Claude use DBeast MCP tools to audit a PostgreSQL database, identify security and maintenance risks, and preview cleanup impact without executing destructive SQL.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="https://youtu.be/NGfHWBe2CGA" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d1aa9a50266e955fa1b7fb9c3f6c01d4e955d0ae57dc0c7b5b46b01dc8d68365/68747470733a2f2f696d672e796f75747562652e636f6d2f76692f4e476648574265324347412f6d617872657364656661756c742e6a7067" alt="DBeast MCP demo: Claude audits a PostgreSQL database"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/NGfHWBe2CGA" rel="nofollow noopener noreferrer"&gt;Watch the demo on YouTube&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How It Works&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;AI assistant  --MCP stdio--&amp;gt;  DBeast server  --asyncpg--&amp;gt;  PostgreSQL
Claude/Cursor                  Python local                 Local, RDS,
Windsurf/VS Code               subprocess                   Supabase, Neon
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;DBeast runs as a local stdio MCP server. Your IDE or desktop assistant starts it as a subprocess and passes database credentials…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/snss10/DBeast" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Preventing context bloat and agent loops in database MCP servers</title>
      <dc:creator>SN</dc:creator>
      <pubDate>Sun, 07 Jun 2026 08:29:52 +0000</pubDate>
      <link>https://dev.to/snss5312/preventing-context-bloat-and-agent-loops-in-database-mcp-servers-3o43</link>
      <guid>https://dev.to/snss5312/preventing-context-bloat-and-agent-loops-in-database-mcp-servers-3o43</guid>
      <description>&lt;p&gt;I've been running Cursor and Claude Code with MCP for a while now, and one thing became obvious pretty quickly:&lt;/p&gt;

&lt;p&gt;Giving an agent a generic &lt;code&gt;execute_sql&lt;/code&gt; tool is usually a terrible idea.&lt;/p&gt;

&lt;p&gt;The first problem is context explosion. If an agent needs to understand a database, it often starts by pulling huge schema dumps, table definitions, or query results directly into the conversation. Context gets consumed incredibly fast.&lt;/p&gt;

&lt;p&gt;The second problem is what I call the &lt;strong&gt;agent loop trap&lt;/strong&gt;. The model writes a query, gets an error, rewrites it, gets another error, and continues indefinitely. If you're using paid models, this can become surprisingly expensive.&lt;/p&gt;

&lt;p&gt;To explore a different approach, I spent the last few weeks building &lt;strong&gt;DBeast&lt;/strong&gt;, an open-source MCP server for PostgreSQL focused on discovery, diagnostics, and safety rather than unrestricted SQL execution.&lt;/p&gt;

&lt;p&gt;Instead of exposing a single powerful database tool, DBeast exposes &lt;strong&gt;21 specialized tools&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A few design decisions that ended up working well:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Schema mapping instead of schema dumping
&lt;/h3&gt;

&lt;p&gt;Rather than feeding entire DDL definitions into context, the server reads &lt;code&gt;information_schema&lt;/code&gt; and system catalogs to generate compact structural representations.&lt;/p&gt;

&lt;p&gt;The goal is to help the model understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;table relationships&lt;/li&gt;
&lt;li&gt;foreign keys&lt;/li&gt;
&lt;li&gt;cardinality&lt;/li&gt;
&lt;li&gt;dependency graphs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without flooding the context window.&lt;/p&gt;

&lt;p&gt;In many cases, a compact graph representation is dramatically more useful than thousands of lines of SQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Safety enforced at the tool layer
&lt;/h3&gt;

&lt;p&gt;I didn't want agents performing unrestricted writes.&lt;/p&gt;

&lt;p&gt;Read-oriented tools automatically enforce result limits, and mutation attempts are intercepted before execution.&lt;/p&gt;

&lt;p&gt;For potentially destructive operations, the server can return an impact assessment instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;estimated rows affected&lt;/li&gt;
&lt;li&gt;dependency information&lt;/li&gt;
&lt;li&gt;potential blast radius&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives the model enough information to reason about consequences without actually making changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Breaking self-correction loops
&lt;/h3&gt;

&lt;p&gt;One thing I noticed is that agents often treat database errors as invitations to keep retrying forever.&lt;/p&gt;

&lt;p&gt;When PostgreSQL returns certain classes of errors, DBeast wraps them into structured responses that encourage the agent to stop, reassess, or ask for clarification instead of endlessly burning tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Keeping everything local
&lt;/h3&gt;

&lt;p&gt;The server runs locally using AsyncIO and standard MCP stdio transport.&lt;/p&gt;

&lt;p&gt;Connection pools remain isolated, and no database metadata leaves the machine unless the host application chooses to send it to the model.&lt;/p&gt;




&lt;p&gt;The project is MIT licensed and still early.&lt;/p&gt;

&lt;p&gt;I'm particularly interested in how others are handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;schema discovery&lt;/li&gt;
&lt;li&gt;permission scoping&lt;/li&gt;
&lt;li&gt;context management&lt;/li&gt;
&lt;li&gt;preventing runaway agent/tool loops&lt;/li&gt;
&lt;li&gt;safe database mutations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those building MCP servers around data systems, what approaches have worked well for you?&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/snss10/DBeast" rel="noopener noreferrer"&gt;https://github.com/snss10/DBeast&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>mcp</category>
      <category>claude</category>
      <category>cursorai</category>
    </item>
    <item>
      <title>I built DBeast: a PostgreSQL MCP server that gives AI assistants DBA-level tools</title>
      <dc:creator>SN</dc:creator>
      <pubDate>Tue, 02 Jun 2026 21:25:33 +0000</pubDate>
      <link>https://dev.to/snss5312/i-built-dbeast-a-postgresql-mcp-server-that-gives-ai-assistants-dba-level-tools-229d</link>
      <guid>https://dev.to/snss5312/i-built-dbeast-a-postgresql-mcp-server-that-gives-ai-assistants-dba-level-tools-229d</guid>
      <description>&lt;p&gt;AI assistants can write SQL.&lt;/p&gt;

&lt;p&gt;But writing SQL is only a small part of working with a real database.&lt;/p&gt;

&lt;p&gt;Most database work is investigation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What tables exist?&lt;/li&gt;
&lt;li&gt;How are they related?&lt;/li&gt;
&lt;li&gt;Why is this query slow?&lt;/li&gt;
&lt;li&gt;Which indexes are unhealthy?&lt;/li&gt;
&lt;li&gt;Is autovacuum keeping up?&lt;/li&gt;
&lt;li&gt;Are there risky permissions?&lt;/li&gt;
&lt;li&gt;Which columns may contain sensitive data?&lt;/li&gt;
&lt;li&gt;What would happen if we changed or deleted this data?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what I built &lt;strong&gt;DBeast&lt;/strong&gt; for.&lt;/p&gt;

&lt;p&gt;DBeast is a PostgreSQL MCP server that gives AI assistants structured DBA-style tools for understanding, analyzing, and troubleshooting PostgreSQL databases.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/snss10/DBeast" rel="noopener noreferrer"&gt;https://github.com/snss10/DBeast&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;A lot of AI database integrations start with a simple tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;execute_sql(query)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is useful, but it is also incomplete.&lt;/p&gt;

&lt;p&gt;A good database assistant should not just run SQL.&lt;/p&gt;

&lt;p&gt;It should help you reason about the database.&lt;/p&gt;

&lt;p&gt;It should inspect schemas, explain query plans, identify maintenance issues, detect security risks, analyze data quality, and help you understand the impact of changes before you make them.&lt;/p&gt;

&lt;p&gt;That is the idea behind DBeast.&lt;/p&gt;

&lt;h2&gt;
  
  
  What DBeast does
&lt;/h2&gt;

&lt;p&gt;DBeast exposes 21 MCP tools for PostgreSQL across areas like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schema discovery&lt;/li&gt;
&lt;li&gt;ERD generation&lt;/li&gt;
&lt;li&gt;Safe SELECT query execution&lt;/li&gt;
&lt;li&gt;Query analysis&lt;/li&gt;
&lt;li&gt;Query optimization hints&lt;/li&gt;
&lt;li&gt;Write-impact previews&lt;/li&gt;
&lt;li&gt;Database health checks&lt;/li&gt;
&lt;li&gt;Maintenance analysis&lt;/li&gt;
&lt;li&gt;Index and vacuum insights&lt;/li&gt;
&lt;li&gt;Security audits&lt;/li&gt;
&lt;li&gt;Sensitive data detection&lt;/li&gt;
&lt;li&gt;Data quality reports&lt;/li&gt;
&lt;li&gt;Duplicate detection&lt;/li&gt;
&lt;li&gt;Replication monitoring&lt;/li&gt;
&lt;li&gt;PostgreSQL configuration review&lt;/li&gt;
&lt;li&gt;Audit logging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of giving the assistant one giant database tool, DBeast gives it focused tools that map to real DBA workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger idea
&lt;/h2&gt;

&lt;p&gt;I do not want AI assistants to be just SQL autocomplete.&lt;/p&gt;

&lt;p&gt;I want them to become useful database copilots.&lt;/p&gt;

&lt;p&gt;With DBeast, you can ask things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Show me how the sales schema is structured and generate an ERD.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Investigate why this dashboard query is slow and suggest indexes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review the public schema for maintenance issues, security risks, and data quality problems.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Compare table bloat, dead tuples, and index health across all schemas.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find columns that may contain sensitive customer data.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check replication lag and tell me if anything looks unhealthy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is much more useful than just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run this SQL.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Safety still matters
&lt;/h2&gt;

&lt;p&gt;DBeast is designed to be safe by default.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT&lt;/code&gt; queries can run with automatic row limits.&lt;/p&gt;

&lt;p&gt;But write operations like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;INSERT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UPDATE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DROP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TRUNCATE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are not executed directly.&lt;/p&gt;

&lt;p&gt;They are analyzed as impact previews.&lt;/p&gt;

&lt;p&gt;So instead of blindly running a risky query, your assistant can tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what tables may be affected&lt;/li&gt;
&lt;li&gt;how many rows may change&lt;/li&gt;
&lt;li&gt;whether related objects are involved&lt;/li&gt;
&lt;li&gt;what the risk level looks like&lt;/li&gt;
&lt;li&gt;what you should review first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The human stays in control.&lt;/p&gt;

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

&lt;p&gt;DBeast runs as a local MCP server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI assistant  -&amp;gt;  DBeast MCP server  -&amp;gt;  PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your assistant talks to DBeast through the Model Context Protocol. DBeast talks to PostgreSQL using asyncpg.&lt;/p&gt;

&lt;p&gt;It works with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local PostgreSQL&lt;/li&gt;
&lt;li&gt;Docker PostgreSQL&lt;/li&gt;
&lt;li&gt;AWS RDS / Aurora&lt;/li&gt;
&lt;li&gt;Supabase&lt;/li&gt;
&lt;li&gt;Neon&lt;/li&gt;
&lt;li&gt;Railway&lt;/li&gt;
&lt;li&gt;Render&lt;/li&gt;
&lt;li&gt;Fly.io&lt;/li&gt;
&lt;li&gt;SSH tunnels&lt;/li&gt;
&lt;li&gt;AWS Secrets Manager&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/snss10/DBeast.git
&lt;span class="nb"&gt;cd &lt;/span&gt;DBeast
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example MCP config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dbeast"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/absolute/path/to/DBeast/src/server.py"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"DATABASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgresql://user:password@localhost:5432/mydb"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then ask your assistant about your database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;DBeast may be useful if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use PostgreSQL&lt;/li&gt;
&lt;li&gt;use Cursor, Claude Desktop, Windsurf, or another MCP client&lt;/li&gt;
&lt;li&gt;want AI help understanding a database&lt;/li&gt;
&lt;li&gt;want query and performance analysis&lt;/li&gt;
&lt;li&gt;want safer database workflows&lt;/li&gt;
&lt;li&gt;want a local tool instead of a hosted database agent&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I’m looking for
&lt;/h2&gt;

&lt;p&gt;This is an early release, and I would love feedback from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL users&lt;/li&gt;
&lt;li&gt;DBAs&lt;/li&gt;
&lt;li&gt;backend engineers&lt;/li&gt;
&lt;li&gt;MCP builders&lt;/li&gt;
&lt;li&gt;people experimenting with AI developer tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m especially interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what database workflows you would want next&lt;/li&gt;
&lt;li&gt;whether setup is clear&lt;/li&gt;
&lt;li&gt;what safety checks would make this more trustworthy&lt;/li&gt;
&lt;li&gt;which MCP clients you want first-class examples for&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/snss10/DBeast" rel="noopener noreferrer"&gt;https://github.com/snss10/DBeast&lt;/a&gt;&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
