<?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: Reno Lu</title>
    <description>The latest articles on DEV Community by Reno Lu (@renolu).</description>
    <link>https://dev.to/renolu</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%2F3961766%2Fe973474b-a6f6-45ab-a944-e0495fc3346e.png</url>
      <title>DEV Community: Reno Lu</title>
      <link>https://dev.to/renolu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/renolu"/>
    <language>en</language>
    <item>
      <title>OpenKnowledge points your editor and your agents at the same folder</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Thu, 03 Sep 2026 16:45:18 +0000</pubDate>
      <link>https://dev.to/renolu/openknowledge-points-your-editor-and-your-agents-at-the-same-folder-mh4</link>
      <guid>https://dev.to/renolu/openknowledge-points-your-editor-and-your-agents-at-the-same-folder-mh4</guid>
      <description>&lt;p&gt;Most tools that offer to organize your knowledge start by asking you to move it. OpenKnowledge starts by asking for a folder path. You open a directory that already contains markdown or mdx files, and that directory stays where it is, in whatever shape it already had.&lt;/p&gt;

&lt;p&gt;That sounds like a small design choice until you look at what it rules out. No import wizard. No proprietary block format. No database that quietly becomes the real source of truth while the exported files rot. The README names the targets it expects you to point at: existing codebases, wikis, Obsidian vaults. Your repo's docs directory qualifies. So does the pile of meeting notes you have been dragging between text editors for years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Editing markdown without feeling the markdown
&lt;/h2&gt;

&lt;p&gt;The editing surface is billed as full true WYSIWYG, with the stated goal that working on a markdown file feels like working in a Google Doc or a Notion page. The README's own shorthand for the whole thing is Notion meets VS Code, which is a fair summary of the tension it is trying to resolve. Plain text files win on portability and lose on the writing experience, and most teams have quietly accepted that trade for a decade.&lt;/p&gt;

&lt;p&gt;Around the editor sit the things you would expect from an IDE rather than a notes app: file navigator, search, tabs, and a graph viewer for wiki links. There is also support for embeddable HTML and rich components, aimed at engineering specs and visualized reports, which is the category of document where raw markdown usually gives up and people move to a hosted doc tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  The install step that carries the weight
&lt;/h2&gt;

&lt;p&gt;The interesting command is not the one that opens the editor. It is &lt;code&gt;ok init&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @inkeep/open-knowledge
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
ok init
ok start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ok init&lt;/code&gt; scaffolds the project and wires up the AI editors it detects on your machine. The README lists Claude Code, Claude Desktop, Cursor, Codex, OpenCode, and OpenClaw. What it installs is MCP and skills, described as designed to give agents enriched search and authoring of documents rather than whatever they would manage on their own against a directory tree.&lt;/p&gt;

&lt;p&gt;Read that alongside the folder-first decision and the architecture gets clear. The editor is the human view of the files. MCP is the agent view of the same files. Neither one owns the data, and there is no sync problem between them because there is nothing to sync. Side-by-side AI editing is listed for Claude, Codex, OpenCode, and Pi, with any other harness reachable through MCP or the CLI.&lt;/p&gt;

&lt;p&gt;This is the part worth stealing even if you never install the app. Teams keep building agent context layers that duplicate content into a vector store, then spend the next quarter reconciling drift. Pointing the agent at the same bytes the human edits removes an entire class of failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharing without a sharing service
&lt;/h2&gt;

&lt;p&gt;Team sharing and auto-sync are described as no-code, powered by git and GitHub underneath, and they are optional. You can run the whole thing without touching them.&lt;/p&gt;

&lt;p&gt;That framing matters for the privacy claim. The project describes itself as private, local, and free, and the sync story is consistent with that rather than working against it. Collaboration is a repo you already know how to audit, revert, and back up, not a hosted workspace with its own permission model to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical notes before you try it
&lt;/h2&gt;

&lt;p&gt;The desktop app covers macOS on Apple Silicon, Windows 10 and up on x64 or Arm64 with a per-user installer and no admin prompt, and Linux via deb or rpm. Intel Macs and servers go through the web app path instead, which runs the same editor locally and needs Node.js 24 or newer plus git.&lt;/p&gt;

&lt;p&gt;The license is GPL-3.0 or later, which is fine for using the app and worth a closer look if you were planning to build on the code. The repo lives at inkeep/open-knowledge, and the project takes public pull requests and issues.&lt;/p&gt;

&lt;p&gt;If you have been waiting for a reason to stop pasting documentation into a chat window, the wiring is the reason. The files are already there.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/inkeep/open-knowledge" rel="noopener noreferrer"&gt;https://github.com/inkeep/open-knowledge&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>mcp</category>
      <category>knowledgemanagement</category>
      <category>typescript</category>
    </item>
    <item>
      <title>LoopX Holds the State Your Agent Harness Forgets</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Wed, 02 Sep 2026 16:55:23 +0000</pubDate>
      <link>https://dev.to/renolu/loopx-holds-the-state-your-agent-harness-forgets-396d</link>
      <guid>https://dev.to/renolu/loopx-holds-the-state-your-agent-harness-forgets-396d</guid>
      <description>&lt;p&gt;The most consequential line in the LoopX README is a disclaimer: "LoopX is not an autonomous production controller." Dangerous permissions, publishing, production writes, and final ownership stay with the human. For a project whose whole subject is agents that run for days, that is a real constraint, and the rest of the repo is built to honor it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem is the gap between turns
&lt;/h2&gt;

&lt;p&gt;LoopX starts from an observation most agent tooling skirts. A single session can finish a task. Long-running work breaks somewhere else: objectives shift, an owner decision shows up mid-stream, evidence goes stale, one agent hands work to a peer, and a scheduler keeps burning turns after there is nothing useful left to transition to. The README's phrasing is blunt about the usual answer. Chat memory and a timer are not enough to govern that.&lt;/p&gt;

&lt;p&gt;So LoopX does not try to be the thing that executes. It calls itself a lightweight state kernel and a local-first control plane, running on top of Codex App, Claude Code, Cursor, dsh, or a harness you wrote yourself. The harness executes one bounded turn. LoopX holds the objective, the gates, the todos, the scope, the evidence, and the quota, then decides what happens next. Stated plainly in the docs: not another agent framework, not a provider-specific orchestration runtime.&lt;/p&gt;

&lt;p&gt;The control flow diagram is short enough to read in one pass. State comes in. If human judgment is needed, the loop asks a concrete question and waits. If a safe fallback exists, it runs one bounded agent slice. The runtime takes its turn, writes evidence, a handoff, and the next todo, and quota decides whether there is another tick.&lt;/p&gt;

&lt;p&gt;That waiting step is the part worth stealing even if you never install this. Most loops fail open. This one is designed to stop and ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  An agent-native Kanban, with the board demoted
&lt;/h2&gt;

&lt;p&gt;The mental model the docs offer is a Kanban board for long-running work, but with a twist: cards carry identity, authority, evidence, and continuation, and moves are validated operators such as claim, gate, monitor, and writeback. The board is a projection. LoopX state stays the source of truth.&lt;/p&gt;

&lt;p&gt;The same rule governs the workspace UI. &lt;code&gt;loopx dashboard&lt;/code&gt; launches a browser or PWA surface where you can see what needs you, what is running, what is being watched, and what is scheduled or stopped, then continue across Codex, Claude Code, or direct-model sessions without losing Goal state. Protected changes go through typed preview, explicit confirmation, and receipts. The README is careful to note that LoopX state, not the browser, remains authoritative. The experimental Tauri desktop shell gets the same treatment: it reuses the loopback status and Chat services rather than becoming a second state authority, and closing the window stops only what the shell itself started.&lt;/p&gt;

&lt;p&gt;Registered agents are peers. Claims, leases, task boundaries, capabilities, and typed continuation decide who acts next. No durable leader identity required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence with the caveats attached
&lt;/h2&gt;

&lt;p&gt;The showcase section is where the project's temperament shows clearest. Two arcs, a public OpenViking contribution sequence and a redacted owner-run Auto ML experiment, each span more than 200 hours of elapsed loop lifetime. The README immediately defines the term: elapsed lifetime is wall-clock project time, not 200 hours of continuous model execution, and not a claim of unattended production autonomy. The ML graph is labeled an owner-run showcase, not a reproduction, not a production result, not an employer endorsement.&lt;/p&gt;

&lt;p&gt;The third case, Auto Research, is the reproducible one. Proposer, executor, and evaluator/promoter agents iterate in parallel over a built-in exact-KNN demo whose task definition, editable and protected files, deterministic CPU evaluator, and dev/held-out commands all ship in the repository. Even there the README calls it a demo result.&lt;/p&gt;

&lt;p&gt;Independent user reports carry the same labeling: a C++ accuracy run past the thirteen-hour mark, a four-day unattended run, seven merged PRs on a public engine refactor with the reported token scale marked as a user claim rather than a measurement.&lt;/p&gt;

&lt;p&gt;Fitting this to your own work is a short test. If your agents finish inside one session, skip it. If you run multi-day objectives, issue and PR loops that must preserve scope and review state, gates for safety or publication or private data, or peer agents that need leases and handoffs, this is the layer that has been missing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/huangruiteng/loopx" rel="noopener noreferrer"&gt;https://github.com/huangruiteng/loopx&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>agentops</category>
      <category>python</category>
      <category>automation</category>
    </item>
    <item>
      <title>LazyCodex Bets That Installation Is the Hard Part of an Agent Harness</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Tue, 01 Sep 2026 17:03:47 +0000</pubDate>
      <link>https://dev.to/renolu/lazycodex-bets-that-installation-is-the-hard-part-of-an-agent-harness-h48</link>
      <guid>https://dev.to/renolu/lazycodex-bets-that-installation-is-the-hard-part-of-an-agent-harness-h48</guid>
      <description>&lt;p&gt;LazyCodex ships almost none of the agent behavior it advertises. The engine, OmO, sits under &lt;code&gt;src/&lt;/code&gt; as a git submodule. What the repository itself holds is a distribution layer, a Next.js site, and two CI workflows. That split is the interesting part. Someone looked at a working agent harness and concluded the remaining hard problem was not the agents. It was getting them installed, verified, and cleanly removed on a machine nobody on the project has ever seen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation is treated as a first-class feature
&lt;/h2&gt;

&lt;p&gt;The primary path is one line, and the README is insistent about it: &lt;code&gt;npx lazycodex-ai install&lt;/code&gt;, no global install, no &lt;code&gt;npm i -g&lt;/code&gt;. That command expands to &lt;code&gt;npx --yes --package oh-my-openagent omo install --platform=codex&lt;/code&gt;. If you want the version that never stops to ask, &lt;code&gt;--no-tui --codex-autonomous&lt;/code&gt; gives you an unattended setup. Note where that flag lives. The newer marketplace route, adding the repo as a marketplace inside Codex and installing &lt;code&gt;omo@sisyphuslabs&lt;/code&gt;, never touches Codex permission settings. Autonomous mode stays something you type on purpose.&lt;/p&gt;

&lt;p&gt;The marketplace path also documents its own awkwardness, which is rarer than it should be. Hooks do not run until you approve them in Codex's startup review. The first approved session prints a notice that bootstrap is running in the background and that you should restart when it completes, because a worker is still writing config blocks, agent roles, bin links, and a pinned &lt;code&gt;sg&lt;/code&gt; binary for the &lt;code&gt;ast_grep&lt;/code&gt; MCP. After an upgrade, that same startup review shows the hooks as Modified, which the README calls expected rather than leaving you to wonder what got tampered with.&lt;/p&gt;

&lt;p&gt;Then there is &lt;code&gt;npx lazycodex-ai doctor&lt;/code&gt;, which prints a health report across plugin cache, hooks, MCP servers, agents, and config state. Uninstall is equally specific: plugin cache, bin links, agent roles, and the managed sections of &lt;code&gt;~/.codex/config.toml&lt;/code&gt;. A tool that names the exact regions of your dotfiles it claims ownership of is a tool you can let near them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three commands, then a drawer of skills
&lt;/h2&gt;

&lt;p&gt;The command surface stays small. &lt;code&gt;$ulw-plan&lt;/code&gt; writes a plan to &lt;code&gt;plans/&amp;lt;slug&amp;gt;.md&lt;/code&gt; and never writes product code, so planning cannot quietly turn into a half-finished implementation. &lt;code&gt;$start-work&lt;/code&gt; executes that plan until every checkbox is done and prints ORCHESTRATION COMPLETE. &lt;code&gt;$ulw-loop&lt;/code&gt; runs a self-referential loop until an Oracle verification passes, capped at 500 iterations in ultrawork mode and 100 in normal mode. Those caps are the honest detail. Anyone who has watched an agent loop knows the failure mode is not stopping too early.&lt;/p&gt;

&lt;p&gt;Below the commands sits a skill layer you reach by typing &lt;code&gt;$&lt;/code&gt; in the Codex composer. &lt;code&gt;$init-deep&lt;/code&gt; scores complex directories and writes hierarchical &lt;code&gt;AGENTS.md&lt;/code&gt; files near the code that needs them, so future agents get landmarks before they start editing. Others cover narrower ground: &lt;code&gt;LSP&lt;/code&gt; for diagnostics, definitions, references and renames, &lt;code&gt;AST-grep&lt;/code&gt; for structural search and rewrite, &lt;code&gt;review-work&lt;/code&gt; for post-implementation review, &lt;code&gt;remove-ai-slops&lt;/code&gt; for behavior-preserving cleanup of code that reads like it was generated.&lt;/p&gt;

&lt;p&gt;Sub-agent roles get installed into &lt;code&gt;~/.codex/agents/&lt;/code&gt; as &lt;code&gt;explorer&lt;/code&gt;, &lt;code&gt;librarian&lt;/code&gt;, &lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;momus&lt;/code&gt;, &lt;code&gt;metis&lt;/code&gt;, and &lt;code&gt;codex-ultrawork-reviewer&lt;/code&gt;. You pick one by passing &lt;code&gt;agent_type&lt;/code&gt; to Codex's own &lt;code&gt;spawn_agent&lt;/code&gt; tool. The installer exposes that parameter on &lt;code&gt;multi_agent_v2&lt;/code&gt; sessions because Codex hides it by default, and if your build has no such parameter, the skills fall back to describing the role inside the message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Routing is about quota, not novelty
&lt;/h2&gt;

&lt;p&gt;A LazyCodex run will show different models mid-session: &lt;code&gt;gpt-5.4-mini&lt;/code&gt; on a small edit, a high-reasoning GPT model on hard logic, a Codex-tuned model on agentic coding paths. The source defines task categories and fallback chains that make this choice, and the README points at &lt;code&gt;openai-categories.ts&lt;/code&gt; and &lt;code&gt;model-requirements.ts&lt;/code&gt; rather than asking you to take its word.&lt;/p&gt;

&lt;p&gt;The stated reason is quota discipline. Parallel agents burning a frontier model on routine steps is how you run out of budget before you run out of work. Routing a &lt;code&gt;quick&lt;/code&gt; category to a cheaper model is not a performance claim, it is an accounting one.&lt;/p&gt;

&lt;p&gt;That framing runs through the whole project. The README's own standard is that lazycodex should be judged by the features it actually installs, which is a reasonable bar to hold any harness to, including this one.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/code-yeongyu/lazycodex" rel="noopener noreferrer"&gt;https://github.com/code-yeongyu/lazycodex&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>codex</category>
      <category>aiagents</category>
      <category>developertools</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Anchoring Is a Wiring Problem: Inside ADHD's Isolated Reasoning Frames</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Mon, 31 Aug 2026 19:18:27 +0000</pubDate>
      <link>https://dev.to/renolu/anchoring-is-a-wiring-problem-inside-adhds-isolated-reasoning-frames-3dj6</link>
      <guid>https://dev.to/renolu/anchoring-is-a-wiring-problem-inside-adhds-isolated-reasoning-frames-3dj6</guid>
      <description>&lt;p&gt;The claim at the center of this repo is narrow and testable: a reasoning agent that keeps one context window will keep one idea. ADHD, a skill for coding agents by Udit Akhouri, treats that as a wiring problem rather than a phrasing problem. It spawns N reasoning processes with zero shared context during divergence, puts each one under a deliberately distorted cognitive frame, and only afterward runs a separate critic pass to score, cluster, prune traps, and deepen the survivors.&lt;/p&gt;

&lt;p&gt;The distinction it draws is worth sitting with. Linear Chain-of-Thought anchors on whatever it says first. Tree-of-Thought widens the search but still walks a single shared context, so the anchor rides along into every branch. Wider search over a contaminated prior is still a contaminated prior. The fix proposed here is not a better instruction telling the model to consider alternatives. It is denying the branches access to each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the isolation actually buys
&lt;/h2&gt;

&lt;p&gt;The README works one eval problem end to end: a CLI calls an LLM and sometimes hangs for 90 seconds, design the retry, timeout, and UX strategy. The single-shot baseline walks four textbook patterns (progressive timeout with staged UI, fast-fail plus exponential backoff, hedged parallel requests, streaming with keepalive) and lands on a hybrid: 15s first-token timeout, 30s between-token timeout, 90s absolute, one auto-retry. The repo's own read on that answer is fair. It is sensible, it is Google SRE Book chapter 22, it is what a senior engineer gives you in thirty seconds.&lt;/p&gt;

&lt;p&gt;What it never does is question the frame. Nobody in that answer asks whether the user might want to bail out of a slow request, and nobody asks whether waiting and retrying the same model is the right move at all.&lt;/p&gt;

&lt;p&gt;The ADHD run spawns 6 isolated frames and surfaces 30+ ideas across clusters labeled &lt;code&gt;economic-incentive&lt;/code&gt;, &lt;code&gt;async-control-surface&lt;/code&gt;, &lt;code&gt;gamification&lt;/code&gt;, &lt;code&gt;perceptual-distortion&lt;/code&gt;, &lt;code&gt;collective-intelligence&lt;/code&gt;, and &lt;code&gt;redundancy-race&lt;/code&gt;. Its non-obvious pick is a rage-quit button that pulses hotter the longer you wait; one click aborts and resubmits to a Haiku-class model. That rests on a premise the baseline never reaches: the slow model might just be the wrong model for this prompt.&lt;/p&gt;

&lt;p&gt;Twenty traps come back flagged with one-line reasons, including the tempting ones like "stream tokens in reverse" and "patience-token billing." I would argue the pruning matters more than the generation. Any fan-out produces volume. Volume without a labeled discard pile just moves the filtering cost onto you. An independent LLM judge on this problem scored breadth 9 versus 6, novelty 8 versus 3, and trap detection roughly 8 versus 2, with methodology in the repo's evals doc. One problem, so read it as an illustration, not a result.&lt;/p&gt;

&lt;h2&gt;
  
  
  The adoption pattern is the interesting signal
&lt;/h2&gt;

&lt;p&gt;Most projects in the early-adopters table did not vendor the code. They ported the shape onto their own primitives. repowire's maintainer turned frames into frame-shifted temp peers and mapped the generator/critic split onto separate peers versus the orchestrator's own turn. zk-flow-oss lifted &lt;code&gt;IDEATION_FRAMES&lt;/code&gt; into a critique workflow as a pre-pass to reduce anchoring bias before review. wtfismyrepo built a deterministic layer (import-graph PageRank, git-churn fragility, GitHub PR and issue signals) that formats its analysis as a problem plus context, then runs codebase onboarding angles through 12 frames with names like &lt;code&gt;new-grad&lt;/code&gt;, &lt;code&gt;archeologist&lt;/code&gt;, and &lt;code&gt;on-call-at-3am&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The entry I keep coming back to is godplans, which adopted the independent audit gate with its own isolated scoring pass and added a no-skill baseline control arm to its eval harness, then explicitly rejected the novelty-scoring axis and randomized frame selection as unsuited to its goals. That is what a portable pattern looks like when it is real. People take the parts that fit their problem and say out loud which parts do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it earns its cost
&lt;/h2&gt;

&lt;p&gt;Installation is one command that auto-detects the agent, covering Claude Code, Cursor, Antigravity, Codex, Cline, Gemini CLI, Windsurf and around 50 more. You invoke it with &lt;code&gt;/adhd "your problem"&lt;/code&gt; or let it auto-trigger on ideation intents. TypeScript, MIT, Node 18 or newer. There is a documented fallback for Codex builds that discover skills from a specific path.&lt;/p&gt;

&lt;p&gt;The guidance on when to reach for it is refreshingly bounded: design decisions, fuzzy debugging, naming, API surface design, strategy, and anything shaped like "give me a few ways to." Spinning up six isolated processes plus a critic pass to answer a question with one correct answer is waste. Spending it before you commit a quarter to an architecture is cheap insurance against the first plausible idea becoming the only idea.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/UditAkhourii/adhd" rel="noopener noreferrer"&gt;https://github.com/UditAkhourii/adhd&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>typescript</category>
      <category>promptengineering</category>
      <category>treeofthought</category>
    </item>
    <item>
      <title>GenOffice bets that file fidelity, not the AI panel, is the hard part</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Sun, 30 Aug 2026 17:04:33 +0000</pubDate>
      <link>https://dev.to/renolu/genoffice-bets-that-file-fidelity-not-the-ai-panel-is-the-hard-part-2j19</link>
      <guid>https://dev.to/renolu/genoffice-bets-that-file-fidelity-not-the-ai-panel-is-the-hard-part-2j19</guid>
      <description>&lt;p&gt;The most interesting engineering in this project has almost nothing to do with the AI panel. It lives in &lt;code&gt;packages/docx-engine&lt;/code&gt;, where editing a &lt;code&gt;.docx&lt;/code&gt; regenerates only the paragraphs you actually touched and carries every other byte of the original file through unchanged. The README calls it a paragraph patch. Anyone who has watched a third-party editor round-trip a signed contract and quietly rewrite its numbering, styles, and section breaks understands why that matters more than any chat sidebar.&lt;/p&gt;

&lt;p&gt;The repo, &lt;code&gt;genspark-ai/genoffice&lt;/code&gt;, is six Electron apps over one shared engine layer: a word processor, a spreadsheet, a presentation editor, a PDF editor, a Markdown editor, and a shell that hosts the other five in tabs. Apache-2.0, TypeScript, builds for macOS, Windows, and Linux. The pitch is an AI-first alternative to Microsoft Office. What is underneath is mostly a file format compatibility project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compatibility is the expensive part
&lt;/h2&gt;

&lt;p&gt;Read the per-app table and you can see where the years went. Docs renders a paginated view whose line metrics reproduce the original document's layout, so page breaks land where Word puts them, and it carries tracked changes, comments, styles, equations, and ink through the round trip. Sheets builds its UI on the open-source Univer core with a large in-house extension layer, but &lt;code&gt;.xlsx&lt;/code&gt; import and export run through an in-house Rust sidecar using calamine and IronCalc, with charts drawn in-house on Konva plus pivot tables, slicers, conditional formatting, and formula tracing. Slides is an in-house &lt;code&gt;.pptx&lt;/code&gt; parse, render, and edit engine with masters, cropping, and HarfBuzz text shaping metrics.&lt;/p&gt;

&lt;p&gt;The PDF app is the sharpest example. Text editing there rewrites page content streams through PDFium compiled to wasm, with subset-embedded fonts, paragraph selection, in-block reflow, alignment restoration, and original-font preservation. The README's phrase for what it avoids is "no cover-up annotations." Most tools that advertise PDF editing paint a white rectangle over the old text and stack new text on top, which holds up until someone copies the text out and gets the original back. Rewriting the content stream is the harder path and the one that survives contact with a counterparty.&lt;/p&gt;

&lt;p&gt;Markdown to Word goes through the same OOXML engine, with no Pandoc and no cloud round trip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the AI actually sits
&lt;/h2&gt;

&lt;p&gt;Every app embeds the same panel, and the shape of it follows from the engines rather than the other way around. In Docs it is block-granular editing with version snapshots and diffs. In the other apps it is a tool-calling agent operating over workbook, slide, or PDF state, with the agent loop and skill composition shared through &lt;code&gt;packages/agent-core&lt;/code&gt;. That design only works because there is a structured block tree to address in the first place. A model that can name the block it wants to change is a very different integration from one that gets handed a flattened blob of text and hands back a new blob.&lt;/p&gt;

&lt;h2&gt;
  
  
  The account is the catch
&lt;/h2&gt;

&lt;p&gt;Model calls route through a Genspark proxy. The apps sign in to a Genspark account with a device-code flow, and the user never enters or stores a model API key; Claude, GPT, and Gemini families are reachable through that proxy. The same account unlocks the "gsk" tool endpoints the agents build on, including web and image search, image generation and editing, media analysis, and audio transcription, all exposed through &lt;code&gt;packages/ai-search&lt;/code&gt; for anyone extending the agent layer.&lt;/p&gt;

&lt;p&gt;So the code is Apache-2.0 and the engine packages are pure TypeScript with no Electron dependency and unit tests, while the AI half depends on a vendor account. Worth knowing before you standardize a team on it. The editing engines still stand on their own if you never sign in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a developer can lift
&lt;/h2&gt;

&lt;p&gt;If you generate or transform documents programmatically, the packages are more useful than the desktop apps. &lt;code&gt;docx-engine&lt;/code&gt; parses to a block tree with &lt;code&gt;docxIndex&lt;/code&gt; anchors and passthrough, emits OOXML fragments, and does the byte-level paragraph patching. &lt;code&gt;file-parse&lt;/code&gt; handles text extraction for AI attachments across office and text formats. &lt;code&gt;ai-provider&lt;/code&gt; is the provider abstraction and streaming layer. Each is importable without pulling in the desktop shell.&lt;/p&gt;

&lt;p&gt;The dev loop is plain: &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;npm run fixtures&lt;/code&gt; to generate test &lt;code&gt;.docx&lt;/code&gt; fixtures, &lt;code&gt;npm test&lt;/code&gt;, &lt;code&gt;npm run typecheck&lt;/code&gt; across every workspace, and &lt;code&gt;npm run dev&lt;/code&gt; to bring up all five editors plus the shell on Vite servers. The docs, sheets, and slides tests need no display, which is the small detail that tells you someone thought about CI before shipping the deb, rpm, and AppImage builds.&lt;/p&gt;

&lt;p&gt;One design call is worth stealing regardless of what you think of the suite: document surfaces stay light in dark mode. Word-style dark chrome around white paper, so a file renders and exports identically either way. Theme colors sit on shared design tokens in &lt;code&gt;packages/ui&lt;/code&gt;, with a CI guard that keeps chrome colors on the token system instead of drifting into hardcoded hex over time.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/genspark-ai/genoffice" rel="noopener noreferrer"&gt;https://github.com/genspark-ai/genoffice&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>electron</category>
      <category>typescript</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Memory Budget Came First: How TurboFieldfare Fits a 26B Model in 2 GB</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Sat, 29 Aug 2026 16:55:29 +0000</pubDate>
      <link>https://dev.to/renolu/the-memory-budget-came-first-how-turbofieldfare-fits-a-26b-model-in-2-gb-1i2l</link>
      <guid>https://dev.to/renolu/the-memory-budget-came-first-how-turbofieldfare-fits-a-26b-model-in-2-gb-1i2l</guid>
      <description>&lt;p&gt;The headline on TurboFieldfare is that Gemma 4 26B-A4B runs in about 2 GB of RAM on an 8 GB MacBook Air. The more useful thing to notice is the ordering. The author picked the memory budget first and then rebuilt the runtime, the installer, and the app until they fit inside it. "Memory got expensive. So I gave a 26-billion-parameter model a ~2 GB budget." That line is the design document.&lt;/p&gt;

&lt;p&gt;The model does not shrink. It occupies about 14.3 GB once installed. What changes is what is allowed to be resident. TurboFieldfare keeps the shared 1.35 GB core and an FP16 KV cache in memory and leaves the routed experts on SSD, pulling in only the ones a given token actually selects. A mixture-of-experts model with 26B total parameters activates roughly 3.88B per token, so most of those weights sit idle during any single forward pass. The project treats that idleness as a storage problem rather than a memory problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The residency rule, applied per layer
&lt;/h2&gt;

&lt;p&gt;The README describes the decode loop in enough detail to argue with, which is rarer than it should be. At each transformer layer, Metal computes attention and the router from weights that are already resident. The CPU takes the router's top-8 expert IDs and plans against that layer's 16-slot LFU cache, then fills the misses with bounded parallel &lt;code&gt;pread&lt;/code&gt; calls into Metal-visible buffers. While those reads are in flight, Metal computes the resident shared-expert branch, and the two results get combined afterward.&lt;/p&gt;

&lt;p&gt;Two choices there are worth stealing. Sixteen slots against a top-8 selection sizes the cache to hold about two tokens of routing history, so repeated experts stay cheap while the miss path stays bounded. And overlapping the shared-expert compute with the expert reads hides SSD latency behind work that had to happen anyway. Prefill pushes the same idea further by processing prompts in chunks of up to 128 tokens, so one fetched expert serves many rows before anything evicts it.&lt;/p&gt;

&lt;p&gt;The throughput figures are the project's own measurements: 5.1 to 6.3 tok/s decode on an 8 GB M2 MacBook Air, and 31 to 35 tok/s on a 24 GB M5 Pro. The README says plainly that these are reference points rather than ceilings, and that prompt length, generated length, and page-cache state all move them. It also links a community benchmark guide, which is the honest way to handle a number that depends this much on the disk underneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The installer keeps the same discipline
&lt;/h2&gt;

&lt;p&gt;Installers usually get a pass. They run once, so people let them stage a full checkpoint on disk and buffer whatever they want. This one does not. It streams the required byte ranges from a pinned Hugging Face revision and repacks them directly into the &lt;code&gt;.gturbo&lt;/code&gt; layout as they arrive, so no second copy of the checkpoint ever lands and scratch memory stays bounded. The first install moves about 15 GB through those range requests, and the result is accepted only after its manifest and file hashes validate. Installation never loads the model into memory at all.&lt;/p&gt;

&lt;p&gt;The repack tool also handles resuming an interrupted download, discarding saved download state, and verifying an existing install without loading it. The runtime refuses anything that is not a completed directory with a final manifest. That refusal is the kind of detail that shows up after someone has debugged a half-written model directory at least once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the constraint costs
&lt;/h2&gt;

&lt;p&gt;TurboFieldfare is model-specific rather than a wrapper over MLX or llama.cpp, and it does not pretend otherwise. The package is arm64-only and wants macOS 26, Metal 4, Swift 6.2, and Xcode 26. It is text-only, with no images, audio, or video. The Mac app and CLI will not expose or execute tools; the loopback server accepts function-tool declarations and hands back model-produced tool calls for the client to authorize and run itself. That server has no remote authentication and no TLS, and the README tells you to keep it on 127.0.0.1.&lt;/p&gt;

&lt;p&gt;There is also an operational cost that most local-inference projects skip mentioning. Only one model-owning process should run at a time, and before starting a run you are told to close memory-heavy apps and check &lt;code&gt;memory_pressure -Q&lt;/code&gt;, then postpone if free memory looks thin. A runtime living inside a 2 GB envelope on an 8 GB machine cannot absorb a Chrome window, and the docs say so instead of letting you find out.&lt;/p&gt;

&lt;p&gt;The repository is turbo-fieldfare, Apache 2.0, and the Swift package ships six products covering the library, the Mac app, the decode service, the CLI, the loopback server, and the repacker. The curated experiment record summarizes 103 measured results across kernels, caching, I/O, prefill, and decode. For anyone whose deployment target is fixed hardware rather than a rentable GPU, that record is probably the most transferable part of the project.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/drumih/turbo-fieldfare" rel="noopener noreferrer"&gt;https://github.com/drumih/turbo-fieldfare&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>metal</category>
      <category>llminference</category>
      <category>localai</category>
    </item>
    <item>
      <title>A 2.78T Model in 8 GB of RAM, and the Gate Moves to the Disk</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Fri, 28 Aug 2026 22:48:22 +0000</pubDate>
      <link>https://dev.to/renolu/a-278t-model-in-8-gb-of-ram-and-the-gate-moves-to-the-disk-50nj</link>
      <guid>https://dev.to/renolu/a-278t-model-in-8-gb-of-ram-and-the-gate-moves-to-the-disk-50nj</guid>
      <description>&lt;p&gt;A 2.78-trillion-parameter model answered a prompt on one CPU inside 8.24 GB of resident memory, and the project reports that the same model on a 224 GB machine produces byte-identical output. Extra RAM buys clock time and nothing else. That inversion is the entire argument of kimi-k3-in-c, a Kimi K3 inference engine written in portable C99 with no BLAS, no framework and no GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory becomes a dial instead of a floor
&lt;/h2&gt;

&lt;p&gt;Most inference stacks treat memory as an eligibility test. You either hold the weights or you do not run. The README replaces that test with a ladder, measured on one machine with 124 cores and a fast NVMe drive: 26.5 seconds per token at 8 GB, 24.2 at 32 GB, 19.8 at 64 GB, and 5.6 at 128 GB and above. The first three rows still read the model off disk on every step, so a slower drive drags them down. The top row keeps everything resident and stops waiting on storage.&lt;/p&gt;

&lt;p&gt;The layout behind that ladder is described in four parts. The dense trunk stays in memory to whatever depth you pick and the rest streams. The 1.45 TB of routed experts are never resident at all, and get multiplied straight out of their packed 4-bit form rather than being unpacked into floats first. The other reductions are architectural: KDA, described as attention with a memory that never grows, and MLA, one latent in place of ninety-six heads. On top of that sit routing choices you can inspect, including picking 16 experts out of 896 and packing 93 layers so each one costs a single read.&lt;/p&gt;

&lt;p&gt;The expert cache is sized from evidence rather than intuition. A trace of 100,096 expert requests recorded during a full 93-layer run ships with the repository, and a Python script replays it to reprint the capacity table the docs publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gate moved from VRAM to the disk
&lt;/h2&gt;

&lt;p&gt;Nothing about the CPU requirement is exotic. AVX2 with FMA is enough and the README says AVX-512 is unnecessary. The build is seven C files against libm and OpenMP, and the resulting engine is 176 KB. Linux x86-64 is assumed because the code uses &lt;code&gt;O_DIRECT&lt;/code&gt;, &lt;code&gt;posix_memalign&lt;/code&gt; and &lt;code&gt;getrusage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The hard requirement is storage. The checkpoint is 1.56 TB, the packed trunk adds 109 GB, and the project asks for roughly 1.7 TB free on fast local disk. So the barrier did not disappear; it relocated. Anyone with a spare terabyte and a weekend of bandwidth is now in the same position as someone with a rack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification you can run before you commit the download
&lt;/h2&gt;

&lt;p&gt;The part worth copying has nothing to do with trillion-parameter models. &lt;code&gt;make test&lt;/code&gt; runs in under a minute with no checkpoint, no network and no Python. It exercises every kernel, the streaming cache, the safetensors reader, the config reader and the tokenizer, then runs three gates over a 13-layer model built from the same tensor graph as the released one: teacher forcing, greedy decode, and incremental decode with the KV cache and carried KDA state. The comparison target is a PyTorch reference captured as fixtures committed to the repo.&lt;/p&gt;

&lt;p&gt;That ordering matters. You get a pass or fail on the arithmetic before you spend hours pulling 1.56 TB. A shell script, &lt;code&gt;k3-doctor.sh&lt;/code&gt;, does the matching check on the machine itself, sizing your RAM to a preset and measuring your disk the way the engine will read it, and exits non-zero when the hardware cannot run the model at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the clock honestly
&lt;/h2&gt;

&lt;p&gt;This is a base checkpoint with no chat template, so after "The capital of France is" it continues into quoted text instead of replying. The captured runs are slow by design of the tradeoff: 8 tokens in 261.5 seconds at 32.69 seconds per token on the laptop preset with 8.24 GB peak RSS, and 28 tokens in 299.3 seconds at 10.69 seconds per token on the server preset with 127.92 GB peak. The project also reports that version 1.0.0 made the math per token about 8 times lighter on that hardware, a follow-up chat turn 3.9 times faster, and long prompts roughly half as costly. Those are its own measurements on its own machine, not a general claim about the technique.&lt;/p&gt;

&lt;p&gt;None of this is a serving path. What it is is a demonstration that the resident working set can be a parameter you choose rather than a constant the architecture imposes, with output equality held fixed across the whole range.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/FareedKhan-dev/kimi-k3-in-c" rel="noopener noreferrer"&gt;https://github.com/FareedKhan-dev/kimi-k3-in-c&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>llminference</category>
      <category>cpuinference</category>
      <category>quantization</category>
    </item>
    <item>
      <title>The CRM Where No Tool Accepts a Confidence Score</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Thu, 27 Aug 2026 22:41:45 +0000</pubDate>
      <link>https://dev.to/renolu/the-crm-where-no-tool-accepts-a-confidence-score-221a</link>
      <guid>https://dev.to/renolu/the-crm-where-no-tool-accepts-a-confidence-score-221a</guid>
      <description>&lt;p&gt;The most opinionated decision in trycompai/crm is a refusal: no tool the agent can call accepts a confidence score. Everything else in the design follows from that.&lt;/p&gt;

&lt;p&gt;The reasoning in the README is blunt. A model asked to grade its own certainty will happily produce a number, and it will be wrong in the direction that makes it look useful. So the tools do not report belief. They report what they observed, under names like &lt;code&gt;crm.signature-block&lt;/code&gt; and &lt;code&gt;github.account-identity&lt;/code&gt;, and a ledger prices the evidence. Strong evidence writes to the record. Weak evidence becomes a suggestion a human settles. The justification is the kind of thing anyone who has cleaned up a contacts table recognizes: a confidently wrong fact about a customer is worse than a blank field, because nobody can tell it is wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent owns the schedule
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;apps/agent&lt;/code&gt; is its own deployment, built on eve, Vercel's filesystem-first framework for durable agents. A tool is a file, a skill is a markdown file, a schedule is a file, and the runtime keeps sessions alive across a redeploy so work resumes where it stopped. The inventory is small and legible: 18 authored tools, 4 skills written as prose the agent reads and the team versions like code, and exactly one schedule.&lt;/p&gt;

&lt;p&gt;That schedule, &lt;code&gt;dispatch.ts&lt;/code&gt;, decides nothing. It leases what is due and starts a session per row. The queue lives in &lt;code&gt;lib/tasks.ts&lt;/code&gt;, where &lt;code&gt;claimDue&lt;/code&gt; leases with &lt;code&gt;FOR UPDATE SKIP LOCKED&lt;/code&gt;, so two dispatchers pick up disjoint work and a run that dies releases its row when the lease expires. The README draws the line explicitly: anything that sounds like "every N minutes, the oldest ten contacts" belongs in a task's &lt;code&gt;dueAt&lt;/code&gt;, not in a cron expression.&lt;/p&gt;

&lt;p&gt;The follow-up rule is the part worth stealing. When the agent wants another look at someone it calls &lt;code&gt;schedule_recheck&lt;/code&gt; and has to say why, and that reason gets shown to the rep. An agent that cannot explain why it will be back in fourteen days does not have a reason. It has a default.&lt;/p&gt;

&lt;h2&gt;
  
  
  A shell with nothing worth taking
&lt;/h2&gt;

&lt;p&gt;The sandbox gives the model &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;glob&lt;/code&gt; and a &lt;code&gt;/workspace&lt;/code&gt;, which is what separates a tool-caller from something that can keep a dossier, diff this month's profile against last month's, and grep a thread for a signature block. It runs with &lt;code&gt;deny-all&lt;/code&gt; egress, and the README argues that costs nothing, because &lt;code&gt;web_fetch&lt;/code&gt; runs in the app runtime and &lt;code&gt;web_search&lt;/code&gt; at the model provider. What the denial removes is the one path by which a customer's email body could leave through a shell command.&lt;/p&gt;

&lt;p&gt;The second half of that rule is an absence: the sandbox is never handed &lt;code&gt;DATABASE_URL&lt;/code&gt;. A shell with credentials and network access is exfiltration-shaped even inside an internal tool. A shell with neither is a text processor. This is a cheaper and more durable control than any prompt instruction telling the model not to leak things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zero keys is a supported configuration
&lt;/h2&gt;

&lt;p&gt;Every outside data source is optional, and running with none of them is the designed baseline. With no API keys, &lt;code&gt;read_crm_history&lt;/code&gt; still reads your own threads, meetings and signature blocks, which the project calls the best evidence available, since no vendor can sell you a reply from the person's own address. Each additional key opens one more place to look, and the agent is told at session start which ones this install has, so it plans around what it actually holds instead of discovering gaps one failed call at a time. Startup prints the list, on or off, line by line.&lt;/p&gt;

&lt;p&gt;One key is asked for rather than configured. Company brand data and LinkedIn both come from Context, and that key lives in a database row because the onboarding collects it and the General page under Settings changes it later. The stated reason is practical: a self-hoster's admin cannot redeploy to set an environment variable.&lt;/p&gt;

&lt;p&gt;The stack is a Turborepo monorepo on Bun. Next.js App Router in front, NestJS with nestjs-trpc behind it, Prisma over Postgres, Better Auth with a single sign-in allow list. The tRPC router type is generated from the Nest routers, so types hold from the Prisma row to the table cell, and list state lives in the URL so copying the address bar reproduces the view. The model layer goes through Vercel AI Gateway, which means no provider SDK in the tree. There are also no organizations, deliberately: single tenant, because an &lt;code&gt;organizationId&lt;/code&gt; that is always the same value is a column, an index and a permissions check that buys nothing while reading like a real one at review time.&lt;/p&gt;

&lt;p&gt;Every contact, company and deal carries an Agent tab showing the steps as they happen, the leads discarded and why, and the questions the agent could not settle on its own. It turns on when &lt;code&gt;AGENT_BRIDGE_SECRET&lt;/code&gt; matches in both processes. Leave it unset and the tab says so, and the agent keeps working its own queue anyway.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/trycompai/crm" rel="noopener noreferrer"&gt;https://github.com/trycompai/crm&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crm</category>
      <category>aiagents</category>
      <category>typescript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Codex Config Tool That Is Really About Undoing Itself</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Wed, 26 Aug 2026 13:45:09 +0000</pubDate>
      <link>https://dev.to/renolu/the-codex-config-tool-that-is-really-about-undoing-itself-3g4b</link>
      <guid>https://dev.to/renolu/the-codex-config-tool-that-is-really-about-undoing-itself-3g4b</guid>
      <description>&lt;p&gt;Most config helpers treat the write as the job. codex-keysmith treats it as something a person will want to reverse six weeks later, after they have forgotten what they installed and why their agent is behaving oddly. That assumption shapes the entire CLI: check status, preview the plan, then write, and keep a file on disk whose only purpose is to make the uninstall possible.&lt;/p&gt;

&lt;p&gt;The tool itself does something simple. It deploys one Markdown file into a Codex configuration directory, usually &lt;code&gt;~/.codex&lt;/code&gt;, so that later sessions load it. The README opens with a warning instead of a pitch, and the warning is the right call. This changes global behavior for that Codex config. It is not a project-level switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The write is small and the blast radius is written down
&lt;/h2&gt;

&lt;p&gt;Four paths change. &lt;code&gt;&amp;lt;codex-dir&amp;gt;/gpt-unrestricted.md&lt;/code&gt;, or whatever you pass to &lt;code&gt;--name&lt;/code&gt;, is either created or backed up and replaced. &lt;code&gt;config.toml&lt;/code&gt; gets exactly one edit, the top-level &lt;code&gt;model_instructions_file&lt;/code&gt; key. &lt;code&gt;hooks.json&lt;/code&gt; is moved aside wholesale to &lt;code&gt;hooks.json.disabled&lt;/code&gt;. Finally, &lt;code&gt;.codex-keysmith-manifest.json&lt;/code&gt; records what this layer owns.&lt;/p&gt;

&lt;p&gt;That last file is the one that makes the rest work. Uninstall reverses a single layer per run, newest first, which is only possible because each deployment wrote down its claim. Scenario deployments land somewhere else entirely, under &lt;code&gt;&amp;lt;target&amp;gt;/.codex-keysmith/&lt;/code&gt;, and leave the instruction-layer files untouched.&lt;/p&gt;

&lt;p&gt;The hook isolation deserves a pause. Disabling all of &lt;code&gt;hooks.json&lt;/code&gt; by default is a heavy move on a shared config directory, and the tool acknowledges that by giving &lt;code&gt;--restore-hooks&lt;/code&gt; different ergonomics from everything else. It runs immediately and refuses &lt;code&gt;--yes&lt;/code&gt;. Deploying and uninstalling want a preview and a confirmation flag. Putting your hooks back does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure states get their own vocabulary
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;inactive-by-config&lt;/code&gt; is a named status, meaning the instruction file is still sitting there but &lt;code&gt;config.toml&lt;/code&gt; no longer points at it. The prescribed fix is &lt;code&gt;--reactivate&lt;/code&gt;, available from v0.3.9, which restores only the missing top-level key. The README explicitly tells you not to hand-edit &lt;code&gt;config.toml&lt;/code&gt; and not to rerun a full deployment just to put one field back.&lt;/p&gt;

&lt;p&gt;Then it does something I rarely see in a tool of this size: it publishes where the guarantees stop. &lt;code&gt;--reactivate&lt;/code&gt; rolls back batch failures it can catch, but it creates no durable journal. After a hard interrupt you run &lt;code&gt;--status&lt;/code&gt; first, and if nothing conflicts you rerun &lt;code&gt;--reactivate --yes&lt;/code&gt; to finish the remaining directories. &lt;code&gt;--recover&lt;/code&gt; handles interrupted deploy and uninstall transactions, and nothing else. Do not delete the journal, the backups, or the manifest by hand.&lt;/p&gt;

&lt;p&gt;The batch language matters because omitting &lt;code&gt;--codex-dir&lt;/code&gt; makes the tool process every configuration directory it auto-discovers. One careless invocation reaches further than one machine's obvious &lt;code&gt;~/.codex&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A second channel that ships broken code on purpose
&lt;/h2&gt;

&lt;p&gt;The instruction channel is what most people will use. The environment channel is &lt;code&gt;--scaffold&lt;/code&gt;, which writes deliberately incomplete fixture workspaces into &lt;code&gt;~/.codex-fixture-workspace/&amp;lt;pack&amp;gt;&lt;/code&gt; and does not modify &lt;code&gt;~/.codex&lt;/code&gt; at all. You list packs with &lt;code&gt;--scaffold-list&lt;/code&gt;, preview with &lt;code&gt;--dry-run&lt;/code&gt;, and commit with &lt;code&gt;--yes&lt;/code&gt;, the same rhythm as the main path. The two channels can stack, and neither writes into the other's directory. If you are running the standalone single-file script without &lt;code&gt;fixture_packs/&lt;/code&gt; next to it, scaffolding prompts you to grab the release bundle or point at &lt;code&gt;--pack-dir&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Distribution reflects the same caution
&lt;/h2&gt;

&lt;p&gt;The recommended install is manual and slightly annoying, which is the point. Download the single-file &lt;code&gt;codex-instruct-v*.py&lt;/code&gt; and &lt;code&gt;SHA256SUMS&lt;/code&gt; from the latest stable release, verify the hash, then run it. The README states the anti-pattern outright: do not pipe curl into python. There is no &lt;code&gt;pip install&lt;/code&gt; and no auto-update.&lt;/p&gt;

&lt;p&gt;The rest of the limits are stated without hedging. macOS and Linux are the primary CLI targets, and a fresh Windows deployment is marked &lt;code&gt;EXPLICIT_BETA&lt;/code&gt;. The Desktop build is unsigned and unnotarized, ships only for Apple Silicon and Windows x64, and may trip Gatekeeper or SmartScreen. Python 3.10 through 3.14 is the recommended range. The published &lt;code&gt;v0.1.0&lt;/code&gt; should not be used.&lt;/p&gt;

&lt;p&gt;The same shape appears across the sibling projects for Claude Code, Grok Build, and ZCode, each aimed at a different tool's config surface. What carries over is not the prompt being deployed. It is the accounting around it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Jia-Ethan/codex-keysmith" rel="noopener noreferrer"&gt;https://github.com/Jia-Ethan/codex-keysmith&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>codex</category>
      <category>python</category>
      <category>developertools</category>
    </item>
    <item>
      <title>Stop Accepting AI on the Demo: Build a Real Sign-Off Process</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Wed, 26 Aug 2026 12:24:04 +0000</pubDate>
      <link>https://dev.to/renolu/stop-accepting-ai-on-the-demo-build-a-real-sign-off-process-1593</link>
      <guid>https://dev.to/renolu/stop-accepting-ai-on-the-demo-build-a-real-sign-off-process-1593</guid>
      <description>&lt;p&gt;When a vendor shows you an AI feature in action, you're watching a performance. The inputs are hand-picked, the outputs are polished, and nothing in that demo resembles the queue of messy, ambiguous, incomplete cases your team handles every day.&lt;/p&gt;

&lt;p&gt;The problem isn't that vendors are dishonest. The problem is that demos are structurally unsuited to tell you whether a system will perform on &lt;em&gt;your&lt;/em&gt; data. You need a repeatable, documented process that produces an answer you can put in a contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Your Own Evaluation Set
&lt;/h2&gt;

&lt;p&gt;Before the vendor sees a line of your data, your team should assemble a set of real historical cases — inputs you already have answers for. Draw from normal operations, but deliberately include the hard ones: requests with missing fields, poor-quality scans, ambiguous instructions, edge cases your best people have argued about.&lt;/p&gt;

&lt;p&gt;When two experienced team members genuinely disagree on the correct answer, leave that case out. That disagreement is a process problem, not a model problem. Including it just muddies your measurement.&lt;/p&gt;

&lt;p&gt;Label every case with the answer a competent person would give. Once you have a working set, hold back roughly a third of them. Share the rest with the vendor for development. The holdout set is what you actually test against at sign-off — if a vendor has only seen a subset of your data, you get a cleaner read on whether the system generalizes.&lt;/p&gt;

&lt;p&gt;Aim for enough cases to get a stable measurement. Very small sets produce noisy results; a larger and more varied set gives you a number you can trust and re-run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set the Threshold Before You See the Score
&lt;/h2&gt;

&lt;p&gt;There is no universal accuracy threshold for AI features. The right number depends entirely on what happens when the system is wrong.&lt;/p&gt;

&lt;p&gt;A tool that drafts responses for a human reviewer to approve before anything goes out has a very different risk profile than one that autonomously posts to a financial ledger or triggers a customer-facing communication. The tolerable error rate for the first might be generous; for the second, you may want something close to airtight.&lt;/p&gt;

&lt;p&gt;Work through the error economics before you run the test. If the system produces a wrong answer, what does it cost in time, money, or customer trust to catch and correct it? That math gives you a defensible threshold. Write it down and get the vendor to agree to it in writing — before testing begins, not after you see a number you don't like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the Edges, Not Just the Averages
&lt;/h2&gt;

&lt;p&gt;Raw accuracy on typical cases is only part of the picture. Three categories of behavior often go untested until they cause problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refusals.&lt;/strong&gt; What does the system do when the input is genuinely outside its scope? It should decline clearly and route the case elsewhere, not produce garbage with false confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalation.&lt;/strong&gt; When should it hand off to a human? Does it actually do that, or does it push through with low confidence and no flag?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hostile inputs.&lt;/strong&gt; Someone will eventually try to manipulate the system — contradictory instructions, adversarial prompts, or attempts to extract behavior it wasn't designed for. You want to know what happens before your customers find out.&lt;/p&gt;

&lt;p&gt;Stability is also worth checking: run identical cases on different days and look for consistency. Some variation is inherent in large language models, but a system that gives wildly different outputs on the same inputs is one you can't rely on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lock the Evaluation Set Into the Contract
&lt;/h2&gt;

&lt;p&gt;An evaluation set that lives only in a shared spreadsheet is easy to ignore once the ink is dry. The better approach: attach it as a formal exhibit to the vendor agreement.&lt;/p&gt;

&lt;p&gt;That contract language should require written notice before the vendor makes any changes that affect the underlying system — model updates, prompt changes, data sources, integration layers. It should specify that re-testing is required after such changes, with results delivered within a defined window.&lt;/p&gt;

&lt;p&gt;The evaluation data should belong to you, not the vendor. That matters if you ever need to switch providers: a proprietary test set controlled by the current vendor is leverage you don't want them to have.&lt;/p&gt;

&lt;p&gt;After go-live, treat the evaluation set as a living regression suite rather than a one-time gate. Business inputs drift; your test set should be updated periodically to reflect how your operations actually look today. Vendors update underlying models on their own schedules — automated changes can shift behavior without anyone alerting you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This guide originally appeared on &lt;a href="https://www.agentpalisade.com/resources/ai-feature-acceptance-testing-guide" rel="noopener noreferrer"&gt;agentpalisade.com&lt;/a&gt;. Agent Palisade helps small and mid-sized businesses put AI to work inside the tools they already use — practical automation, internal assistants, and AI security reviews. &lt;a href="https://www.agentpalisade.com/book-call" rel="noopener noreferrer"&gt;Book a free 30-minute call&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>business</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Graft's real claim isn't speed, it's the files your agent never opened</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Tue, 25 Aug 2026 13:40:57 +0000</pubDate>
      <link>https://dev.to/renolu/grafts-real-claim-isnt-speed-its-the-files-your-agent-never-opened-4f36</link>
      <guid>https://dev.to/renolu/grafts-real-claim-isnt-speed-its-the-files-your-agent-never-opened-4f36</guid>
      <description>&lt;p&gt;The most useful number in Graft's results table is not the 60% latency cut. It is the pattern the maintainers describe behind their SWE-bench Verified wins: every correctness gain has the same shape, because the cold baseline patches one file and misses its siblings. On &lt;code&gt;django-11532&lt;/code&gt; the report says the baseline patched 1 of the 5 files the fix requires and broke 18 previously-passing tests. On &lt;code&gt;django-16263&lt;/code&gt; it patched 1 of 4. Those are not slow runs. They are confident, fast, incomplete ones.&lt;/p&gt;

&lt;p&gt;Graft is a TypeScript CLI from NanoNets that writes a context layer into your repo so a coding agent stops rediscovering the codebase on every task. Install it with npm, run &lt;code&gt;graft init&lt;/code&gt;, and it asks which agents to wire up, builds a &lt;code&gt;graft/&lt;/code&gt; folder from your source, and drops a statusline plus hooks into &lt;code&gt;.claude/&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rediscovery is the tax, incompleteness is the bill
&lt;/h2&gt;

&lt;p&gt;The README's problem statement is blunt about what an agent does before it changes anything: grep a term, open a file, follow an import, back out, try again. It is rebuilding a picture of a codebase it mapped an hour ago and threw away. The exploration cost gets paid again from zero on the next task, and whatever the agent worked out dies with the session. Humans onboard to a codebase once; agents onboard every single time.&lt;/p&gt;

&lt;p&gt;Most tools that attack this sell you the token savings. Graft's own controlled sweep does report those, and they are real by the project's measurement: 162 runs across two repos, same Claude Sonnet 5 agent, same file tools, only the context differs. Mean tool calls drop from 4.2 to 2.3, tokens from 8,070 to 4,650, latency from 39.8 seconds to 15.8. Correctness in that sweep stayed flat at 93%.&lt;/p&gt;

&lt;p&gt;Flat correctness is the honest part. The savings claim and the accuracy claim come from two different harnesses, and the project says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  The graph is a folder you can grep
&lt;/h2&gt;

&lt;p&gt;There is no vector store here. &lt;code&gt;graft build&lt;/code&gt; produces a set of linked markdown files, one node per system, API, or concept, with typed links between them. The agent opens and follows them the way it reads any other file in the repo. No embeddings, no similarity search, no index to keep warm.&lt;/p&gt;

&lt;p&gt;Two LLM passes build it. The first summarizes each source file into a short description. The second groups those summaries into a curated node set, picking a level of detail so a large repo lands at a few dozen readable nodes rather than one node per file. Running alongside that is a deterministic tree-sitter tier that emits a per-symbol code graph into &lt;code&gt;graft/.graph/wiring.json&lt;/code&gt; and never calls a model at all.&lt;/p&gt;

&lt;p&gt;The storage decision is the one operators will appreciate. &lt;code&gt;graft build&lt;/code&gt; adds &lt;code&gt;graft/&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt; and treats it as a regenerable local cache, in the same spirit as &lt;code&gt;node_modules&lt;/code&gt;. What you commit is the small wiring that &lt;code&gt;init&lt;/code&gt; left behind in &lt;code&gt;.claude/&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt;, and the MCP config, and each teammate builds their own graph. Every query rebuilds against the working tree first, which the project clocks at roughly 3 milliseconds of structural work when nothing moved, so uncommitted edits are covered without a stale index to babysit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Push and pull are different products
&lt;/h2&gt;

&lt;p&gt;The sweep ran three variants, not two. Push injects a &lt;code&gt;graft ask&lt;/code&gt; bundle up front. Pull exposes &lt;code&gt;graft_find_code&lt;/code&gt; and &lt;code&gt;graft_file_api&lt;/code&gt; as tools and injects nothing, so context is paid for only when the agent asks. Push bought the speed. Pull gave most of that speed back and took correctness to 98%, five points over cold, which the project calls the strongest single result in the sweep.&lt;/p&gt;

&lt;p&gt;That is a genuine fork, and the README does not paper over it: push when speed is what you need, pull when being right matters more. If your agent's mistakes look like the django cases, where it stops at the first plausible file, the pull configuration is the one worth trying first.&lt;/p&gt;

&lt;p&gt;Summaries run under your own key against whichever provider you pick, including a local model, and the structural commands never touch one. The project is MIT licensed with a telemetry badge reading none. The check to run on your own codebase is not whether the token counter drops. It is whether the next multi-file change lands on all of the files it should.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/NanoNets/Graft" rel="noopener noreferrer"&gt;https://github.com/NanoNets/Graft&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curated by &lt;a href="https://www.agentpalisade.com" rel="noopener noreferrer"&gt;Agent Palisade&lt;/a&gt; — practical AI for small and mid-sized businesses.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Before You Self-Host AI: Getting the Requirement in Writing First</title>
      <dc:creator>Reno Lu</dc:creator>
      <pubDate>Tue, 25 Aug 2026 12:22:29 +0000</pubDate>
      <link>https://dev.to/renolu/before-you-self-host-ai-getting-the-requirement-in-writing-first-5842</link>
      <guid>https://dev.to/renolu/before-you-self-host-ai-getting-the-requirement-in-writing-first-5842</guid>
      <description>&lt;p&gt;When teams start building with AI, someone eventually raises the question of where the data actually goes. That concern is legitimate — but it often short-circuits into a conclusion before anyone has read the actual requirement driving it.&lt;/p&gt;

&lt;p&gt;There are three real deployment options: a standard hosted API, an enterprise-tier hosted service with contractual data protections, and open-weight models running on your own infrastructure. Many projects land on option three without seriously evaluating option two. That skip is expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Must Self-Host" Usually Means
&lt;/h2&gt;

&lt;p&gt;Most mandates to keep AI inference local trace back to one of four sources: sector regulations, contract clauses with clients or vendors, internal security policies written before enterprise AI tiers existed, or security team guidelines applied conservatively.&lt;/p&gt;

&lt;p&gt;The critical question is what the requirement actually constrains. There's a meaningful difference between a rule that governs &lt;em&gt;data properties&lt;/em&gt; — who can use data for training, how long it's retained, what access controls exist — and one that requires &lt;em&gt;physical custody&lt;/em&gt; of the model. Those two things sound related but lead to completely different architectures.&lt;/p&gt;

&lt;p&gt;Get the specific language in writing before making any infrastructure decisions. "We can't send data to third parties" is a starting point, not a specification. Find out who approved the policy, what evidence would satisfy it, and whether it applies to all data or only specific categories.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Enterprise Tier Most Teams Skip
&lt;/h2&gt;

&lt;p&gt;Hosted providers offer business and enterprise plans that include terms many teams assume require self-hosting: no use of customer content for training, configurable or zero data retention, regional processing, tenant isolation, audit logging, and data processing agreements you can show to legal or compliance reviewers.&lt;/p&gt;

&lt;p&gt;The difference between enterprise contract terms and standard terms is the difference between an enforceable promise and a best-effort practice. If a provider's enterprise agreement says they won't train on your data and they do anyway, you have contractual remedies. That's meaningfully different from relying on a public-facing privacy policy that can change.&lt;/p&gt;

&lt;p&gt;Before pricing out GPU infrastructure, request written terms for the exact product your team would use. Verify what they say about training restrictions, retention windows, breach notification timelines, and deletion on request. Then get sign-off from whoever owns the compliance decision. This step often closes the self-hosting question entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Self-Hosting Actually Makes Sense
&lt;/h2&gt;

&lt;p&gt;Some requirements genuinely can't be satisfied by any hosted service — specific regulatory frameworks, sensitive data categories, or client contracts with strict custody language. When that's the case, the economics deserve a realistic look before committing.&lt;/p&gt;

&lt;p&gt;Hardware is rarely the largest cost. The fuller picture includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure for peak load&lt;/strong&gt;, not average load — concurrent request spikes determine your sizing, not daily averages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-production environments&lt;/strong&gt; for testing and development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redundancy&lt;/strong&gt; for availability requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engineering hours&lt;/strong&gt; for ongoing maintenance, patching, and model evaluation cycles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-call coverage&lt;/strong&gt; for inference failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality gaps&lt;/strong&gt; between open-weight and frontier models, measured on your actual tasks, converted to human review costs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build your cost model from real measurements. Sample a week of actual requests, count tokens, identify daily peaks, and project what 3x growth looks like. Then compare that number to the enterprise tier price, not to a rough internal estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hybrid Routing as the Middle Path
&lt;/h2&gt;

&lt;p&gt;Many systems don't require uniform treatment of all data. Only certain fields, records, or request types fall under the actual mandate. In those cases, a hybrid approach routes only the constrained slice to a locally-hosted model while everything else goes through a hosted API.&lt;/p&gt;

&lt;p&gt;Practical patterns include keeping embeddings local while running generation through a hosted service, using redaction at the boundary to strip sensitive fields before they leave your infrastructure, or using a local model as a preliminary classifier that routes requests based on content type.&lt;/p&gt;

&lt;p&gt;The routing logic in a hybrid system becomes a security control in its own right. Test it against edge cases, log every routing decision, and configure it to fail closed — uncertain requests stay local rather than defaulting to the hosted path.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Decision Order
&lt;/h2&gt;

&lt;p&gt;The sequence matters. Getting drawn into GPU pricing before confirming what the requirement actually says leads to expensive commitments that may turn out to be unnecessary.&lt;/p&gt;

&lt;p&gt;A useful order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the requirement in writing and classify what it actually constrains&lt;/li&gt;
&lt;li&gt;Evaluate whether a hosted enterprise agreement satisfies it&lt;/li&gt;
&lt;li&gt;Measure real volume, latency targets, and peak concurrency before sizing anything&lt;/li&gt;
&lt;li&gt;Cost the self-hosted option end-to-end, including engineering and on-call time&lt;/li&gt;
&lt;li&gt;If neither fully fits, design the hybrid split around the specific data categories under constraint&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most mandates that initially seem to require self-hosting are satisfied by a hosted enterprise agreement once the terms are reviewed carefully. The ones that remain after that review usually represent genuine regulatory or contractual requirements — and at that point, the infrastructure complexity is justified.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This guide originally appeared on &lt;a href="https://www.agentpalisade.com/resources/hosted-vs-self-hosted-ai-guide" rel="noopener noreferrer"&gt;agentpalisade.com&lt;/a&gt;. Agent Palisade helps small and mid-sized businesses put AI to work inside the tools they already use — practical automation, internal assistants, and AI security reviews. &lt;a href="https://www.agentpalisade.com/book-call" rel="noopener noreferrer"&gt;Book a free 30-minute call&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>business</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
