<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Jorge Menjivar</title>
        <link>https://menjivar.ai/</link>
        <description>Jorge Menjivar's Website</description>
        <lastBuildDate>Thu, 30 Jul 2026 09:34:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Jorge Menjivar</title>
            <url>https://menjivar.ai/favicon-32x32.png</url>
            <link>https://menjivar.ai/</link>
        </image>
        <copyright>All rights reserved 2026, Jorge Menjivar</copyright>
        <atom:link href="https://menjivar.ai/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Rethinking Speech-To-Text Support in Linux]]></title>
            <link>https://menjivar.ai/posts/rethinking-speech-to-text-in-linux</link>
            <guid isPermaLink="false">https://menjivar.ai/posts/rethinking-speech-to-text-in-linux</guid>
            <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Speech-to-text is an important accessibility feature that must land in Linux.]]></description>
            <content:encoded><![CDATA[<p>All major operating systems ship with built-in speech-to-text accessibility features that
let a user type into a text field by using their voice instead of a keyboard. Well,
almost all of them. Linux distros don&#39;t. In fact, Linux distros can&#39;t even support
that feature. What&#39;s worse is that there is not even proper third-party support for
this.</p>
<p>Let&#39;s take a look at the current state of speech-to-text support in major operating systems:</p>
<div class="support-matrix column-gutters"><table>
<thead>
<tr>
<th>OS</th>
<th>STT Solution</th>
<th>How to Use</th>
</tr>
</thead>
<tbody><tr>
<td>macOS</td>
<td>Via the &quot;Dictation&quot; feature</td>
<td>Press the dictation key, press a keyboard shortcut, or use the UI menu.</td>
</tr>
<tr>
<td>Windows</td>
<td>Via the &quot;Voice Typing&quot; feature</td>
<td>Press a keyboard shortcut on a physical keyboard. Press the microphone button in the virtual keyboard.</td>
</tr>
<tr>
<td>Android</td>
<td>Via the &quot;Speech Recognition&quot; service</td>
<td>In most keyboard apps, simply press the microphone button.</td>
</tr>
<tr>
<td>iOS</td>
<td>Via the &quot;Dictation&quot; feature</td>
<td>Press the microphone button on the keyboard.</td>
</tr>
<tr>
<td>Linux</td>
<td>X</td>
<td>X</td>
</tr>
</tbody></table>
</div><h2>Current Speech-to-text support in Linux</h2>
<p>Some open-source projects try to bring STT functionality to Linux, but none provide
an easy-to-use solution that works across all Linux distributions. And this is not their
fault. The problem is that Linux doesn&#39;t have a single standardized way to implement STT
engines and models. Each project has to implement everything from scratch, including the
STT engine, model support, and a way to simulate input.</p>
<p>Projects like <a href="https://github.com/ideasman42/nerd-dictation">Nerd Dictation</a>,
<a href="https://github.com/peteonrails/voxtype">Voxtype</a>, 
<a href="https://github.com/openwhispr/openwhispr">OpenWhisper</a>,
and my own <a href="https://github.com/jorge-menjivar/super-stt">Super STT</a> are all attempts at
solving a problem that should not exist in the first place.</p>
<p>Each of these community projects does things differently, but in the end, each is just a
hack to get STT working on Linux. Each has its pros and cons, but none of them are a
proper solution to the problem.</p>
<h2>The Solution</h2>
<p>The solution is simple:
<strong>Linux distributions need to ship with reliable built-in support for speech-to-text.</strong></p>
<p>How we achieve that is not simple at all. <strong>At the very least</strong> we need to solve the following
problems:</p>
<ul>
<li><input disabled="" type="checkbox"> Ship a speech-to-text engine with Linux distributions without bloating them.</li>
<li><input disabled="" type="checkbox"> Create a system-level speech-to-text abstraction layer that lets applications
interact with the engine.</li>
<li><input disabled="" type="checkbox"> Create a native, safe, non-intrusive way to input into text fields across all desktop
environments and applications.</li>
<li><input disabled="" type="checkbox"> Develop an engine that can support tiny models, as well as powerful models.</li>
<li><input disabled="" type="checkbox"> Address model weight licenses, their training data availability, and other legal
considerations.</li>
<li><input disabled="" type="checkbox"> Have each distro provide a list of models available for download that the STT engine can
immediately use without any extra steps or requirements.</li>
</ul>
<h2>Starting from Zero</h2>
<p>For the last year, my own project,
<a href="https://github.com/jorge-menjivar/super-stt">Super STT</a>, had been using Rust
implementations of the Whisper and Voxtral models in order to
support a quick and simple installation, without requiring Python, PyTorch, or other heavy
system dependencies. With a binary size of only 26MB, the daemon was able to run over 12
different models, and if the user had an NVIDIA GPU with the CUDA Toolkit installed in
their system, each of the models could be run on the GPU, offering much higher performance.</p>
<p>I was very happy with what Super STT could already accomplish. After all, Voxtral models were
the state-of-the-art models for much of last year.</p>
<p>However, things felt odd. In order to support a new model, new code needed to be added to
the binary directly, making the binary increase in size (although very little), and making
things more fragile than they should be.</p>
<p>So a few months ago, I decided to rewrite things. I decided to turn Super STT into a
proper, <strong>standardized</strong>, STT engine with the following features and capabilities: </p>
<ul>
<li>Ability to run <strong>any</strong> STT model in any programming language. From tiny, basic models
to large, state-of-the-art models that can be GPU-accelerated.</li>
<li>Small footprint so that it can ship anywhere.</li>
<li>Must be daemon-based, so it can be enabled/disabled on demand if necessary.</li>
<li>Must implement a protocol that other system apps can also implement to transcribe things
natively. For example, a notes app could use the STT engine to get transcriptions when you
press a button within its UI, displaying the real-time transcriptions in a different way
from the final transcriptions, showing other app animations, etc.</li>
<li>Must be security-conscious. Give the user control over which apps can interact with the
engine.</li>
</ul>
<h2>The First Step</h2>
<p>Let&#39;s pause for a moment, because I need to be fully transparent about this. I use
LLMs to help me with the development of Super STT, especially in the last couple of
months, where I needed to do a lot of refactoring and converting my protocol docs to
an actual abstraction layer. Even with that extra (massive) help, Super STT still has a
long way to go to be an actual solution to the bigger STT problem. This is a huge
problem that, so far, I have mostly been tackling alone, so I will continue to use
whatever help I can get.</p>
<p>I try to use LLM tools responsibly, but I know this is a controversial topic,
so feel free to skip <a href="https://github.com/jorge-menjivar/super-stt">Super STT</a>
if it goes against your values or beliefs. Anything that Super STT does can be used as a
reference to implement a better solution in other STT projects like
<a href="https://github.com/ideasman42/nerd-dictation">Nerd Dictation</a>,
<a href="https://github.com/peteonrails/voxtype">Voxtype</a>, 
<a href="https://github.com/openwhispr/openwhispr">OpenWhisper</a>, etc., if you would like to
contribute to any of those awesome projects instead.</p>
<p>Now, let&#39;s continue. This week, I shipped
<a href="https://github.com/jorge-menjivar/super-stt/releases#release-v0.2.0">v0.2.0 of Super STT</a>,
which does everything in that list. I also wanted to make it genuinely good
and easy for people to use, so it includes a few extra things. The engine binary remained
the same 26MB, which is probably already small enough to ship with a distro, but could be
shrunk further with some optimizations.</p>
<h3>Backends</h3>
<p>Super STT now has the concept of backends. Each backend can add support for many models at
once, although ideally one backend should add support for one family of models at most.
For example, the Voxtral backend adds support for the voxtral-mini and voxtral-small models
and is only 6MB. Likewise, the OpenAI backend adds support only for the OpenAI cloud models
and is only 206KB!</p>
<p>Anyone can create their own backend and publish it to the default
<a href="https://github.com/jorge-menjivar/super-stt/tree/main/registry">Super STT registry</a>.
Furthermore, any distro or person can replace this registry with their own in order to only
list their own approved models for whatever reasons.</p>
<p>Super STT can run the following types of backends:</p>
<ul>
<li>WASM binaries, which are good for CPU-only models or online models that just need to
connect to an online API.</li>
<li>Subprocesses, which are good for running models that require more performance or need
access to the GPU.</li>
</ul>
<p>Each backend runs in a sandboxed manner, preventing it from changing system files or
connecting to the internet without permission. For example, in order for the
<a href="https://github.com/jorge-menjivar/super-stt-openai">OpenAI backend</a> to connect to OpenAI
servers, it must first declare that it needs access to <code>api.openai.com</code> in its own
<a href="https://github.com/jorge-menjivar/super-stt-openai/blob/ea7512f535bc25e358197e9c471826fe1482633f/backend.toml#L21">configuration file</a>.</p>
<p>As of this writing, the following backends are available in Super STT:</p>
<ol>
<li><a href="https://github.com/jorge-menjivar/super-stt-voxtral">Voxtral</a> (Rust Subprocess)</li>
<li><a href="https://github.com/jorge-menjivar/super-stt-whisper">Whisper</a> (Rust Subprocess)</li>
<li><a href="https://github.com/jorge-menjivar/super-stt-qwen-asr">Qwen-ASR</a> (Python Subprocess)</li>
<li><a href="https://github.com/jorge-menjivar/super-stt-mistral">Mistral</a> (WASM - Online)</li>
<li><a href="https://github.com/jorge-menjivar/super-stt-openai">OpenAI</a> (WASM - Online)</li>
<li><a href="https://github.com/jorge-menjivar/super-stt-deepgram">Deepgram</a> (WASM - Online)</li>
</ol>
<h3>An Open Protocol</h3>
<p>The daemon itself includes the STT engine and has everything necessary to download
backends, load models, transcribe, and simulate typing into apps. However, in order to
actually make the engine human-friendly, you want to be able to interact with it using
a client. Super STT now has a full HTTP protocol, so a client can be implemented in any
programming language and can even be a website. A client can manage the engine settings,
backends, models, start/stop transcriptions, receive transcription updates, and do pretty
much anything else you can think of.</p>
<p>The Super STT project right now has three clients:</p>
<ul>
<li>The main app (GUI), to manage the engine settings, download backends, load models, etc.</li>
<li>A CLI app to allow transcriptions to be started/stopped via commands.</li>
<li>A COSMIC Desktop applet that visualizes the user&#39;s voice when a transcription is
started.</li>
</ul>
<p>Anyone can create a client for the engine to extend capabilities or even just to replace
the current main app to manage the engine with their own.</p>
<h3>Security</h3>
<p>Each client must receive scope-based permissions from the user in order for it to connect
to the engine. When a client tries to connect to the engine for the first time or after
a system restart, the engine will show the user a consent window asking for the user&#39;s
permission before allowing the client&#39;s connection.</p>
<p>For now, the Super STT default clients are excluded from this security requirement and
are allowed to connect without explicit consent. This decision was made to improve the
user experience, but may be reverted in the future.</p>
<h2>What It Accomplished</h2>
<p>Super STT has been rebuilt to support a better architecture, getting it closer to being a
real solution to the STT problem Linux has. However, the project still has a long way to go.
Let&#39;s see a <strong>very optimistic</strong> view of what Super STT could theoretically take care of
now that the new version of Super STT has been released.</p>
<ul>
<li><input checked="" disabled="" type="checkbox"> Ship a speech-to-text engine with Linux distributions without bloating them.</li>
</ul>
<p><em>Yes, the engine itself is only 26MB unoptimized.</em></p>
<ul>
<li><input checked="" disabled="" type="checkbox"> Create a system-level speech-to-text abstraction layer that lets applications
interact with the engine.</li>
</ul>
<p><em>Yes, the abstraction layer foundation is there now, although it is meaningless if not
adopted by anyone.</em></p>
<ul>
<li><input disabled="" type="checkbox"> Create a native, safe, non-intrusive way to input into text fields across all desktop
environments and applications.</li>
</ul>
<p><em>No, this hasn&#39;t been touched yet.</em></p>
<ul>
<li><input checked="" disabled="" type="checkbox"> Develop an engine that can support tiny models, as well as powerful models.</li>
</ul>
<p><em>Yes, the engine can run any model from any framework. For example, it runs backends
that use Rust (Candle) and other backends that use Python (PyTorch).</em></p>
<ul>
<li><input disabled="" type="checkbox"> Address model weight licenses, their training data availability, and other legal
considerations.</li>
</ul>
<p><em>Maybe? A custom registry (see below) could help, but I need to research this more.</em></p>
<ul>
<li><input checked="" disabled="" type="checkbox"> Have each distro provide a list of models available for download that the STT
engine can immediately use without any extra steps or requirements.</li>
</ul>
<p><em>Yes, this is possible by swapping out the registry index to one that the distro
provides.</em></p>
<h2>What&#39;s Next?</h2>
<p>I hope my work sparks some conversations about the speech-to-text issues that Linux
currently has. Super STT is not meant to be a perfect solution, at least not yet. For now,
Super STT is chaotic and bleeding-edge and will continue to push things in a better
direction for everyone.</p>
<p>The next step is simply to listen to what others have to say about this issue, the
protocol, security, and any other aspects of the project.</p>
]]></content:encoded>
            <author>Jorge Menjivar</author>
        </item>
        <item>
            <title><![CDATA[I built a Speech-to-Text App for Linux so I Can be More Productive]]></title>
            <link>https://menjivar.ai/posts/i-built-a-speech-to-text-app-for-linux</link>
            <guid isPermaLink="false">https://menjivar.ai/posts/i-built-a-speech-to-text-app-for-linux</guid>
            <pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Linux had no dictation that types into any app, so I built one — from a Python prototype to SuperSTT, with Voxtral implemented in Rust.]]></description>
            <content:encoded><![CDATA[<h1>Long Story</h1>
<p>I couldn&#39;t find a Speech-to-Text solution for Linux that works similarly to the STT feature on iOS, macOS, and Windows, among others.</p>
<p>I wanted to press a button or shortcut, have it record my voice, convert it to text, and automatically write it in any text box my cursor is focused on. There are a few apps that let you transcribe speech, but you have to use their UI to get your transcription. I could have just continued using one of those other apps and called it a day. It would have saved me a lot of trouble 🤣.</p>
<p>But where is the fun in that? I wanted to have state-of-the-art (SOTA) transcriptions on my Linux computer, making it superior to those on macOS and Windows computers. So a few weeks ago, when I read that Mistral AI introduced Voxtral, a new open-source SOTA transcription model, I got to work.</p>
<h1>First Attempt - Python</h1>
<p>Since the Hugging Face Python library already had Voxtral implemented in it, and Python developers often implement AI models first, I decided to build the proof-of-concept app using Python.</p>
<p>It worked well; however, Python is notorious for being hard to package. And let&#39;s not even talk about asking someone to install a 5GB PyTorch library and other dependencies just to get things running. So I had to rethink my strategy.</p>
<p>If I am going to make something useful for myself, I want to make it as useful to others as well. 2026 will be the year of the Linux desktop 😉, and so I wanted new users to be able to install SuperSTT as easily as possible.</p>
<h1>Second Attempt - Rust</h1>
<p>Rust excels at packaging and shipping things, and, of course, the COSMIC DE, my daily driver, is already built on Rust, making it easier for me to build a native UI later.</p>
<p>However, Rust is not known for supporting AI models (at least not yet). So, although STT models like Whisper were already implemented in Candle (Rust&#39;s version of Pytorch + Hugging Face), there was no support for Voxtral yet.</p>
<p>That meant that I had to implement the AI model myself 😵‍💫, which was intimidating, but super exciting, because I had never dealt with AI Rust code before. I will save you some time and skip this part, even though I really wanted to share it. It took 2 weeks to implement Voxtral in Candle and another 2 weeks to get it approved for production.</p>
<p>The rest of the app is much simpler, so once Voxtral had been implemented in SuperSTT, we were ready to use it to transcribe with a shortcut. However, there were no visual indicators, no easy way to change the transcription model, or update other settings.</p>
<h1>SuperSTT Service and UI Clients</h1>
<p>I built SuperSTT as a service that runs on systemd. It loads the AI model once when you log in to your system. It exposes a protocol so that any client apps can communicate with the service to update its settings or receive raw audio data (for visualizations).</p>
<p>I built two UI apps:</p>
<ol>
<li>A settings app using libcosmic that should work on any desktop environment.</li>
<li>An applet especially made for the COSMIC panel that displays visualizations.</li>
</ol>
<p>Anyone can build a client for their DE if they really want to (e.g., a Gnome extension, a KDE Widget) and continue to use SuperSTT.</p>
<p><a href="https://github.com/jorge-menjivar/super-stt">https://github.com/jorge-menjivar/super-stt</a></p>
]]></content:encoded>
            <author>Jorge Menjivar</author>
        </item>
        <item>
            <title><![CDATA[Github Portfolio is Up]]></title>
            <link>https://menjivar.ai/posts/github-portfolio-is-up</link>
            <guid isPermaLink="false">https://menjivar.ai/posts/github-portfolio-is-up</guid>
            <pubDate>Thu, 19 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[My site broke, so I built GitHub Portfolio — a zero-maintenance portfolio and blog that handles RSS, sitemaps and SEO for me.]]></description>
            <content:encoded><![CDATA[<p>My site was broken, something on the server side was throwing a 404 status code, basically meaning &quot;Page not found&quot;, so I could not even see my own website. I was devastated. My dreams of being the next Vitalik Buterin were crushed. I decided to fix it. After hours of debugging, I was finally able to see my site again, but then realized how ugly it was. It needed a lot of work to keep it updated.</p>
<p>I want to be cool like Vitalik Buterin. I want to have my own site to post my thoughts. But wait, I also want to showcase my projects. I want to introduce any web travelers that pass by my site to the things that I do. One important thing is that any good site needs RSS support and SEO optimization so Google can find it.</p>
<p>This sounds like a lot of maintenance work. I&#39;ll need to keep the RSS feed up to date and generate a new sitemap whenever I create a new post or project. I don&#39;t have time for that. I just want to show what I&#39;m working on and update people once or twice a year. I&#39;m not a professional writer, I write at a 10 year old&#39;s level. I don&#39;t need a whole CMS for this. And I definitely don&#39;t want to pay monthly for one. I just need to write blogs and update my projects without managing anything else. </p>
<p>So I did what any lazy developer would do - let GitHub handle the hosting. I created <a href="https://github.com/jorge-menjivar/GitHub-Portfolio">GitHub Portfolio</a>, the perfect solution for me. No worrying about servers or CMS. It automatically fetches my GitHub activity for my portfolio. All I do is write markdown files for blog posts. It handles the rest - RSS, sitemap, SEO, etc. Now I can focus on projects while it manages my portfolio and blog. Best of all, it&#39;s free since it uses Vercel hosting. You may be reading this from GitHub Portfolio or an RSS feed, but either way, it&#39;s thanks to GitHub.</p>
<p>You can set up your own site with GitHub Portfolio in 1 minute or less. It&#39;s open source and easy to customize however you want. Use it, break it, fix it, improve it - go wild!</p>
<p>That&#39;s it. Just wanted to share.</p>
]]></content:encoded>
            <author>Jorge Menjivar</author>
        </item>
    </channel>
</rss>