<?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: Fabián Silva</title>
    <description>The latest articles on DEV Community by Fabián Silva (@fabian_silva_).</description>
    <link>https://dev.to/fabian_silva_</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%2F3859600%2Fa5376d93-692f-49c6-be19-47aed874cda4.jpeg</url>
      <title>DEV Community: Fabián Silva</title>
      <link>https://dev.to/fabian_silva_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabian_silva_"/>
    <language>en</language>
    <item>
      <title>I Built a Visual Spec-Driven Development Extension for VS Code That Works With Any LLM</title>
      <dc:creator>Fabián Silva</dc:creator>
      <pubDate>Fri, 03 Apr 2026 21:50:42 +0000</pubDate>
      <link>https://dev.to/fabian_silva_/i-built-a-visual-spec-driven-development-extension-for-vs-code-that-works-with-any-llm-36ok</link>
      <guid>https://dev.to/fabian_silva_/i-built-a-visual-spec-driven-development-extension-for-vs-code-that-works-with-any-llm-36ok</guid>
      <description>&lt;h2&gt;
  
  
  I Built a Visual Spec-Driven Development Extension for VS Code That Works With Any LLM
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;If you've tried &lt;a href="https://github.com/github/spec-kit" rel="noopener noreferrer"&gt;GitHub's Spec Kit&lt;/a&gt;, you know the value of spec-driven development: define requirements before coding, let AI generate structured specs, plans, and tasks. It's a great workflow.&lt;/p&gt;

&lt;p&gt;But there's a gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spec Kit&lt;/strong&gt; works through slash commands in chat. No visual UI, no progress tracking, no approval workflow. You type &lt;code&gt;/speckit.specify&lt;/code&gt;, read the output, type &lt;code&gt;/speckit.plan&lt;/code&gt;, and so on. It works, but it's not visual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiro&lt;/strong&gt; (Amazon's VS Code fork) offers a visual experience — but locks you into their specific LLM and requires leaving VS Code for a custom fork.&lt;/p&gt;

&lt;p&gt;I wanted both: a &lt;strong&gt;visual workflow inside VS Code&lt;/strong&gt; that works with &lt;strong&gt;any LLM I choose&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Caramelo&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Caramelo Does
&lt;/h2&gt;

&lt;p&gt;Caramelo is a VS Code extension that gives you a complete visual UI for spec-driven development:&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%2Fz2tzbvyxgi1oc97baqng.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%2Fz2tzbvyxgi1oc97baqng.png" alt="Caramelo sidebar showing workflow panel with constitution, specs, and progress rings" width="608" height="1206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Connect Any LLM — Including Your Corporate Proxy
&lt;/h3&gt;

&lt;p&gt;Click a preset, enter credentials, done. No CLI tools required.&lt;/p&gt;

&lt;p&gt;Supported out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; — uses your existing subscription, no API key needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local&lt;/strong&gt;: Ollama, LM Studio (no API key needed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud&lt;/strong&gt;: Claude, OpenAI, Gemini, Groq (API key)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom&lt;/strong&gt;: any OpenAI-compatible endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corporate proxies&lt;/strong&gt;: custom auth headers for Azure API Manager, AWS API Gateway, etc.&lt;/li&gt;
&lt;/ul&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%2F3qz7xwpvgayom7ij8ogu.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%2F3qz7xwpvgayom7ij8ogu.png" alt="Providers section with preset buttons for Ollama, Claude, OpenAI, Gemini, Groq, and Copilot" width="620" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can have &lt;strong&gt;multiple providers of the same type&lt;/strong&gt; — "Claude Personal" with your own API key and "Claude MyCompany" through your company's proxy, each with different endpoints and auth settings. Switch between them by clicking the dot indicator. Models are fetched from the API when available, or entered manually with automatic validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Visual Workflow with Approval Gates
&lt;/h3&gt;

&lt;p&gt;Instead of remembering which slash command to run next, Caramelo shows your workflow visually:&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%2F63jponh0u0wbghj5yh73.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%2F63jponh0u0wbghj5yh73.png" alt="Spec card showing sequential phases with approval gates and progress ring" width="600" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each phase must be &lt;strong&gt;approved&lt;/strong&gt; before the next unlocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Requirements&lt;/strong&gt; → generates spec.md&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design&lt;/strong&gt; → generates plan.md + research.md + data-model.md&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tasks&lt;/strong&gt; → generates tasks.md&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You see the documents streaming in real time as the LLM writes them. Approve when satisfied, or edit manually first. If you regenerate an earlier phase, downstream phases are flagged as stale.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Constitution-Driven Generation
&lt;/h3&gt;

&lt;p&gt;Before creating any specs, you define your project's &lt;strong&gt;constitution&lt;/strong&gt; — the non-negotiable principles:&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%2F2d7eqysb5154ek7qkizd.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%2F2d7eqysb5154ek7qkizd.png" alt="Constitution editor with AI generation and project principles" width="800" height="770"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"All features must include error handling." "TDD mandatory." "No external dependencies without justification."&lt;/p&gt;

&lt;p&gt;You can write them manually or click &lt;strong&gt;"Generate with AI"&lt;/strong&gt; — describe your project, and the LLM suggests principles. These are automatically included as context in every generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Import Specs from Jira
&lt;/h3&gt;

&lt;p&gt;For teams that plan in Jira:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect your Jira Cloud board (search by name for orgs with 2000+ boards)&lt;/li&gt;
&lt;li&gt;Click "From Jira" when creating a spec&lt;/li&gt;
&lt;li&gt;Search issues or type a key directly (e.g., PROJ-123)&lt;/li&gt;
&lt;li&gt;Title, description, acceptance criteria, and comments become your spec's input&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The spec card shows a linked Jira badge — click to jump to the issue.&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%2F7o7q2vx9fdgonp8e06er.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%2F7o7q2vx9fdgonp8e06er.png" alt=" Jira integration showing issue import and linked badge on spec card" width="762" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Task Execution from the Editor
&lt;/h3&gt;

&lt;p&gt;Generated tasks aren't just a document — they're actionable:&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%2Fali1bfa11brc9ewobx0b.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%2Fali1bfa11brc9ewobx0b.png" alt="Task execution with CodeLens Run Task buttons and LLM output streaming" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run Task&lt;/strong&gt; — click a button, the LLM generates the code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run All Tasks&lt;/strong&gt; — execute everything, respecting parallel markers &lt;code&gt;[P]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output Channel&lt;/strong&gt; — watch the LLM reasoning in real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress tracking&lt;/strong&gt; — completion percentage in the sidebar (100% only when all tasks done)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline checklist&lt;/strong&gt; — toggle tasks directly in the sidebar&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Quality Tools
&lt;/h3&gt;

&lt;p&gt;Before moving forward, verify your work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clarify&lt;/strong&gt; — LLM identifies ambiguities, presents questions as QuickPick dialogs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze&lt;/strong&gt; — checks consistency across all artifacts, reports findings with severity levels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix Issues&lt;/strong&gt; — one-click auto-fix from the analysis report&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checklists&lt;/strong&gt; — generates content-specific verification items&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All accessible from the &lt;strong&gt;Caramelo menu&lt;/strong&gt; (cat icon in the editor toolbar) — a single grouped dropdown that keeps your toolbar clean.&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%2Fn35xb9ljzn6r2n2yxjwb.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%2Fn35xb9ljzn6r2n2yxjwb.png" alt="Caramelo cat menu grouping all contextual actions in the editor toolbar" width="396" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The extension is surprisingly simple (~170KB bundle):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No LLM SDKs&lt;/strong&gt; — native &lt;code&gt;fetch&lt;/code&gt; with a shared SSE parser, plus &lt;code&gt;vscode.lm&lt;/code&gt; for Copilot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No React&lt;/strong&gt; — native VS Code APIs (WebviewView, CodeLens, QuickPick)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No external CLI&lt;/strong&gt; — doesn't require &lt;code&gt;specify&lt;/code&gt; CLI or any tool in PATH&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spec Kit compatible&lt;/strong&gt; — reads/writes &lt;code&gt;specs/&lt;/code&gt;, syncs templates from GitHub releases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State-driven UI&lt;/strong&gt; — all inline editing uses re-render pattern, no fragile DOM manipulation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned Building This
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VS Code's WebviewView API is powerful.&lt;/strong&gt; A single webview panel replaced 3 separate TreeViews and gave us forms, progress rings, task checklists, and inline editing — all with plain HTML/CSS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SSE streaming is simple.&lt;/strong&gt; Two LLM provider types (OpenAI-compatible + Anthropic) plus Copilot's &lt;code&gt;vscode.lm&lt;/code&gt; API cover 95% of use cases with ~150 lines of streaming code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Corporate LLM access is messy.&lt;/strong&gt; Different API managers use different auth header names and prefixes. Making these configurable per-provider was essential for enterprise adoption.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;State-driven re-renders beat DOM manipulation.&lt;/strong&gt; Early attempts to inject form elements via &lt;code&gt;postMessage&lt;/code&gt; broke because &lt;code&gt;refresh()&lt;/code&gt; destroyed event listeners. Storing &lt;code&gt;editingState&lt;/code&gt; and re-rendering the full HTML with editors baked in was the reliable solution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spec-driven development works.&lt;/strong&gt; Using Caramelo to build Caramelo proved the workflow. Each feature went through specify → clarify → plan → tasks → implement.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It
&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%2Fu1bq6qjqykxvbf3542pg.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%2Fu1bq6qjqykxvbf3542pg.png" alt="Caramelo logo" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install&lt;/strong&gt;: Search "Caramelo" in VS Code Extensions, or visit the &lt;a href="https://marketplace.visualstudio.com/items?itemName=fsilvaortiz.caramelo" rel="noopener noreferrer"&gt;Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/fsilvaortiz/caramelo" rel="noopener noreferrer"&gt;github.com/fsilvaortiz/caramelo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributions welcome! Check the &lt;a href="https://github.com/fsilvaortiz/caramelo/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing Guide&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with spec-driven development, powered by any LLM you choose.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>ai</category>
      <category>opensource</category>
      <category>speckit</category>
    </item>
  </channel>
</rss>
