<?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: Namit Arora</title>
    <description>The latest articles on DEV Community by Namit Arora (@blazestorm).</description>
    <link>https://dev.to/blazestorm</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2438341%2Fb66edf8a-3d74-4bb6-b94e-35cee84c4b93.png</url>
      <title>DEV Community: Namit Arora</title>
      <link>https://dev.to/blazestorm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blazestorm"/>
    <language>en</language>
    <item>
      <title>aMuseMe: When Small Models Compose a Visual Symphony</title>
      <dc:creator>Namit Arora</dc:creator>
      <pubDate>Mon, 15 Jun 2026 22:48:06 +0000</pubDate>
      <link>https://dev.to/blazestorm/amuseme-when-small-models-compose-a-visual-symphony-50fc</link>
      <guid>https://dev.to/blazestorm/amuseme-when-small-models-compose-a-visual-symphony-50fc</guid>
      <description>&lt;p&gt;&lt;em&gt;Field Notes from "An Adventure in Thousand Token Wood" — Build Small Hackathon 2026&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Music videos are deeply personal artifacts. They transform a song from something you hear into something you &lt;em&gt;see&lt;/em&gt; and &lt;em&gt;feel&lt;/em&gt;. But creating even a simple lyric video — the kind where words appear in sync with the music — is a tedious, manual process. You're keyframing word timings in a video editor, aligning text to beats by ear, hunting for stock footage that "fits the vibe." Hours of work for a 3-minute song.&lt;/p&gt;

&lt;p&gt;We built &lt;strong&gt;aMuseMe&lt;/strong&gt; to ask a different question: &lt;em&gt;What if you just dropped an audio file and got a complete, stylized lyric video back?&lt;/em&gt; No lyrics needed. No timeline editing. No stock footage hunting. Just music in, video out.&lt;/p&gt;

&lt;p&gt;And we did it with &lt;strong&gt;3.5 billion parameters total&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Idea: Kinetic Typography Meets Small AI
&lt;/h2&gt;

&lt;p&gt;Kinetic typography — words that move, scale, and animate in sync with spoken audio — is one of the most engaging ways to present text on screen. Music lyric videos are a perfect application: every word has an exact timestamp, and every line has an emotional mood that could inform how it &lt;em&gt;looks&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We imagined a pipeline where:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An AI &lt;strong&gt;listens&lt;/strong&gt; to the song and timestamps every word&lt;/li&gt;
&lt;li&gt;An AI &lt;strong&gt;reads&lt;/strong&gt; the lyrics and decides how to break them into display lines&lt;/li&gt;
&lt;li&gt;An AI &lt;strong&gt;illustrates&lt;/strong&gt; each section with a matching background painting&lt;/li&gt;
&lt;li&gt;A renderer &lt;strong&gt;animates&lt;/strong&gt; it all into a smooth, 30fps HD video&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The catch: all four steps had to fit inside the hackathon's 32B parameter budget. No cloud APIs. Everything local.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture: Four Small Models, One Pipeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stage 1: The Listener — Whisper large-v3 (~1.55B)
&lt;/h3&gt;

&lt;p&gt;We use &lt;code&gt;faster-whisper&lt;/code&gt; (a CTranslate2-optimized port) to extract &lt;strong&gt;word-level timestamps&lt;/strong&gt; from raw audio. Not sentence-level — &lt;em&gt;word-level&lt;/em&gt;. When the singer says "heart" at exactly 4.72 seconds, we know it starts at 4.72s and ends at 5.01s.&lt;/p&gt;

&lt;p&gt;This precision is what makes the final video feel alive. Words don't just appear line-by-line; each word lights up at the exact millisecond it's sung.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tuning rabbit hole:&lt;/strong&gt; Getting accurate word timestamps from songs (not clean speech) required extensive experimentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;condition_on_previous_text=True&lt;/code&gt;&lt;/strong&gt; dramatically improves accuracy — Whisper uses its own previous output as context, so it "remembers" the song's vocabulary. But this causes &lt;strong&gt;infinite hallucination loops&lt;/strong&gt; during instrumental breaks (Whisper fills the silence with repeated phantom lyrics).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VAD (Voice Activity Detection)&lt;/strong&gt; solves the hallucination problem. We use aggressive thresholds — &lt;code&gt;min_silence_duration_ms=2000&lt;/code&gt;, &lt;code&gt;speech_pad_ms=2000&lt;/code&gt;, &lt;code&gt;min_speech_duration_ms=50&lt;/code&gt; — so Whisper only sees audio segments where someone is actually singing.&lt;/li&gt;
&lt;li&gt;We started with &lt;code&gt;whisper-base&lt;/code&gt; (74M params) for speed, but word boundary accuracy was poor for fast vocals. &lt;code&gt;large-v3&lt;/code&gt; was the sweet spot: accurate enough for songs, and still well within the 32B budget.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 2: The Director — MiniCPM5-1B + Outlines
&lt;/h3&gt;

&lt;p&gt;This is the creative brain of the pipeline. Raw Whisper output is a flat list of timestamped words — but a lyric video needs &lt;em&gt;lines&lt;/em&gt;. "Every heartbeat echoes feel like grooving my veins" needs to become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Every heartbeat echoes        ← line 1
feel like grooving my veins   ← line 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A rule-based approach (split on silence gaps, cap at 7 words) works, but it produces mechanical, unnatural breaks. An LLM understands phrase structure — it knows "breaking all of these chains" should stay together.&lt;/p&gt;

&lt;p&gt;We use &lt;strong&gt;MiniCPM5-1B&lt;/strong&gt; (by OpenBMB, one of the hackathon's anchor sponsors) — a 1B-parameter language model that's small enough to run alongside Whisper and SD-Turbo on a single GPU. For each chunk of ~10 words, the model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Splits words into display lines&lt;/strong&gt; — deciding how many words belong on each line&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Picks a frame animation&lt;/strong&gt; — &lt;code&gt;zoom_in&lt;/code&gt; for emphasis, &lt;code&gt;flash&lt;/code&gt; for a dramatic hit, &lt;code&gt;fade_to_black&lt;/code&gt; for a quiet ending, &lt;code&gt;pan_left&lt;/code&gt;/&lt;code&gt;pan_right&lt;/code&gt; for gentle movement&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The structured generation breakthrough:&lt;/strong&gt; The biggest challenge with small LLMs is output reliability. A 1B model often produces malformed JSON, missing fields, or hallucinated keys. We solved this completely with &lt;strong&gt;Outlines&lt;/strong&gt; — a library that constrains the LLM's token generation to match a Pydantic schema at decode time. The model literally &lt;em&gt;cannot&lt;/em&gt; produce invalid JSON. No retries, no regex extraction, no parsing failures.&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;outlines&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;from_transformers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Generator&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;  &lt;span class="c1"&gt;# how many words on this line
&lt;/span&gt;    &lt;span class="n"&gt;frame_animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FrameAnim&lt;/span&gt;  &lt;span class="c1"&gt;# zoom_in, flash, pan_left, etc.
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SongFrames&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;from_transformers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hf_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SongFrames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# schema-enforced!
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# result is ALWAYS valid SongFrames — guaranteed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stage 3: The Illustrator — SD-Turbo (~865M)
&lt;/h3&gt;

&lt;p&gt;For each pair of lyric lines, we generate a cinematic background image using &lt;strong&gt;SD-Turbo&lt;/strong&gt; (Stability AI's distilled Stable Diffusion model). The magic of SD-Turbo: it generates high-quality images in &lt;strong&gt;a single inference step&lt;/strong&gt; with &lt;code&gt;guidance_scale=0.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We merge the lyric text with the user's style prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"neon-lit futuristic city at night, vibrant glowing colors, 
 cyberpunk aesthetic, breaking all of these chains"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a 3-minute song with ~15 storyboard images, the entire background generation step takes &lt;strong&gt;~2 seconds on GPU&lt;/strong&gt;. The backgrounds are then darkened (55% overlay) so white/neon lyric text remains readable on any generated image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 4: The Renderer — Pillow + FFmpeg
&lt;/h3&gt;

&lt;p&gt;The final stage is a custom frame-by-frame renderer built with Pillow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Word-level highlighting&lt;/strong&gt;: Words in the current line are shown in the theme's active color; unspoken words are dimmed. As each word's timestamp arrives, it lights up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frame-level animations&lt;/strong&gt;: The LLM-chosen animation (zoom, pan, flash, fade) is applied to the entire text block, creating cinematic movement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart text wrapping&lt;/strong&gt;: Long lines automatically break across multiple rows instead of shrinking to unreadable sizes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-fade transitions&lt;/strong&gt;: Background images blend smoothly with 1-second alpha transitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frames are streamed as raw RGB bytes directly to an FFmpeg subprocess via stdin pipe — no temp files written to disk. This avoids the I/O bottleneck that plagues cloud runners and keeps the assembly step near-instantaneous.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes This "Thousand Token Wood"?
&lt;/h2&gt;

&lt;p&gt;Track 2 asks for something &lt;strong&gt;delightful that wouldn't exist without AI&lt;/strong&gt;. aMuseMe isn't an AI chatbot or a productivity tool — it's a creative instrument. You feed it a song, and four small AI models collaborate to produce something that would take a human editor hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Would you show a friend?&lt;/strong&gt; Absolutely. "Drop your favorite song and get a lyric video in 90 seconds" is an instant demo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is AI load-bearing?&lt;/strong&gt; Remove any of the four models and the experience collapses. Without Whisper, no word sync. Without MiniCPM5-1B, ugly line breaks and no animation direction. Without SD-Turbo, no visual atmosphere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it original?&lt;/strong&gt; We haven't seen another project that chains speech-to-text → structured LLM direction → text-to-image → kinetic typography rendering in a single pipeline. The "AI as video director" concept — where the LLM doesn't just format text but actually makes creative decisions about animation — is, to our knowledge, novel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it polished?&lt;/strong&gt; Three visual themes, four font families, a cyberpunk-inspired dark UI, sample songs to try instantly, and a one-click generation button.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Off the Grid: No Cloud APIs
&lt;/h2&gt;

&lt;p&gt;The entire pipeline runs on-device. Whisper, MiniCPM5-1B, SD-Turbo, and Demucs are all local models loaded into GPU memory. No OpenAI API, no Stability API, no cloud dependencies. On HF Spaces, we use ZeroGPU (&lt;code&gt;@spaces.GPU&lt;/code&gt;) for efficient shared-GPU allocation, but the computation is still happening on HF's own hardware — not calling out to external services.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structured generation changes everything for small models.&lt;/strong&gt; A 1B model that always outputs valid JSON via Outlines is more reliable than a 70B model that you hope will format correctly. The constraint isn't a limitation — it's a superpower.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Word-level sync is the "wow" factor.&lt;/strong&gt; Line-by-line lyrics feel like karaoke from 2005. Word-by-word highlighting with millisecond precision feels &lt;em&gt;magical&lt;/em&gt;. The difference in viewer engagement is enormous.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Whisper needs babysitting for music.&lt;/strong&gt; VAD, condition-on-previous-text, compression ratio thresholds, temperature scheduling — we spent more time tuning Whisper parameters than writing the renderer. Songs are fundamentally harder than speech.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pipes over disk.&lt;/strong&gt; Streaming raw bytes to FFmpeg via stdin was a 10× performance win over writing temp frames to disk. On cloud runners with slow I/O, this is the difference between a 10-second and a 100-second pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;One-step diffusion is a game-changer for pipelines.&lt;/strong&gt; SD-Turbo generating 15 images in 2 seconds means background generation is no longer a bottleneck. It's fast enough to be a utility, not a feature.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Try it yourself — drop a song and watch the magic happen:&lt;/em&gt;&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://huggingface.co/spaces/build-small-hackathon/aMuseMe" rel="noopener noreferrer"&gt;aMuseMe on Hugging Face Spaces&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  OUTPUT song VIDEO;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://youtu.be/GBOrS2fsQ2E" rel="noopener noreferrer"&gt;https://youtu.be/GBOrS2fsQ2E&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  APP DEMO VIDEO:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://youtu.be/6RJwgFu6LHQ" rel="noopener noreferrer"&gt;https://youtu.be/6RJwgFu6LHQ&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>music</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Take Control of VSCode Tabs with Tabby: The Ultimate Tab Manager!</title>
      <dc:creator>Namit Arora</dc:creator>
      <pubDate>Fri, 15 Nov 2024 17:12:01 +0000</pubDate>
      <link>https://dev.to/blazestorm/take-control-of-vscode-tabs-with-tabby-the-ultimate-tab-manager-2lan</link>
      <guid>https://dev.to/blazestorm/take-control-of-vscode-tabs-with-tabby-the-ultimate-tab-manager-2lan</guid>
      <description>&lt;p&gt;Hello, fellow developers!&lt;br&gt;&lt;br&gt;
I’m excited to introduce &lt;a href="https://marketplace.visualstudio.com/items?itemName=NamitArora.tabby-tab-manager&amp;amp;ssr=false" rel="noopener noreferrer"&gt;Tabby&lt;/a&gt;, my very first VSCode extension, designed to help you manage, close, and restore tabs efficiently.&lt;/p&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%2F4fztozfz295tqveqk0ek.gif" 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%2F4fztozfz295tqveqk0ek.gif" alt="gif" width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Key Features
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tab Mode (F10 Activation)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;One-key shortcuts for tab management.&lt;/li&gt;
&lt;li&gt;Close tabs (&lt;code&gt;w&lt;/code&gt;), navigate between them (&lt;code&gt;j&lt;/code&gt;/&lt;code&gt;k&lt;/code&gt;), reorder tabs (&lt;code&gt;a&lt;/code&gt;/&lt;code&gt;d&lt;/code&gt;), and even jump directly to a specific tab by index (1-9).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Powerful Filtering Options&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Hit &lt;code&gt;f&lt;/code&gt; in Tab Mode or use the command &lt;code&gt;Tabby: Filter Tabs in Active Tab Group&lt;/code&gt; to filter tabs based on:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wildcard Patterns&lt;/strong&gt;: &lt;code&gt;*&lt;/code&gt; for any sequence, &lt;code&gt;_&lt;/code&gt; for a single character.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path-Based Filter&lt;/strong&gt;: &lt;code&gt;?myfolder&lt;/code&gt; keeps tabs matching a specific folder path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index-Based Filters&lt;/strong&gt;: Single index (e.g., &lt;code&gt;1&lt;/code&gt;), ranges (e.g., &lt;code&gt;3:5&lt;/code&gt;), and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filenames containing only numbers&lt;/strong&gt;: &lt;code&gt;\123&lt;/code&gt; for files named "123".&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combined Filtering&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Mix and match filters! For example: &lt;code&gt;*.py, 1:4, \123, ?myfolder&lt;/code&gt; will keep all &lt;code&gt;.py&lt;/code&gt; files, tabs in the 1-4 range, the file &lt;code&gt;123&lt;/code&gt;, and files in &lt;code&gt;myfolder&lt;/code&gt; open.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tab History&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Quickly restore closed tabs by pressing &lt;code&gt;h&lt;/code&gt; in Tab Mode or run&lt;code&gt;Tabby: Open Tabs from History&lt;/code&gt;. Also view your closed tabs from the 'Tab History' in the File Explorer View.&lt;/li&gt;
&lt;li&gt;Press u in Tab Mode to undo restore tabs closed recently (works only for tabs closed/filtered using Tabby).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s my first extension, so all suggestions and constructive feedback are greatly appreciated!&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=NamitArora.tabby-tab-manager&amp;amp;ssr=false" rel="noopener noreferrer"&gt;Download Tabby from Marketplace&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
