<?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: Ravi Weiss</title>
    <description>The latest articles on DEV Community by Ravi Weiss (@raviweiss).</description>
    <link>https://dev.to/raviweiss</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%2F4136777%2F5b0248d7-811f-4f70-b190-7a1385638edf.png</url>
      <title>DEV Community: Ravi Weiss</title>
      <link>https://dev.to/raviweiss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raviweiss"/>
    <language>en</language>
    <item>
      <title>OpenCode vs Claude Code in Late 2026: What OpenCode V2 Changed</title>
      <dc:creator>Ravi Weiss</dc:creator>
      <pubDate>Wed, 07 Oct 2026 03:15:35 +0000</pubDate>
      <link>https://dev.to/raviweiss/opencode-vs-claude-code-in-late-2026-what-opencode-v2-changed-3p41</link>
      <guid>https://dev.to/raviweiss/opencode-vs-claude-code-in-late-2026-what-opencode-v2-changed-3p41</guid>
      <description>&lt;p&gt;Most "OpenCode vs Claude Code" write-ups I find were written in spring, and they hold up on the big picture: Claude Code is Anthropic's tightly integrated agent, OpenCode is the open-source one you can point at almost any model. What they miss is that OpenCode shipped a V2 since then, and V2 changed the config format my team actually edits every week. So this is a narrower comparison: the parts that touch day-to-day setup, written after moving my team's config back and forth between the two.&lt;/p&gt;

&lt;p&gt;One scoping note first. Both tools are for changing code that already exists. When the job is a brand-new product surface from nothing, a landing page plus a companion app, I don't open either of them; I use &lt;a href="https://begin.sh/?utm_source=devto&amp;amp;utm_medium=ugc&amp;amp;utm_campaign=raviweiss&amp;amp;utm_content=opencode-vs-claude-code-intro" rel="noopener noreferrer"&gt;begin&lt;/a&gt;, which builds a website, iOS app, Android app or Chrome extension from one prompt. Everything below is about the other case, an existing repo with tests and reviewers.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenCode vs Claude Code: the short version
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;OpenCode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Models&lt;/td&gt;
&lt;td&gt;Claude, via subscription, Console, or Bedrock / Google Cloud / Microsoft Foundry&lt;/td&gt;
&lt;td&gt;75+ providers via Models.dev, local models, plus optional Zen and Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surfaces&lt;/td&gt;
&lt;td&gt;Terminal, VS Code, JetBrains, desktop app, web&lt;/td&gt;
&lt;td&gt;Terminal, desktop app, IDE extension (V1); terminal, desktop, web (V2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project memory&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt;, can also read &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt;, falls back to &lt;code&gt;CLAUDE.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission precedence&lt;/td&gt;
&lt;td&gt;deny, then ask, then allow&lt;/td&gt;
&lt;td&gt;Last matching rule wins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in subagents&lt;/td&gt;
&lt;td&gt;Explore, Plan, general-purpose&lt;/td&gt;
&lt;td&gt;General, Explore, Scout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entry price&lt;/td&gt;
&lt;td&gt;Pro at $20/month ($17/month billed annually)&lt;/td&gt;
&lt;td&gt;Free; you pay your model provider, or Go at $10/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you only read one row, read "Permission precedence". It's the one that caused real surprises for us.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed with OpenCode V2
&lt;/h2&gt;

&lt;p&gt;The V2 migration guide lists three intentional breaking changes: a new plugin API, new server API contracts, and terminal client config moving from layered &lt;code&gt;tui.json&lt;/code&gt; files into one global &lt;code&gt;cli.json&lt;/code&gt; (migrated automatically). V1 and V2 both use the &lt;code&gt;opencode&lt;/code&gt; command and no longer install side by side, so remove a package-managed V1 before installing V2.&lt;/p&gt;

&lt;p&gt;The good news: V2 reads your existing &lt;code&gt;opencode.json&lt;/code&gt; from the same locations as V1 and normalizes V1 fields in memory, so agents, commands and skills in &lt;code&gt;.opencode/&lt;/code&gt; keep working. The part I'd flag is permissions. V2 replaces the per-tool &lt;code&gt;permission&lt;/code&gt; object with an ordered &lt;code&gt;permissions&lt;/code&gt; array, and renames actions: &lt;code&gt;bash&lt;/code&gt; becomes &lt;code&gt;shell&lt;/code&gt;, &lt;code&gt;task&lt;/code&gt; becomes &lt;code&gt;subagent&lt;/code&gt;, and &lt;code&gt;write&lt;/code&gt;/&lt;code&gt;patch&lt;/code&gt; fold into &lt;code&gt;edit&lt;/code&gt;. Your V1 file still loads, but every doc example and every snippet a teammate pastes from now on will be in the new shape.&lt;/p&gt;

&lt;p&gt;V2 install, from the official docs:&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;# OpenCode V2&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://opencode.ai/v2/install | bash
&lt;span class="c"&gt;# or&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @opencode/cli

&lt;span class="c"&gt;# Claude Code (macOS, Linux, WSL)&lt;/span&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;h2&gt;
  
  
  Permissions: same words, opposite logic
&lt;/h2&gt;

&lt;p&gt;Both tools use allow / ask / deny. They resolve conflicts in opposite ways, and this is where copying a rule from one to the other goes wrong.&lt;/p&gt;

&lt;p&gt;Claude Code evaluates deny first, then ask, then allow. The first match in that order decides, and specificity doesn't matter. The docs spell out the consequence: a broad deny like &lt;code&gt;Bash(aws *)&lt;/code&gt; blocks &lt;code&gt;aws s3 ls&lt;/code&gt; even if you also have an allow rule for exactly that. You can't carve an exception out of a deny.&lt;/p&gt;

&lt;p&gt;OpenCode does the reverse. The last matching rule wins, so you write the broad rule first and the exceptions after it. That's true in V1's object syntax and in V2's array.&lt;/p&gt;

&lt;p&gt;Here is the same intent, "ask before shell commands, allow git status and diff, never push", in both:&lt;/p&gt;

&lt;p&gt;Claude Code, in &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;"Bash(git status *)"&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 diff *)"&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="s2"&gt;"Bash(git push *)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Read(./.env)"&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;OpenCode V2, in &lt;code&gt;opencode.jsonc&lt;/code&gt; (order matters, last match wins):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&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;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://opencode.ai/config.json"&lt;/span&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&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;"effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ask"&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="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git status *"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow"&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="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git diff *"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;"effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow"&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="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git push *"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;"effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deny"&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;In Claude Code I don't need the catch-all "ask" line, because Manual mode already prompts for Bash commands outside a built-in read-only set. In OpenCode the catch-all matters. V1 starts from permissive defaults where most permissions are &lt;code&gt;allow&lt;/code&gt; (with &lt;code&gt;.env&lt;/code&gt; reads denied, and &lt;code&gt;doom_loop&lt;/code&gt; and &lt;code&gt;external_directory&lt;/code&gt; set to ask). The V2 docs say that when no rule matches, OpenCode uses &lt;code&gt;ask&lt;/code&gt;. If your team moved from V1 to V2 without writing explicit rules, the number of prompts you see may change. Check before you assume either behavior.&lt;/p&gt;

&lt;p&gt;The other difference is how you skip prompts. Claude Code has named modes: Manual (&lt;code&gt;default&lt;/code&gt;), &lt;code&gt;acceptEdits&lt;/code&gt;, &lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;auto&lt;/code&gt;, where a background classifier reviews actions instead of you, &lt;code&gt;dontAsk&lt;/code&gt;, and &lt;code&gt;bypassPermissions&lt;/code&gt;. OpenCode has &lt;code&gt;opencode --auto&lt;/code&gt;, which approves anything not explicitly denied. Deny rules still hold in both, so write your denies first and your conveniences second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory files: you can share one
&lt;/h2&gt;

&lt;p&gt;This used to be a migration headache and mostly isn't anymore.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code reads &lt;code&gt;CLAUDE.md&lt;/code&gt; at the start of every session, and its docs say it can read an existing &lt;code&gt;AGENTS.md&lt;/code&gt; on its own or alongside &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;OpenCode reads &lt;code&gt;AGENTS.md&lt;/code&gt; and uses &lt;code&gt;CLAUDE.md&lt;/code&gt; as a fallback when no &lt;code&gt;AGENTS.md&lt;/code&gt; exists. It also falls back to &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; for global rules and picks up &lt;code&gt;~/.claude/skills/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So a single committed &lt;code&gt;AGENTS.md&lt;/code&gt; works for a mixed team. The trap is the global fallback. If you run both tools on one machine, OpenCode will quietly load your personal Claude Code instructions unless you have a &lt;code&gt;~/.config/opencode/AGENTS.md&lt;/code&gt;. If that isn't what you want, set &lt;code&gt;OPENCODE_DISABLE_CLAUDE_CODE=1&lt;/code&gt; (or the narrower &lt;code&gt;_PROMPT&lt;/code&gt; and &lt;code&gt;_SKILLS&lt;/code&gt; variants).&lt;/p&gt;

&lt;h2&gt;
  
  
  Subagents and agents
&lt;/h2&gt;

&lt;p&gt;The two are closer here than the marketing suggests. Both delegate to a child agent with its own context and return a result to the parent.&lt;/p&gt;

&lt;p&gt;OpenCode gives you two primary agents you cycle with Tab, Build (everything enabled) and Plan (edits and bash set to ask), plus three subagents: General, Explore (read-only codebase search) and Scout, which is read-only research on external docs and dependency source. You can also &lt;code&gt;@&lt;/code&gt;-mention a subagent directly. Custom agents live in &lt;code&gt;.opencode/agents/*.md&lt;/code&gt; or in &lt;code&gt;opencode.json&lt;/code&gt;, each with its own model and permissions. In practice that means a cheap model for search and a strong one for edits, in the same session.&lt;/p&gt;

&lt;p&gt;Claude Code ships Explore, Plan and general-purpose, with custom agents in &lt;code&gt;.claude/agents/&lt;/code&gt;, and adds background agents and cloud routines on top. Model choice per agent exists, but it's choice within Claude, unless you route the whole tool through Bedrock, Google Cloud, Foundry or an LLM gateway via &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost: a subscription vs. a meter
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;OpenCode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool&lt;/td&gt;
&lt;td&gt;Included with Pro / Max / Team / Enterprise&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cheapest paid path&lt;/td&gt;
&lt;td&gt;Pro: $20/month, or $17/month billed annually&lt;/td&gt;
&lt;td&gt;Go: $10/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavier use&lt;/td&gt;
&lt;td&gt;Max from $100/month, 5x or 20x Pro usage&lt;/td&gt;
&lt;td&gt;Go Plus: $40/month, or pay-per-request on Zen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay as you go&lt;/td&gt;
&lt;td&gt;Console API tokens&lt;/td&gt;
&lt;td&gt;Any provider key you already have&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limit shape&lt;/td&gt;
&lt;td&gt;Plan usage limits&lt;/td&gt;
&lt;td&gt;Go: per-model dollar caps, 5-hour = 20% and weekly = 50% of the monthly cap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For API-billed teams, Anthropic's cost docs give a useful anchor. Across enterprise deployments the average is about $13 per developer per active day and $150–250 per developer per month, with 90% of users under $30 per active day.&lt;/p&gt;

&lt;p&gt;One detail I didn't expect: OpenCode's own Go docs list Claude Code as a validated client for the Go endpoint. If the reason you're looking at OpenCode is cheap open models rather than the open harness, that's worth knowing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I landed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for the repos where review quality matters most and the team is already on Claude plans. Deny-first rules are easier to audit, and the modes are better for people who don't want to think about config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenCode&lt;/strong&gt; for experiments with new open models, for anyone who wants a local or non-Anthropic provider, and wherever we want permissions with real exceptions ("deny all edits except these docs paths"), which last-match-wins handles cleanly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/strong&gt; committed to every repo, so switching tools costs nothing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is OpenCode a free alternative to Claude Code?&lt;/strong&gt;&lt;br&gt;
The tool is free and open source. Model usage isn't, unless you use a free model. You bring a provider key, log in with GitHub Copilot or ChatGPT Plus/Pro, or subscribe to OpenCode Go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can OpenCode use Claude models?&lt;/strong&gt;&lt;br&gt;
Yes. Anthropic is one of the providers it supports, alongside OpenAI, Google and local models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does OpenCode read CLAUDE.md?&lt;/strong&gt;&lt;br&gt;
Yes, as a fallback when there's no &lt;code&gt;AGENTS.md&lt;/code&gt;, plus &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; globally. Turn it off with &lt;code&gt;OPENCODE_DISABLE_CLAUDE_CODE=1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will my OpenCode V1 config work in V2?&lt;/strong&gt;&lt;br&gt;
Mostly. V2 reads V1 config from the same paths. Plugins and server API integrations need porting, and permissions are worth converting to the new ordered array so the rule order is explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;The honest summary of OpenCode vs Claude Code in late 2026: same agent loop, different opinions about who owns the harness, and permission semantics that are close to opposite. Pick based on that, keep your instructions in &lt;code&gt;AGENTS.md&lt;/code&gt;, and read the &lt;a href="https://opencode.ai/docs/" rel="noopener noreferrer"&gt;OpenCode docs&lt;/a&gt; on permissions before you copy a rule across. When the task is a new product rather than a change to an old one, I still hand it to &lt;a href="https://begin.sh/?utm_source=devto&amp;amp;utm_medium=ugc&amp;amp;utm_campaign=raviweiss&amp;amp;utm_content=opencode-vs-claude-code-outro" rel="noopener noreferrer"&gt;begin&lt;/a&gt;, because hosting, sign-in and Stripe payments come wired into the first build.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>claude</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
