<?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: Al Amin</title>
    <description>The latest articles on DEV Community by Al Amin (@alaminik).</description>
    <link>https://dev.to/alaminik</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%2F4187870%2Fda01af73-e16e-47f3-a2cd-123cfce388ca.png</url>
      <title>DEV Community: Al Amin</title>
      <link>https://dev.to/alaminik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alaminik"/>
    <language>en</language>
    <item>
      <title>Local Whisper vs. Cloud Dictation: Privacy, Latency and Accuracy Tradeoffs (Plus a Private Setup)</title>
      <dc:creator>Al Amin</dc:creator>
      <pubDate>Sun, 18 Oct 2026 05:01:35 +0000</pubDate>
      <link>https://dev.to/alaminik/local-whisper-vs-cloud-dictation-privacy-latency-and-accuracy-tradeoffs-plus-a-private-setup-37jf</link>
      <guid>https://dev.to/alaminik/local-whisper-vs-cloud-dictation-privacy-latency-and-accuracy-tradeoffs-plus-a-private-setup-37jf</guid>
      <description>&lt;p&gt;"Just run Whisper locally" is good advice that skips a lot of detail. Local speech-to-text is genuinely useful, but it is not automatically faster, more accurate, or even fully private, depending on what else sits in your pipeline.&lt;/p&gt;

&lt;p&gt;This post breaks the decision into three questions (what leaves the machine, where latency comes from, and how accurate it is for &lt;em&gt;your&lt;/em&gt; voice) and ends with a setup where nothing leaves your computer. I use InsertKit as the dictation front end because it supports local Whisper, bring-your-own-key cloud providers, and custom OpenAI-compatible endpoints in one place. The tradeoffs apply to any stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Privacy: map the data flow first
&lt;/h2&gt;

&lt;p&gt;A modern dictation pipeline usually has two stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mic audio -&amp;gt; [speech-to-text] -&amp;gt; raw transcript -&amp;gt; [LLM formatting] -&amp;gt; text at cursor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each stage can be local or remote, and people often secure one and forget the other.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speech-to-text.&lt;/strong&gt; With a cloud engine, your audio is uploaded and processed by that provider. With a local Whisper model, audio stays on your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formatting.&lt;/strong&gt; Clean-up (removing filler words, fixing punctuation, adapting tone) is usually done by a chat model. If that model is in the cloud, your &lt;em&gt;transcript&lt;/em&gt; leaves the machine even when the audio did not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Side channels.&lt;/strong&gt; Sync features count too. In InsertKit, snippets, clipboard history, custom vocabulary, and API keys sync to your account. If your vocabulary list contains an unreleased product codename, that word list is synced, even if every audio clip stays local.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What InsertKit stores is worth knowing precisely: cloud voice history in Settings → Usage covers the last 30 days and is &lt;strong&gt;text only, no audio&lt;/strong&gt;, with a Clear button. Local voice history stays on the device, and setting its maximum to 0 disables it.&lt;/p&gt;

&lt;p&gt;So "private" is not a property of a model. It is a property of the whole path.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Latency: where the milliseconds actually go
&lt;/h2&gt;

&lt;p&gt;Local is not always faster. Rough breakdown:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud:&lt;/strong&gt; upload time + queueing + inference on fast hardware + download. On a good connection, short utterances can come back very quickly, because providers run large models on serious GPUs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local:&lt;/strong&gt; zero network, but inference runs on your CPU or GPU. A small model on a modern laptop is responsive. A large model on an older CPU can take noticeably longer than the time you spent talking.&lt;/p&gt;

&lt;p&gt;Two details that matter in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model loading.&lt;/strong&gt; Expect the first transcription after loading a large model to be slower than the ones that follow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long dictation.&lt;/strong&gt; If the tool waits until you finish a three-minute ramble before transcribing, you wait for all of it at the end. InsertKit splits long speech into chunks at natural pauses and transcribes them while you keep talking, which hides much of that delay locally and in the cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Accuracy: benchmark your own voice
&lt;/h2&gt;

&lt;p&gt;Published word error rates come from benchmark datasets, not from your accent, your mic, or your jargon. Ten minutes of testing beats any leaderboard.&lt;/p&gt;

&lt;p&gt;Here is a quick, tool-agnostic way to compare Whisper model sizes with whisper.cpp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ggml-org/whisper.cpp
&lt;span class="nb"&gt;cd &lt;/span&gt;whisper.cpp
cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build &lt;span class="nt"&gt;-j&lt;/span&gt; &lt;span class="nt"&gt;--config&lt;/span&gt; Release

&lt;span class="k"&gt;for &lt;/span&gt;m &lt;span class="k"&gt;in &lt;/span&gt;base small medium&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;sh ./models/download-ggml-model.sh &lt;span class="nv"&gt;$m&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Convert a 60-second recording of you reading real work text to 16 kHz mono WAV&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; sample.m4a &lt;span class="nt"&gt;-ar&lt;/span&gt; 16000 &lt;span class="nt"&gt;-ac&lt;/span&gt; 1 &lt;span class="nt"&gt;-c&lt;/span&gt;:a pcm_s16le sample.wav

&lt;span class="k"&gt;for &lt;/span&gt;m &lt;span class="k"&gt;in &lt;/span&gt;base small medium&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  /usr/bin/time &lt;span class="nt"&gt;-p&lt;/span&gt; ./build/bin/whisper-cli &lt;span class="nt"&gt;-m&lt;/span&gt; models/ggml-&lt;span class="nv"&gt;$m&lt;/span&gt;.bin &lt;span class="nt"&gt;-f&lt;/span&gt; sample.wav &lt;span class="nt"&gt;-otxt&lt;/span&gt; &lt;span class="nt"&gt;-of&lt;/span&gt; out-&lt;span class="nv"&gt;$m&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then score each output against what you actually said:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# pip install jiwer
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;jiwer&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;wer&lt;/span&gt;

&lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reference.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;hyp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;out-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WER:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;wer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hyp&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use real material: a commit message, a ticket description, a paragraph full of service names. Generic sentences flatter every model.&lt;/p&gt;

&lt;p&gt;A few patterns you will likely see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bigger models handle accents and noise better&lt;/strong&gt;, at the cost of speed and memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jargon fails across all sizes.&lt;/strong&gt; That is a vocabulary problem, not a model-size problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whisper can hallucinate on silence or noise&lt;/strong&gt;, producing text nobody said. Trimming silence and using a decent mic reduce it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For jargon, a correction layer helps more than a bigger model. InsertKit's &lt;strong&gt;Custom Vocabulary&lt;/strong&gt; has word hints plus "heard as → write as" corrections, like &lt;code&gt;post gres&lt;/code&gt; → &lt;code&gt;Postgres&lt;/code&gt;, and corrections run before and after formatting so the LLM cannot undo them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision, simplified
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audio must never leave the machine:&lt;/strong&gt; local Whisper.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed on modest hardware:&lt;/strong&gt; cloud, or a small local model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy on difficult audio:&lt;/strong&gt; a large local model with a GPU, or a strong cloud engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero setup:&lt;/strong&gt; a hosted engine that needs no key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Air-gapped or offline work:&lt;/strong&gt; local Whisper plus a local LLM, or formatting turned off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many developers end up hybrid: local for anything touching client code or internal docs, cloud for low-stakes chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  A fully private dictation setup
&lt;/h2&gt;

&lt;p&gt;Here is the setup where audio and text both stay on your machine. Local Whisper is a desktop feature in InsertKit (Windows, macOS, Linux).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Local speech-to-text
&lt;/h3&gt;

&lt;p&gt;In the Speech Engine panel, choose &lt;strong&gt;Local Offline (Whisper)&lt;/strong&gt; and download a model inside the app. Sizes go from Tiny (~75 MB) and Base (~140 MB) through Small (~460 MB) and Medium (~1.5 GB) to Large v3 (~3 GB). Use your benchmark results to pick. Small is a sensible starting point on most laptops.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: A local LLM for formatting
&lt;/h3&gt;

&lt;p&gt;Run a local OpenAI-compatible server. With Ollama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull llama3.2
curl http://localhost:11434/v1/models
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LM Studio exposes a similar server, by default at &lt;code&gt;http://localhost:1234/v1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In InsertKit, open Settings → API Keys and add a &lt;strong&gt;Custom OpenAI-compatible provider&lt;/strong&gt;: a name, the base URL (for example &lt;code&gt;http://localhost:11434/v1&lt;/code&gt;), a key if your server needs one, and the models (auto-fetched or entered by hand). Then choose that model for Smart Formatting.&lt;/p&gt;

&lt;p&gt;Smaller local models format well enough for clean-up. If output gets too creative, add a short custom instruction under &lt;strong&gt;Use my own instructions&lt;/strong&gt;, such as "Fix punctuation and remove filler words. Do not add or change content."&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Decide what happens when formatting is unavailable
&lt;/h3&gt;

&lt;p&gt;Enable &lt;strong&gt;Keep working offline&lt;/strong&gt; so the raw transcript is pasted if the formatter cannot be reached. Or skip formatting for sensitive sessions and rely on vocabulary corrections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Verify, do not assume
&lt;/h3&gt;

&lt;p&gt;Turn off Wi-Fi (or run &lt;code&gt;nmcli networking off&lt;/code&gt; on Linux) and dictate a paragraph into your editor. If text still appears and is formatted, both stages are local. Turn the network back on afterwards, because account sync needs it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux note
&lt;/h3&gt;

&lt;p&gt;Check Settings → General → &lt;strong&gt;Linux Dependencies&lt;/strong&gt;. Typing and pasting rely on tools such as xdotool and wtype, and on Wayland the tips point to wtype or ydotool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where cloud still wins
&lt;/h2&gt;

&lt;p&gt;To be fair to cloud dictation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No local resources.&lt;/strong&gt; Large models do not eat your RAM or battery during a long build.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent quality on weak hardware.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language coverage.&lt;/strong&gt; InsertKit's voice typing covers 100+ languages with auto-detect. If you dictate in more than one, benchmark each on your local model before committing to it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile.&lt;/strong&gt; InsertKit's Android app uses hosted or BYOK engines; there is no on-device Whisper there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you use the cloud, at least choose deliberately. InsertKit Free needs no key and has a daily limit, Premium uses credits, and BYOK covers providers such as OpenAI, Groq, Deepgram, AssemblyAI, and ElevenLabs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Local Whisper is a strong default for private work, but privacy depends on the full path, latency depends on your hardware, and accuracy depends on your own voice. Benchmark with real text, add vocabulary corrections for your stack, and verify your setup with the network off.&lt;/p&gt;

&lt;p&gt;If you want to try this exact setup, the desktop builds are at &lt;a href="https://insertkit.com/download" rel="noopener noreferrer"&gt;insertkit.com/download&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Dictating Code Comments and Commit Messages: A Practical Hands-Free Setup</title>
      <dc:creator>Al Amin</dc:creator>
      <pubDate>Sat, 17 Oct 2026 05:18:32 +0000</pubDate>
      <link>https://dev.to/alaminik/dictating-code-comments-and-commit-messages-a-practical-hands-free-setup-4fb1</link>
      <guid>https://dev.to/alaminik/dictating-code-comments-and-commit-messages-a-practical-hands-free-setup-4fb1</guid>
      <description>&lt;p&gt;I do not want to dictate code. Brackets, indentation, and symbol-heavy syntax are a bad fit for speech, and autocomplete already does a lot of that work.&lt;/p&gt;

&lt;p&gt;The prose around code is a different story. Comments that explain &lt;em&gt;why&lt;/em&gt;, commit messages that someone will read during a painful &lt;code&gt;git bisect&lt;/code&gt;, PR descriptions, review replies. That text is often the part we rush, because typing a careful paragraph after an hour of debugging feels like a chore. Saying it out loud is easier, and it usually comes out clearer.&lt;/p&gt;

&lt;p&gt;Here is how I set that up with InsertKit, a desktop app (Windows, macOS, Linux) that combines voice typing, text snippets, and clipboard history.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basic loop
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Put your cursor where the text should go: a comment line, the commit message buffer, a PR description box.&lt;/li&gt;
&lt;li&gt;Press the voice shortcut (Right Alt by default) and talk.&lt;/li&gt;
&lt;li&gt;Stop talking. After a short silence (5 seconds by default, configurable), recording stops and the text is inserted at the cursor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It works system-wide, so the same shortcut works in your editor, a terminal, the browser, or a chat app. Long explanations are fine too: speech is split into chunks at natural pauses and processed while you keep talking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let the Code profile handle formatting
&lt;/h2&gt;

&lt;p&gt;Raw transcripts are messy. With &lt;strong&gt;Smart Formatting&lt;/strong&gt; turned on, InsertKit cleans filler words and punctuation and adapts the style to the app in focus. When the active window is VS Code, Cursor, IntelliJ, Sublime, vim, or a terminal, it uses the &lt;strong&gt;Code&lt;/strong&gt; profile.&lt;/p&gt;

&lt;p&gt;Two things happen in that profile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Output reads like a comment or docstring, not a chatty paragraph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spoken identifiers become camelCase or snake_case.&lt;/strong&gt; Say "this wraps fetch user profile and retries on a timeout" and you get a comment that refers to &lt;code&gt;fetchUserProfile&lt;/code&gt; instead of four loose words.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It will not always guess the convention you want, so glance at identifiers before you move on. If you want a specific house style, there is a &lt;strong&gt;Use my own instructions&lt;/strong&gt; option for a custom formatting prompt. Keep in mind it changes formatting generally, not only in your editor.&lt;/p&gt;

&lt;p&gt;If the formatter is unreachable, the raw transcript is pasted anyway, so nothing you said gets lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snippets for the boilerplate around the prose
&lt;/h2&gt;

&lt;p&gt;Voice handles the thinking. Snippets handle the structure that should look the same every time. A few I use:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/todo&lt;/code&gt;&lt;/strong&gt; for a TODO tag with my name and today's date, using built-in variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TODO({{myName}}, {{date}}): 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type &lt;code&gt;/todo&lt;/code&gt;, then press the voice shortcut and say what needs doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/pr&lt;/code&gt;&lt;/strong&gt; for a PR description skeleton:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## What changed&lt;/span&gt;

&lt;span class="gu"&gt;## Why&lt;/span&gt;

&lt;span class="gu"&gt;## How to test&lt;/span&gt;

&lt;span class="gu"&gt;## Notes for reviewers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop it in, then dictate each section. "Why" is where speaking pays off most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/commit&lt;/code&gt;&lt;/strong&gt; as a dynamic snippet. On desktop, a snippet can have form fields. I use a Dropdown called &lt;code&gt;type&lt;/code&gt; (feat, fix, refactor, docs, chore, test) and a Text field called &lt;code&gt;scope&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;}}({{&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;}}):&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type &lt;code&gt;/commit&lt;/code&gt; in the commit buffer, pick the type, enter the scope, press Enter, then dictate the subject and body.&lt;/p&gt;

&lt;p&gt;If you forget a trigger, typing &lt;code&gt;/&lt;/code&gt; opens a small autocomplete popup at the cursor with matching snippets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Press F4 before snippets bite you
&lt;/h2&gt;

&lt;p&gt;Here is the gotcha nobody mentions. Snippets fire the moment the end of what you typed matches a trigger, without waiting for Space. That is great in a chat box and dangerous in code. If you have a &lt;code&gt;/pr&lt;/code&gt; snippet and you type a path like &lt;code&gt;/proc/...&lt;/code&gt; or a URL segment starting with &lt;code&gt;/pr&lt;/code&gt;, it will expand.&lt;/p&gt;

&lt;p&gt;Two fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pick triggers that rarely appear in code or paths.&lt;/strong&gt; &lt;code&gt;/prdesc&lt;/code&gt; is safer than &lt;code&gt;/pr&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Press F4&lt;/strong&gt; (Fn + F4 on Mac) to turn the whole snippet system off while you are writing code, and press it again when you switch to prose. A small toast confirms "Snippets disabled" or "Snippets enabled". You can change the key in Settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some apps also use &lt;code&gt;/&lt;/code&gt; for their own commands. Under Settings → Snippets → Trigger Prefixes, you can enable a different prefix character for those cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Teach it your jargon
&lt;/h2&gt;

&lt;p&gt;Speech engines are trained on everyday speech, not on your stack. &lt;strong&gt;Custom Vocabulary&lt;/strong&gt; fixes that in two ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add word&lt;/strong&gt;: hint terms like Kubernetes, PostgreSQL, gRPC, or your internal service names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add correction&lt;/strong&gt;: "When heard as" → "Write as". For example "post gres" → "Postgres", "next js" → "Next.js", or "k eights" → "k8s".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Corrections run before and after AI formatting, so the formatter cannot "fix" your spelling back. Vocabulary syncs to your account, so it follows you to another machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking an engine: hosted, BYOK, or fully local
&lt;/h2&gt;

&lt;p&gt;You can start with &lt;strong&gt;InsertKit Free&lt;/strong&gt;, which needs no API key and has a daily limit. For more control there are a few options worth knowing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bring your own key.&lt;/strong&gt; Settings → API Keys accepts keys for providers such as OpenAI, Groq, OpenRouter, Deepgram, AssemblyAI, and ElevenLabs for transcription, plus chat providers for formatting. Adding a key assigns sensible defaults. A Groq key, for example, sets whisper-large-v3 for speech.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Offline (Whisper).&lt;/strong&gt; On desktop you can download a Whisper model inside the app, from Tiny (~75 MB) up to Large v3 (~3 GB). With this engine selected, audio is transcribed on your machine and does not leave it. Start with Small or Base on a laptop and move up if accuracy is not good enough for your accent and vocabulary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom OpenAI-compatible endpoint.&lt;/strong&gt; Formatting uses a chat model, and by default that may be a cloud model. If you want the text to stay local too, add a custom provider pointing at a local server such as &lt;strong&gt;Ollama&lt;/strong&gt; or &lt;strong&gt;LM Studio&lt;/strong&gt;: set a name, the base URL, a key if needed, and fetch or enter the model list. Pair that with Local Offline Whisper and the whole pipeline runs on your machine.&lt;/p&gt;

&lt;p&gt;If your team has rules about what can leave your machine, that is the setup to look at. Or turn Smart Formatting off and rely on vocabulary corrections alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linux notes
&lt;/h2&gt;

&lt;p&gt;On Linux, check Settings → General → &lt;strong&gt;Linux Dependencies&lt;/strong&gt;. InsertKit relies on tools such as xdotool, wtype, and maim to type and paste. On Wayland, the tips point to wtype or ydotool.&lt;/p&gt;

&lt;h2&gt;
  
  
  A couple of extras
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Voice Assistant&lt;/strong&gt;: say "hey ik draft a short changelog entry for a fix to session expiry handling" and a draft is typed at the cursor. Treat it like a junior's first draft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clipboard history&lt;/strong&gt;: Ctrl + Shift + Z opens a small popup with recent copies, snippets, and favorites. Handy for juggling an error message, a ticket ID, and a stack trace line while writing a commit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What does not work well
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open-plan offices. Dictation is awkward with people around.&lt;/li&gt;
&lt;li&gt;Dictating code itself. Stick to prose.&lt;/li&gt;
&lt;li&gt;Skipping review. Read every comment before you commit it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to try this workflow, the desktop builds are at &lt;a href="https://insertkit.com/download" rel="noopener noreferrer"&gt;insertkit.com/download&lt;/a&gt;. My suggestion: set up &lt;code&gt;/todo&lt;/code&gt;, &lt;code&gt;/commit&lt;/code&gt;, and a few vocabulary corrections, then dictate every commit body for a week and see if your history reads better.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>git</category>
      <category>ai</category>
      <category>vscode</category>
    </item>
  </channel>
</rss>
