<?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: Vanja Petreski</title>
    <description>The latest articles on DEV Community by Vanja Petreski (@vpetreski).</description>
    <link>https://dev.to/vpetreski</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%2F419006%2F0dc8a054-7ddc-4e90-8525-fe1871d5e03c.jpeg</url>
      <title>DEV Community: Vanja Petreski</title>
      <link>https://dev.to/vpetreski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vpetreski"/>
    <language>en</language>
    <item>
      <title>Configure Claude Code for Maximum Power</title>
      <dc:creator>Vanja Petreski</dc:creator>
      <pubDate>Mon, 13 Apr 2026 01:55:47 +0000</pubDate>
      <link>https://dev.to/vpetreski/configure-claude-code-for-maximum-power-4coi</link>
      <guid>https://dev.to/vpetreski/configure-claude-code-for-maximum-power-4coi</guid>
      <description>&lt;p&gt;No prompts, max effort, zero friction. The complete permissions setup for power users who want Claude Code fully unleashed.&lt;/p&gt;

&lt;p&gt;Claude Code ships with six permission modes, protected paths, allow/deny rules, hooks, and a deprecated flag that still half-works. Most people never touch any of it. They either get prompted constantly or they set one flag and think they are done.&lt;/p&gt;

&lt;p&gt;This is the complete setup for running Claude Code at maximum power. No prompts. Max effort. Zero friction. I debugged this on my own machine after &lt;code&gt;allow: ["*"]&lt;/code&gt; was not doing what I thought it was doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup: Two Files, One Alias
&lt;/h2&gt;

&lt;p&gt;You need three things configured correctly. Miss one and you will still get prompted.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Global Settings
&lt;/h3&gt;

&lt;p&gt;Create or edit &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"defaultMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bypassPermissions"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skipDangerousModePermissionPrompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alwaysThinkingEnabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"effortLevel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"max"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Shell Alias
&lt;/h3&gt;

&lt;p&gt;Add to your &lt;code&gt;.zshrc&lt;/code&gt; (or &lt;code&gt;.bashrc&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"CLAUDE_CODE_NO_FLICKER=1 claude --permission-mode bypassPermissions --effort max"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;c&lt;/code&gt; launches Claude Code in bypass mode with max thinking effort and the smooth terminal renderer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Source Your Shell
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is it. From now on, &lt;code&gt;c&lt;/code&gt; runs Claude Code with zero prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You Need Both Settings AND the Flag
&lt;/h2&gt;

&lt;p&gt;This is the part that tripped me up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;defaultMode: "bypassPermissions"&lt;/code&gt; in settings means even launching with plain &lt;code&gt;claude&lt;/code&gt; (no alias) starts in bypass mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--permission-mode bypassPermissions&lt;/code&gt; in the alias is belt-and-suspenders. Explicitly sets it for the aliased command.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;skipDangerousModePermissionPrompt: true&lt;/code&gt; skips the "are you sure?" warning when entering bypass mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;allow: ["*"]&lt;/code&gt; is a blanket allow for all tools. But without &lt;code&gt;defaultMode&lt;/code&gt; it only works within &lt;code&gt;default&lt;/code&gt; mode rules, which still protect certain paths.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key lesson: &lt;strong&gt;allow: ["*"] is NOT the same as bypassPermissions.&lt;/strong&gt; The allow rule works within the current mode's framework. &lt;code&gt;bypassPermissions&lt;/code&gt; skips the framework entirely. You need &lt;code&gt;defaultMode: "bypassPermissions"&lt;/code&gt; to truly remove all prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Deprecated Flag Trap
&lt;/h2&gt;

&lt;p&gt;If you are using this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"claude --dangerously-skip-permissions --effort max"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It still works. But &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; is deprecated. The canonical flag is now &lt;code&gt;--permission-mode bypassPermissions&lt;/code&gt;. Update your alias before the old flag stops working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protected Paths: Why allow: ["*"] Still Prompts
&lt;/h2&gt;

&lt;p&gt;Even with &lt;code&gt;allow: ["*"]&lt;/code&gt; in &lt;code&gt;default&lt;/code&gt; mode, these paths &lt;strong&gt;always prompt&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.git/&lt;/code&gt;, &lt;code&gt;.vscode/&lt;/code&gt;, &lt;code&gt;.idea/&lt;/code&gt;, &lt;code&gt;.husky/&lt;/code&gt; - editor and repo config&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.claude/&lt;/code&gt; - Claude's own config (except commands, agents, skills, worktrees)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.gitconfig&lt;/code&gt;, &lt;code&gt;.gitmodules&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.bash_profile&lt;/code&gt;, &lt;code&gt;.zshrc&lt;/code&gt;, &lt;code&gt;.zprofile&lt;/code&gt;, &lt;code&gt;.profile&lt;/code&gt; - shell configs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.mcp.json&lt;/code&gt;, &lt;code&gt;.claude.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly what happened to me. I had &lt;code&gt;allow: ["*"]&lt;/code&gt; and was still getting prompted for &lt;code&gt;.claude/&lt;/code&gt; edits. Adding &lt;code&gt;defaultMode: "bypassPermissions"&lt;/code&gt; fixed it because bypass mode skips the protected paths check entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Six Permission Modes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;default&lt;/code&gt; - Most restrictive. Prompts for every non-read operation. Protected paths always prompt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;acceptEdits&lt;/code&gt; - Auto-approves file reads and edits. Still prompts for Bash commands and network access.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plan&lt;/code&gt; - Read-only. Claude can read and search but cannot edit or run commands.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;auto&lt;/code&gt; - AI classifier (Sonnet 4.6) reviews every action. Auto-approves safe actions, blocks dangerous ones. Requires Team/Enterprise/API plan.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dontAsk&lt;/code&gt; - Pure allowlist. Anything in &lt;code&gt;permissions.allow&lt;/code&gt; executes. Everything else is silently denied. For CI/CD.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bypassPermissions&lt;/code&gt; - Skips the permission layer entirely. No rules checked, no prompts. Maximum speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Press &lt;strong&gt;Shift+Tab&lt;/strong&gt; during a session to cycle: default, acceptEdits, plan (and bypass/auto if enabled). Note: &lt;code&gt;dontAsk&lt;/code&gt; is startup-only and never appears in the cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Allow/Deny Rules: The Fine-Grained Option
&lt;/h2&gt;

&lt;p&gt;If you want something between "prompt everything" and "bypass everything," rules let you pre-approve specific tools.&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"defaultMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acceptEdits"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git *)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(npm *)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(python3 *)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"WebFetch(domain:github.com)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(rm -rf *)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules evaluate in order: &lt;strong&gt;deny &amp;gt; ask &amp;gt; allow&lt;/strong&gt;. If a tool is denied at any level, no other level can allow it. Deny always wins.&lt;/p&gt;

&lt;p&gt;Path rules use gitignore-style patterns. One gotcha: &lt;code&gt;/path&lt;/code&gt; is relative to the project root. Use &lt;code&gt;//path&lt;/code&gt; (double slash) for absolute filesystem paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every Setting Explained
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"defaultMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bypassPermissions"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skipDangerousModePermissionPrompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alwaysThinkingEnabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"effortLevel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"max"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Settings files load in priority order: managed (highest) &amp;gt; CLI flags &amp;gt; local project &amp;gt; shared project &amp;gt; user global (lowest). A deny at any level blocks everything below it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mistakes I Made So You Do Not Have To
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thinking allow: ["*"] = bypass mode.&lt;/strong&gt; It is not. allow works within the mode's framework. Protected paths still prompt in default mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using --dangerously-skip-permissions.&lt;/strong&gt; Deprecated. Use --permission-mode bypassPermissions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing defaultMode in settings.&lt;/strong&gt; Without it, you start in default mode regardless of allow rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting to uninstall the old npm binary.&lt;/strong&gt; If you switched to the native installer, the old npm claude may still be in your PATH taking precedence. Run &lt;code&gt;which -a claude&lt;/code&gt; to check.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The maximum power configuration is two files and one alias. The settings file tells Claude Code to start in bypass mode with max effort. The alias makes it a single-character command. Once it is set up, you stop thinking about permissions entirely and just work.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://vanja.io/claude-code-max-power/" rel="noopener noreferrer"&gt;vanja.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Claude Code: GUI vs Terminal — A Tale of Two Workflows</title>
      <dc:creator>Vanja Petreski</dc:creator>
      <pubDate>Mon, 13 Apr 2026 01:49:59 +0000</pubDate>
      <link>https://dev.to/vpetreski/claude-code-gui-vs-terminal-a-tale-of-two-workflows-30hm</link>
      <guid>https://dev.to/vpetreski/claude-code-gui-vs-terminal-a-tale-of-two-workflows-30hm</guid>
      <description>&lt;p&gt;I've been using Claude Code in the terminal for a while now. Sonnet model, JetBrains IDE open on the side, watching changes flow in real-time, git branches under my control. Life was good. Sure, there were annoyances - the dreaded "compacting conversation" message that makes you wonder what context just got sacrificed to the token gods, or losing everything when the terminal session dies. But overall? Solid workflow.&lt;/p&gt;

&lt;p&gt;Then Anthropic dropped the GUI preview. Shiny new interface. Opus model. "This is going to be amazing," I thought.&lt;/p&gt;

&lt;p&gt;Reader, it was not amazing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The GUI Experience: A Horror Story in Three Acts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Act I: The Worktree From Hell
&lt;/h3&gt;

&lt;p&gt;First thing I noticed: Claude Code GUI doesn't work in your project directory. Oh no. It creates its own little universe - a git worktree tucked away in some &lt;code&gt;.workspaces&lt;/code&gt; folder, completely isolated from your actual codebase.&lt;/p&gt;

&lt;p&gt;"That's fine," you might think. "I'll just open it in my IDE."&lt;/p&gt;

&lt;p&gt;Nope. JetBrains sees the branch exists but throws errors when you try to switch to it. Something about worktrees. Something about suffering.&lt;/p&gt;

&lt;p&gt;The workaround? There's a cute little "Open in VSCode" button that works because apparently VSCode and Claude are best friends now. Great for VSCode users. For those of us who've spent years customizing our JetBrains setup? Pain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Act II: Where Did My Environment Go?
&lt;/h3&gt;

&lt;p&gt;Here's the thing about git worktrees - they're a fresh checkout. You know what doesn't get checked into git? Your &lt;code&gt;.env&lt;/code&gt; file. Your local config. All those gitignored secrets that make your app actually run.&lt;/p&gt;

&lt;p&gt;So Claude spins up in its pristine worktree, tries to run your app, and... nothing works. No database connection. No API keys. Just vibes and error messages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Act III: Shell Shock
&lt;/h3&gt;

&lt;p&gt;I use zsh. Like most developers in 2025. Claude Code GUI? Bash only.&lt;/p&gt;

&lt;p&gt;This means nothing on my PATH works. My aliases? Gone. My carefully curated shell environment? Invisible.&lt;/p&gt;

&lt;p&gt;The workaround: tell Claude to wrap everything in &lt;code&gt;zsh -c "..."&lt;/code&gt;. Then put that instruction in CLAUDE.md so it doesn't forget. Then watch it forget anyway and wonder why &lt;code&gt;nvm&lt;/code&gt; isn't a command.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Cleanup Crew
&lt;/h3&gt;

&lt;p&gt;Once you're done with a session, you get to manually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete the orphaned git branch&lt;/li&gt;
&lt;li&gt;Clean up the workspace directory&lt;/li&gt;
&lt;li&gt;Question your life choices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This cruft accumulates. Your &lt;code&gt;.workspaces&lt;/code&gt; folder grows. Your branch list becomes a graveyard of abandoned Claude sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Wait, There's Good Stuff Too
&lt;/h2&gt;

&lt;p&gt;I'm not completely hating here. The GUI does solve real problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No more compacting.&lt;/strong&gt; Those long sessions where terminal Claude starts forgetting your project structure? Gone. The GUI maintains full context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session persistence.&lt;/strong&gt; Close the window, come back later, pick up where you left off. Terminal Claude? Session dies with the terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's pretty.&lt;/strong&gt; Look, the interface is nice. If you're into that sort of thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opus is genuinely better.&lt;/strong&gt; This was the revelation. Working with Opus instead of Sonnet means less ping-pong. You describe what you want, Claude does it right the first time. No more "okay but you broke the tests" followed by "okay but now you broke something else" loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Plot Twist
&lt;/h2&gt;

&lt;p&gt;Here's the thing: &lt;strong&gt;you can run Opus in terminal Claude Code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The GUI's advantages - session persistence, no compacting, better model - only one of those is exclusive to the GUI. And it's not the model.&lt;/p&gt;

&lt;p&gt;Terminal + Opus gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opus-level reasoning (fewer iterations, correct on first try)&lt;/li&gt;
&lt;li&gt;Your JetBrains IDE working normally&lt;/li&gt;
&lt;li&gt;Your &lt;code&gt;.env&lt;/code&gt; and gitignored files intact&lt;/li&gt;
&lt;li&gt;Your zsh config and PATH&lt;/li&gt;
&lt;li&gt;Clean git workflow on branches you control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You lose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session persistence (mitigate with good CLAUDE.md)&lt;/li&gt;
&lt;li&gt;Conversation compacting (mitigate with good CLAUDE.md)&lt;/li&gt;
&lt;li&gt;The pretty interface (you're a terminal person, you'll survive)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Terminal + Opus. Not even close.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The GUI preview is solving problems I don't have while creating problems I very much do have. The worktree isolation might make sense for beginners who need guardrails, but for developers with established workflows, it's actively hostile.&lt;/p&gt;

&lt;p&gt;The real MVP features - better reasoning, fewer iterations - come from Opus, not from the GUI wrapper. Run Opus in your terminal. Keep your workflow. Watch Claude get things right the first time while you maintain full visibility in your actual IDE.&lt;/p&gt;

&lt;p&gt;Will the GUI improve? Probably. Anthropic ships fast and iterates faster. Maybe we'll get configurable worktree behavior. Maybe JetBrains integration. Maybe zsh support.&lt;/p&gt;

&lt;p&gt;But I'm not going to fight my tools waiting for "maybe later." Terminal + Opus works today.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Now if you'll excuse me, I have a CLAUDE.md file to update. Gotta make sure Claude remembers to use zsh... wait, that's only the GUI. Never mind. Terminal life is good.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://vanja.io/claude-code-gui-vs-terminal-a-tale-of-two-workflows/" rel="noopener noreferrer"&gt;vanja.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>How to Install Claude Code the Right Way in 2026</title>
      <dc:creator>Vanja Petreski</dc:creator>
      <pubDate>Mon, 13 Apr 2026 01:46:41 +0000</pubDate>
      <link>https://dev.to/vpetreski/how-to-install-claude-code-the-right-way-in-2026-52kb</link>
      <guid>https://dev.to/vpetreski/how-to-install-claude-code-the-right-way-in-2026-52kb</guid>
      <description>&lt;p&gt;I've installed Claude Code three different ways in the past month. Homebrew first, then npm, now the native installer. Each time I thought I had the right answer. Here's what I learned.&lt;/p&gt;




&lt;h2&gt;
  
  
  Homebrew: Where I Started
&lt;/h2&gt;

&lt;p&gt;I was running Claude Code &lt;code&gt;v2.1.81&lt;/code&gt; via Homebrew. The new &lt;code&gt;/buddy&lt;/code&gt; command — the terminal pet everyone was talking about — needed v2.1.89+. I ran &lt;code&gt;brew upgrade&lt;/code&gt;. Nothing happened. Homebrew was &lt;strong&gt;9 versions behind&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The problem: Homebrew wraps Claude Code as a cask. Someone has to update the formula after each release, then it goes through review. There's always a delay — sometimes hours, sometimes days.&lt;/p&gt;




&lt;h2&gt;
  
  
  npm: Better, but Not the Answer
&lt;/h2&gt;

&lt;p&gt;I switched to npm. Updates landed faster because &lt;code&gt;@anthropic-ai/claude-code&lt;/code&gt; is the actual package Anthropic publishes. No middleman. I even added a quick-update alias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;cu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"npm update -g @anthropic-ai/claude-code"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This worked well — until I noticed a yellow banner in my terminal telling me npm installation is &lt;strong&gt;deprecated&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Native Installer: The Right Way
&lt;/h2&gt;

&lt;p&gt;Anthropic now ships a &lt;strong&gt;native binary&lt;/strong&gt; — no Node.js required, no npm, no dependency chain. It's code-signed by Anthropic (notarized by Apple on macOS), and it &lt;strong&gt;auto-updates in the background&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Install it with one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://claude.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The binary lands at &lt;code&gt;~/.local/bin/claude&lt;/code&gt;. Make sure it's in your PATH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're coming from npm or Homebrew, uninstall the old version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# From npm&lt;/span&gt;
npm uninstall &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code

&lt;span class="c"&gt;# From Homebrew&lt;/span&gt;
brew uninstall claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Auth tokens live in &lt;code&gt;~/.claude/&lt;/code&gt;, completely independent of the install method. No re-authentication. You pick up right where you left off.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Native Wins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Auto-updates.&lt;/strong&gt; Claude Code updates itself in the background. No manual &lt;code&gt;brew upgrade&lt;/code&gt; or &lt;code&gt;npm update&lt;/code&gt;. You always have the latest version. If you want to trigger an update manually: &lt;code&gt;claude update&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero dependencies.&lt;/strong&gt; No Node.js. No npm. No version manager conflicts with nvm, asdf, or fnm intercepting your PATH.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code-signed.&lt;/strong&gt; The binary is signed by Anthropic and notarized by Apple. Integrity verification via GPG-signed manifests with SHA256 checksums.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release channels.&lt;/strong&gt; Choose &lt;code&gt;latest&lt;/code&gt; (default, immediate updates) or &lt;code&gt;stable&lt;/code&gt; (roughly one week behind, skips regressions).&lt;/p&gt;




&lt;h2&gt;
  
  
  The Alias
&lt;/h2&gt;

&lt;p&gt;My update alias is now just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;cu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"claude update"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Though honestly, with auto-updates you barely need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Gotcha: Ghost npm Still in PATH
&lt;/h2&gt;

&lt;p&gt;If you previously installed via npm and then installed the native binary, you might still see this warning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code has switched from npm to native installer. Run `claude install` or see https://docs.anthropic.com/en/docs/claude-code/getting-started for more options.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means the old npm binary is still in your PATH and taking precedence over the native one. Check with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;which &lt;span class="nt"&gt;-a&lt;/span&gt; claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see &lt;code&gt;/opt/homebrew/bin/claude&lt;/code&gt; (npm) above &lt;code&gt;~/.local/bin/claude&lt;/code&gt; (native), the stale npm version is winning. The fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm uninstall &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, &lt;code&gt;which claude&lt;/code&gt; should resolve to &lt;code&gt;~/.local/bin/claude&lt;/code&gt; and the warning disappears.&lt;/p&gt;




&lt;p&gt;Three install methods, three different trade-offs. Homebrew lags behind. npm works but is deprecated. The native installer auto-updates, has zero dependencies, and is the only one Anthropic actively recommends. Switch once, stop thinking about it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://vanja.io/install-claude-code/" rel="noopener noreferrer"&gt;vanja.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
