<?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: Ashutosh Tiwari</title>
    <description>The latest articles on DEV Community by Ashutosh Tiwari (@ashut90).</description>
    <link>https://dev.to/ashut90</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%2F3965256%2F9d844460-6a48-4959-8e1b-054393416cc8.png</url>
      <title>DEV Community: Ashutosh Tiwari</title>
      <link>https://dev.to/ashut90</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ashut90"/>
    <language>en</language>
    <item>
      <title>I built a tool that dubs any YouTube video into Hindi — and 19 other languages — in real time</title>
      <dc:creator>Ashutosh Tiwari</dc:creator>
      <pubDate>Sat, 06 Jun 2026 11:01:47 +0000</pubDate>
      <link>https://dev.to/ashut90/i-built-a-tool-that-dubs-any-youtube-video-into-hindi-and-19-other-languages-in-real-time-4dg5</link>
      <guid>https://dev.to/ashut90/i-built-a-tool-that-dubs-any-youtube-video-into-hindi-and-19-other-languages-in-real-time-4dg5</guid>
      <description>&lt;p&gt;&lt;strong&gt;Subtitles are not the same as understanding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I kept finding incredible technical tutorials on YouTube — but they were in languages I didn't speak. Auto-subtitles simply weren't cutting it. So, I built &lt;strong&gt;youtube-dubber&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You paste a YouTube URL, pick a language, and it dubs the video in real time using a natural-sounding neural voice. No robotic monotone here. It sounds like an actual person explaining the concept to you — utilizing Hinglish code-switching for Hindi, and conversational tones for everything else.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/2unzDR_rISo"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3nuaz5h2fz5u0qbg6obt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3nuaz5h2fz5u0qbg6obt.png" alt="Pipeline" width="720" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application handles audio processing using two distinct pipelines:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Video URL Mode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extraction:&lt;/strong&gt; Pulls captions from the YouTube video (falls back to Groq Whisper STT if captions are unavailable).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translation:&lt;/strong&gt; Passes the text to LLaMA 3.1-8b hosted on Groq for ultra-fast processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synthesis:&lt;/strong&gt; Generates voice text-to-speech using edge-tts neural voices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sync:&lt;/strong&gt; Coordinates audio and playback through &lt;code&gt;mpv&lt;/code&gt; via a JSON IPC socket.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimization:&lt;/strong&gt; Utilizes segment-level disk caching. The first run is slow, but every rerun is instant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Live Dub Mode (Linux Only)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capture:&lt;/strong&gt; Grabs live system audio via a PulseAudio virtual sink.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5-Agent Pipeline:&lt;/strong&gt; Streamlined sequence: Capture → Groq Whisper STT → LLaMA Translation → edge-tts → Speaker Output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency:&lt;/strong&gt; Holds a ~3–5 second lag floor. This is inherent to a listen-then-translate architecture rather than a software bug.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What the App Looks Like
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftfnv9dmbqh9mrff5qrey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftfnv9dmbqh9mrff5qrey.png" alt="App UI" width="720" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The video plays inside a separate native &lt;code&gt;mpv&lt;/code&gt; window. The Electron window acts exclusively as your control panel for tracking subtitles, adjusting volume, and managing progress. Both components stay completely in sync over &lt;code&gt;mpv&lt;/code&gt;'s IPC socket.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes It Different
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hinglish Code-Switching
&lt;/h3&gt;

&lt;p&gt;Translation shouldn't read like a formal dictionary. Hindi and Indian languages naturally blend English technical terms into normal conversation. Phrases like &lt;em&gt;"yeh function ek callback leta hai"&lt;/em&gt; sound natural, whereas a pure Hindi translation feels forced and confusing. &lt;/p&gt;

&lt;p&gt;The LLaMA model is explicitly prompted for this hybrid style. Additionally, a slang replacement map processes the output to handle formal-to-casual substitutions right before synthesis.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Linux Driver Bug That Shaped the Architecture
&lt;/h3&gt;

&lt;p&gt;Why use &lt;code&gt;mpv&lt;/code&gt; instead of a standard built-in HTML5 video player? &lt;/p&gt;

&lt;p&gt;Initially, Electron's &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element threw constant &lt;code&gt;SIGSEGV&lt;/code&gt; crashes on Linux machines utilizing Optimus (Intel + NVIDIA) hybrid graphics. The GPU driver routinely kills Chromium's renderer the moment it touches hardware video decoding or the &lt;code&gt;AudioContext&lt;/code&gt; API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; Hand all heavy media lifting entirely over to &lt;code&gt;mpv&lt;/code&gt; and control it via a JSON IPC socket. The Electron window remains a pure HTML/CSS UI layer that never touches video GPU registers. What started as a workaround became the defining architecture of the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Native Desktop App + Python Library
&lt;/h3&gt;

&lt;p&gt;It functions perfectly as a local app, but you can also integrate it directly into your backend code or use the CLI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;youtube-dubber
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GROQ_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gsk_xxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;youtube_dubber&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dub&lt;/span&gt;

&lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.youtube.com/watch?v=VIDEO_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hindi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;female&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./output_audio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or execute directly from your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;youtube-dubber &lt;span class="nt"&gt;--url&lt;/span&gt; https://youtu.be/VIDEO_ID &lt;span class="nt"&gt;--lang&lt;/span&gt; hindi &lt;span class="nt"&gt;--gender&lt;/span&gt; female &lt;span class="nt"&gt;--out&lt;/span&gt; ./output_audio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Supported Languages
&lt;/h2&gt;

&lt;p&gt;The system supports 20 languages: Hindi, Tamil, Telugu, Bengali, Marathi, Gujarati, Kannada, Malayalam, Punjabi, Urdu, Spanish, French, German, Japanese, Chinese, Korean, Arabic, Portuguese, Russian, and Italian.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: Indian regional languages default to the Hinglish/code-switched style to keep technical terms in English. Other options translate fully.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Why This Choice?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transcription&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Groq Whisper&lt;/td&gt;
&lt;td&gt;Lightning-fast voice-to-text response times.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Translation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LLaMA 3.1-8b via Groq&lt;/td&gt;
&lt;td&gt;Sub-second text inference speeds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Voice Synthesis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;edge-tts&lt;/td&gt;
&lt;td&gt;High-quality Microsoft neural voices without API key limits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Video Playback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;mpv via JSON IPC&lt;/td&gt;
&lt;td&gt;Bypasses Chromium GPU crashes entirely.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desktop Framework&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Electron&lt;/td&gt;
&lt;td&gt;Fast, cross-platform UI development.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Audio Capture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PulseAudio&lt;/td&gt;
&lt;td&gt;Direct system-level audio routing for Live Mode.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VAD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Silero VAD&lt;/td&gt;
&lt;td&gt;Highly accurate Voice Activity Detection to segment chunks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Video Download&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yt-dlp + ffmpeg&lt;/td&gt;
&lt;td&gt;Industry standard for reliable stream fetching and muxing.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Honest Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Dub is Linux-Only:&lt;/strong&gt; Bound strictly to PulseAudio dependencies for now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Initial Pass is Throttle-Gated:&lt;/strong&gt; Processing long videos for the first time hits Groq free-tier rate limits during parallel batching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language Variance:&lt;/strong&gt; Hindi is heavily fine-tuned and sounds best; quality across the other 19 languages may vary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connectivity Dependent:&lt;/strong&gt; &lt;code&gt;edge-tts&lt;/code&gt; relies on live connections to Microsoft servers to synthesize audio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lag Floor:&lt;/strong&gt; The 3–5s delay in Live Dub cannot be bypassed without implementing predictive AI text modeling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Quick Seeking:&lt;/strong&gt; You cannot skip ahead during the first pass; the dub engine generates chunks sequentially from &lt;code&gt;0:00&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Part That Surprised Me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;193 GitHub clones in 3 days.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;No public posts. No marketing. No product hunting. It gained traction purely from the package sitting on PyPI. The problem is real, and developers are actively hunting for solutions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;youtube-dubber
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/youtube-dubber/" rel="noopener noreferrer"&gt;pypi.org/project/youtube-dubber&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Ashut90/youtube-dubber" rel="noopener noreferrer"&gt;github.com/Ashut90/youtube-dubber&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;strong&gt;License:&lt;/strong&gt; GPL-3.0 (Fork it freely, just keep your modifications open source)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Star it, fork it, break it. GPL-3.0.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>whisper</category>
      <category>linux</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Was Tired of AI Subscriptions, So I Built a Free Local PDF Tutor for Dense Docs</title>
      <dc:creator>Ashutosh Tiwari</dc:creator>
      <pubDate>Tue, 02 Jun 2026 20:05:46 +0000</pubDate>
      <link>https://dev.to/ashut90/beyond-the-chatbox-architecting-a-local-first-ai-pdf-tutor-for-heavy-documentation-2k6p</link>
      <guid>https://dev.to/ashut90/beyond-the-chatbox-architecting-a-local-first-ai-pdf-tutor-for-heavy-documentation-2k6p</guid>
      <description>&lt;p&gt;I work on embedded systems, which means I spend most of my time inside dense PDFs — processor reference manuals, Linux internals textbooks, datasheets that run hundreds of pages.&lt;/p&gt;

&lt;p&gt;When "chat with your PDF" tools showed up, I was excited. Then I actually used them for real work, and three problems kept breaking my workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Privacy.&lt;/strong&gt; Most tools make you upload the document to their cloud. I'm not comfortable sending proprietary datasheets or copyrighted textbooks to a server I don't control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Context limits.&lt;/strong&gt; A single technical chapter can be dozens of pages of diagrams and code. Most wrappers quietly truncate it or start hallucinating once they hit their token limit — and they don't tell you it happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Summaries don't equal understanding.&lt;/strong&gt; Reading an AI summary of how Linux memory mapping works feels productive. But it doesn't mean you can actually use it two weeks later. Passive reading isn't retention.&lt;/p&gt;

&lt;p&gt;I wanted something local-first, private, and built around &lt;em&gt;remembering&lt;/em&gt; what I read — not just summarizing it. So I built &lt;strong&gt;PDF Tutor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/Ashut90/pdf-tutor" rel="noopener noreferrer"&gt;https://github.com/Ashut90/pdf-tutor&lt;/a&gt; (open source, MIT)&lt;/p&gt;




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

&lt;p&gt;PDF Tutor is a desktop app in Python 3.9+ with a three-pane Tkinter interface. The core idea is a hybrid local/cloud model — run everything locally by default, fall back to free cloud APIs only when a chapter is too big for local compute.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Local PDF
                    │  (PyMuPDF, parsed locally)
                    ▼
            Orchestration engine
            ┌───────┴────────┐
            ▼                ▼
     Ollama (local)    Free cloud APIs
   qwen2.5-coder /     (Gemini 1M context,
      llama3            Groq, OpenRouter)
            └───────┬────────┘
                    ▼
              Output tracks
     ┌──────────┬──────────┬──────────┐
     │   Anki   │ Diagrams │   TTS    │
     │  export  │ Graphviz │ pyttsx3  │
     └──────────┴──────────┴──────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local parsing.&lt;/strong&gt; PDFs are parsed entirely on-device with PyMuPDF — no upload, no telemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local inference.&lt;/strong&gt; Ollama runs the LLM (&lt;code&gt;qwen2.5-coder:7b&lt;/code&gt; or &lt;code&gt;llama3&lt;/code&gt;) on consumer hardware — it works on a laptop with 8GB RAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud only when needed.&lt;/strong&gt; If a chapter is too large for local context, it falls back to a free tier — Gemini (1M context), Groq, or OpenRouter. Your choice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline diagrams.&lt;/strong&gt; Mind maps and flowcharts render with Graphviz/Matplotlib, so they work fully offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local audio.&lt;/strong&gt; Text-to-speech runs on-device with pyttsx3.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The part I actually use: active recall
&lt;/h2&gt;

&lt;p&gt;A summary isn't learning. So the tool's prompts are built around the VARK model — turning a chapter into different formats depending on how you learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visual&lt;/strong&gt; → mind maps, flowcharts, tables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditory&lt;/strong&gt; → spoken, conversational explanations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read/Write&lt;/strong&gt; → notes and writing prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kinesthetic&lt;/strong&gt; → extracted code snippets and shell commands you can actually run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The feature I rely on most is &lt;strong&gt;Anki flashcard generation.&lt;/strong&gt; PDF Tutor turns a chapter into atomic Q&amp;amp;A pairs and exports a &lt;code&gt;.txt&lt;/code&gt; deck you import straight into Anki. So instead of reading about Linux memory mapping and hoping it sticks, I'm doing spaced repetition on it the same day:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What kernel structure represents a task's state in Linux?&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; &lt;code&gt;struct task_struct&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Difference between a process and a thread in the kernel?&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Processes have separate virtual memory spaces; threads share their parent's.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Ashut90/pdf-tutor
&lt;span class="nb"&gt;cd &lt;/span&gt;pdf-tutor

python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate   &lt;span class="c"&gt;# Windows: venv\Scripts\activate&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

python run.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For offline use, pull a local model first: &lt;code&gt;ollama pull qwen2.5-coder:7b&lt;/code&gt;. For cloud mode, paste a free-tier API key into the settings.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Conversation history (SQLite)&lt;/li&gt;
&lt;li&gt;EPUB and DjVu support&lt;/li&gt;
&lt;li&gt;A built-in spaced-repetition scheduler, so you don't need to export to Anki at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a work in progress and I'd genuinely like feedback — especially from people who deal with a lot of technical docs. If you hit an edge case or have ideas, open an issue or comment here. And if it's useful to you, a star helps others find it.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/Ashut90/pdf-tutor" rel="noopener noreferrer"&gt;https://github.com/Ashut90/pdf-tutor&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
      <category>rag</category>
    </item>
  </channel>
</rss>
