<?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: Antonio Trento</title>
    <description>The latest articles on DEV Community by Antonio Trento (@antonio_trento).</description>
    <link>https://dev.to/antonio_trento</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%2F4017853%2F28cfd81d-bd54-41fe-bd76-9ff82dc200b9.jpg</url>
      <title>DEV Community: Antonio Trento</title>
      <link>https://dev.to/antonio_trento</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antonio_trento"/>
    <language>en</language>
    <item>
      <title>Your local LLM will translate a transcript instead of summarizing it — and other lessons from going 100% offline</title>
      <dc:creator>Antonio Trento</dc:creator>
      <pubDate>Mon, 13 Jul 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/antonio_trento/your-local-llm-will-translate-a-transcript-instead-of-summarizing-it-and-other-lessons-from-going-2oln</link>
      <guid>https://dev.to/antonio_trento/your-local-llm-will-translate-a-transcript-instead-of-summarizing-it-and-other-lessons-from-going-2oln</guid>
      <description>&lt;p&gt;I spent a few weekends building an offline audio/video transcriber, and the most&lt;br&gt;
useful things I learned had nothing to do with transcription. They were about the&lt;br&gt;
boring reality of running AI on someone else's laptop: models that do the wrong task,&lt;br&gt;
RAM numbers that lie, and CPUs that don't have the instructions your binary assumes.&lt;/p&gt;

&lt;p&gt;Here are the three that cost me the most time. If you're shipping anything with a&lt;br&gt;
local LLM, at least the first one will probably bite you too.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why local at all
&lt;/h2&gt;

&lt;p&gt;The trigger was simple: every cloud transcription tool wants you to upload the audio.&lt;br&gt;
Fine for a public podcast. Not fine for a client call, an internal meeting, or an&lt;br&gt;
interview where the other person didn't agree to have their voice sent to a third&lt;br&gt;
party. I wanted the opposite — drop a file, get text, subtitles and a summary, and&lt;br&gt;
have nothing leave the machine.&lt;/p&gt;

&lt;p&gt;So the whole thing runs on-device: NVIDIA NeMo &lt;strong&gt;Parakeet&lt;/strong&gt; for speech-to-text&lt;br&gt;
(fast on CPU, 25 European languages in one 0.6B model, word-level timestamps) and a&lt;br&gt;
local &lt;strong&gt;Qwen2.5&lt;/strong&gt; model via &lt;code&gt;llama.cpp&lt;/code&gt; for summaries. That constraint — &lt;em&gt;it has to&lt;br&gt;
run on a normal Windows PC with no GPU and no setup&lt;/em&gt; — is where the interesting&lt;br&gt;
problems started.&lt;/p&gt;
&lt;h2&gt;
  
  
  Lesson 1: "summarize in Italian" makes the model translate, not summarize
&lt;/h2&gt;

&lt;p&gt;This one is worth stealing regardless of what you're building.&lt;/p&gt;

&lt;p&gt;Say the audio is English and the user wants the summary in Italian. The obvious prompt&lt;br&gt;
is &lt;em&gt;"Summarize the following transcript in Italian."&lt;/em&gt; On a small local model (I started&lt;br&gt;
with a 3B), the output was not a summary — it was a near-complete &lt;strong&gt;translation&lt;/strong&gt; of&lt;br&gt;
the whole transcript. All the length, none of the compression. Useless.&lt;/p&gt;

&lt;p&gt;The reason is that you asked the model to do two hard things at once — &lt;em&gt;compress&lt;/em&gt; and&lt;br&gt;
&lt;em&gt;change language&lt;/em&gt; — and the smaller the model, the more likely it collapses to the&lt;br&gt;
easier, more literal one: translate line by line.&lt;/p&gt;

&lt;p&gt;The fix is to stop overloading it. Split into 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;Stage 1: summarize in the SOURCE language   (English → English)  ← model's strong suit
Stage 2: translate the short summary         (English → Italian) ← small, safe task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step is now something a small model does well: same-language summarization, then&lt;br&gt;
translating a handful of sentences instead of a whole document. Quality jumped&lt;br&gt;
immediately — and even more when I later moved from 3B to 7B.&lt;/p&gt;

&lt;p&gt;Two details that mattered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gate it.&lt;/strong&gt; If source and target language are the same, take the exact old
single-pass path. The two-stage logic only activates when &lt;code&gt;source != target&lt;/code&gt;, so
same-language jobs are byte-for-byte unchanged and you can't regress them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translate the summary, not the transcript.&lt;/strong&gt; The whole point is that stage 2
operates on ~10 sentences, not 10 minutes of speech.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;General principle: when a small model does the wrong task, check whether you've asked&lt;br&gt;
it to do two things in one shot. Decomposing into single-responsibility calls beats a&lt;br&gt;
cleverer prompt almost every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 2: "16 GB of RAM" is a lie the moment something else is open
&lt;/h2&gt;

&lt;p&gt;My first gate for enabling local summaries checked &lt;strong&gt;total&lt;/strong&gt; system RAM: got 16 GB?&lt;br&gt;
You're good. This is wrong, and it will crash on real machines.&lt;/p&gt;

&lt;p&gt;A ~4.7 GB model file needs its weights resident, plus a KV cache, plus compute buffers,&lt;br&gt;
plus whatever the rest of the app and the OS are already using. A user with 32 GB total&lt;br&gt;
but a browser, an IDE and Slack open can easily have less &lt;strong&gt;free&lt;/strong&gt; RAM than someone&lt;br&gt;
with 16 GB and nothing running. Total RAM tells you what the machine &lt;em&gt;could&lt;/em&gt; do in a&lt;br&gt;
vacuum; it says nothing about right now.&lt;/p&gt;

&lt;p&gt;The right signal is &lt;strong&gt;available&lt;/strong&gt; memory at the moment you're about to load, not the&lt;br&gt;
total the box shipped with. And when it's not enough, the correct behavior is a clear&lt;br&gt;
message — "not enough free RAM, close some apps or use a cloud key" — not an&lt;br&gt;
out-of-memory crash that kills the process with a useless exit code.&lt;/p&gt;

&lt;p&gt;It sounds obvious written down. It is not obvious when &lt;code&gt;psutil.virtual_memory().total&lt;/code&gt;&lt;br&gt;
is right there and returns a nice big number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 3: your prebuilt binary assumes a CPU your users don't have
&lt;/h2&gt;

&lt;p&gt;Local inference on CPU means shipping native code, and native code makes assumptions.&lt;br&gt;
Many prebuilt &lt;code&gt;llama.cpp&lt;/code&gt; builds assume &lt;strong&gt;AVX&lt;/strong&gt; instructions. On an older or low-end&lt;br&gt;
processor, that's not a slow path — it's an illegal-instruction crash on startup,&lt;br&gt;
before your app draws a single pixel.&lt;/p&gt;

&lt;p&gt;So I compile a &lt;strong&gt;baseline&lt;/strong&gt; build with no AVX assumptions (MinGW, statically linked)&lt;br&gt;
and bundle the runtime next to it. No "please install the Visual C++ redistributable"&lt;br&gt;
step, no "works on my machine" surprises. It's unglamorous packaging work, but for a&lt;br&gt;
desktop app aimed at non-technical users it's the difference between &lt;em&gt;runs&lt;/em&gt; and&lt;br&gt;
&lt;em&gt;doesn't&lt;/em&gt;. The fanciest model is worthless if the binary segfaults on their hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decompose tasks for small models.&lt;/strong&gt; One call = one job. "Summarize &lt;em&gt;and&lt;/em&gt; translate"
becomes "summarize, then translate."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gate on available resources, not nominal ones.&lt;/strong&gt; Free RAM now, not total RAM ever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assume nothing about the CPU.&lt;/strong&gt; Baseline builds and bundled runtimes, or you'll
crash on exactly the machines you're trying to reach.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is transcription-specific — it's the tax you pay to move AI from a GPU in&lt;br&gt;
a datacenter to a random laptop. I think that tax is worth paying: keeping people's&lt;br&gt;
audio on their own machine is a feature you can't fake with a privacy policy.&lt;/p&gt;

&lt;p&gt;If you want to poke at the thing this came out of, it's a Windows app called &lt;strong&gt;Qwibo&lt;/strong&gt;&lt;br&gt;
— source-available and auditable on GitHub, free for personal use, and very much&lt;br&gt;
&lt;strong&gt;alpha&lt;/strong&gt; (the installer isn't code-signed yet, so Windows SmartScreen will grumble).&lt;br&gt;
I'd genuinely rather hear where it breaks than get a compliment: the "here's the file&lt;br&gt;
that made it fall over" kind of comment is the useful kind.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code: &lt;a href="https://github.com/qwibo/qwibo" rel="noopener noreferrer"&gt;https://github.com/qwibo/qwibo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Download (Windows): &lt;a href="https://qwibo.github.io" rel="noopener noreferrer"&gt;https://qwibo.github.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Stop losing your bugs in AI chats: How to connect Cursor/Claude to GitHub Issues</title>
      <dc:creator>Antonio Trento</dc:creator>
      <pubDate>Mon, 06 Jul 2026 13:57:03 +0000</pubDate>
      <link>https://dev.to/antonio_trento/stop-losing-your-bugs-in-ai-chats-how-to-connect-cursorclaude-to-github-issues-43d7</link>
      <guid>https://dev.to/antonio_trento/stop-losing-your-bugs-in-ai-chats-how-to-connect-cursorclaude-to-github-issues-43d7</guid>
      <description>&lt;h3&gt;
  
  
  The Problem with "Vibe Coding"
&lt;/h3&gt;

&lt;p&gt;If you use AI tools like Cursor, Windsurf, or Claude Code, you know the feeling: you are flying through a refactor, the AI is doing great, but suddenly you notice a separate bug. You mention it in the chat, the AI acknowledges it, but you move on. &lt;/p&gt;

&lt;p&gt;Two days later... &lt;em&gt;what was that bug again?&lt;/em&gt; It's buried in a chat history. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;p&gt;AI agents are great at writing code, but they are isolated from our project management tools. I wanted my AI to just open a GitHub issue for me, just like a real pair programmer would.&lt;/p&gt;

&lt;p&gt;That's why I created &lt;strong&gt;&lt;a href="https://github.com/issuebeam/issuebeam" rel="noopener noreferrer"&gt;issuebeam&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is issuebeam?
&lt;/h3&gt;

&lt;p&gt;It's an open-source (MIT) bridge between your AI agent and your official GitHub repository. It consists of:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A zero-dependency Python CLI that can list, create, and manage issues.&lt;/li&gt;
&lt;li&gt;Optimized prompt instructions (&lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;.cursor/rules&lt;/code&gt;) that teach the AI how to use the CLI.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why not just use the &lt;code&gt;gh&lt;/code&gt; CLI?
&lt;/h3&gt;

&lt;p&gt;I wanted this to work everywhere—Windows, Mac, Linux—without forcing developers to install binaries or deal with OS-specific shell scripts. Python is ubiquitous, and by restricting issuebeam to the standard library (&lt;code&gt;urllib&lt;/code&gt;), any AI agent can execute it effortlessly.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to use it in your project
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;(Insert code blocks showing the quick start)&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get a GitHub Token&lt;/li&gt;
&lt;li&gt;Run the &lt;code&gt;adopt.py&lt;/code&gt; script in your repo.&lt;/li&gt;
&lt;li&gt;Tell your AI: "Track this bug"&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;If you are building software with AI, you need AI-native tooling. issuebeam is completely free and open source. Check out the repository &lt;a href="https://github.com/issuebeam/issuebeam" rel="noopener noreferrer"&gt;here&lt;/a&gt; and let me know your thoughts in the comments!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
    </item>
  </channel>
</rss>
