<?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: Igor Halilovic</title>
    <description>The latest articles on DEV Community by Igor Halilovic (@igor_halilovic_3fa0baa977).</description>
    <link>https://dev.to/igor_halilovic_3fa0baa977</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%2F2785314%2F4d6e7d56-e9f8-489c-8a6d-edfc6f29cf2b.png</url>
      <title>DEV Community: Igor Halilovic</title>
      <link>https://dev.to/igor_halilovic_3fa0baa977</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/igor_halilovic_3fa0baa977"/>
    <language>en</language>
    <item>
      <title>"Do You Even Know What Red Is?" (And How Claude Saw My Plugin Before I Did)</title>
      <dc:creator>Igor Halilovic</dc:creator>
      <pubDate>Tue, 27 Jan 2026 21:53:18 +0000</pubDate>
      <link>https://dev.to/igor_halilovic_3fa0baa977/do-you-even-know-what-red-is-and-how-claude-saw-my-plugin-before-i-did-1ejj</link>
      <guid>https://dev.to/igor_halilovic_3fa0baa977/do-you-even-know-what-red-is-and-how-claude-saw-my-plugin-before-i-did-1ejj</guid>
      <description>&lt;p&gt;"Do you even know what red is?!"&lt;/p&gt;

&lt;p&gt;That’s what I wanted to scream, three messages deep into a color-mismatch argument. We've all been there: paragraphs of text describing a vision, the AI understands maybe half, and then the endless iterations - each round getting us only 10% closer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It’s like describing a painting over the phone.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So, I decided to stop talking and start showing.&lt;/p&gt;

&lt;p&gt;I built an MCP server that finally gives Claude eyes. It now screenshots my app and sees exactly what I see. Instead of us guessing colors in the dark, it generates design options I can actually look at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best part? It now validates its own code before I even have to check it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The "Telephone Game" Problem
&lt;/h2&gt;

&lt;p&gt;It’s the same old story. You need to tweak a UI, so you open a conversation with your AI assistant and start typing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"The button should be more prominent. The spacing feels off. Can you make the header less crowded?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The AI makes changes. They’re... okay, but not quite right. So you type more. &lt;em&gt;"No, I meant the vertical spacing, not horizontal. And the button color should match the accent, not the primary."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The friction is exhausting. You’re spending more time describing the fix than it would take to just do it yourself. This is exactly where that "phone call" breaks down - you're trying to explain a painting to someone who is effectively blind.&lt;/p&gt;

&lt;p&gt;My previous &lt;a href="https://dev.to/igor_halilovic_3fa0baa977/tabbyspaces-visual-workspace-editor-for-tabby-terminal-2ig6"&gt;TabbySpaces&lt;/a&gt; UI was what I call "one-shot AI slop" - generated quickly, shipped fast, and it looked exactly like that. When I decided to redesign it properly, I had one goal: find a way to do this without losing my mind.&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%2Fdbgm89b32npnn5h7v57l.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%2Fdbgm89b32npnn5h7v57l.png" alt="Before: vertical card list" width="800" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Before: Simple vertical card list. Functional, but basic.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Giving Claude Eyes and Hands
&lt;/h2&gt;

&lt;p&gt;The answer was obvious: if describing visuals is the bottleneck, I had to remove the need for descriptions.&lt;/p&gt;

&lt;p&gt;I built an MCP server called &lt;a href="https://hanuya.net/vault/tabby-mcp" rel="noopener noreferrer"&gt;Tabby MCP&lt;/a&gt;. It gives Claude direct access to my Tabby terminal through Chrome DevTools Protocol. In simple terms, I gave it a way to look at the screen and interact with the code directly. Since Tabby runs on Electron/Chromium, CDP was the obvious choice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;screenshot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Visual snapshot - whole window or specific element&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;query&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DOM inspection - finding selectors and classes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;execute_js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run JavaScript directly in Tabby's Electron context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_targets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List available tabs for targeting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now Claude has &lt;strong&gt;eyes&lt;/strong&gt; (screenshot) and &lt;strong&gt;hands&lt;/strong&gt; (query/execute_js). It can see what I'm working on, inspect the structure, test interactions, and validate its own changes.&lt;/p&gt;

&lt;p&gt;The difference in iteration speed:&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%2Fg4nmeoe1it0wpvczcaj9.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%2Fg4nmeoe1it0wpvczcaj9.png" width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I didn’t reinvent the wheel"&lt;/em&gt;, I told a friend while explaining this. &lt;em&gt;"I just connected existing Lego blocks."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Building this took about &lt;strong&gt;30 minutes&lt;/strong&gt;. Between solid documentation and Claude’s native ability to build MCP servers, you can skip the "interview phase" and go straight to work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hard part wasn't technical - it was realizing this was even possible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’re working with an Electron app, a CDP-compatible browser, or anything with an automation API, you can do the same thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Concept to Implementation in 30 Minutes
&lt;/h2&gt;

&lt;p&gt;Instead of wrestling with the code immediately, the process for the &lt;strong&gt;TabbySpaces v0.2.0&lt;/strong&gt; redesign felt more like a fast-paced brainstorming session:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Visual Check&lt;/strong&gt;: Claude takes a screenshot via MCP. It finally sees what I'm seeing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Wild Ideas" Phase&lt;/strong&gt;: Claude generates 10 standalone HTML variants. Since these aren't touching the production code, I can afford to be experimental.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Human Filter&lt;/strong&gt;: I look at the options and pick the best bits. "Combine the tabs from #3 with the spacing from #7."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tuning&lt;/strong&gt;: Another 10 variants, but this time focusing on the "vibe" (e.g., "Tight &amp;amp; Sharp" vs. "Soft &amp;amp; Modern").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation &amp;amp; Auto-Correction&lt;/strong&gt;: Once I'm happy, Claude writes the real code and immediately uses the MCP to validate it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; Because the mockups are standalone HTML, I can explore 10 wild ideas without risk. If they all suck, I just delete them and try again.&lt;/p&gt;

&lt;p&gt;And then comes the best part: Claude catches its own CSS bugs before I even see them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Opaaa!"&lt;/strong&gt; (That's Serbian slang for &lt;em&gt;“There it is!”&lt;/em&gt; or &lt;em&gt;“Bingo!”&lt;/em&gt;). I was right. It works.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Numbers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Sessions&lt;/th&gt;
&lt;th&gt;Total Time&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP Implementation&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;~30 min&lt;/td&gt;
&lt;td&gt;CDP bridge for Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mockups &amp;amp; Design&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;~1.5h&lt;/td&gt;
&lt;td&gt;20 unique variants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final Implementation&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;~30 min&lt;/td&gt;
&lt;td&gt;Production-ready code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visual Validation&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;~2h&lt;/td&gt;
&lt;td&gt;Automated design check&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The visual testing was the longest part of the process. But here is the kicker: &lt;strong&gt;Claude was the one doing the looking, not me&lt;/strong&gt;. While Claude was busy comparing pixels and validating CSS, I could actually take a breather and chat with my wife. Its feedback loop told me exactly when I needed to intervene and when I could just sit back.&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%2Fxxoyc1wacmrczn53yfrc.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%2Fxxoyc1wacmrczn53yfrc.png" alt="After: tab bar with inline editing" width="800" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;After: Horizontal tab bar, inline pane editor, organized sections.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Universal Pattern: Stop Describing Red
&lt;/h2&gt;

&lt;p&gt;This isn't just about Tabby terminal or MCP specifically. It’s a pattern that any developer can use to escape "LLM design phobia":&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Give AI eyes&lt;/strong&gt; - Provide visual context (screenshots, recordings).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work in isolation&lt;/strong&gt; - Use mockups or sandboxes where the AI can play without breaking production code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep human in the loop&lt;/strong&gt; - Let the AI generate options, but you make the final call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable self-validation&lt;/strong&gt; - Let AI verify its own work before it even reaches you.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/halilc4/tabbyspaces" rel="noopener noreferrer"&gt;TabbySpaces v0.2.0&lt;/a&gt; shipped with a complete UI redesign done entirely through this workflow. It's not just a theory; it's the backbone of how I build now. &lt;/p&gt;

&lt;p&gt;If you’re interested in this kind of stuff, I’ve started documenting my experiments, MCP tools, and other side projects over at &lt;a href="https://hanuya.net/" rel="noopener noreferrer"&gt;Hanuya.net&lt;/a&gt;. It's basically my digital vault - feel free to drop by and check it out.&lt;/p&gt;

&lt;p&gt;If you’ve ever given up on AI-assisted UI work because explaining was harder than doing, this is your exit ramp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build the bridge. Give AI eyes. Stop describing red.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Update: Someone Else Used the Workflow
&lt;/h2&gt;

&lt;p&gt;While I was still editing this post, a friend (&lt;a href="https://github.com/mozulator" rel="noopener noreferrer"&gt;@mozulator&lt;/a&gt;) started using TabbySpaces and had ideas. &lt;em&gt;"Why don't you add drag-to-resize? What about percentage labels? The empty state needs work."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My answer: &lt;em&gt;"The whole repo is set up for Claude. Just tell it what you want."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So he did. He pointed Claude at the codebase, used the same tabby-mcp setup, and &lt;a href="https://github.com/halilc4/tabbyspaces/pull/9" rel="noopener noreferrer"&gt;shipped a PR&lt;/a&gt; with drag-to-resize handles that snap to 10%, live dimension labels, a redesigned empty state: all visual features you can't validate without seeing them. The &lt;code&gt;CLAUDE.md&lt;/code&gt; explained the workflow, the MCP tools were already there, and Claude handled the rest.&lt;/p&gt;

&lt;p&gt;I didn't walk him through anything. The setup &lt;em&gt;was&lt;/em&gt; the walkthrough.&lt;/p&gt;




</description>
      <category>mcp</category>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>TabbySpaces - visual workspace editor for Tabby terminal</title>
      <dc:creator>Igor Halilovic</dc:creator>
      <pubDate>Sat, 03 Jan 2026 14:02:37 +0000</pubDate>
      <link>https://dev.to/igor_halilovic_3fa0baa977/tabbyspaces-visual-workspace-editor-for-tabby-terminal-2ig6</link>
      <guid>https://dev.to/igor_halilovic_3fa0baa977/tabbyspaces-visual-workspace-editor-for-tabby-terminal-2ig6</guid>
      <description>&lt;p&gt;If you use Tabby with split layouts, you probably edit YAML by hand every time you want a new workspace. I got tired of that.&lt;/p&gt;

&lt;p&gt;TabbySpaces lets you design workspaces visually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Split panes with a click&lt;/li&gt;
&lt;li&gt;Set profile, cwd, startup command per pane&lt;/li&gt;
&lt;li&gt;Launch from toolbar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built entirely with Claude Code (Opus 4.5). ~6 hours across 20 sessions, ~1700 lines of Angular/TypeScript. No npm dependency hell, no Angular config nightmares - it just worked.  &lt;/p&gt;

&lt;p&gt;I think good context files did half the work. Detailed CLAUDE.md with Tabby plugin patterns, coding preferences and project structure. I have a small Go tool that manages my context files, so my Claude Code workflow is pretty smooth at this point.&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%2Ft67gwwadg80tnz5ie872.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%2Ft67gwwadg80tnz5ie872.png" alt="Workspace editor" width="800" height="740"&gt;&lt;/a&gt;&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%2Fi2hpiyo8s4ofzoa5lcsq.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%2Fi2hpiyo8s4ofzoa5lcsq.png" alt="Pane editor" width="741" height="807"&gt;&lt;/a&gt;&lt;br&gt;
Install from Tabby's plugin manager (search "tabbyspaces") or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  npm &lt;span class="nb"&gt;install &lt;/span&gt;tabby-tabbyspaces
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or clone/fork GitHub repo and manually install it -this will work 100% :)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you have problems with installation, leave a comment/issue&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/halilc4/tabbyspaces" rel="noopener noreferrer"&gt;https://github.com/halilc4/tabbyspaces&lt;/a&gt;&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>cli</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
