<?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: Manuel Bruña</title>
    <description>The latest articles on DEV Community by Manuel Bruña (@tecnomanu).</description>
    <link>https://dev.to/tecnomanu</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%2F938087%2Fadc3c6af-233f-4eb1-90c8-37af70ebe3f2.jpeg</url>
      <title>DEV Community: Manuel Bruña</title>
      <link>https://dev.to/tecnomanu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tecnomanu"/>
    <language>en</language>
    <item>
      <title>Project Tasks Belong in APX, Not APC</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Tue, 14 Jul 2026 12:04:13 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/project-tasks-belong-in-apx-not-apc-268k</link>
      <guid>https://dev.to/agentprojectcontext/project-tasks-belong-in-apx-not-apc-268k</guid>
      <description>&lt;h1&gt;
  
  
  Project Tasks Belong in APX, Not APC
&lt;/h1&gt;

&lt;p&gt;A project task is operational state.&lt;/p&gt;

&lt;p&gt;That is why it belongs in APX, not APC.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer. It keeps the repository contract in files like &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/&lt;/code&gt;. APX is the daily-use runtime and tooling layer. It keeps the moving parts that should stay local: sessions, messages, conversations, caches, and, importantly, tasks.&lt;/p&gt;

&lt;p&gt;That split matters because tasks feel deceptively simple. People often try to store everything in the same place: project rules, agent definitions, memory notes, TODOs, and runtime traces. The result is a blurred system where durable context and daily operations pollute each other.&lt;/p&gt;

&lt;p&gt;APX draws a cleaner line.&lt;/p&gt;

&lt;p&gt;In the implementation, project tasks live under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.apx/projects/&amp;lt;project-id&amp;gt;/tasks/YYYY-MM.jsonl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That location says a lot.&lt;/p&gt;

&lt;p&gt;The task log is per project, machine-local, append-only, and runtime-owned. APC does not need to version it inside the repository. The repository should define what the project is. APX should track what is happening around the project right now.&lt;/p&gt;

&lt;p&gt;The current task store is also deliberately small. Each task is created as an event, then projected into current state. The lifecycle stays simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;done&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reopen&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open tasks can also carry a workflow status such as &lt;code&gt;pending&lt;/code&gt;, &lt;code&gt;running&lt;/code&gt;, &lt;code&gt;in_review&lt;/code&gt;, or &lt;code&gt;blocked&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That design is practical for agent work.&lt;/p&gt;

&lt;p&gt;If you ask APX to capture a follow-up, the CLI can write it without inventing a bigger project-management system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx task add &lt;span class="s2"&gt;"Review auth edge case"&lt;/span&gt; &lt;span class="nt"&gt;--tag&lt;/span&gt; bug &lt;span class="nt"&gt;--agent&lt;/span&gt; reviewer &lt;span class="nt"&gt;--due&lt;/span&gt; 2026-07-15
apx task list &lt;span class="nt"&gt;--state&lt;/span&gt; open
apx task &lt;span class="k"&gt;done &lt;/span&gt;t_ab12cd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those commands are useful precisely because they stay local to APX runtime state. They do not rewrite your repository contract. They do not pretend a temporary follow-up note is the same kind of artifact as &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;.apc/project.json&lt;/code&gt;, or &lt;code&gt;.apc/mcps.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There is also a structural reason this belongs in APX.&lt;/p&gt;

&lt;p&gt;Tasks are tied to runtime activity. APX exposes per-project task APIs, a global task view across registered projects, task summaries for status screens, and task-aware tools for the super-agent. That is operational plumbing, not portable specification. APC-compatible tools may understand agent definitions or project metadata, but they should not be forced to inherit one runtime's transient TODO stream.&lt;/p&gt;

&lt;p&gt;This is the same boundary APC and APX keep elsewhere.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC stores durable, reviewable project intent.&lt;/li&gt;
&lt;li&gt;APX stores live execution state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A task like "re-run migration after vendor update" is real work, but it is not project contract. It may matter only on one machine, for one agent, during one week. Storing it in APX keeps the repo clean while still making the work visible and queryable.&lt;/p&gt;

&lt;p&gt;The alternative looks worse in both directions.&lt;/p&gt;

&lt;p&gt;If tasks go into APC, the repository starts collecting operational noise that should not travel forever. If tasks stay only inside ad hoc chat threads, they become hidden, vendor-tied, and hard to inspect later.&lt;/p&gt;

&lt;p&gt;APX avoids both problems by giving tasks a first-class local store.&lt;/p&gt;

&lt;p&gt;That also makes the APC/APX relationship easier to explain:&lt;/p&gt;

&lt;p&gt;APC tells a runtime what this project means.&lt;/p&gt;

&lt;p&gt;APX tracks what this project is doing.&lt;/p&gt;

&lt;p&gt;For daily agent work, that is the right split. Keep the shared contract in APC. Keep the changing task flow in APX.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Stopped Treating the Web Admin as a Separate Product</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 13 Jul 2026 13:05:09 +0000</pubDate>
      <link>https://dev.to/tecnomanu/i-stopped-treating-the-web-admin-as-a-separate-product-4e93</link>
      <guid>https://dev.to/tecnomanu/i-stopped-treating-the-web-admin-as-a-separate-product-4e93</guid>
      <description>&lt;h1&gt;
  
  
  I Stopped Treating the Web Admin as a Separate Product
&lt;/h1&gt;

&lt;p&gt;I used to think the browser UI was the polished layer and the CLI was the serious layer.&lt;/p&gt;

&lt;p&gt;That split felt natural for a while. The CLI was where I trusted the work. The web view was where I expected convenience, maybe better visibility, maybe a nicer way to poke around when the terminal got crowded. But while building APX, that mental model kept producing one annoying symptom: drift.&lt;/p&gt;

&lt;p&gt;The browser could show something useful, but if it did anything more than mirror the same state and actions as the daemon, it started to become its own little product. Then the CLI and the web panel slowly stopped agreeing on what mattered, or how to name it, or which path owned the truth.&lt;/p&gt;

&lt;p&gt;That is the part I finally stopped tolerating.&lt;/p&gt;

&lt;p&gt;My current thesis is simple: &lt;strong&gt;the APX web admin only works when it stays a thin surface over the same daemon, the same repo-owned project state, and the same local runtime rules&lt;/strong&gt;. If the browser invents a second version of the system, the convenience is fake. If it reads and writes the same core state, it becomes genuinely useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What APX actually is
&lt;/h2&gt;

&lt;p&gt;The APX README says the system in plain words: APX is a daemon plus CLI. The daemon is a local HTTP server that manages projects, agents, sessions, and message logs. The web admin is a browser UI served by that daemon. It is not a separate backend. It is the same runtime seen through another surface.&lt;/p&gt;

&lt;p&gt;That distinction matters more than it sounds.&lt;/p&gt;

&lt;p&gt;If the browser talks to a different store, or keeps its own state, or re-implements a business rule just to feel faster, then I am no longer using one system. I am using two systems that happen to share a logo.&lt;/p&gt;

&lt;p&gt;APX is opinionated about storage for the same reason. The repo owns project definitions and curated memory. Runtime noise lives under &lt;code&gt;~/.apx/&lt;/code&gt; and stays local. That split already tells me where the web UI should stand. It should render the same project contract, not create a separate one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the drift showed up
&lt;/h2&gt;

&lt;p&gt;I started noticing the problem in small ways.&lt;/p&gt;

&lt;p&gt;A task would look right in the browser, but the command-line flow would still expose the older shape.&lt;/p&gt;

&lt;p&gt;A project setting would be easy to edit in one place, but the other surface would lag behind or use a slightly different name.&lt;/p&gt;

&lt;p&gt;A session history view would be handy, but the action behind it would not map cleanly to the same daemon call the CLI used.&lt;/p&gt;

&lt;p&gt;None of those bugs were dramatic by themselves. The real damage was cumulative. Every time I let one surface improvise, I created another place where I had to remember what the system was &lt;em&gt;supposed&lt;/em&gt; to mean.&lt;/p&gt;

&lt;p&gt;That is a bad trade.&lt;/p&gt;

&lt;p&gt;I do not want my own tooling to depend on me carrying parallel mental models. I want one model, many views.&lt;/p&gt;

&lt;h2&gt;
  
  
  The browser is good at browsing
&lt;/h2&gt;

&lt;p&gt;The browser is still valuable. I am not arguing against it. I am arguing for a narrower job.&lt;/p&gt;

&lt;p&gt;A browser is good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scanning lots of state quickly&lt;/li&gt;
&lt;li&gt;comparing several things side by side&lt;/li&gt;
&lt;li&gt;editing structured data without leaving the machine&lt;/li&gt;
&lt;li&gt;showing relationships that are annoying in a terminal&lt;/li&gt;
&lt;li&gt;making the daemon feel inspectable instead of hidden&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is already enough.&lt;/p&gt;

&lt;p&gt;In APX, the web admin covers the right kind of surfaces for that job: projects, chat, tasks, routines, MCPs, memories, skills, docs, files, and the rest of the local control plane. The browser should help me see what is going on, not redefine what is going on.&lt;/p&gt;

&lt;p&gt;That is why I like the docs phrase that the web admin is the same runtime in the browser. That is the right mental frame. Same runtime, different interface. Not same brand, different truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I changed in practice
&lt;/h2&gt;

&lt;p&gt;Once I accepted that, the implementation discipline got simpler.&lt;/p&gt;

&lt;p&gt;The daemon became the place where the real work lives. The web panel became a client of the daemon. The CLI stayed a second client of the same daemon. Both surfaces can be opinionated about presentation. Neither surface should own the domain rules on its own.&lt;/p&gt;

&lt;p&gt;That gives me a clean test for every feature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the behavior matters to the product, it belongs in the daemon or core.&lt;/li&gt;
&lt;li&gt;If the behavior is only about how a surface presents that state, it belongs in the surface.&lt;/li&gt;
&lt;li&gt;If a feature cannot be expressed cleanly in both CLI and web, the design is probably too surface-specific.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That test has saved me from building UI-only logic that felt nice in the moment and then turned into maintenance debt later.&lt;/p&gt;

&lt;p&gt;The other thing that changed is how I think about authentication and locality. The web panel runs on &lt;code&gt;127.0.0.1:7430&lt;/code&gt; and uses the daemon over HTTP. It does not need a public server to feel modern. If I want another device on the same LAN to join, APX has an explicit pairing path. That is a better shape than quietly opening the door and hoping nobody notices.&lt;/p&gt;

&lt;p&gt;Local-first is not a marketing slogan here. It is what keeps the browser honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real lesson
&lt;/h2&gt;

&lt;p&gt;The web admin taught me something that the CLI alone did not make obvious.&lt;/p&gt;

&lt;p&gt;A tool can feel unified from the terminal and still be split in practice if the surfaces each accumulate their own ideas.&lt;/p&gt;

&lt;p&gt;That is the trap I keep watching for now. The browser UI is tempting because it is easy to add just one more convenience: a cached view, a special action, a shortcut that skips the core path. Each one looks harmless. Together they turn one system into a fork.&lt;/p&gt;

&lt;p&gt;So I am trying to stay strict about the boundary.&lt;/p&gt;

&lt;p&gt;APC holds the project contract in the repo.&lt;/p&gt;

&lt;p&gt;APX owns the local runtime, daemon, and local state.&lt;/p&gt;

&lt;p&gt;The web admin is only a view over that same runtime.&lt;/p&gt;

&lt;p&gt;When I keep those layers separate, the whole thing gets easier to understand, easier to debug, and easier to trust. When I blur them, I spend more time explaining my own tool than using it.&lt;/p&gt;

&lt;p&gt;That is why I stopped treating the web admin as a separate product.&lt;/p&gt;

&lt;p&gt;It is not a second product. It is a second angle on the same machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source notes
&lt;/h2&gt;

&lt;p&gt;The concrete pieces behind this are already in the repo and docs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APX README: daemon + CLI, browser UI, and local state split.&lt;/li&gt;
&lt;li&gt;APX docs on the daemon: every surface talks to the same host layer.&lt;/li&gt;
&lt;li&gt;APX docs on the web panel: browser UI over HTTP, no public server by default.&lt;/li&gt;
&lt;li&gt;APX docs on projects and memory: repo-owned project context, local runtime state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the boundary I want to keep. The browser can be friendly. It does not need to become independent.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Project Config Should Travel With APC</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 13 Jul 2026 12:02:35 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/project-config-should-travel-with-apc-1g20</link>
      <guid>https://dev.to/agentprojectcontext/project-config-should-travel-with-apc-1g20</guid>
      <description>&lt;h1&gt;
  
  
  Project Config Should Travel With APC
&lt;/h1&gt;

&lt;p&gt;When a team decides how an agent should behave in one repository, that decision should travel with the repository.&lt;/p&gt;

&lt;p&gt;That is why project config should live in APC.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer. It keeps repository-owned agent context in &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/&lt;/code&gt;. APX is the daily-use runtime and tooling layer. It reads that portable context, merges it with machine-local runtime settings, and keeps sessions, messages, and secrets outside the repo.&lt;/p&gt;

&lt;p&gt;That split becomes especially useful with configuration.&lt;/p&gt;

&lt;p&gt;APX documents two config layers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global config lives in &lt;code&gt;~/.apx/config.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Project config lives in &lt;code&gt;.apc/config.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rule is simple: machine-local settings stay machine-local, but repo-owned behavior travels with the project.&lt;/p&gt;

&lt;p&gt;This is stronger than convenience. It is a boundary that prevents silent drift.&lt;/p&gt;

&lt;p&gt;Imagine a team wants one project to route Telegram messages to a &lt;code&gt;reviewer&lt;/code&gt; agent and to use a different super-agent model than the default machine setting. If that choice lives only in one developer's &lt;code&gt;~/.apx/config.json&lt;/code&gt;, the behavior is no longer really part of the project. Another clone on another machine can register the same APC project and get different operational behavior without noticing.&lt;/p&gt;

&lt;p&gt;Putting that override in &lt;code&gt;.apc/config.json&lt;/code&gt; fixes the problem.&lt;/p&gt;

&lt;p&gt;A small example from the APX docs looks like this:&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;"super_agent"&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;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"groq:llama-3.3-70b-versatile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"permission_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"total"&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;"telegram"&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;"route_to_agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reviewer"&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;That file belongs in the repo because it expresses project intent. APX then applies it only for that project.&lt;/p&gt;

&lt;p&gt;The CLI makes the workflow explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx project config &lt;span class="nb"&gt;set &lt;/span&gt;my-app super_agent.model groq:llama-3.3-70b-versatile
apx project config &lt;span class="nb"&gt;set &lt;/span&gt;my-app telegram.route_to_agent reviewer
apx project config show my-app &lt;span class="nt"&gt;--effective&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the right division of labor.&lt;/p&gt;

&lt;p&gt;APC owns the durable contract. APX owns the runtime merge.&lt;/p&gt;

&lt;p&gt;The same docs also draw the line that matters most: never put secrets in &lt;code&gt;.apc/config.json&lt;/code&gt;. API keys, provider credentials, daemon settings for your machine, and other private runtime details belong in &lt;code&gt;~/.apx/config.json&lt;/code&gt;, not in the repository. APC should carry safe, reviewable project behavior. APX should keep private operational state local.&lt;/p&gt;

&lt;p&gt;That gives teams a clean model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;commit project overrides&lt;/li&gt;
&lt;li&gt;keep credentials local&lt;/li&gt;
&lt;li&gt;let APX merge both at runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without this split, teams usually fall into one of two bad patterns.&lt;/p&gt;

&lt;p&gt;The first bad pattern is hiding project behavior in one laptop. The project becomes harder to reproduce because important agent settings are no longer visible in code review.&lt;/p&gt;

&lt;p&gt;The second bad pattern is committing too much. People start placing keys, local provider endpoints, or one-off machine tweaks into shared files because there is no clear boundary between project config and runtime config.&lt;/p&gt;

&lt;p&gt;APC and APX avoid both mistakes by naming the boundary directly.&lt;/p&gt;

&lt;p&gt;There is also a portability advantage here. APC does not need to know how APX stores sessions, messages, or caches. It only needs to preserve the project-owned facts another runtime could understand later. A committed &lt;code&gt;.apc/config.json&lt;/code&gt; is part of that project contract. Even if another APC-compatible runtime eventually reads only part of it, the repository still has a visible, reviewable source of truth for its intended behavior.&lt;/p&gt;

&lt;p&gt;So the practical thesis is small but important:&lt;/p&gt;

&lt;p&gt;If a setting describes how this repository should behave, put it in APC.&lt;/p&gt;

&lt;p&gt;If a setting describes your machine, your credentials, or your local runtime state, keep it in APX.&lt;/p&gt;

&lt;p&gt;Portable context should travel. Private runtime state should not. Project config is one of the clearest places where that APC/APX boundary pays off every day.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Skill Bodies Should Load on Demand</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Sun, 12 Jul 2026 12:02:53 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/skill-bodies-should-load-on-demand-2kj7</link>
      <guid>https://dev.to/agentprojectcontext/skill-bodies-should-load-on-demand-2kj7</guid>
      <description>&lt;h1&gt;
  
  
  Skill Bodies Should Load on Demand
&lt;/h1&gt;

&lt;p&gt;A good skill system has two jobs that pull in opposite directions.&lt;/p&gt;

&lt;p&gt;First, the project needs durable instructions that live in version control. That is APC's job. A project can keep reusable skill files under &lt;code&gt;.apc/skills/&lt;/code&gt;, and agents can reference those skills by name from &lt;code&gt;AGENTS.md&lt;/code&gt; or &lt;code&gt;.apc/agents/&amp;lt;slug&amp;gt;.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Second, the runtime needs to stay fast and focused during actual work. That is APX's job. If every skill body is injected into every turn, the prompt gets noisy, token costs rise, and the model starts seeing instructions that do not matter for the current request.&lt;/p&gt;

&lt;p&gt;That is why APX is right to treat skill bodies as on-demand runtime material rather than permanent prompt baggage.&lt;/p&gt;

&lt;p&gt;In APC, the skill file is the project-owned source. The spec keeps this simple: skills are reusable instruction files under &lt;code&gt;.apc/skills/&amp;lt;name&amp;gt;.md&lt;/code&gt;, meant to avoid repeating the same operational guidance across many agents. That keeps the durable contract in the repo, reviewable like any other project artifact.&lt;/p&gt;

&lt;p&gt;But APX does not have to dump that whole contract into the model on every turn.&lt;/p&gt;

&lt;p&gt;The runtime code is explicit about this tradeoff. In &lt;code&gt;src/core/agent/skills/catalog.js&lt;/code&gt;, APX builds a compact skills hint block that lists only slugs. It tells the model that bodies are not loaded, that it can call &lt;code&gt;list_skills&lt;/code&gt; to browse one-line descriptions, and &lt;code&gt;load_skill({slug})&lt;/code&gt; to fetch the full body when exact syntax is needed. That is a better default than preloading everything.&lt;/p&gt;

&lt;p&gt;Why? Because most turns do not need most skills.&lt;/p&gt;

&lt;p&gt;If a user asks for a quick summary, a design opinion, or a small code fix, loading a release checklist, a deployment runbook, a security review guide, and a migration playbook all at once just burns attention. The model now has to separate relevant instructions from irrelevant ones before it can even start solving the task.&lt;/p&gt;

&lt;p&gt;APX also keeps the loading order practical. In &lt;code&gt;src/core/agent/skills/loader.js&lt;/code&gt;, project skills shadow global ones, and global skills shadow built-in runtime skills. So APC keeps ownership of project-specific behavior, while APX still provides a safe fallback catalog. That split matters: portable context stays in the repo, but runtime convenience does not get mistaken for project truth.&lt;/p&gt;

&lt;p&gt;There is an even stronger version of the same idea in APX's optional Skill Inspector. When enabled, the runtime suppresses the static slug dump and re-evaluates the current prompt each turn. High-confidence matches can inline one skill body. Lower-confidence matches become hints. Everything else stays out. The point is not magic retrieval. The point is prompt discipline.&lt;/p&gt;

&lt;p&gt;This is the deeper APC/APX boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC should preserve reusable knowledge.&lt;/li&gt;
&lt;li&gt;APX should decide how much of that knowledge becomes active for this turn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A concrete example makes the split clearer.&lt;/p&gt;

&lt;p&gt;Imagine a repo with these skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;release-checklist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;security-review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;support-triage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docs-style&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those files belong in &lt;code&gt;.apc/skills/&lt;/code&gt; because they are durable project instructions. But if the user asks, "Explain this error log and suggest the smallest patch," APX should not inject all four bodies. A small hint that those skills exist is enough. Only if the turn becomes a release task or a security audit should the runtime pay to load the matching body.&lt;/p&gt;

&lt;p&gt;That behavior keeps APC portable and APX usable.&lt;/p&gt;

&lt;p&gt;Portable context is not the same as always-active context. A project can own many valid instructions without forcing every runtime turn to carry all of them. Once you accept that distinction, the architecture gets cleaner: APC stores the skill files, APX routes them into the prompt only when the request actually needs them.&lt;/p&gt;

&lt;p&gt;That is the right default for daily agent work.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Path-Scoped Rules Belong in APC</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Sat, 11 Jul 2026 12:05:45 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/path-scoped-rules-belong-in-apc-502g</link>
      <guid>https://dev.to/agentprojectcontext/path-scoped-rules-belong-in-apc-502g</guid>
      <description>&lt;h1&gt;
  
  
  Path-Scoped Rules Belong in APC
&lt;/h1&gt;

&lt;p&gt;A repository should not need different hidden rule copies for different tools.&lt;/p&gt;

&lt;p&gt;That is why path-scoped rules belong in APC.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer. It keeps repository-owned meaning in &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/&lt;/code&gt;. APX is the daily-use runtime and tooling layer. It helps current agents and runtimes work with that portable context while still keeping sessions, messages, and other runtime state outside the repo.&lt;/p&gt;

&lt;p&gt;The split matters most when one rule should apply only to one part of the codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  One repo, different rule zones
&lt;/h2&gt;

&lt;p&gt;Most projects do not have one flat instruction surface.&lt;/p&gt;

&lt;p&gt;Frontend code may need accessibility checks and bundle-size discipline. Backend code may need input validation at the route boundary. Support content may need a specific tone and escalation path. If all of that lives only in one giant root prompt, agents either ignore the details or carry too much irrelevant guidance into every task.&lt;/p&gt;

&lt;p&gt;APC gives a cleaner shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; for repository-wide rules&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.apc/rules/&lt;/code&gt; for reusable or path-scoped rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The APC rules spec is explicit about this. &lt;code&gt;AGENTS.md&lt;/code&gt; is the broad root contract. &lt;code&gt;.apc/rules/&lt;/code&gt; is where rules can become smaller and more targeted.&lt;/p&gt;

&lt;p&gt;A recommended file can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
description: "Backend API rules"
globs:
  - "src/api/**/*.ts"
alwaysApply: false
---

- Validate request input at the route boundary.
- Keep database writes inside service functions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a better boundary than copying the same instructions into Cursor rules, Claude-specific files, and a runtime-local note that no one reviews.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why APC should own these rules
&lt;/h2&gt;

&lt;p&gt;Path-scoped rules are still project meaning.&lt;/p&gt;

&lt;p&gt;They describe how &lt;em&gt;this repository&lt;/em&gt; wants work done in &lt;em&gt;these paths&lt;/em&gt;. That is exactly the kind of information that should survive a fresh clone, code review, and a runtime change. If the rules live only in one editor's private directory, they stop being part of the project contract and start being workstation trivia.&lt;/p&gt;

&lt;p&gt;APC fixes that by keeping the source in &lt;code&gt;.apc/rules/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The folder structure docs make the intent clear: path-scoped &lt;code&gt;.mdc&lt;/code&gt; rules are project-owned, safe to commit, and distinct from runtime state. Sessions, conversations, messages, caches, and private memory do not belong there. APX keeps those under &lt;code&gt;~/.apx/&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;That separation keeps two different concerns from bleeding together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC stores durable guidance worth reviewing.&lt;/li&gt;
&lt;li&gt;APX stores local operational history worth keeping out of git.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this also helps APX
&lt;/h2&gt;

&lt;p&gt;APX works best when the repository already has a clean contract.&lt;/p&gt;

&lt;p&gt;The APC reference docs describe APX as the runtime bridge that makes &lt;code&gt;.apc/&lt;/code&gt; usable today. It handles the daemon, CLI, runtimes, engines, and local storage. It should not become a second source of truth for project rules.&lt;/p&gt;

&lt;p&gt;If path-scoped guidance already lives in APC, APX can stay thin. It can help compatible runtimes use the repo context without owning a second project-specific rules database.&lt;/p&gt;

&lt;p&gt;That is also future-proof. The APC rules docs explicitly allow compatible consumers to project &lt;code&gt;.apc/rules/*.mdc&lt;/code&gt; into tool-specific rule systems when needed. The important part is not the projection target. The important part is the source stays in the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical example
&lt;/h2&gt;

&lt;p&gt;Suppose a monorepo has these needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt;: run tests before merge, never commit secrets, keep migrations reversible&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.apc/rules/frontend.mdc&lt;/code&gt;: preserve keyboard navigation and avoid text-only icon buttons&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.apc/rules/backend.mdc&lt;/code&gt;: validate input at the boundary and keep writes inside services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the project can move across tools without rewriting its own discipline each time.&lt;/p&gt;

&lt;p&gt;APC keeps the rule map portable. APX keeps the runtime local. That is the right division of labor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Path-scoped rules belong in APC because they are part of the repository contract, not part of one runtime's private memory.&lt;/p&gt;

&lt;p&gt;Keep broad rules in &lt;code&gt;AGENTS.md&lt;/code&gt;. Keep narrower, reusable, path-aware rules in &lt;code&gt;.apc/rules/&lt;/code&gt;. Let APX handle execution, sessions, and local tooling around that contract instead of duplicating it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Project Skills Should Override Global Skills</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Fri, 10 Jul 2026 12:04:48 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/project-skills-should-override-global-skills-389o</link>
      <guid>https://dev.to/agentprojectcontext/project-skills-should-override-global-skills-389o</guid>
      <description>&lt;h1&gt;
  
  
  Project Skills Should Override Global Skills
&lt;/h1&gt;

&lt;p&gt;When an agent needs operational instructions, the worst outcome is ambiguous precedence. A project wants one behavior, your machine has another, and the runtime quietly picks the wrong one.&lt;/p&gt;

&lt;p&gt;APC and APX avoid that by making skill scope explicit.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer. It keeps project-owned instructions in the repository, including &lt;code&gt;.apc/skills/&lt;/code&gt;. APX is the daily-use runtime and tooling layer. It discovers those skills, lets the super-agent load them on demand, and still keeps a machine-wide skill catalog under &lt;code&gt;~/.apx/skills/&lt;/code&gt; plus its own built-in runtime skills.&lt;/p&gt;

&lt;p&gt;The important rule is simple: project skills win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three skill lanes, one precedence order
&lt;/h2&gt;

&lt;p&gt;The APX skills docs and loader code define one runtime catalog with three sources, in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;project&amp;gt;/.apc/skills/&amp;lt;slug&amp;gt;/SKILL.md&lt;/code&gt; or &lt;code&gt;&amp;lt;slug&amp;gt;.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.apx/skills/&amp;lt;slug&amp;gt;/SKILL.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;APX built-in runtime skills under &lt;code&gt;src/core/runtime-skills/&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first matching slug wins. That means a project skill can override a user-global skill, and a user-global skill can override a built-in one.&lt;/p&gt;

&lt;p&gt;That is the right order because APC owns project meaning.&lt;/p&gt;

&lt;p&gt;If a repository says its &lt;code&gt;deploy-checklist&lt;/code&gt; skill should work a certain way, that project-local instruction should beat whatever happens to be installed globally on one laptop. Otherwise the same APC project would behave differently depending on whose machine ran it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why APC needs the top slot
&lt;/h2&gt;

&lt;p&gt;Portable context only works if the repository can carry its own exceptions.&lt;/p&gt;

&lt;p&gt;Imagine you keep a global &lt;code&gt;release-notes&lt;/code&gt; skill in &lt;code&gt;~/.apx/skills/&lt;/code&gt; that fits most projects. Then one repository has stricter rules: mention migration risk, list MCP changes separately, and never claim a release is safe without test output.&lt;/p&gt;

&lt;p&gt;That repository should not need a forked runtime or a custom machine setup. It should only need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.apc/skills/release-notes/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now APX reads the project skill first, and the super-agent loads the correct instructions for that repository.&lt;/p&gt;

&lt;p&gt;That is APC doing its job: project-specific context travels with the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why global skills still matter
&lt;/h2&gt;

&lt;p&gt;Global skills are still useful. They are the machine-wide layer for habits you want everywhere on one workstation.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;personal writing style&lt;/li&gt;
&lt;li&gt;preferred debugging checklist&lt;/li&gt;
&lt;li&gt;local publishing workflow&lt;/li&gt;
&lt;li&gt;a custom skill for a tool only you use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APX stores those in &lt;code&gt;~/.apx/skills/&lt;/code&gt;, so they stay available across projects on that machine without polluting any repository.&lt;/p&gt;

&lt;p&gt;That is also the APC/APX split in miniature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC keeps shared, reviewable, repo-owned instructions.&lt;/li&gt;
&lt;li&gt;APX keeps operator-local runtime customizations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A global skill should be convenient. It should not outrank a project contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why built-in skills stay as the safety net
&lt;/h2&gt;

&lt;p&gt;APX keeps a third lane for built-in runtime skills. The docs describe those as private: always available, always active, and not deletable from scope settings.&lt;/p&gt;

&lt;p&gt;That matters because APX ships its own operational knowledge there: &lt;code&gt;apx-*&lt;/code&gt; skills, &lt;code&gt;apc-context&lt;/code&gt;, and runtime-specific guidance. If users could accidentally delete or fully disable that foundation, the runtime would lose basic self-knowledge about how to use its own commands and structures.&lt;/p&gt;

&lt;p&gt;So the full design is not just “project overrides global.” It is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;project wins when the repo needs a local rule&lt;/li&gt;
&lt;li&gt;global wins when the operator wants a machine-wide customization&lt;/li&gt;
&lt;li&gt;built-in remains as the fallback safety net&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  On-demand loading keeps prompt cost low
&lt;/h2&gt;

&lt;p&gt;This precedence model works well because APX does not dump full skill bodies into every prompt.&lt;/p&gt;

&lt;p&gt;The runtime exposes &lt;code&gt;list_skills&lt;/code&gt; and &lt;code&gt;load_skill&lt;/code&gt;, and APX documents that &lt;code&gt;load_skill&lt;/code&gt; pulls the full body only for the current turn. The baseline prompt stays small, while exact instructions stay available when needed.&lt;/p&gt;

&lt;p&gt;That means you can keep project-specific skill overrides in APC without paying for all of them on every message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical rule
&lt;/h2&gt;

&lt;p&gt;Use each lane for its real job.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Put repo-owned exceptions in &lt;code&gt;.apc/skills/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Put personal machine-wide helpers in &lt;code&gt;~/.apx/skills/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Leave built-in APX runtime skills alone unless you are intentionally shadowing them with a better local or project version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If one slug means different things in two repositories, that is not a bug. That is exactly why the project lane exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Project skills should override global skills because APC owns portable project intent.&lt;/p&gt;

&lt;p&gt;APX makes that practical with a clear precedence chain, built-in fallback skills, and turn-local skill loading. The result is predictable behavior: the repo decides project meaning, the machine adds personal convenience, and the runtime still keeps its own minimum operational floor.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>You're not 'a programmer' anymore. You're one of these 5 archetypes.</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Thu, 09 Jul 2026 22:26:49 +0000</pubDate>
      <link>https://dev.to/tecnomanu/youre-not-a-programmer-anymore-youre-one-of-these-5-archetypes-hof</link>
      <guid>https://dev.to/tecnomanu/youre-not-a-programmer-anymore-youre-one-of-these-5-archetypes-hof</guid>
      <description>&lt;p&gt;Boris Cherny — the creator of Claude Code at Anthropic — shared an idea that stuck with me all day: in the AI era, we've stopped being "the person who writes code" and started moving between &lt;strong&gt;5 developer archetypes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They're not job titles or seniority levels. They're &lt;em&gt;ways of working&lt;/em&gt; — and most of us move through all of them depending on where a project is.&lt;/p&gt;

&lt;p&gt;Here's the breakdown, plus why I think it's one of the most useful lenses I've found for reading my own work. 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5 archetypes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧪 1. Prototyper — the spark
&lt;/h3&gt;

&lt;p&gt;The zero-to-one person. Fires off ideas and experiments, most of which never ship — and that's the point. Their job isn't to be right; it's to find out &lt;em&gt;fast&lt;/em&gt; whether something is worth building at all. They don't fall in love with the code, they fall in love with learning.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It doesn't work yet, but look at what's coming."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🏗️ 2. Builder — makes it real
&lt;/h3&gt;

&lt;p&gt;Takes that duct-tape prototype and turns it into an actual product: real features, real infrastructure, something that holds up when real users show up. From "cool demo" to "this survives production."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Give me the chaos and I'll hand you something that works."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🧹 3. Sweeper — the one who subtracts
&lt;/h3&gt;

&lt;p&gt;Simplifies the code and the system. Deletes what's unnecessary, cleans up the UI, kills bugs, pays down technical debt. Their superpower is &lt;em&gt;removing&lt;/em&gt;, not adding — the quiet work that keeps everything else from collapsing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Less code, less debt, more speed."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  📈 4. Grower — pushes toward product-market fit
&lt;/h3&gt;

&lt;p&gt;Takes a built product and iterates it, again and again, toward the thing people actually want. Lives on metrics, feedback and experiments.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It works. Now let's make them actually want it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🛠️ 5. Maintainer — the silent hero
&lt;/h3&gt;

&lt;p&gt;Owns the mature system. Keeps it secure, reliable and fast while it scales. The person who prevents the fires you never hear about.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If you didn't notice it went down, that was me."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The detail almost nobody sees
&lt;/h2&gt;

&lt;p&gt;Here's what I loved most: &lt;strong&gt;these aren't your job title.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On the Claude Code team, everyone shares the same title. A designer can be a Prototyper. A PM can be a Maintainer. It's &lt;em&gt;how&lt;/em&gt; you work, not what your contract says.&lt;/p&gt;

&lt;p&gt;And each stage of a product asks for a different mix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pre-PMF:&lt;/strong&gt; Prototyper + Builder + Sweeper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth:&lt;/strong&gt; Builder + Sweeper + Grower&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maturity:&lt;/strong&gt; Sweeper + Grower + Maintainer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI doesn't erase these roles — it makes them sharper. When an agent can knock out the mechanical parts, what's left is the judgment call about &lt;em&gt;which mode the moment needs&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  So… which one are you?
&lt;/h2&gt;

&lt;p&gt;The honest answer for most of us is: it changes. You shift archetype depending on the project, the week, sometimes the hour. I'm a Builder at heart, but lately I've been living in Sweeper mode. 😅&lt;/p&gt;

&lt;p&gt;Which of the 5 do you feel most like in your day-to-day? I'd genuinely love to read it in the comments. 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Inspired by an idea from Boris Cherny, creator of Claude Code.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>A Stable Project ID Keeps APC Portable and APX Local</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Thu, 09 Jul 2026 12:04:01 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/a-stable-project-id-keeps-apc-portable-and-apx-local-46ag</link>
      <guid>https://dev.to/agentprojectcontext/a-stable-project-id-keeps-apc-portable-and-apx-local-46ag</guid>
      <description>&lt;h1&gt;
  
  
  A Stable Project ID Keeps APC Portable and APX Local
&lt;/h1&gt;

&lt;p&gt;A lot of agent tooling problems start with a bad identity model. If a runtime treats a folder path as the project identity, everything looks fine until you rename the repo, move it to another machine, or register the same code from a different checkout.&lt;/p&gt;

&lt;p&gt;APC and APX avoid that trap by splitting identity from runtime state.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer. It keeps the committed project contract in the repository. APX is the daily-use runtime and tooling layer. It reads that contract, then keeps sessions, messages, caches, and other machine-local state outside the repo.&lt;/p&gt;

&lt;p&gt;A small file is what makes that split work: &lt;code&gt;.apc/project.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;project.json&lt;/code&gt; gives the project a durable identity
&lt;/h2&gt;

&lt;p&gt;The APC docs define &lt;code&gt;.apc/project.json&lt;/code&gt; as the canonical metadata file for a project. Its job is intentionally boring: say what the project is called, which APC version it targets, and when that metadata set was created.&lt;/p&gt;

&lt;p&gt;A minimal APC shape looks like this:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My Project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-08T00:00:00Z"&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;APX extends that practical story with one more field when it initializes a real working project:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-15T10:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apx_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"077078af9dd7"&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;That &lt;code&gt;apx_id&lt;/code&gt; is the key detail. APX documents it as the stable identifier that links the committed APC definition to local runtime state under &lt;code&gt;~/.apx/projects/&amp;lt;apx_id&amp;gt;/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So folder path is not the identity. Repo display name is not enough either. The stable id is the bridge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why that matters in daily work
&lt;/h2&gt;

&lt;p&gt;Imagine this sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You run &lt;code&gt;apx init&lt;/code&gt; in a repository.&lt;/li&gt;
&lt;li&gt;APX creates &lt;code&gt;.apc/project.json&lt;/code&gt; and generates &lt;code&gt;apx_id&lt;/code&gt; once.&lt;/li&gt;
&lt;li&gt;You register the project with APX.&lt;/li&gt;
&lt;li&gt;APX stores runtime state under &lt;code&gt;~/.apx/projects/&amp;lt;apx_id&amp;gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now later you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rename the repo directory&lt;/li&gt;
&lt;li&gt;move it to another path&lt;/li&gt;
&lt;li&gt;clone it on another machine&lt;/li&gt;
&lt;li&gt;reopen it from a different tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The APC contract still travels with the repo, because it lives in &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/&lt;/code&gt;. The APX runtime state still has a clear local home, because it hangs off the stable id, not off an unstable folder name.&lt;/p&gt;

&lt;p&gt;That is exactly the APC/APX division in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC says what project this is.&lt;/li&gt;
&lt;li&gt;APX says what happened while this machine worked on it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without a stable id, a runtime has to guess. It may create duplicate local projects, lose message history after a rename, or tie private runtime state too tightly to one filesystem path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portable definition, local runtime
&lt;/h2&gt;

&lt;p&gt;The APX project docs make the storage split explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;repo&amp;gt;/.apc/&lt;/code&gt; holds agent definitions, skills, MCP hints, and project config.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/.apx/projects/&amp;lt;id&amp;gt;/&lt;/code&gt; holds sessions, conversations, messages, caches, task logs, and other runtime files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That design has two benefits.&lt;/p&gt;

&lt;p&gt;First, the repository stays reviewable and clone-safe. APC contains portable context, not machine junk.&lt;/p&gt;

&lt;p&gt;Second, APX stays honest about privacy and locality. Runtime transcripts, caches, and logs do not quietly end up in git just because a tool needed somewhere convenient to put them.&lt;/p&gt;

&lt;h2&gt;
  
  
  One practical rule
&lt;/h2&gt;

&lt;p&gt;Treat &lt;code&gt;.apc/project.json&lt;/code&gt; like identity, not like a scratchpad.&lt;/p&gt;

&lt;p&gt;Do not turn it into a dump of runtime flags, private state, or session metadata. The APC spec keeps it small for a reason. The more stable it stays, the more reliable the bridge to APX becomes.&lt;/p&gt;

&lt;p&gt;Likewise, do not change &lt;code&gt;apx_id&lt;/code&gt; casually. APX documents that field as the permanent key for the local runtime folder. If you break that link, APX will not know that old local state belongs to the same committed project. If you move the repo, the APX docs point to &lt;code&gt;apx project rebuild&lt;/code&gt; as the right repair step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Portable context needs a stable identity, not a lucky pathname.&lt;/p&gt;

&lt;p&gt;APC provides the committed project contract. APX provides the local runtime layer. &lt;code&gt;.apc/project.json&lt;/code&gt; is the small boundary object that lets both sides do their job without leaking into each other.&lt;/p&gt;

&lt;p&gt;That is not glamorous design. It is better: it keeps project meaning portable and runtime state local.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Agent Slugs Are the Smallest Handoff Key Between APC and APX</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Wed, 08 Jul 2026 12:03:00 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/agent-slugs-are-the-smallest-handoff-key-between-apc-and-apx-dom</link>
      <guid>https://dev.to/agentprojectcontext/agent-slugs-are-the-smallest-handoff-key-between-apc-and-apx-dom</guid>
      <description>&lt;h1&gt;
  
  
  Agent Slugs Are the Smallest Handoff Key Between APC and APX
&lt;/h1&gt;

&lt;p&gt;A lot of APC and APX discussion happens at the level of folders, memory, or runtimes. But there is a smaller boundary that matters every day: the agent slug.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer. It keeps the project contract in the repository: &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;.apc/project.json&lt;/code&gt;, &lt;code&gt;.apc/agents/&amp;lt;slug&amp;gt;.md&lt;/code&gt;, skills, commands, and curated memory that is safe to share. APX is the daily-use runtime and tooling layer. It reads that contract, runs agents, stores local runtime state under &lt;code&gt;~/.apx/&lt;/code&gt;, and gives you CLI, daemon, and web admin workflows.&lt;/p&gt;

&lt;p&gt;The slug is where those two layers meet.&lt;/p&gt;

&lt;p&gt;In APC, the slug identifies the structured agent definition. In APX, the same slug becomes the routing key for commands like &lt;code&gt;apx run &amp;lt;slug&amp;gt;&lt;/code&gt;, &lt;code&gt;apx exec -a &amp;lt;slug&amp;gt;&lt;/code&gt;, &lt;code&gt;apx memory &amp;lt;slug&amp;gt;&lt;/code&gt;, and &lt;code&gt;apx session new &amp;lt;slug&amp;gt;&lt;/code&gt;. APX also uses it to place runtime files under per-agent paths such as &lt;code&gt;~/.apx/projects/&amp;lt;project-id&amp;gt;/agents/&amp;lt;slug&amp;gt;/sessions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That sounds small, but it solves a real design problem: how do you keep a portable project contract and a local runtime aligned without inventing hidden IDs for every agent?&lt;/p&gt;

&lt;p&gt;The answer is not to make the runtime smarter. The answer is to keep the join key boring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;If the shared name for an agent is unstable, everything around it gets noisy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session history stops feeling continuous.&lt;/li&gt;
&lt;li&gt;Runtime memory becomes harder to inspect.&lt;/li&gt;
&lt;li&gt;Telegram routing, CLI commands, and follow-up sessions become less predictable.&lt;/li&gt;
&lt;li&gt;Teams start treating agent definitions like disposable prompts instead of durable project roles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A stable slug avoids that.&lt;/p&gt;

&lt;p&gt;For example, if a repository defines &lt;code&gt;.apc/agents/reviewer.md&lt;/code&gt;, APX can keep using &lt;code&gt;reviewer&lt;/code&gt; everywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx run reviewer &lt;span class="nt"&gt;--runtime&lt;/span&gt; claude-code &lt;span class="s2"&gt;"Review the open PRs"&lt;/span&gt;
apx &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; reviewer &lt;span class="s2"&gt;"Summarize test risk"&lt;/span&gt;
apx memory reviewer
apx session new reviewer &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Follow-up audit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a better contract than a display name. You can rename a role description, change the model, or expand the skills list, and the runtime history still lands under the same agent lane.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should stay stable
&lt;/h2&gt;

&lt;p&gt;The slug should describe the durable responsibility, not the mood of the prompt.&lt;/p&gt;

&lt;p&gt;Good slugs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;reviewer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;planner&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backend&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;release-manager&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Weak slugs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;smart-reviewer-v2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;best-agent-final&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claude-helper&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;telegram-reviewer-temporary&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those weaker names leak implementation details into the project contract. They age badly when you switch models, channels, or runtimes. APC should describe the project role. APX should decide how that role runs today.&lt;/p&gt;

&lt;h2&gt;
  
  
  APC side, APX side
&lt;/h2&gt;

&lt;p&gt;APC keeps the definition portable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; holds repository-wide rules.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.apc/agents/&amp;lt;slug&amp;gt;.md&lt;/code&gt; holds the structured agent definition.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.apc/agents/&amp;lt;slug&amp;gt;/memory.md&lt;/code&gt; can hold curated, team-safe memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APX keeps the runtime local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sessions&lt;/li&gt;
&lt;li&gt;conversations&lt;/li&gt;
&lt;li&gt;message logs&lt;/li&gt;
&lt;li&gt;runtime memory and caches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That split only stays clean if both sides can point to the same agent identity without translation glue. The slug is enough.&lt;/p&gt;

&lt;p&gt;This is also why APX does not need a second hidden naming system for normal agent work. The portable name from APC already gives the runtime a stable filesystem lane, command target, and audit trail anchor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical rule
&lt;/h2&gt;

&lt;p&gt;Pick slugs like you would pick API names.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stable over clever&lt;/li&gt;
&lt;li&gt;Role-based over model-based&lt;/li&gt;
&lt;li&gt;Short over decorative&lt;/li&gt;
&lt;li&gt;Reusable over temporary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need to change how an agent behaves, edit the definition. If you need a different responsibility, create another slug.&lt;/p&gt;

&lt;p&gt;That keeps APC readable in the repo and APX readable on disk.&lt;/p&gt;

&lt;p&gt;The bigger APC/APX idea is often described as portable context plus local runtime. That is true. But in daily use, the smallest piece doing real work is often just one good slug.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Not Every Memory Belongs in APC</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Tue, 07 Jul 2026 12:03:53 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/not-every-memory-belongs-in-apc-3773</link>
      <guid>https://dev.to/agentprojectcontext/not-every-memory-belongs-in-apc-3773</guid>
      <description>&lt;h1&gt;
  
  
  Not Every Memory Belongs in APC
&lt;/h1&gt;

&lt;p&gt;A lot of agent setups fail for the same reason: they treat all memory as one bucket.&lt;/p&gt;

&lt;p&gt;That is not what APC and APX are trying to do.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer. It should keep only durable project facts that are safe to share, review, and commit.&lt;br&gt;
APX is the daily runtime layer. It should keep local agent memory, cross-channel recall, sessions, and other runtime state outside the repo.&lt;/p&gt;

&lt;p&gt;That split matters because different kinds of memory solve different problems.&lt;/p&gt;

&lt;p&gt;If you put everything into APC, the repo fills with private notes, temporary conclusions, and stale conversation debris.&lt;br&gt;
If you keep everything in APX, the project loses durable knowledge every time a machine, runtime, or session changes.&lt;/p&gt;

&lt;p&gt;The better model is simple: APC stores what the project should remember. APX stores what the runtime needs in order to work.&lt;/p&gt;
&lt;h2&gt;
  
  
  APC memory: portable, curated, team-safe
&lt;/h2&gt;

&lt;p&gt;In APC, curated memory lives with the project under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.apc/agents/&amp;lt;slug&amp;gt;/memory.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That file is for durable facts tied to the agent's project role. Good examples are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;long-lived constraints&lt;/li&gt;
&lt;li&gt;team conventions&lt;/li&gt;
&lt;li&gt;architectural decisions&lt;/li&gt;
&lt;li&gt;recurring responsibilities&lt;/li&gt;
&lt;li&gt;stable domain facts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This kind of memory is boring in the best way. It is plain Markdown, easy to diff, easy to review, and easy to migrate to another tool.&lt;/p&gt;

&lt;p&gt;A reviewer agent might keep something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Memory - reviewer&lt;/span&gt;

&lt;span class="gu"&gt;## Project facts&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Prefer findings-first reviews.
&lt;span class="p"&gt;-&lt;/span&gt; API compatibility matters more than internal file layout during v0.1.

&lt;span class="gu"&gt;## Durable decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use pnpm, never npm.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That belongs in APC because another contributor, another IDE, or another runtime should be able to read the same project rule later.&lt;/p&gt;

&lt;h2&gt;
  
  
  APX memory: local, operational, runtime-owned
&lt;/h2&gt;

&lt;p&gt;APX has a different job. It is the runtime and tooling layer, so it keeps machine-local memory where the repo should not.&lt;/p&gt;

&lt;p&gt;Per-agent runtime memory lives under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.apx/projects/&amp;lt;project-id&amp;gt;/agents/&amp;lt;slug&amp;gt;/memory.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That file is injected into the agent prompt on every call. It is useful for local operational context, owner preferences, and durable notes that help the runtime, but should not automatically travel with the repository.&lt;/p&gt;

&lt;p&gt;APX also has a separate cross-channel memory system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.apx/memory.md
~/.apx/memory.db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That layer powers automatic recall across channels. It can remember recent facts, retrieve semantically relevant past messages, and compact long histories without turning the repo into a session dump.&lt;/p&gt;

&lt;p&gt;So APX already tells us something important: not all memory should be committed, and not all memory should be global.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical rule: decide by visibility, not by format
&lt;/h2&gt;

&lt;p&gt;The mistake teams make is judging memory by file type instead of visibility.&lt;br&gt;
A &lt;code&gt;memory.md&lt;/code&gt; file can still be the wrong place if the content is private, temporary, or unreviewed.&lt;/p&gt;

&lt;p&gt;A better rule is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Put it in APC if the whole project may need it later and it is safe to commit.&lt;/li&gt;
&lt;li&gt;Keep it in APX if it is runtime-local, personal, temporary, or derived from ongoing sessions.&lt;/li&gt;
&lt;li&gt;Leave it out of both if it is raw noise.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;"Use pnpm, never npm" belongs in APC.&lt;/li&gt;
&lt;li&gt;"Owner prefers short PR summaries" may belong in APX runtime memory.&lt;/li&gt;
&lt;li&gt;"This session explored three bad refactors before finding the safe path" belongs in session history, not in either memory file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last example is the real trap. Raw transcripts feel informative, but they age badly. Future contributors do not need every thought. They need the final durable fact, constraint, or decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why APC and APX fit together here
&lt;/h2&gt;

&lt;p&gt;This is where the APC/APX split becomes useful instead of abstract.&lt;/p&gt;

&lt;p&gt;APC gives the project one portable place for curated meaning.&lt;br&gt;
APX gives daily work a local runtime that can keep richer state without leaking it into the repo.&lt;/p&gt;

&lt;p&gt;That means you can switch tools, machines, or runtimes without losing the project contract, while still letting the runtime keep the messy memory it needs.&lt;/p&gt;

&lt;p&gt;The clean workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Work in APX.&lt;/li&gt;
&lt;li&gt;Let sessions, recall, and runtime memory stay local.&lt;/li&gt;
&lt;li&gt;Extract only durable, sanitized facts into APC.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not every memory deserves version control.&lt;br&gt;
But every durable project fact should have a portable home.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>APX Works Best When the Bridge Stays Thin</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 06 Jul 2026 13:03:33 +0000</pubDate>
      <link>https://dev.to/tecnomanu/apx-works-best-when-the-bridge-stays-thin-16go</link>
      <guid>https://dev.to/tecnomanu/apx-works-best-when-the-bridge-stays-thin-16go</guid>
      <description>&lt;h1&gt;
  
  
  APX Works Best When the Bridge Stays Thin
&lt;/h1&gt;

&lt;p&gt;I kept trying to make APX do more than it should.&lt;/p&gt;

&lt;p&gt;That is the honest version.&lt;/p&gt;

&lt;p&gt;At first I wanted APX to feel like a single control surface for everything: project rules, runtime choice, agent identity, session history, message logs, and whatever else a tool might need to feel "smart". The problem was not that the features were wrong. The problem was that I kept asking the bridge to become the house.&lt;/p&gt;

&lt;p&gt;That is where the work got messy.&lt;/p&gt;

&lt;p&gt;The part that finally clicked for me is simple: &lt;strong&gt;APX works best when the bridge stays thin&lt;/strong&gt;. APC should hold the project contract. APX should handle the moving parts. If the runtime starts carrying project meaning that should live in the repo, or if the repo starts carrying machine-specific behavior, the boundary blurs and the system becomes harder to trust.&lt;/p&gt;

&lt;p&gt;That sounds abstract until you look at the actual code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the bridge really does
&lt;/h2&gt;

&lt;p&gt;In APX, the bridge is not a giant translation layer. It is a small set of decisions that let a runtime do useful work without pretending to own the project.&lt;/p&gt;

&lt;p&gt;The README already says the split plainly: APX is a daemon plus CLI, it manages projects, agents, sessions, and logs, and the local state lives under &lt;code&gt;~/.apx/&lt;/code&gt;. That part matters because it tells you what APX is &lt;em&gt;for&lt;/em&gt;: live work, not durable project meaning.&lt;/p&gt;

&lt;p&gt;The runtime bridge tests pushed me toward the same conclusion. &lt;code&gt;buildApfHint()&lt;/code&gt; is intentionally slim. It substitutes the placeholders the runtime needs, and nothing more. The test even guards against leftover template markers. That sounds minor, but it is the right instinct: the hint should be enough for the runtime to know where it is, not a second copy of the entire APC story.&lt;/p&gt;

&lt;p&gt;That is the boundary I want everywhere in APX.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identity is not the same as context
&lt;/h2&gt;

&lt;p&gt;Another thing I had to stop mixing up: identity and project context are related, but they are not the same problem.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;buildIdentityBlock()&lt;/code&gt; injects the agent name, personality, owner, owner context, and language into the super-agent prompt. The tests make that explicit. If identity is missing, the prompt becomes vague. If language is wrong, the whole experience feels off even when the logic is correct.&lt;/p&gt;

&lt;p&gt;So APX needs to be opinionated about identity.&lt;/p&gt;

&lt;p&gt;But it still should not become the source of truth for the project itself.&lt;/p&gt;

&lt;p&gt;Identity is runtime behavior. It tells the agent how to speak, who owns it, and which language to use. APC is still where the project rules live. That separation is what keeps the tool from drifting into a pile of hidden defaults.&lt;/p&gt;

&lt;p&gt;I used to think more data in the prompt would solve this. It does not. It just creates a bigger prompt with more chances to go stale. A thinner bridge with explicit identity is easier to debug than a fat prompt that tries to impersonate the whole repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup is not initialization
&lt;/h2&gt;

&lt;p&gt;The distinction between &lt;code&gt;apx init&lt;/code&gt; and &lt;code&gt;apx setup&lt;/code&gt; is one of the cleanest examples of the split.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apx init&lt;/code&gt; is project work. It scaffolds APC into a repo and points you at the durable files.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apx setup&lt;/code&gt; is machine work. It is the interactive first-run wizard that asks about provider, model, channels, and language. It also starts the daemon and wires in the local runtime choices that do not belong in a repo.&lt;/p&gt;

&lt;p&gt;That separation helped me stop asking one command to do two jobs.&lt;/p&gt;

&lt;p&gt;If I blur them, I end up with a setup flow that leaks machine preference into the project. If I keep them separate, the repo stays portable and the machine stays configurable. The user sees a cleaner model: project first, runtime second.&lt;/p&gt;

&lt;p&gt;That split also makes failure easier to reason about. If a project is wrong, I fix APC. If a machine is wrong, I fix APX. I do not have to guess whether the bug is in a repo artifact or in the local daemon state.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed for me
&lt;/h2&gt;

&lt;p&gt;The biggest practical change was not a new feature. It was a new discipline.&lt;/p&gt;

&lt;p&gt;I stopped trying to make every layer remember everything.&lt;/p&gt;

&lt;p&gt;Now I want each layer to remember only what it owns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC remembers the project contract&lt;/li&gt;
&lt;li&gt;APX remembers runtime state, sessions, and machine-local behavior&lt;/li&gt;
&lt;li&gt;identity is injected when the runtime needs to speak&lt;/li&gt;
&lt;li&gt;logs and session metadata stay local, where they can be inspected without polluting the repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That shift matters because the system became easier to debug.&lt;/p&gt;

&lt;p&gt;When a session goes wrong, I no longer wonder whether the agent lost the project rules or whether the runtime picked a weird local state. I can look at the boundary. I can inspect the APX session frontmatter, the runtime bridge, or the APC files in the repo and see which side is responsible.&lt;/p&gt;

&lt;p&gt;That is the real benefit of a thin bridge: less mystery, less duplication, fewer places for truth to split.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I still like the split
&lt;/h2&gt;

&lt;p&gt;I still think APX is the right place for the messy parts.&lt;/p&gt;

&lt;p&gt;It bridges Claude Code, Codex, OpenCode, and Aider. It handles local sessions. It owns the daemon. It keeps the runtime state where it belongs. That is a lot of responsibility, but it is the right kind of responsibility because it is machine-shaped.&lt;/p&gt;

&lt;p&gt;APC stays simpler because of that. It does not have to know how every runtime behaves. It just has to describe the project clearly enough that any compatible tool can enter the repo and understand what it is looking at.&lt;/p&gt;

&lt;p&gt;That is the part I care about most now: APC should be portable, APX should be local, and the bridge between them should stay narrow enough to trust.&lt;/p&gt;

&lt;p&gt;If I get greedy and push more meaning into APX, I usually regret it later. If I keep the bridge thin, the whole stack becomes easier to maintain, easier to explain, and easier to reuse the next time I need another tool to join the project.&lt;/p&gt;

&lt;p&gt;That is the rule I am keeping.&lt;/p&gt;

&lt;p&gt;And it is the one that finally made APX feel like a runtime instead of a second copy of the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source notes
&lt;/h2&gt;

&lt;p&gt;The concrete parts behind this lesson are already in the repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APX README: daemon + CLI, local state under &lt;code&gt;~/.apx/&lt;/code&gt;, runtimes, engines, and plugins.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;runtime-bridge.test.js&lt;/code&gt;: the runtime hint stays slim and placeholder-driven.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;identity-injection.test.js&lt;/code&gt;: identity and &lt;code&gt;config.user.language&lt;/code&gt; must be injected into the super-agent prompt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setup.js&lt;/code&gt;: provider, model, channels, and language belong to machine setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is enough structure for me. Anything thicker starts to look like a second project.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>APX is live: the personal assistant that orchestrates my Claude, Codex and Fable sessions</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 06 Jul 2026 13:00:04 +0000</pubDate>
      <link>https://dev.to/tecnomanu/apx-is-live-the-personal-assistant-that-orchestrates-my-claude-codex-and-fable-sessions-44n3</link>
      <guid>https://dev.to/tecnomanu/apx-is-live-the-personal-assistant-that-orchestrates-my-claude-codex-and-fable-sessions-44n3</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyu2ua98svln1rpok39uh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyu2ua98svln1rpok39uh.png" alt="APX" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the last few months my daily work has been spread across a growing pile of AI coding tools — Claude Code in one terminal, Codex in another, Fable somewhere else, each with its own sessions, its own context, its own MCP servers and its own way of remembering (or forgetting) what I was doing. It worked, but I was the glue holding it all together. Every context switch cost me something.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;APX&lt;/strong&gt; — and it's now live and running really well.&lt;/p&gt;

&lt;h2&gt;
  
  
  What APX actually is
&lt;/h2&gt;

&lt;p&gt;APX is a local daemon that acts as my personal assistant for working with AI agents. Instead of me jumping between CLIs, APX sits in front of all of them and orchestrates the whole thing from one place.&lt;/p&gt;

&lt;p&gt;In practice that means it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manage sessions&lt;/strong&gt; across Claude, Codex and Fable — start them, route work to the right runtime, and keep track of what each one is doing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule tasks&lt;/strong&gt; so work runs when it should, not only when I happen to be sitting at the keyboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organize everything&lt;/strong&gt;: projects, agents, MCP servers and artifacts, all in one coherent structure instead of scattered configs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tagline in my head was simple: &lt;em&gt;stop being the glue.&lt;/em&gt; Let one assistant hold the context so I can stay on the actual problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem it solves
&lt;/h2&gt;

&lt;p&gt;If you use more than one AI CLI seriously, you already know the pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each tool has its own notion of a "session," and none of them talk to each other.&lt;/li&gt;
&lt;li&gt;MCP servers get re-declared per tool, per project, with subtly different scopes.&lt;/li&gt;
&lt;li&gt;Your agents and prompts live in a dozen folders and README files.&lt;/li&gt;
&lt;li&gt;When you want something to run later — or run in a different runtime — you're doing it by hand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APX turns that into a single control plane. One place to see the agents, one place to register MCPs, one place to hand a task to whichever runtime fits it best.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I use it day to day
&lt;/h2&gt;

&lt;p&gt;The part that changed my workflow the most is being able to &lt;strong&gt;delegate a task to any runtime&lt;/strong&gt; without re-setting-up my whole environment. I can hand a task to the local super-agent, or route it to Claude, Codex or another CLI — same projects, same agents, same MCPs underneath.&lt;/p&gt;

&lt;p&gt;On top of that, the scheduling piece means the boring recurring work (status checks, routine jobs, follow-ups) just happens. I stopped being the cron job.&lt;/p&gt;

&lt;p&gt;And because projects, agents and artifacts are organized in one model, onboarding a new agent or spinning up a new project is minutes, not an afternoon of copy-pasting config.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's open source
&lt;/h2&gt;

&lt;p&gt;APX is open and you can dig into it here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/agentprojectcontext/apx" rel="noopener noreferrer"&gt;https://github.com/agentprojectcontext/apx&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're juggling multiple AI CLIs and feel like &lt;em&gt;you&lt;/em&gt; are the integration layer, this is exactly the itch APX scratches. I'd genuinely love feedback, issues and ideas — this is the tool I use every single day, so it keeps getting better.&lt;/p&gt;

&lt;p&gt;More coming soon. If you want to see it in action, I'm posting demos on my channels as Tecno Manu.&lt;/p&gt;




&lt;h1&gt;
  
  
  codex #ai #ia #claude #fable #agents
&lt;/h1&gt;

</description>
      <category>codex</category>
      <category>ai</category>
      <category>ia</category>
      <category>claude</category>
    </item>
  </channel>
</rss>
