<?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>TextExpander Pricing vs Cheap Alternatives: A Developer's Cost Breakdown (Free, Open Source and Paid)</title>
      <dc:creator>Al Amin</dc:creator>
      <pubDate>Fri, 30 Oct 2026 03:44:44 +0000</pubDate>
      <link>https://dev.to/alaminik/textexpander-pricing-vs-cheap-alternatives-a-developers-cost-breakdown-free-open-source-and-8nm</link>
      <guid>https://dev.to/alaminik/textexpander-pricing-vs-cheap-alternatives-a-developers-cost-breakdown-free-open-source-and-8nm</guid>
      <description>&lt;p&gt;If you have ever looked at TextExpander pricing and wondered whether a cheap alternative would do the same job, you are not alone. Developers retype a lot: PR descriptions, review comments, bug report templates, standup notes, the same &lt;code&gt;curl&lt;/code&gt; flags. A text expander removes most of that. The question is how much you need to pay for it.&lt;/p&gt;

&lt;p&gt;This post breaks down TextExpander's current plans, then compares them with free and low-cost options from a developer's point of view: price, platforms (including Linux), how snippets are stored, and team sharing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a text expander?
&lt;/h2&gt;

&lt;p&gt;A text expander is a background app that watches what you type and replaces a short trigger with longer saved text. You type something like &lt;code&gt;/pr&lt;/code&gt; and it expands into a full pull request template. Most tools also support placeholders such as today's date or a fill-in form, so one snippet can produce slightly different text each time.&lt;/p&gt;

&lt;p&gt;Unlike editor snippets (VS Code user snippets, JetBrains live templates), a system-wide text expander works across apps: your browser, Slack, email, the terminal, and your IDE.&lt;/p&gt;

&lt;h2&gt;
  
  
  TextExpander pricing in 2026
&lt;/h2&gt;

&lt;p&gt;According to TextExpander's own pricing page (checked on 30 October 2026):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free&lt;/strong&gt;: $0, with unlimited total snippets but only &lt;strong&gt;5 active snippets&lt;/strong&gt;, and you can swap one active snippet every 2 weeks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro&lt;/strong&gt;: &lt;strong&gt;$5 per user per month, billed annually&lt;/strong&gt; ($60 per year), up to 5 users, unlimited active snippets, plus dynamic content like date math and JavaScript snippets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business&lt;/strong&gt;: &lt;strong&gt;$10 per user per month, billed annually&lt;/strong&gt; ($120 per year), no 5-user cap, plus snippet requests, guest sharing and Google SSO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise&lt;/strong&gt;: custom pricing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monthly billing is also offered; annual billing gives two months free. Prices are in USD and exclude tax, so VAT or GST can be added at checkout depending on your country.&lt;/p&gt;

&lt;p&gt;On platforms, TextExpander's FAQ lists Mac, Windows, iPhone and iPad, and a Chrome extension. Linux is not on that list.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the free plan means for developers
&lt;/h3&gt;

&lt;p&gt;Five active snippets runs out fast. A PR template, a "needs repro" reply, a review nit, a signature, a standup template, and you are already over. After that, you either swap snippets every two weeks or pay for Pro.&lt;/p&gt;

&lt;p&gt;Pro is fair value if you need JavaScript snippets or shell scripts on macOS. If your needs are simpler, or you work on Linux, cheaper routes exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cheap and free TextExpander alternatives
&lt;/h2&gt;

&lt;h3&gt;
  
  
  espanso (free, open source)
&lt;/h3&gt;

&lt;p&gt;espanso is an open-source text expander for Windows, macOS and Linux. Snippets ("matches") live in YAML files under a config folder, and changes reload automatically after you save. It has a package hub, a search bar (Alt+Space by default) and app-specific configs.&lt;/p&gt;

&lt;p&gt;The big plus for developers: snippets are plain files you can keep in your dotfiles repo and review in git. The trade-off is that you edit YAML by hand and need to get indentation right.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;matches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:pr"&lt;/span&gt;
    &lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;##&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;What&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;##&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Why&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;##&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;How&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AutoHotkey hotstrings (free, Windows only)
&lt;/h3&gt;

&lt;p&gt;AutoHotkey is a free scripting tool for Windows, and its hotstrings expand abbreviations as you type. If you already write AHK scripts, adding hotstrings costs nothing, but it does not help on macOS or Linux.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editor snippets (free, editor only)
&lt;/h3&gt;

&lt;p&gt;VS Code user snippets and JetBrains live templates are already installed and great for code. They do not follow you into Slack, a GitHub comment box or an email, which is where a lot of repeated text happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Text Blaze (freemium)
&lt;/h3&gt;

&lt;p&gt;Text Blaze started as a Chrome extension and now also has Windows and macOS desktop apps. Per its plans page, Pro is &lt;strong&gt;$2.99 per month billed yearly&lt;/strong&gt; (or $3.49 billed monthly) and adds full access to forms, images and tables, and if/then rules. Business is $6.99 per user per month billed yearly. The free plan has limited snippets. Text Blaze's FAQ says native apps for other platforms are on its roadmap with no ETA, so on Linux you are limited to the Chrome extension today.&lt;/p&gt;

&lt;h3&gt;
  
  
  InsertKit (free tier plus a low-cost plan)
&lt;/h3&gt;

&lt;p&gt;InsertKit is a text expander combined with voice typing and clipboard history. It runs on Windows, macOS and Linux (AppImage, .deb and .rpm), plus Android and a Chrome extension, and snippets sync through your account. There is a free tier, and the paid plan is &lt;strong&gt;$2.99 per month&lt;/strong&gt; at international pricing.&lt;/p&gt;

&lt;p&gt;A few details that matter to developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Triggers and prefixes.&lt;/strong&gt; Triggers look like &lt;code&gt;/pr&lt;/code&gt; or &lt;code&gt;/repro&lt;/code&gt;. The &lt;code&gt;/&lt;/code&gt; and &lt;code&gt;;&lt;/code&gt; prefixes are on by default, and a trigger saved as &lt;code&gt;/pr&lt;/code&gt; also works as &lt;code&gt;;pr&lt;/code&gt;, which helps in apps like Slack or Discord that use &lt;code&gt;/&lt;/code&gt; for their own commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F4 to pause.&lt;/strong&gt; On desktop, F4 turns typed snippet triggers off and on, which is handy before a long coding session so nothing expands inside an identifier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic snippets.&lt;/strong&gt; Add fields such as text, dropdown or date, and typing the trigger opens a small fill-in form (desktop and Chrome extension). Built-in variables like &lt;code&gt;{{date}}&lt;/code&gt; are available too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux notes.&lt;/strong&gt; The app has a Linux dependencies check (xdotool, wtype, maim), and on Wayland its tips point to wtype or ydotool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice, if you want it.&lt;/strong&gt; Voice typing works in 100+ languages, and saying "insert" plus a snippet name pastes that snippet by voice. A dynamic snippet inserted by voice still opens its fill-in form. A Code formatting profile turns spoken identifiers into camelCase or snake_case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring your own model.&lt;/strong&gt; You can add your own API keys, including a custom OpenAI-compatible provider such as Ollama or LM Studio, so the AI formatting and voice assistant can run against a local model. There is also an offline Whisper option for speech on desktop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off compared with espanso: snippets are edited in a GUI and synced through an account rather than kept as YAML files in your repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side comparison
&lt;/h2&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;Entry price for one person&lt;/th&gt;
&lt;th&gt;Free option&lt;/th&gt;
&lt;th&gt;Linux&lt;/th&gt;
&lt;th&gt;How snippets are stored&lt;/th&gt;
&lt;th&gt;Team sharing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TextExpander&lt;/td&gt;
&lt;td&gt;$5/user/mo billed annually (Pro)&lt;/td&gt;
&lt;td&gt;Yes, 5 active snippets&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;Cloud account, app UI&lt;/td&gt;
&lt;td&gt;Pro up to 5 users; Business unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;espanso&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Fully free, open source&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;YAML files on disk&lt;/td&gt;
&lt;td&gt;Share files or packages yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutoHotkey&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Fully free&lt;/td&gt;
&lt;td&gt;No (Windows only)&lt;/td&gt;
&lt;td&gt;Script files&lt;/td&gt;
&lt;td&gt;Share scripts yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VS Code / JetBrains snippets&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Built in&lt;/td&gt;
&lt;td&gt;Yes (inside the editor)&lt;/td&gt;
&lt;td&gt;Editor config&lt;/td&gt;
&lt;td&gt;Via settings sync or repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text Blaze&lt;/td&gt;
&lt;td&gt;$2.99/mo billed yearly (Pro)&lt;/td&gt;
&lt;td&gt;Yes, limited snippets&lt;/td&gt;
&lt;td&gt;Chrome extension only&lt;/td&gt;
&lt;td&gt;Cloud account, app UI&lt;/td&gt;
&lt;td&gt;Business plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InsertKit&lt;/td&gt;
&lt;td&gt;$2.99/mo&lt;/td&gt;
&lt;td&gt;Yes, free tier&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Cloud account, app UI&lt;/td&gt;
&lt;td&gt;Private or Teams snippets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prices are as published by each vendor at the time of writing and can change, so check before you buy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose without overpaying
&lt;/h2&gt;

&lt;p&gt;Start from where you type, not from feature lists:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Only inside your editor?&lt;/strong&gt; Use your editor's built-in snippets. They are free and already there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Across apps, and you like config-as-code?&lt;/strong&gt; espanso gives you text expansion on every desktop OS for free, with snippets in git.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows only, and you already script?&lt;/strong&gt; AutoHotkey hotstrings cost nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need fill-in forms and team sharing on Mac or Windows?&lt;/strong&gt; TextExpander Pro or Text Blaze are worth comparing. Count your active snippets first, because the TextExpander free plan caps them at 5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want snippets, voice typing and clipboard history in one app, including on Linux and Android?&lt;/strong&gt; A combined tool can replace two or three separate subscriptions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also budget for migration time: rebuild your top ten snippets in the new tool and use it for a week before deleting anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying a cheaper option
&lt;/h2&gt;

&lt;p&gt;If you want text expansion across apps with a GUI instead of YAML, test a low-cost tool against your current setup for a week. Current plans are on the &lt;a href="https://insertkit.com/pricing" rel="noopener noreferrer"&gt;InsertKit pricing page&lt;/a&gt;, and the free tier is enough to rebuild a few of your most-used snippets and compare.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How much does TextExpander cost?
&lt;/h3&gt;

&lt;p&gt;Per TextExpander's pricing page, Pro is $5 per user per month and Business is $10 per user per month, both billed annually. Monthly billing is available at a higher rate, and Enterprise is custom. Taxes may be added depending on your country.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a free version of TextExpander?
&lt;/h3&gt;

&lt;p&gt;Yes. The Free plan keeps unlimited snippets in your account but only 5 can be active at a time, and you can swap one active snippet every 2 weeks.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the cheapest TextExpander alternative?
&lt;/h3&gt;

&lt;p&gt;espanso and AutoHotkey are free. espanso works on Windows, macOS and Linux with YAML config; AutoHotkey is Windows only. Among paid GUI tools, Text Blaze Pro and InsertKit both list $2.99 per month (Text Blaze's price is billed yearly).&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a TextExpander alternative for Linux?
&lt;/h3&gt;

&lt;p&gt;Yes. espanso supports Linux, and InsertKit has a Linux desktop app (AppImage, .deb and .rpm). TextExpander's FAQ does not list Linux.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can a text expander work in the terminal and IDE?
&lt;/h3&gt;

&lt;p&gt;System-wide expanders such as espanso and InsertKit type into most apps where you can enter text, including terminals and editors. If expansions get in the way while coding, use a toggle key; in InsertKit, F4 pauses typed triggers on desktop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need a text expander if my editor has snippets?
&lt;/h3&gt;

&lt;p&gt;Not for code inside the editor. A system-wide expander covers everything else: PR descriptions, issue replies, chat messages and emails.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>opensource</category>
      <category>tooling</category>
      <category>textexpander</category>
    </item>
    <item>
      <title>Text Expander With Voice Typing: Why I Keep Snippets and Dictation in One App</title>
      <dc:creator>Al Amin</dc:creator>
      <pubDate>Fri, 23 Oct 2026 03:38:43 +0000</pubDate>
      <link>https://dev.to/alaminik/text-expander-with-voice-typing-why-i-keep-snippets-and-dictation-in-one-app-4h69</link>
      <guid>https://dev.to/alaminik/text-expander-with-voice-typing-why-i-keep-snippets-and-dictation-in-one-app-4h69</guid>
      <description>&lt;p&gt;For a long time I ran two separate apps: a text expander for the replies I send over and over, and a dictation tool for everything new. They worked, but they never talked to each other. Then I tried a text expander with voice typing built in, and my day got simpler. This post explains what that kind of tool is, the three ways to set one up, and how to pick.&lt;/p&gt;

&lt;p&gt;I compare TextExpander, Wispr Flow and InsertKit using only what each company publishes on its own site (I checked the pages on October 23, 2026). Prices and plans change, so check the pages again before you buy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a text expander with voice typing?
&lt;/h2&gt;

&lt;p&gt;A text expander saves text you use often, such as a sign-off, an address or a support reply, and inserts it when you type a short trigger like &lt;code&gt;/reply&lt;/code&gt;. Voice typing (dictation) turns what you say into text at your cursor.&lt;/p&gt;

&lt;p&gt;A text expander with voice typing does both from one app. You type a trigger for fixed text, you speak for new text, and ideally you can also call up a saved snippet by voice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why snippets and dictation belong together
&lt;/h2&gt;

&lt;p&gt;Most of what I write falls into two buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fixed text.&lt;/strong&gt; The same refund policy, the same booking link, the same "thanks, I'll get back to you" line. Snippets handle this well because the wording never changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New text.&lt;/strong&gt; The part of an email that answers this specific person, a quick Slack reply, notes after a call. Speaking is faster here because there is nothing to reuse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A real email is usually both: a few sentences I need to say fresh, plus a block I have written a hundred times. With two separate apps I kept switching modes. With one app I dictate the personal part and drop in the fixed part without leaving the text field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways to get a text expander with voice typing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: A text expander plus separate dictation
&lt;/h3&gt;

&lt;p&gt;This is the classic setup. TextExpander is a well-known example. According to its pricing page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Free plan includes 5 active snippets, with 1 snippet swap every 2 weeks, and new accounts get a 30-day preview of paid features.&lt;/li&gt;
&lt;li&gt;Pro is listed at $5 per user per month and Business at $10 per user per month, both billed annually.&lt;/li&gt;
&lt;li&gt;One account works across Mac, Windows, iPhone and iPad, and the Chrome extension.&lt;/li&gt;
&lt;li&gt;Paid plans add dynamic content such as date math, conditional sections in fill-ins and JavaScript snippets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did not see voice dictation listed on TextExpander's pricing page, so in this setup you pair it with the dictation built into your system or another app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: A dictation app that has snippets
&lt;/h3&gt;

&lt;p&gt;Wispr Flow comes at it from the voice side. Its features page describes snippets as voice shortcuts: you speak a cue, and Flow pastes the full text where you are typing. Its pricing page says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flow is free on Mac, Windows, iPhone and Android, with weekly usage limits on the free plan.&lt;/li&gt;
&lt;li&gt;The free plan includes speech-to-text in any app, 100+ languages, and a dictionary and snippets.&lt;/li&gt;
&lt;li&gt;Pro is listed at $15 per user per month on monthly billing and removes the limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you mostly speak and only need a handful of saved phrases, this is a strong option.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 3: One app built for both
&lt;/h3&gt;

&lt;p&gt;InsertKit, the app I use, treats snippets, voice typing and clipboard history as three equal parts of one app. You can type a trigger, speak, or say "insert" plus a snippet name, and it all works from the same snippet library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Text expander with voice typing: a quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;TextExpander&lt;/th&gt;
&lt;th&gt;Wispr Flow&lt;/th&gt;
&lt;th&gt;InsertKit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Typed snippet triggers&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Not listed on its features page&lt;/td&gt;
&lt;td&gt;Yes, with &lt;code&gt;/&lt;/code&gt; or &lt;code&gt;;&lt;/code&gt; prefixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice dictation&lt;/td&gt;
&lt;td&gt;Not listed on its pricing page&lt;/td&gt;
&lt;td&gt;Yes, 100+ languages&lt;/td&gt;
&lt;td&gt;Yes, 100+ languages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insert a snippet by voice&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;Yes, speak the cue&lt;/td&gt;
&lt;td&gt;Yes, say "insert" plus the snippet name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clipboard history&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;Yes, synced to your account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platforms&lt;/td&gt;
&lt;td&gt;Mac, Windows, iPhone and iPad, Chrome&lt;/td&gt;
&lt;td&gt;Mac, Windows, iPhone, Android&lt;/td&gt;
&lt;td&gt;Windows, macOS, Linux, Android, Chrome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free plan&lt;/td&gt;
&lt;td&gt;5 active snippets&lt;/td&gt;
&lt;td&gt;Weekly usage limits&lt;/td&gt;
&lt;td&gt;Daily voice limit on InsertKit Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"Not listed" means I could not find it on the pages I checked, not that it can never exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  How my combined workflow looks in practice
&lt;/h2&gt;

&lt;p&gt;Here is a normal client email, start to finish, in InsertKit on my desktop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I click into the email body and press the voice shortcut (Right Alt by default). A small pill near the cursor shows it is listening.&lt;/li&gt;
&lt;li&gt;I speak the personal part: "Hi Dana, thanks for sending the draft, I've gone through it and I have two small changes."&lt;/li&gt;
&lt;li&gt;Smart Formatting cleans up punctuation and filler words like "um", and it adapts the style to the app. In an email app it keeps a professional, warm tone. In a chat app like Slack it stays short and casual.&lt;/li&gt;
&lt;li&gt;For the fixed part I type &lt;code&gt;/reply&lt;/code&gt; and my saved paragraph about turnaround times appears. If I'd rather not touch the keyboard, I say "insert reply" instead, and InsertKit matches the snippet by its trigger or title.&lt;/li&gt;
&lt;li&gt;If I need something I copied an hour ago, I press Ctrl+Shift+Z (Cmd+Shift+Z on Mac). The popup has Clipboard, Snippets and Favorites tabs, so it doubles as a snippet picker.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A few details made the combination work better than two apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic snippets (desktop).&lt;/strong&gt; A snippet like &lt;code&gt;/meet&lt;/code&gt; can open a small form with fields for a client name and a date, then insert the finished message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variations.&lt;/strong&gt; One trigger can hold several versions, like a short and a long reply, and a picker lets you choose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom vocabulary.&lt;/strong&gt; I added client and product names, plus corrections like "insert kit" to "InsertKit". These sync to my account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice Assistant.&lt;/strong&gt; Saying "hey ik" followed by a request, like "hey ik write a polite reminder about the invoice", makes the AI write the answer straight into the text field.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When this setup is not the right fit
&lt;/h2&gt;

&lt;p&gt;To be fair, one app for everything is not always the answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You only need snippets with heavy logic.&lt;/strong&gt; If your team relies on JavaScript snippets or conditional fill-ins, TextExpander lists those on its paid plans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need meeting notes.&lt;/strong&gt; Wispr's pricing page includes a Notetaker for meetings on Mac and Windows. That is a different job from dictation and snippets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You work mainly on iPhone.&lt;/strong&gt; InsertKit's site lists Windows, Mac, Linux, Chrome and Android. Wispr Flow and TextExpander both list iPhone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to set up a text expander with voice typing in InsertKit
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install the app for your platform and sign in. The same account syncs your snippets, clipboard history and vocabulary across desktop, Android and the Chrome extension.&lt;/li&gt;
&lt;li&gt;On macOS, grant Accessibility (for pasting) and Input Monitoring (for detecting triggers as you type). The app shows a banner with buttons that open the right System Settings page.&lt;/li&gt;
&lt;li&gt;Create three or four snippets for the text you type most. Use a slash style like &lt;code&gt;/reply&lt;/code&gt;, &lt;code&gt;/addr&lt;/code&gt; or &lt;code&gt;/thanks&lt;/code&gt;. The Templates library has ready-made ones if you'd rather not start from zero.&lt;/li&gt;
&lt;li&gt;Turn on Voice Typing and test your microphone on the Voice Typing page.&lt;/li&gt;
&lt;li&gt;Add the names and terms you say often to Custom Vocabulary.&lt;/li&gt;
&lt;li&gt;Try saying "insert" plus one of your snippet names, so you get used to both paths.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can start on the free plan. The pricing page lists a free plan covering snippets, voice and clipboard with no credit card, a daily voice limit on InsertKit Free, and credits for InsertKit Premium. You can compare the details on &lt;a href="https://insertkit.com/pricing" rel="noopener noreferrer"&gt;InsertKit's plans for text expansion and voice typing&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can a text expander do voice typing?
&lt;/h3&gt;

&lt;p&gt;Some can. A classic text expander only expands typed triggers. A text expander with voice typing adds dictation, so you can speak new text and insert saved snippets from the same app. InsertKit does both on Windows, macOS, Linux, Android and in its Chrome extension.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use voice commands to insert text snippets?
&lt;/h3&gt;

&lt;p&gt;Yes, in apps that support it. In InsertKit you say the call name "insert" plus the snippet name, for example "insert greeting", and the snippet is pasted. You can change the call name. Wispr Flow's snippets also work by speaking a cue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does voice typing work offline?
&lt;/h3&gt;

&lt;p&gt;On desktop, InsertKit has a Local Offline (Whisper) option that runs on your computer, so your audio stays on the device in that mode. It is not available on Android. Cloud providers process audio online.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many languages does voice typing support?
&lt;/h3&gt;

&lt;p&gt;InsertKit voice typing supports 100+ languages, plus auto-detect. Wispr Flow also lists 100+ languages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a dictation app with snippets the same thing?
&lt;/h3&gt;

&lt;p&gt;Close, but the starting point differs. A dictation app with snippets is voice-first, with saved phrases you call by voice. A text expander with voice typing also gives you typed triggers, fill-in forms and a snippet library you can use with or without speaking.&lt;/p&gt;

&lt;p&gt;If you juggle a text expander and a separate dictation tool, try one week with a single app for both.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tools</category>
      <category>speechtotext</category>
      <category>writing</category>
    </item>
    <item>
      <title>How to Set Up Paid Client Calls with TidyCal (One-Time $29 Lifetime Deal)</title>
      <dc:creator>Al Amin</dc:creator>
      <pubDate>Thu, 22 Oct 2026 21:02:31 +0000</pubDate>
      <link>https://dev.to/alaminik/how-to-set-up-paid-client-calls-with-tidycal-one-time-29-lifetime-deal-2mlk</link>
      <guid>https://dev.to/alaminik/how-to-set-up-paid-client-calls-with-tidycal-one-time-29-lifetime-deal-2mlk</guid>
      <description>&lt;p&gt;Freelance developers spend a surprising amount of time on things that are not code. Booking discovery calls, chasing payment for a consulting hour, rescheduling over email. A booking link with payment built in removes most of that.&lt;/p&gt;

&lt;p&gt;This guide covers setting up that workflow with TidyCal, a scheduling tool sold on AppSumo as a &lt;strong&gt;lifetime deal&lt;/strong&gt;: a one-time payment instead of a monthly subscription. The current offer is on the &lt;a href="https://appsumo.8odi.net/MKxOeJ" rel="noopener noreferrer"&gt;TidyCal AppSumo deal page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a booking tool for freelance work
&lt;/h2&gt;

&lt;p&gt;A typical freelance week has a few kinds of calls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free 15–30 minute discovery calls with new leads&lt;/li&gt;
&lt;li&gt;Paid consulting or code review sessions&lt;/li&gt;
&lt;li&gt;Recurring check-ins with retainer clients&lt;/li&gt;
&lt;li&gt;The occasional group session or workshop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TidyCal supports one-on-one, group and recurring booking types, so all of these can live behind one link. The product page sums up the flow: "Share one link. Clients pick a time, pay if you charge, and it lands on your calendar."&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: Pick the right tier
&lt;/h2&gt;

&lt;p&gt;Both tiers are lifetime access with a single payment.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Individual&lt;/th&gt;
&lt;th&gt;Agency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;$29 once (regular $144)&lt;/td&gt;
&lt;td&gt;$79 once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team members&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;You + 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrated calendars&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reminders&lt;/td&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Email + 10 SMS/mo (US &amp;amp; Canada)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bookings per month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform fee on paid bookings&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team booking page / collective / round-robin&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom domain &amp;amp; no branding&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A solo freelancer is usually covered by Individual. A small dev shop where leads should go to whoever is free will want Agency for round-robin meetings.&lt;/p&gt;

&lt;p&gt;Deal terms to keep in mind: activate within 60 days of purchase, upgrades between the two tiers are allowed while the deal is live, downgrades within 60 days, and the deal is only for users who do not already have a paid TidyCal account. AppSumo's 60-day money-back guarantee applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Connect your calendars
&lt;/h2&gt;

&lt;p&gt;TidyCal syncs with Google Calendar, Outlook Calendar and iCloud Calendar, with up to 10 integrated calendars on either plan. Connect every calendar that holds real commitments (work, personal, a client's shared calendar) so conflicts get blocked automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Set availability, buffers and limits
&lt;/h2&gt;

&lt;p&gt;Under availability, set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Working hours&lt;/strong&gt; for when calls can be booked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buffer time&lt;/strong&gt; between meetings so a call that runs over does not eat the next one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Booking limits&lt;/strong&gt; so a single day does not fill with calls when there is code to ship&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These three settings matter more than anything else for protecting focus time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Create your booking types
&lt;/h2&gt;

&lt;p&gt;A sensible starting set:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discovery call&lt;/strong&gt; — free, 20 minutes, one-on-one, Google Meet or Zoom link attached&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paid consultation&lt;/strong&gt; — 60 minutes, one-on-one, payment required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retainer check-in&lt;/strong&gt; — recurring weekly booking for ongoing clients&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workshop&lt;/strong&gt; — group booking for a small cohort&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;TidyCal allows unlimited booking types and can attach Zoom, Google Meet or Teams links.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Turn on payments
&lt;/h2&gt;

&lt;p&gt;Connect Stripe or PayPal. Paid booking types then collect payment when the client books, so there is no invoice to chase afterwards.&lt;/p&gt;

&lt;p&gt;Beyond single sessions, TidyCal lets you sell &lt;strong&gt;packages&lt;/strong&gt; (for example, a bundle of sessions) and &lt;strong&gt;subscriptions&lt;/strong&gt;, and you can create &lt;strong&gt;coupon codes&lt;/strong&gt; for repeat clients or launches.&lt;/p&gt;

&lt;p&gt;Factor in the cost: there is a &lt;strong&gt;1% platform fee on paid bookings, on top of Stripe or PayPal fees&lt;/strong&gt;. The page notes the separate Pro plan has no platform fee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Make the page and emails yours
&lt;/h2&gt;

&lt;p&gt;Pick a page style, add your logo and colors, and write custom confirmation and reminder emails. Good confirmation emails cut down on no-shows and pre-call questions. Include what the client should prepare, such as a repo link or a short project brief.&lt;/p&gt;

&lt;p&gt;One thing that will not change on the lifetime tiers: a "Powered by TidyCal" bar stays at the bottom of the booking page. Custom domain and no-branding are not part of either tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Collect reviews automatically
&lt;/h2&gt;

&lt;p&gt;TidyCal can request a review after each completed booking and show reviews on the booking page, with a verified review history. For freelancers, social proof on the same page where someone books is useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Wire it into the rest of your stack
&lt;/h2&gt;

&lt;p&gt;Integrations listed include Zapier, Google Analytics, Stripe, PayPal, Zoom and Google Meet. With Zapier, a new booking can trigger things like adding the client to a CRM or creating a task. Google Analytics shows how many visitors reach the booking page versus how many book.&lt;/p&gt;

&lt;p&gt;Other options worth knowing about: CC others on bookings (useful when a client's PM wants to be in the loop), custom reply-to on the Agency plan, translation in 30+ locales, and AI features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to put the link
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Your portfolio site's contact page&lt;/li&gt;
&lt;li&gt;GitHub profile README&lt;/li&gt;
&lt;li&gt;Email signature&lt;/li&gt;
&lt;li&gt;The "contact" section of proposals&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What reviewers on AppSumo mention
&lt;/h2&gt;

&lt;p&gt;TidyCal holds a 4.3 rating from 936 reviews on AppSumo. Support comes up often. Reviewer &lt;strong&gt;asya17&lt;/strong&gt; wrote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I reached out with an issue, and Luka Belik, Customer Experience Manager, was phenomenal. His instructions were clear, specific, and incredibly easy to follow. I made the exact updates he recommended, tested everything, and it worked perfectly."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is also a useful warning from reviewer &lt;strong&gt;andres099&lt;/strong&gt;, who upgraded tiers and later posted an update:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"UPDATE: I reached out to support and a couple of hours later received an email stating that issue was resolved. Turns out it was just a bug."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Their advice for anyone upgrading: "Just make sure if all your features are there if you're upgrading for some reason."&lt;/p&gt;

&lt;h2&gt;
  
  
  Things to double-check
&lt;/h2&gt;

&lt;p&gt;Deal details can change, so &lt;a href="https://appsumo.8odi.net/MKxOeJ" rel="noopener noreferrer"&gt;verify every detail on the sale page&lt;/a&gt; before purchasing, especially the current price, the tier features and the activation window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;For a freelancer, the workflow is simple: one link, clear availability, payment taken up front, reviews collected automatically. TidyCal handles that for a one-time $29 (Individual) or $79 (Agency), with the trade-offs of a 1% fee on paid bookings and a visible TidyCal bar.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://appsumo.8odi.net/MKxOeJ" rel="noopener noreferrer"&gt;check out the TidyCal lifetime deal here&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: This post contains an affiliate link. A commission may be earned if you purchase through it, at no extra cost to you.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelancing</category>
      <category>productivity</category>
      <category>tools</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Text Expander With Multiple Variations: Canned Replies for GitHub Issues That Don't Read Like a Bot</title>
      <dc:creator>Al Amin</dc:creator>
      <pubDate>Thu, 22 Oct 2026 06:45:46 +0000</pubDate>
      <link>https://dev.to/alaminik/text-expander-with-multiple-variations-canned-replies-for-github-issues-that-dont-read-like-a-bot-1697</link>
      <guid>https://dev.to/alaminik/text-expander-with-multiple-variations-canned-replies-for-github-issues-that-dont-read-like-a-bot-1697</guid>
      <description>&lt;p&gt;If you maintain a project, work in devrel or sit in a support rotation, you already know the problem a text expander with multiple variations solves. The same five questions arrive every week, and the same canned reply pasted under each of them starts to look like a bot wrote it. People notice. A reporter who gets the identical "please provide a minimal reproduction" block that was posted on the last forty issues feels processed, not helped.&lt;/p&gt;

&lt;p&gt;This post is about a small change that made my canned replies feel human again: keeping several versions of a reply under one shortcut, and choosing the right one at the moment I need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with one canned reply per situation
&lt;/h2&gt;

&lt;p&gt;Most of us start with a flat list. One snippet for "needs repro", one for "duplicate", one for "thanks for the PR". It works for a while. Then you notice three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The tone is wrong half the time.&lt;/strong&gt; A first-time contributor and a long-time maintainer from another project should not get the same wording.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The length is wrong the other half.&lt;/strong&gt; Sometimes a one-liner is enough. Sometimes the person needs the full checklist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You end up with trigger sprawl.&lt;/strong&gt; You create &lt;code&gt;/repro&lt;/code&gt;, &lt;code&gt;/repro-short&lt;/code&gt;, &lt;code&gt;/repro-new&lt;/code&gt;, &lt;code&gt;/repro-firm&lt;/code&gt;, and then forget which ones exist.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What I wanted was one shortcut per situation, with the variants living behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What snippet variations are: multiple replies behind one shortcut
&lt;/h2&gt;

&lt;p&gt;Snippet variations means one trigger holds several items, and each item has a label and its own content. In InsertKit, which is the tool I use for this, the flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I type the trigger, for example &lt;code&gt;/repro&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Instead of inserting text immediately, a &lt;strong&gt;Choose variation&lt;/strong&gt; picker opens. It shows the trigger, the snippet title, and how many options are available, with numbered items that each show a label and a preview.&lt;/li&gt;
&lt;li&gt;I move with the arrow keys, press Enter or Tab to insert the one I want, or Esc to cancel. A small counter shows where I am, like "2 / 4".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The important detail for this use case: you choose. It is not a random rotation. That matters because the goal isn't to fool anyone with shuffled wording. The goal is to pick the reply that actually fits the person and the situation, without retyping it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I structure variations for issues, reviews and community questions
&lt;/h2&gt;

&lt;p&gt;The trick is to label variations by &lt;em&gt;who&lt;/em&gt; or &lt;em&gt;how much&lt;/em&gt;, not by a vague number. When the picker opens, the labels are what you scan, so make them obvious.&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue triage: &lt;code&gt;/repro&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;First-timer, friendly&lt;/strong&gt;: thanks them for the report, explains what a minimal reproduction is, and points to the issue template.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regular contributor, short&lt;/strong&gt;: "Could you add a minimal repro? Happy to dig in once we can reproduce it."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale, closing soon&lt;/strong&gt;: a polite note that the issue will be closed if no repro arrives, with a clear way to reopen it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can't reproduce on main&lt;/strong&gt;: asks for version, OS and the exact steps they ran.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Code review: &lt;code&gt;/review&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nit, non-blocking&lt;/strong&gt;: makes it clear the comment is optional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Needs tests&lt;/strong&gt;: asks for a test that covers the change, with a note on where similar tests live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope too large&lt;/strong&gt;: suggests splitting the PR and offers to review the first part quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approve with thanks&lt;/strong&gt;: a short, warm approval for first contributions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community questions: &lt;code&gt;/faq-install&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short answer&lt;/strong&gt;: two lines and the docs section name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long answer&lt;/strong&gt;: full install steps for people who are clearly stuck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Known issue&lt;/strong&gt;: acknowledges the bug, explains the workaround, and says where progress is tracked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three shortcuts, eleven replies. I only remember &lt;code&gt;/repro&lt;/code&gt;, &lt;code&gt;/review&lt;/code&gt; and &lt;code&gt;/faq-install&lt;/code&gt;; the labels do the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making a picked variation still sound like you
&lt;/h2&gt;

&lt;p&gt;Variations get you most of the way. A few habits close the gap between "template" and "reply":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Leave one sentence open.&lt;/strong&gt; End the template where a personal line naturally goes, then type one specific sentence about their issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write variations in your real voice.&lt;/strong&gt; If you'd never say "We appreciate your patience" out loud, don't save it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep them short.&lt;/strong&gt; Long canned replies are the ones that feel automated. Link to docs by section name instead of pasting the whole page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Variations vs. dynamic snippets: pick one per snippet
&lt;/h2&gt;

&lt;p&gt;InsertKit also has &lt;strong&gt;dynamic snippets&lt;/strong&gt; on desktop: you add fields like a text input, a dropdown or a date, and typing the trigger opens a small form, then your values replace placeholders such as &lt;code&gt;{{username}}&lt;/code&gt; in the content. That's useful when the reply is the same but the details change, like a release note with a version and a date.&lt;/p&gt;

&lt;p&gt;A snippet can't be both at once. In the snippet editor, the &lt;strong&gt;Snippet variations&lt;/strong&gt; and &lt;strong&gt;Dynamic&lt;/strong&gt; switches can't be on together, so I decide per snippet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Different wording or length&lt;/strong&gt; for the same situation: variations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same wording, different values&lt;/strong&gt;: dynamic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For triage replies I almost always want variations, because the tone is what changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the shortcut works
&lt;/h2&gt;

&lt;p&gt;Because it runs system-wide on Windows, macOS and Linux, the same &lt;code&gt;/repro&lt;/code&gt; works in the GitHub web UI, a Discord or Slack message, an email to a user, or a text field in my editor. Variations also work in the Android app and the Chrome extension, so I can answer from my phone with the same set.&lt;/p&gt;

&lt;p&gt;A few practical notes from using it as a developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Slash-command apps.&lt;/strong&gt; Discord and Slack use &lt;code&gt;/&lt;/code&gt; for their own commands. A trigger saved as &lt;code&gt;/repro&lt;/code&gt; also works with any other prefix you enable under Settings, Snippets, Trigger Prefixes, so you can switch prefixes for those apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pausing while coding.&lt;/strong&gt; On desktop, F4 toggles all snippets off and on. I press it before long coding sessions so nothing expands mid-identifier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharing with a team.&lt;/strong&gt; Snippets can be Private or shared with your team, which helps when several people triage the same repo and you want consistent but not identical wording.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you also answer by voice, the same app does voice typing in 100+ languages, but that's a separate topic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this compares with other ways of keeping canned replies
&lt;/h2&gt;

&lt;p&gt;GitHub has its own saved replies, and I still use them for things that only live on GitHub. According to GitHub's docs they work in issues, pull requests and discussions, are tied to your personal account, and you can create up to 100. The limit for me was that they stay inside GitHub.&lt;/p&gt;

&lt;p&gt;If you're looking for an espanso alternative with a GUI, it's worth knowing what espanso does here, since it's a capable open-source tool. Per espanso's docs, if several matches share one trigger it shows a selection dialog (they call it match disambiguation), it has a Choice extension for picking from a list, and a Random extension that picks one replacement at random. All of that is configured in YAML files. If you like editing config, that's a solid setup.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Where it works&lt;/th&gt;
&lt;th&gt;How you pick a version&lt;/th&gt;
&lt;th&gt;How you set it up&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub saved replies&lt;/td&gt;
&lt;td&gt;Issues, PRs and discussions on GitHub&lt;/td&gt;
&lt;td&gt;Choose from your saved list&lt;/td&gt;
&lt;td&gt;Web settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;espanso&lt;/td&gt;
&lt;td&gt;System-wide&lt;/td&gt;
&lt;td&gt;Selection dialog for shared triggers, or random&lt;/td&gt;
&lt;td&gt;YAML config files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InsertKit variations&lt;/td&gt;
&lt;td&gt;System-wide on desktop, plus Android and Chrome&lt;/td&gt;
&lt;td&gt;Choose variation picker with labels and previews&lt;/td&gt;
&lt;td&gt;GUI snippet editor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I went the GUI route: I wanted to edit replies in a form, see labels and previews when choosing, and have the same snippets on my phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up your first variation snippet
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open InsertKit and go to &lt;strong&gt;Snippets&lt;/strong&gt;, then &lt;strong&gt;Add Snippet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set a trigger such as &lt;code&gt;/repro&lt;/code&gt; and a clear title like "Needs reproduction".&lt;/li&gt;
&lt;li&gt;Turn on the &lt;strong&gt;Snippet variations&lt;/strong&gt; switch.&lt;/li&gt;
&lt;li&gt;Add items, each with a label ("First-timer, friendly", "Regular, short") and the reply text.&lt;/li&gt;
&lt;li&gt;Pick a category like "Triage" so it's easy to filter later, and choose Private or Teams.&lt;/li&gt;
&lt;li&gt;Save, open any issue, and type &lt;code&gt;/repro&lt;/code&gt;. The picker opens; choose and insert.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want to try it, you can &lt;a href="https://insertkit.com/download" rel="noopener noreferrer"&gt;download InsertKit&lt;/a&gt; for desktop and add your first variation snippet in a few minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is a text expander with multiple variations?
&lt;/h3&gt;

&lt;p&gt;It's a text expander where one shortcut holds several versions of a snippet. When you type the shortcut, you choose which version to insert instead of always getting the same text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does InsertKit pick a variation at random?
&lt;/h3&gt;

&lt;p&gt;No. When you type the trigger, a Choose variation picker opens with numbered, labeled items and previews. You select one with the arrow keys and Enter or Tab, or cancel with Esc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use snippet variations for canned replies on GitHub issues?
&lt;/h3&gt;

&lt;p&gt;Yes. The desktop app expands snippets system-wide, so a trigger like &lt;code&gt;/repro&lt;/code&gt; works in GitHub's comment box in the browser, as well as in chat apps, email and editors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can one snippet have both variations and fill-in fields?
&lt;/h3&gt;

&lt;p&gt;No. In InsertKit a snippet uses either variations or dynamic fields, not both. Use variations when the wording changes and dynamic snippets when only the details change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do variations work on Android?
&lt;/h3&gt;

&lt;p&gt;Yes. When you type the full trigger on Android, a picker appears so you can choose which item to insert. Dynamic fill-in forms are a desktop feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if an app already uses the slash key for commands?
&lt;/h3&gt;

&lt;p&gt;You can enable other trigger prefixes in Settings, and a trigger saved with a slash also works with any enabled prefix. On desktop you can also press F4 to turn snippets off temporarily.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>productivity</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Voice Typing on Linux: How to Dictate Into Any App on X11 and Wayland</title>
      <dc:creator>Al Amin</dc:creator>
      <pubDate>Wed, 21 Oct 2026 06:43:38 +0000</pubDate>
      <link>https://dev.to/alaminik/voice-typing-on-linux-how-to-dictate-into-any-app-on-x11-and-wayland-3hgd</link>
      <guid>https://dev.to/alaminik/voice-typing-on-linux-how-to-dictate-into-any-app-on-x11-and-wayland-3hgd</guid>
      <description>&lt;p&gt;Voice typing on Linux has always been a bit of a DIY project. On Windows you press Win+H, on macOS you tap the dictation key, and on most Linux desktops you go looking for a Python script, a Whisper model, and a way to get the text into the window you're actually using.&lt;/p&gt;

&lt;p&gt;This post explains what a working voice typing setup on Linux needs, why X11 and Wayland behave differently, and how I set it up with a GUI app instead of gluing scripts together. It's written for people who want dictation in a terminal, an editor, a browser, and a chat app, not just inside one program.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "voice typing on Linux" actually requires
&lt;/h2&gt;

&lt;p&gt;Speech-to-text is only half the job. A usable setup has three parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt;: record from the right microphone, and know when to stop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transcribe&lt;/strong&gt;: turn audio into text, either with a local model (such as Whisper) or a cloud API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insert&lt;/strong&gt;: put the text where your cursor is, in whatever app has focus.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most homemade setups get the first two working quickly. The third part is where Linux gets tricky, because it depends on your display server.&lt;/p&gt;

&lt;h2&gt;
  
  
  X11 vs Wayland: why inserting text is the hard part
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;X11&lt;/strong&gt;, any program can send synthetic keystrokes or paste into the focused window. Tools like &lt;code&gt;xdotool&lt;/code&gt; do this, which is why older dictation scripts "just work" on X11 sessions.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;Wayland&lt;/strong&gt;, apps are isolated from each other by design. A random program can't type into another window the way it could on X11. To insert text you need a tool that the compositor allows, such as &lt;code&gt;wtype&lt;/code&gt; (on compositors that support the virtual keyboard protocol) or &lt;code&gt;ydotool&lt;/code&gt; (which works at the input-device level and usually needs extra permissions).&lt;/p&gt;

&lt;p&gt;So if a dictation tool works on your laptop but not on a colleague's, the first thing to check is &lt;code&gt;echo $XDG_SESSION_TYPE&lt;/code&gt;. If it says &lt;code&gt;wayland&lt;/code&gt;, the insertion method is probably the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local Whisper vs cloud speech-to-text
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Local (offline) Whisper&lt;/th&gt;
&lt;th&gt;Cloud speech API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Internet needed&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where audio goes&lt;/td&gt;
&lt;td&gt;Stays on your machine&lt;/td&gt;
&lt;td&gt;Sent to the provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup&lt;/td&gt;
&lt;td&gt;Download a model once&lt;/td&gt;
&lt;td&gt;Sign in or add an API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Depends on your CPU/GPU and model size&lt;/td&gt;
&lt;td&gt;Depends on your connection and the provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Good for&lt;/td&gt;
&lt;td&gt;Private notes, offline work, sensitive text&lt;/td&gt;
&lt;td&gt;Weaker hardware, quick setup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Model size is the main trade-off for local dictation. Small models download fast and run on modest hardware; larger models are heavier and usually more accurate. Try a small one first and move up only if the results aren't good enough for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  A GUI setup: voice typing on Linux with InsertKit
&lt;/h2&gt;

&lt;p&gt;I use &lt;a href="https://insertkit.com/" rel="noopener noreferrer"&gt;InsertKit, a voice typing and text expander app&lt;/a&gt;, which ships Linux builds as &lt;code&gt;.AppImage&lt;/code&gt;, &lt;code&gt;.deb&lt;/code&gt; and &lt;code&gt;.rpm&lt;/code&gt;. It runs in the system tray and inserts text at the cursor in most apps where you can type: terminals, VS Code, browsers, Slack, and so on.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install and check dependencies
&lt;/h3&gt;

&lt;p&gt;After installing, open &lt;strong&gt;Settings → General → Linux Dependencies&lt;/strong&gt;. It checks for &lt;code&gt;xdotool&lt;/code&gt;, &lt;code&gt;wtype&lt;/code&gt; and &lt;code&gt;maim&lt;/code&gt;. On Wayland, the tips point you to &lt;code&gt;wtype&lt;/code&gt; or &lt;code&gt;ydotool&lt;/code&gt;. On Debian or Ubuntu, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;xdotool wtype
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Pick a speech engine
&lt;/h3&gt;

&lt;p&gt;In the &lt;strong&gt;Speech Engine&lt;/strong&gt; panel you can choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;InsertKit Free&lt;/strong&gt;: hosted models with a daily limit. You just sign in; no API key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;InsertKit Premium&lt;/strong&gt;: premium hosted models that use credits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Offline (Whisper)&lt;/strong&gt;: runs fully on your computer with no internet. Models download inside the app: Tiny (~75 MB), Base (~140 MB), Small (~460 MB), Medium (~1.5 GB) and Large v3 (~3 GB).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring your own key&lt;/strong&gt;: OpenAI, Groq, OpenRouter, Deepgram, AssemblyAI or ElevenLabs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If privacy is the reason you're on Linux in the first place, Local Offline is the mode to pick: in that mode your audio doesn't leave the machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Dictate
&lt;/h3&gt;

&lt;p&gt;Click into any text field, press the activation shortcut (default &lt;strong&gt;Right Alt / AltGr&lt;/strong&gt;), and speak. A small pill near the cursor shows LIVE while it listens and THINK while it transcribes. Press the shortcut again to stop, or just stop talking: auto-stop after silence is on by default (5 seconds, adjustable to 2, 3, 8 or 10, or off).&lt;/p&gt;

&lt;p&gt;Long dictation is split into chunks at natural pauses and transcribed while you keep talking, so a long paragraph doesn't arrive all at once at the end.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Let formatting match the app
&lt;/h3&gt;

&lt;p&gt;With &lt;strong&gt;Smart Formatting&lt;/strong&gt; on, the text is cleaned up (punctuation, filler words like "um") and the style adapts to the app you're in. In VS Code, vim or a terminal it uses a code-comment style, and spoken identifiers become camelCase or snake_case. In a chat app it stays short and casual. If the AI step can't be reached, the raw transcript is still pasted, so you don't lose what you said.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Teach it your words
&lt;/h3&gt;

&lt;p&gt;Linux work is full of words speech models get wrong: &lt;code&gt;kubectl&lt;/code&gt;, &lt;code&gt;systemd&lt;/code&gt;, &lt;code&gt;nginx&lt;/code&gt;, your project names. In the &lt;strong&gt;Vocabulary&lt;/strong&gt; tab you can add hint words, and add corrections like "when heard as &lt;em&gt;engine x&lt;/em&gt;, write as &lt;em&gt;nginx&lt;/em&gt;". Corrections are applied before and after formatting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Voice typing plus snippets
&lt;/h2&gt;

&lt;p&gt;Because the same app is also a text expander, you can mix the two. Save a snippet with a trigger like &lt;code&gt;/standup&lt;/code&gt;, type it in any app, and the full template appears. Or say "insert standup" while dictating and the snippet is pasted by voice. Press &lt;strong&gt;F4&lt;/strong&gt; to pause all snippets when you don't want &lt;code&gt;/&lt;/code&gt; triggers firing, for example in a terminal session.&lt;/p&gt;

&lt;p&gt;Pricing is simple: there's a free tier, and paid plans start at $2.99/month. Voice typing supports 100+ languages with auto-detect.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is there voice typing built into Linux?&lt;/strong&gt;&lt;br&gt;
Most Linux desktops don't ship system-wide dictation the way Windows (Win+H) and macOS do. You usually add it with a separate app or script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use Whisper for dictation on Linux offline?&lt;/strong&gt;&lt;br&gt;
Yes. Whisper models can run locally. In InsertKit, choose Local Offline (Whisper), download a model, and dictation works without an internet connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does my dictation tool work on X11 but not Wayland?&lt;/strong&gt;&lt;br&gt;
Wayland doesn't let apps type into other windows freely. You need a compositor-supported tool such as &lt;code&gt;wtype&lt;/code&gt;, or &lt;code&gt;ydotool&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does voice typing work in the terminal?&lt;/strong&gt;&lt;br&gt;
With a system-wide app, yes: text is inserted wherever the cursor is, including terminal emulators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need an API key?&lt;/strong&gt;&lt;br&gt;
No. InsertKit Free and Premium need no key. Keys are optional if you want to use your own OpenAI, Groq or other account.&lt;/p&gt;

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

&lt;p&gt;A good Linux dictation setup comes down to three questions: where transcription happens (local or cloud), how text gets into the focused window (X11 or Wayland tooling), and whether the output fits what you're writing. Sort those out and voice typing on Linux stops being a weekend project and becomes something you reach for daily.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>productivity</category>
      <category>wayland</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Text Expander for Developers: Reusable PR Descriptions, Bug Reports and Code Review Replies with Slash Triggers</title>
      <dc:creator>Al Amin</dc:creator>
      <pubDate>Tue, 20 Oct 2026 06:05:51 +0000</pubDate>
      <link>https://dev.to/alaminik/text-expander-for-developers-reusable-pr-descriptions-bug-reports-and-code-review-replies-with-4i4b</link>
      <guid>https://dev.to/alaminik/text-expander-for-developers-reusable-pr-descriptions-bug-reports-and-code-review-replies-with-4i4b</guid>
      <description>&lt;p&gt;Most developers I know already have a text expander habit, even if they don't call it that: a pinned note with a PR template, a gist of "polite no" review comments, a bug report skeleton buried in a wiki. The problem is the friction. Open the note, find the right block, copy, switch back, paste, fix the placeholders.&lt;/p&gt;

&lt;p&gt;A text expander for developers removes that loop. You type a short trigger like &lt;code&gt;/pr&lt;/code&gt;, and the full template appears in whatever you're typing in. This post covers the snippets I find worth saving, how to structure them, and how I set them up in InsertKit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why slash triggers work well for code-adjacent writing
&lt;/h2&gt;

&lt;p&gt;A trigger is only useful if you never type it by accident. Plain words like &lt;code&gt;reply&lt;/code&gt; show up in normal sentences, so I start every trigger with a slash: &lt;code&gt;/pr&lt;/code&gt;, &lt;code&gt;/bug&lt;/code&gt;, &lt;code&gt;/lgtm&lt;/code&gt;. A slash almost never starts a word in prose, and it's easy to remember as "this is a shortcut".&lt;/p&gt;

&lt;p&gt;A few habits that help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short and consistent.&lt;/strong&gt; &lt;code&gt;/pr&lt;/code&gt;, &lt;code&gt;/bug&lt;/code&gt;, &lt;code&gt;/nit&lt;/code&gt;, &lt;code&gt;/ty&lt;/code&gt;. If you have to think about the trigger, you won't use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group by prefix idea.&lt;/strong&gt; Use &lt;code&gt;/rev-&lt;/code&gt; for review replies, &lt;code&gt;/bug-&lt;/code&gt; for issue templates, so autocomplete narrows them down as you type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One job per snippet.&lt;/strong&gt; Small snippets compose better than one giant template.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Snippet 1: a pull request description
&lt;/h2&gt;



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

&lt;span class="gu"&gt;## Why&lt;/span&gt;
Context, ticket or issue link: 

&lt;span class="gu"&gt;## How to test&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; 
&lt;span class="p"&gt;2.&lt;/span&gt; 

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

&lt;/div&gt;



&lt;p&gt;Save this under &lt;code&gt;/pr&lt;/code&gt;. In InsertKit you can turn a snippet into a dynamic one, so typing &lt;code&gt;/pr&lt;/code&gt; opens a small form where you fill in fields like the summary, and the rest of the template is inserted around your answers. Placeholders are written as &lt;code&gt;{{variable}}&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snippet 2: a bug report that people can actually act on
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**Summary**&lt;/span&gt;
One sentence describing what's wrong.

&lt;span class="gs"&gt;**Steps to reproduce**&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; 
&lt;span class="p"&gt;2.&lt;/span&gt; 
&lt;span class="p"&gt;3.&lt;/span&gt; 

&lt;span class="gs"&gt;**Expected behavior**&lt;/span&gt;

&lt;span class="gs"&gt;**Actual behavior**&lt;/span&gt;

&lt;span class="gs"&gt;**Environment**&lt;/span&gt;
OS / browser / app version:

&lt;span class="gs"&gt;**Logs or screenshots**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trigger: &lt;code&gt;/bug&lt;/code&gt;. The value isn't the template itself. It's that you stop skipping the "Environment" section when you're tired and in a hurry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snippet 3: code review replies
&lt;/h2&gt;

&lt;p&gt;Review comments are repetitive, and tone matters. Having the wording ready helps you stay kind and clear when you have thirty files to go through.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/nit&lt;/code&gt; → &lt;code&gt;Nit (non-blocking):&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/lgtm&lt;/code&gt; → &lt;code&gt;Looks good to me. Thanks for the clear description and tests.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/q&lt;/code&gt; → &lt;code&gt;Could you add a bit of context on why this approach was chosen over the alternatives? Happy to approve once I understand the trade-off.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/split&lt;/code&gt; → &lt;code&gt;This PR is doing a few things at once. Could we split it so each part can be reviewed and reverted on its own?&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you like to vary the wording by situation, InsertKit's snippet variations let one trigger hold several versions, each with a label. Type the trigger and a small picker opens so you can choose between, for example, a short and a longer version of the same reply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snippet 4: the small stuff you retype constantly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/sig&lt;/code&gt; for your email signature&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/repo&lt;/code&gt; for a repository or docs link&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/standup&lt;/code&gt; for a daily update skeleton&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/today&lt;/code&gt; using the built-in &lt;code&gt;{{date}}&lt;/code&gt; variable for notes and changelogs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Variables like &lt;code&gt;{{date}}&lt;/code&gt;, &lt;code&gt;{{time}}&lt;/code&gt; and &lt;code&gt;{{myName}}&lt;/code&gt; are built in, so you don't need to type them each time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting it up in InsertKit
&lt;/h2&gt;

&lt;p&gt;I use &lt;a href="https://insertkit.com/download" rel="noopener noreferrer"&gt;a text expander for developers that works on desktop and mobile&lt;/a&gt; called InsertKit. It runs on Windows, macOS and Linux, with an Android app and a Chrome extension (iOS is planned for later). Here is the workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the app and sign in. Snippets sync to your account, so they follow you across devices.&lt;/li&gt;
&lt;li&gt;Create a snippet, give it a trigger such as &lt;code&gt;/pr&lt;/code&gt;, and paste your template.&lt;/li&gt;
&lt;li&gt;Optionally add a category (for example "Code review") so the list stays tidy.&lt;/li&gt;
&lt;li&gt;Type the trigger in any text field. The snippet fires as soon as the full trigger is typed, no Space or Enter needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A few details that matter for developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autocomplete popup.&lt;/strong&gt; Type &lt;code&gt;/&lt;/code&gt; and a small list of matching snippets appears at your cursor. Arrow keys to move, Tab or Enter to insert, Esc to close.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefix settings.&lt;/strong&gt; Some apps use &lt;code&gt;/&lt;/code&gt; for their own commands (Slack, Discord and Notion do). In Settings you can switch which prefixes are active, such as using &lt;code&gt;;&lt;/code&gt; instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A global on/off key.&lt;/strong&gt; The default is F4. Handy when you're about to type something where expansion would get in the way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams.&lt;/strong&gt; Snippets can be Private or shared with a team, so your PR template can live in one place for everyone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the expansion happens system-wide, the same &lt;code&gt;/pr&lt;/code&gt; works in the GitHub web UI, a Slack message, or a text field in your editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: dictate the first draft, expand the rest
&lt;/h2&gt;

&lt;p&gt;InsertKit also has voice typing in 100+ languages, and I sometimes combine the two. I dictate the free-form part of a bug report ("what I saw, what I expected") and let the &lt;code&gt;/bug&lt;/code&gt; snippet provide the structure. It's optional, but it's a nice fit when typing long explanations feels tedious.&lt;/p&gt;

&lt;h2&gt;
  
  
  A starter set to copy this week
&lt;/h2&gt;

&lt;p&gt;If you want to try the idea without overthinking it, start with five snippets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/pr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pull request description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/bug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bug report skeleton&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/nit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Non-blocking review comment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/lgtm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Approval reply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/standup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Daily update&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use them for a week, then add one new snippet each time you catch yourself typing the same thing twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need a text expander if my editor already has snippets?&lt;/strong&gt;&lt;br&gt;
Editor snippets only work inside the editor. A system-wide expander covers the places where you write the most prose: GitHub, Slack, issue trackers and email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which text expander for developers works on Linux?&lt;/strong&gt;&lt;br&gt;
InsertKit has a Linux desktop app (AppImage, deb and rpm packages), alongside Windows and macOS. Check the download page for the current builds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will slash triggers clash with Slack or Notion commands?&lt;/strong&gt;&lt;br&gt;
They can, since those apps use &lt;code&gt;/&lt;/code&gt; themselves. You can turn individual trigger prefixes on or off in settings and use &lt;code&gt;;&lt;/code&gt; in those apps instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I share snippets with my team?&lt;/strong&gt;&lt;br&gt;
Yes. Snippets can be set to Teams access, and team management happens on the web dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are my private snippets encrypted?&lt;/strong&gt;&lt;br&gt;
There is an optional end-to-end encryption setting for private snippets, currently marked as beta. Team snippets stay unencrypted so teammates can use them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there an Android version?&lt;/strong&gt;&lt;br&gt;
Yes. The Android app expands &lt;code&gt;/triggers&lt;/code&gt; in other apps, which is useful for quick replies on the go.&lt;/p&gt;

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

&lt;p&gt;You don't need a clever system. Pick the three or four things you retype every week, give them slash triggers, and let the machine do the typing. Your future self reviewing a PR at 6 pm will thank you.&lt;/p&gt;

&lt;p&gt;What's the snippet you'd add first? Share it in the comments.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>git</category>
      <category>codereview</category>
    </item>
    <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>
