<?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: Antoni Caimari Caldés</title>
    <description>The latest articles on DEV Community by Antoni Caimari Caldés (@caimari).</description>
    <link>https://dev.to/caimari</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%2F4230985%2F2c744476-8fe1-4fb4-9fd7-bde55ca4f815.png</url>
      <title>DEV Community: Antoni Caimari Caldés</title>
      <link>https://dev.to/caimari</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/caimari"/>
    <language>en</language>
    <item>
      <title>I built a local AI coding agent for VS Code in 4 days — here's how it works</title>
      <dc:creator>Antoni Caimari Caldés</dc:creator>
      <pubDate>Fri, 06 Nov 2026 19:16:42 +0000</pubDate>
      <link>https://dev.to/caimari/i-built-a-local-ai-coding-agent-for-vs-code-in-4-days-heres-how-it-works-2cd9</link>
      <guid>https://dev.to/caimari/i-built-a-local-ai-coding-agent-for-vs-code-in-4-days-heres-how-it-works-2cd9</guid>
      <description>&lt;p&gt;During Meta's Global AI Developer Hackathon, I spent roughly four intensive days building &lt;strong&gt;RAME Code&lt;/strong&gt;, a free, Apache-2.0 open-source AI coding agent for Visual Studio Code.&lt;/p&gt;

&lt;p&gt;It runs &lt;strong&gt;Meta Muse Glimmer 30B locally&lt;/strong&gt;, through compatible inference servers such as LM Studio, Ollama and llama.cpp.&lt;/p&gt;

&lt;p&gt;There are already plenty of AI coding agents. I wanted to explore a more specific question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if the model never gets the final word — not on what runs, not on what's remembered, and not on whether a task is actually finished?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;RAME Code v0.2.0 is available now. It's experimental, has known limitations, and I'm looking for developers willing to test it with their own local models.&lt;/p&gt;

&lt;p&gt;Here's how it works, what I've learned, and what still needs improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model proposes, the user authorizes, the host verifies
&lt;/h2&gt;

&lt;p&gt;RAME Code separates three responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The model&lt;/strong&gt; reads project context and proposes actions, such as modifying files, executing permitted tools or searching the web.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The user&lt;/strong&gt; reviews and approves actions that require authorization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The host&lt;/strong&gt; — the VS Code extension itself — validates permissions, executes approved actions and independently records their results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last part is particularly important.&lt;/p&gt;

&lt;p&gt;When a task finishes, RAME can display a record labelled:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Host record — verified by RAME Code, not written by the model"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea is simple: a model saying "I've completed the task" is not sufficient evidence that the requested changes actually happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approvals are bound to specific actions
&lt;/h2&gt;

&lt;p&gt;RAME Code uses two elements when validating an approval:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A fresh &lt;strong&gt;action identifier&lt;/strong&gt;, which prevents an old approval from being reused.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;digest&lt;/strong&gt; calculated from the proposed action, including its relevant parameters and context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The digest ties an approval to the proposed operation. The identifier distinguishes individual approval requests, including repeated proposals of an otherwise identical action.&lt;/p&gt;

&lt;p&gt;If the proposed action changes, the previous approval cannot authorize the modified action.&lt;/p&gt;

&lt;p&gt;Pending approvals are also invalidated when relevant execution conditions change.&lt;/p&gt;

&lt;p&gt;This is an example of something I believe should be enforced by software rather than relying exclusively on instructions to the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preventing accidental overwrites
&lt;/h2&gt;

&lt;p&gt;Before modifying an existing file, the agent must read its contents.&lt;/p&gt;

&lt;p&gt;A proposed patch includes the expected SHA-256 hash of the file. Before applying the change, RAME calculates the current hash again.&lt;/p&gt;

&lt;p&gt;If another application, developer or process modified that file in the meantime, the patch is rejected.&lt;/p&gt;

&lt;p&gt;RAME also includes rollback handling for multi-file patches. If a write or post-write verification fails, it attempts to restore the original files.&lt;/p&gt;

&lt;p&gt;This is not a substitute for Git, filesystem snapshots or a fully isolated execution environment.&lt;/p&gt;

&lt;p&gt;Some sensitive paths are excluded from the agent's file tools, including Git internals, common credential locations and private key files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missions: tasks that survive a VS Code reload
&lt;/h2&gt;

&lt;p&gt;Longer coding tasks can be organized into &lt;strong&gt;Missions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A Mission contains a plan, bounded execution steps and checkpoints managed by the extension.&lt;/p&gt;

&lt;p&gt;If VS Code reloads during execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Mission is marked as interrupted.&lt;/li&gt;
&lt;li&gt;Previously started actions with unrecorded outcomes can be marked as uncertain.&lt;/li&gt;
&lt;li&gt;Execution does not automatically continue.&lt;/li&gt;
&lt;li&gt;The user explicitly decides whether to resume.&lt;/li&gt;
&lt;li&gt;New actions still require the appropriate permissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because an interrupted operation should not simply be repeated when its previous outcome is unknown.&lt;/p&gt;

&lt;p&gt;I've also been testing interruption and permission-denial scenarios to improve the recovery behavior in the next release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Versioned project memory with human approval
&lt;/h2&gt;

&lt;p&gt;RAME Code includes a system for storing project decisions.&lt;/p&gt;

&lt;p&gt;For example, a project might contain an approved decision such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;shipping.free_threshold_eur = 60&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The model can propose a new decision, but it cannot independently turn that proposal into authorized project knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Only the user can approve changes to project decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The system maintains a version history, and proposals refer to the version they expect to modify. This helps reject outdated updates.&lt;/p&gt;

&lt;p&gt;Decisions can also be associated with project files and verification results, allowing RAME to identify certain relationships that become stale when a decision changes.&lt;/p&gt;

&lt;p&gt;There are still important challenges to solve, including detecting contradictions between different approved decisions and marking existing decisions as disputed while corrections are pending.&lt;/p&gt;

&lt;p&gt;These are areas I'm actively researching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local-first AI
&lt;/h2&gt;

&lt;p&gt;The coding agent can run using a local model through compatible inference servers.&lt;/p&gt;

&lt;p&gt;RAME also supports optional capabilities that communicate with external services, but these are separate from local inference.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web searches require authorization before sending queries.&lt;/li&gt;
&lt;li&gt;Optional cloud model escalation is disabled by default.&lt;/li&gt;
&lt;li&gt;Requests to external services are subject to their corresponding controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local inference does not mean that every optional operation is offline. I think making that distinction explicit is important.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned from real testing
&lt;/h2&gt;

&lt;p&gt;One of the first practical problems I encountered involved LM Studio.&lt;/p&gt;

&lt;p&gt;With just-in-time model loading, LM Studio can initialize a model using a default context window of 4,096 tokens.&lt;/p&gt;

&lt;p&gt;For some agent tasks, the tools and project context alone exceeded that limit, resulting in an HTTP 400 error.&lt;/p&gt;

&lt;p&gt;The immediate workaround was to configure a larger default context window in LM Studio.&lt;/p&gt;

&lt;p&gt;I'm preparing improvements so that RAME can explain these failures more clearly and help users correct the configuration.&lt;/p&gt;

&lt;p&gt;It's a good reminder that local models behave differently depending on hardware, inference software, context limits and model settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Known limitations
&lt;/h2&gt;

&lt;p&gt;RAME Code v0.2.0 was developed quickly, and there are several things I want to improve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No proper diff in approval cards yet.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Currently, a file modification card shows the proposed new content rather than a dedicated before-and-after diff. Large content may be truncated.&lt;/p&gt;

&lt;p&gt;A proper diff viewer is one of my highest priorities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No one-click undo for completed changes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RAME includes recovery handling for certain failed patches, but it does not yet provide a convenient way to undo an already approved and successfully applied change.&lt;/p&gt;

&lt;p&gt;For now, Git or VS Code's local history remains important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No operating-system sandbox.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Allowlisted tools execute with the permissions of the host environment. The current permission system should not be treated as a complete security boundary against untrusted code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local model compatibility needs broader testing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've primarily tested RAME on my own Windows and Linux environments, including local and Remote SSH setups.&lt;/p&gt;

&lt;p&gt;Different hardware configurations, operating systems and inference servers need more coverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Large projects need more evaluation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Long-running tasks, context management and reliability on larger codebases remain important areas for improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm looking for beta testers
&lt;/h2&gt;

&lt;p&gt;If you work with local LLMs, I'd really appreciate your feedback.&lt;/p&gt;

&lt;p&gt;Three tests would be especially useful:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Try your preferred local model.&lt;/strong&gt; Does RAME connect correctly through your inference server? What hardware and context settings are you using?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try a multi-file modification.&lt;/strong&gt; Is the approval process clear? What information would you need before trusting a proposed change?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interrupt and resume a Mission.&lt;/strong&gt; Does the recovery process behave as you expect?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Please use a disposable test project&lt;/strong&gt;, not an important production repository.&lt;/p&gt;

&lt;p&gt;I'm particularly interested in unexpected behavior, usability problems, failed tool calls and differences between local model configurations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Website, installation and demo:&lt;/strong&gt; &lt;a href="https://ramecode.com" rel="noopener noreferrer"&gt;https://ramecode.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source code (Apache-2.0):&lt;/strong&gt; &lt;a href="https://github.com/caimari/rame-code" rel="noopener noreferrer"&gt;https://github.com/caimari/rame-code&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug reports and suggestions:&lt;/strong&gt; &lt;a href="https://github.com/caimari/rame-code/issues" rel="noopener noreferrer"&gt;https://github.com/caimari/rame-code/issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RAME Code was created during &lt;strong&gt;Meta's Global AI Developer Hackathon 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you'd like to see the original hackathon announcement, it's available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/caimaricaldes/status/2118144184733282470" rel="noopener noreferrer"&gt;https://x.com/caimaricaldes/status/2118144184733282470&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm an independent developer from Mallorca, Spain, and this project is still at an early stage.&lt;/p&gt;

&lt;p&gt;I would genuinely appreciate constructive criticism, especially from people building or using local AI coding agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you improve first: the approval interface, recovery from interrupted tasks, model compatibility or project memory?&lt;/strong&gt;&lt;/p&gt;

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