<?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: TunaDev</title>
    <description>The latest articles on DEV Community by TunaDev (@tunadev0).</description>
    <link>https://dev.to/tunadev0</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%2F3493236%2F1d868278-1935-45a2-ab47-4c0d4063fda2.jpeg</url>
      <title>DEV Community: TunaDev</title>
      <link>https://dev.to/tunadev0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tunadev0"/>
    <language>en</language>
    <item>
      <title>Zed is amazing, I hate it</title>
      <dc:creator>TunaDev</dc:creator>
      <pubDate>Tue, 30 Jun 2026 22:46:39 +0000</pubDate>
      <link>https://dev.to/tunadev0/zed-is-amazing-i-hate-it-5aob</link>
      <guid>https://dev.to/tunadev0/zed-is-amazing-i-hate-it-5aob</guid>
      <description>&lt;p&gt;Zed is, hands down, the best-&lt;em&gt;feeling&lt;/em&gt; editor I've used in years. It's fast in a way that makes every other Electron-based IDE feel like it's wading through syrup. Multi-buffer editing is genuinely great. The collaborative stuff works. When you're just typing code, Zed gets out of your way better than anything else on the market.&lt;/p&gt;

&lt;p&gt;And I hate it, because it's still missing things that should be table stakes for a daily-driver IDE in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that shouldn't be this annoying
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Panels don't stay where you put them
&lt;/h3&gt;

&lt;p&gt;If you run an AI coding agent in a side panel — Claude Code, Cursor's chat, whatever — and then open a file from the project tree, Zed happily shoves that file &lt;em&gt;into the agent's pane&lt;/em&gt;, burying your conversation. There was no way to tell a pane "stay put, don't let new files land here."&lt;/p&gt;

&lt;p&gt;So I added one. A pane lock: toggle it on, and that pane stops accepting new items.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;is_locked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.is_locked&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;toggle_lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pane&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.is_locked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.is_locked&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="nf"&gt;.emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LockChanged&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;Wired into the pane's context menu next to the existing pin/unpin entries. Now I can lock the pane running my agent, open files anywhere else in the project, and it never gets stolen.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Some shortcuts just won't move
&lt;/h3&gt;

&lt;p&gt;I came from VS Code, where &lt;code&gt;option-space&lt;/code&gt; (alt-space) opens suggestions. In Zed, that binding is hardcoded elsewhere and I couldn't get it to point at the completions action I wanted — no combination of keymap edits would take.&lt;/p&gt;

&lt;p&gt;I didn't fix the remap. I gave up on remapping and added a second action bound to the key I wanted instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"alt-space"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"editor::ShowImportCompletions"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// Shows import completions for components.&lt;/span&gt;
&lt;span class="n"&gt;ShowImportCompletions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To be precise about what this is: it's not "I made the unmovable shortcut movable." &lt;code&gt;ctrl-space&lt;/code&gt; still triggers Zed's normal &lt;code&gt;ShowCompletions&lt;/code&gt;, untouched. &lt;code&gt;alt-space&lt;/code&gt; now triggers a parallel action I added myself. If Zed's keymap system won't bend, you route around it instead of through it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The extension ecosystem isn't there yet
&lt;/h3&gt;

&lt;p&gt;I wanted a real Claude Code panel — not a terminal tab running &lt;code&gt;claude&lt;/code&gt;, an actual dock panel: message history, slash commands, drag-and-drop file context, the works. Zed's extension API doesn't give you that level of native UI. Extensions are mostly language servers and themes; you can't ship a full custom panel through one.&lt;/p&gt;

&lt;p&gt;So that panel doesn't exist as an extension. It's built directly into the fork — a dock panel registered right alongside the built-in Git and Debug panels:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;claude_code_panel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="nn"&gt;ClaudeCodePanel&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;workspace_handle&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="nf"&gt;add_panel_when_ready&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;claude_code_panel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;workspace_handle&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worth being honest about what this panel actually is: it's a thin UI shell over a &lt;code&gt;claude&lt;/code&gt; CLI subprocess. It doesn't reimplement Claude Code, it just gives it a proper home inside the editor instead of a terminal tab. About 800 lines of Rust to get there — the point isn't the line count, it's that an extension couldn't have given me this at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual point: this is tractable now
&lt;/h2&gt;

&lt;p&gt;A year or two ago, "just fork the editor and patch it yourself" was advice for people who already knew Rust and had a free weekend. I am not that person. I don't know Rust. I wrote zero of those lines by hand.&lt;/p&gt;

&lt;p&gt;I used GPT-5.4, through OpenCode, to make every one of these changes — reading an unfamiliar ~1.5k-file Rust codebase, finding the right place to hook in, and getting it building. Worth separating two things here, because it's easy to conflate them: OpenCode running GPT-5.4 is the agent that wrote the patches. Claude Code is the separate CLI tool that the new panel above wraps. One AI agent built a UI for a different AI agent — not the cleanest sentence, but accurate.&lt;/p&gt;

&lt;p&gt;That's the actual headline, more than any single feature: the cost of "stop complaining about your editor and fix it" used to be a barrier most developers couldn't clear. It isn't anymore. You don't need to know the codebase, or the language it's written in, to go in and change a default that's been bothering you for months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on one thing
&lt;/h2&gt;

&lt;p&gt;You don't need to fork an entire IDE to test this. Pick the single shortcut, panel behavior, or default that annoys you most in whatever editor you use daily. Find where it's defined — a keymap file, a config struct, a single function — and point an agent at it with the specific behavior you want instead. Don't aim for a feature. Aim for the one thing you'd mutter about under your breath today.&lt;/p&gt;

&lt;p&gt;If it works, you've just deleted a complaint you've been carrying around for free. If it doesn't, you've lost an hour, and the editor's no worse than when you started.&lt;/p&gt;

</description>
      <category>zed</category>
      <category>coding</category>
      <category>developertolols</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I built an AI tutor to learn GeoGuessr-style visual geography (not a solver)</title>
      <dc:creator>TunaDev</dc:creator>
      <pubDate>Mon, 12 Jan 2026 10:04:28 +0000</pubDate>
      <link>https://dev.to/tunadev0/i-built-an-ai-tutor-to-learn-geoguessr-style-visual-geography-not-a-solver-2akl</link>
      <guid>https://dev.to/tunadev0/i-built-an-ai-tutor-to-learn-geoguessr-style-visual-geography-not-a-solver-2akl</guid>
      <description>&lt;p&gt;While playing GeoGuessr, I noticed that most tools fall into two extremes:&lt;br&gt;
they either give you the answer instantly or they’re straight-up cheats.&lt;/p&gt;

&lt;p&gt;I wanted something different, so I built GeoCoach — an educational Chrome extension that acts more like a tutor than a solver.&lt;/p&gt;

&lt;p&gt;Instead of telling you the country, it analyzes the Street View scene and explains why a location is likely: vegetation, road markings, architecture, utility poles, license plates, etc. The idea is to train pattern recognition over time, not to shortcut the game.&lt;/p&gt;

&lt;p&gt;A few intentional constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spoiler-free by default (no country names unless you ask)&lt;/li&gt;
&lt;li&gt;Designed for learning in single-player or unranked modes&lt;/li&gt;
&lt;li&gt;Local-only API keys, no servers, no tracking&lt;/li&gt;
&lt;li&gt;Open source (MIT)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s still early, but usable.&lt;br&gt;
If you enjoy GeoGuessr for learning geography — or you’re interested in AI-assisted educational tools built on top of games — I’d love feedback.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
