<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Developer Tools on KnightLi Blog</title>
        <link>https://knightli.com/en/tags/developer-tools/</link>
        <description>Recent content in Developer Tools on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Fri, 29 May 2026 15:24:18 +0800</lastBuildDate><atom:link href="https://knightli.com/en/tags/developer-tools/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Google Pay and Wallet Launch Developer MCP Server: Bringing Payment Integration Into AI Assistants</title>
        <link>https://knightli.com/en/2026/05/29/google-pay-wallet-developer-mcp-server/</link>
        <pubDate>Fri, 29 May 2026 15:24:18 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/29/google-pay-wallet-developer-mcp-server/</guid>
        <description>&lt;p&gt;Google Developers has released the Google Pay and Wallet Developer MCP Server. Built for developers integrating the Google Pay API and Google Wallet API, it connects official documentation, account status, integration checks, and some business metrics to MCP-compatible AI development tools.&lt;/p&gt;
&lt;p&gt;This kind of update may not look as flashy as a model launch, but it is very practical for developers. Payment and wallet integrations are often less about whether someone can write the code and more about dense documentation, many configuration items, review requirements, and scattered error feedback. The value of an MCP Server is that it lets an AI assistant help developers troubleshoot from a position much closer to the real context.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-it-solves&#34;&gt;What Problem It Solves
&lt;/h2&gt;&lt;p&gt;When developers integrate Google Pay or Google Wallet, they usually have to switch back and forth across several places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Checking official documentation and sample code&lt;/li&gt;
&lt;li&gt;Confirming account and merchant configuration&lt;/li&gt;
&lt;li&gt;Inspecting request parameters and returned errors&lt;/li&gt;
&lt;li&gt;Verifying whether the integration meets requirements&lt;/li&gt;
&lt;li&gt;Observing call performance and key metrics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If these resources are treated only as web documentation, an AI assistant can mostly explain concepts or generate examples. After connecting to an MCP Server, the assistant can access more specific information through tools and provide suggestions that are closer to the current project state.&lt;/p&gt;
&lt;h2 id=&#34;why-mcp-fits-here&#34;&gt;Why MCP Fits Here
&lt;/h2&gt;&lt;p&gt;MCP provides standardized tool interfaces for AI applications. For developer products such as Google Pay and Wallet, it is especially well suited to tasks that combine documentation, status, and validation.&lt;/p&gt;
&lt;p&gt;For example, developers can ask an MCP-capable AI tool to help answer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which configuration items are missing from the current integration&lt;/li&gt;
&lt;li&gt;Why a particular Google Pay request failed&lt;/li&gt;
&lt;li&gt;Which fields in a Wallet pass definition may not meet the requirements&lt;/li&gt;
&lt;li&gt;How a code sample should be adapted to the current business need&lt;/li&gt;
&lt;li&gt;Which items still need to be checked before the integration goes live&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These questions are risky if answered only from a large model&amp;rsquo;s memory. When the answer can combine official tools with current account information, it becomes much more actionable.&lt;/p&gt;
&lt;h2 id=&#34;what-it-means-for-ai-coding-workflows&#34;&gt;What It Means for AI Coding Workflows
&lt;/h2&gt;&lt;p&gt;This release also points to a trend: AI coding assistants are moving from &amp;ldquo;reading code&amp;rdquo; to &amp;ldquo;reading product systems.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;In the past, when developers asked AI to help integrate payment capabilities, they usually had to paste in documentation snippets, error logs, and code. AI could explain them, but it did not necessarily know the real state of the current integration. MCP Server pushes that capability one step forward, giving AI assistants a chance to work directly around the product integration environment.&lt;/p&gt;
&lt;p&gt;This is especially valuable in several scenarios:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A new project integrates Google Pay or Wallet for the first time.&lt;/li&gt;
&lt;li&gt;An old project migrates to a new API or configuration approach.&lt;/li&gt;
&lt;li&gt;The team performs integration checks before launch.&lt;/li&gt;
&lt;li&gt;The team needs to quickly locate issues involving error codes, review problems, or configuration mismatches.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For teams, the benefit is not just reading a few fewer pages of documentation. It is reducing the friction of &amp;ldquo;the documentation was understood correctly, but the live configuration does not match.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;it-will-not-replace-developer-judgment&#34;&gt;It Will Not Replace Developer Judgment
&lt;/h2&gt;&lt;p&gt;Payment and wallet integrations involve security, compliance, and user experience requirements. MCP Server can help AI assistants find information faster, check status, and generate suggestions, but developers still need to confirm the code, security strategy, merchant configuration, and launch process.&lt;/p&gt;
&lt;p&gt;This is especially true for payment flows. A seemingly reasonable AI suggestion should not be pushed directly to production. A more reliable approach is to treat MCP tools as inspectors and navigators: they can shorten the time needed to locate a problem, but they cannot replace review, testing, or business responsibility.&lt;/p&gt;
&lt;h2 id=&#34;my-take&#34;&gt;My Take
&lt;/h2&gt;&lt;p&gt;The significance of the Google Pay and Wallet Developer MCP Server is not that there is &amp;ldquo;one more MCP example.&amp;rdquo; It is that MCP has been placed inside a real, complex, highly constrained developer scenario.&lt;/p&gt;
&lt;p&gt;If MCP only connects to documentation, its value is limited. If it can connect to account status, integration validation, metrics, and product backends, AI assistants can take on more practical development work. Google&amp;rsquo;s release shows exactly that direction.&lt;/p&gt;
&lt;p&gt;Similar capabilities are likely to appear in more cloud services, advertising platforms, payment systems, and enterprise SaaS products in the future. Developers need to adapt not just to &amp;ldquo;AI can write code,&amp;rdquo; but to &amp;ldquo;AI can participate in the entire integration process through standardized tool interfaces.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Original link: &lt;a class=&#34;link&#34; href=&#34;https://developers.googleblog.com/supercharge-your-integration-workflow-with-the-google-pay-wallet-developer-mcp-server/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Supercharge your integration workflow with the Google Pay &amp;amp; Wallet Developer MCP Server&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Remotion: Generate Videos Programmatically with React</title>
        <link>https://knightli.com/en/2026/05/27/remotion-react-programmatic-video-generation/</link>
        <pubDate>Wed, 27 May 2026 14:39:22 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/27/remotion-react-programmatic-video-generation/</guid>
        <description>&lt;p&gt;&lt;code&gt;remotion-dev/remotion&lt;/code&gt; is a framework for creating videos programmatically with React. It pulls video production out of traditional timeline tools and turns it into a frontend engineering problem that can be controlled with components, state, data, API, CSS, Canvas, SVG, WebGL, and algorithms.&lt;/p&gt;
&lt;p&gt;Project address: &lt;a class=&#34;link&#34; href=&#34;https://github.com/remotion-dev/remotion&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;remotion-dev/remotion&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This kind of tool fits today&amp;rsquo;s AI coding workflows very well: if an agent can generate web pages, charts, and data views, it can also keep going and generate video scripts, animation components, and renderable short films.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-does-remotion-solve&#34;&gt;What Problem Does Remotion Solve
&lt;/h2&gt;&lt;p&gt;Traditional video tools are good at manual editing, but not at scale, parameterization, or automation.&lt;/p&gt;
&lt;p&gt;For example, these tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generate a personalized annual recap video for each user&lt;/li&gt;
&lt;li&gt;Automatically generate product demo videos from a database&lt;/li&gt;
&lt;li&gt;Combine charts, code snippets, and explanatory subtitles into technical short videos&lt;/li&gt;
&lt;li&gt;Batch-generate marketing assets, social media short videos, or course clips&lt;/li&gt;
&lt;li&gt;Render videos on demand through CI/CD or backend services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With traditional editing software, these tasks are hard to fully automate. Remotion&amp;rsquo;s approach is to write video as a React application: every frame is the result of components and data at a specific point in time.&lt;/p&gt;
&lt;h2 id=&#34;why-react&#34;&gt;Why React
&lt;/h2&gt;&lt;p&gt;The reason given in the Remotion README is straightforward: React can reuse Web technologies and component-based development.&lt;/p&gt;
&lt;p&gt;It lets you use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS for layout and animation&lt;/li&gt;
&lt;li&gt;SVG for vector graphics&lt;/li&gt;
&lt;li&gt;Canvas and WebGL for complex drawing&lt;/li&gt;
&lt;li&gt;JavaScript / TypeScript for variables, functions, API calls, math, and algorithms&lt;/li&gt;
&lt;li&gt;React components for reuse, composition, and fast iteration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means frontend developers do not need to learn an entirely unfamiliar video DSL from scratch. Many existing UI pieces, charts, design systems, and data logic can be moved into video generation scenarios.&lt;/p&gt;
&lt;h2 id=&#34;quick-start&#34;&gt;Quick Start
&lt;/h2&gt;&lt;p&gt;If Node.js is already installed, the entry command given in the README is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx create-video@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After creating a project, you typically write React components to describe the scene, then let Remotion render the video frame by frame.&lt;/p&gt;
&lt;p&gt;For more complete documentation, see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docs: &lt;a class=&#34;link&#34; href=&#34;https://www.remotion.dev/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;remotion.dev/docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;API Reference: &lt;a class=&#34;link&#34; href=&#34;https://www.remotion.dev/api&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;remotion.dev/api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-scenarios-is-it-good-for&#34;&gt;What Scenarios Is It Good For
&lt;/h2&gt;&lt;p&gt;Remotion is best suited to scenarios where &amp;ldquo;video content is driven by data or code.&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;personalized-videos&#34;&gt;Personalized Videos
&lt;/h3&gt;&lt;p&gt;Examples include annual recaps, user achievements, order summaries, and learning reports. Each user&amp;rsquo;s data is different, but the visual structure is the same. Using React components plus data-driven rendering feels more natural than manual editing.&lt;/p&gt;
&lt;h3 id=&#34;technical-demo-videos&#34;&gt;Technical Demo Videos
&lt;/h3&gt;&lt;p&gt;If a video contains code, charts, product interfaces, step animations, and explanatory text, Remotion is well suited to organizing these elements into templates that can be rendered repeatedly.&lt;/p&gt;
&lt;h3 id=&#34;data-videos-and-chart-animations&#34;&gt;Data Videos and Chart Animations
&lt;/h3&gt;&lt;p&gt;Data visualization is already a frontend strength. Remotion lets charts appear not only on web pages, but also enter videos along a timeline.&lt;/p&gt;
&lt;h3 id=&#34;ai-generated-video-workflows&#34;&gt;AI-Generated Video Workflows
&lt;/h3&gt;&lt;p&gt;An AI agent can first generate scripts and asset structures, then generate Remotion components, and finally render the video. This is more controllable than asking a model to directly generate the final video, because the intermediate artifact is code that can be inspected, edited, versioned, and reused.&lt;/p&gt;
&lt;h2 id=&#34;why-it-matters-for-ai-coding-tools&#34;&gt;Why It Matters for AI Coding Tools
&lt;/h2&gt;&lt;p&gt;Remotion is especially interesting for AI coding tools such as Codex, Claude Code, Cursor, and Gemini CLI.&lt;/p&gt;
&lt;p&gt;The reason is that video generation is broken down into development tasks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate React components.&lt;/li&gt;
&lt;li&gt;Adjust styles and layout.&lt;/li&gt;
&lt;li&gt;Connect data.&lt;/li&gt;
&lt;li&gt;Preview the scene.&lt;/li&gt;
&lt;li&gt;Modify based on feedback.&lt;/li&gt;
&lt;li&gt;Render the output.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This workflow is a very good fit for agents: every step has files, code, a preview, and clear feedback. Compared with &amp;ldquo;directly generating a video file,&amp;rdquo; code-based video is easier to review and iterate on.&lt;/p&gt;
&lt;p&gt;Combined with browser sidebars, screenshot inspection, automated rendering, and comment feedback, Remotion can become the video artifact layer inside an AI workflow.&lt;/p&gt;
&lt;h2 id=&#34;check-the-license-before-use&#34;&gt;Check the License Before Use
&lt;/h2&gt;&lt;p&gt;The Remotion README specifically notes that Remotion has a special license, and that certain company usage scenarios require a company license.&lt;/p&gt;
&lt;p&gt;So do not treat it as just another small MIT utility. License requirements may differ for personal projects, open-source projects, commercial projects, and internal enterprise tools. Before using it in company production, you should first read its LICENSE page and official licensing notes.&lt;/p&gt;
&lt;p&gt;This is important, especially when connecting Remotion to automated content generation, marketing asset generation, or internal enterprise video pipelines.&lt;/p&gt;
&lt;h2 id=&#34;my-take&#34;&gt;My Take
&lt;/h2&gt;&lt;p&gt;Remotion&amp;rsquo;s value is not just &amp;ldquo;making videos with React&amp;rdquo;; it is turning video into something programmable, reusable, and automatable.&lt;/p&gt;
&lt;p&gt;For ordinary frontend teams, it is suitable for data-driven video templates. For AI tools, it is more like a stable output target: the model does not need to generate a black-box video in one shot, but can instead generate readable, editable, renderable React code.&lt;/p&gt;
&lt;p&gt;If your content needs batch generation, personalization, updates based on data, or repeated visual adjustments by an agent, Remotion is worth putting into the toolbox. It is not a replacement for traditional editing software, but a way to connect video production to a software engineering workflow.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>RTK: A CLI Proxy That Saves Tokens for AI Coding Agents</title>
        <link>https://knightli.com/en/2026/05/27/rtk-ai-cli-proxy-token-savings/</link>
        <pubDate>Wed, 27 May 2026 13:52:01 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/27/rtk-ai-cli-proxy-token-savings/</guid>
        <description>&lt;p&gt;&lt;code&gt;rtk-ai/rtk&lt;/code&gt; is a command-line proxy for AI coding agents. The idea is straightforward: many agents repeatedly call &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;git status&lt;/code&gt;, &lt;code&gt;git diff&lt;/code&gt;, test commands, and build commands while working on a project, and the raw output from those commands is often long and repetitive. RTK filters and compresses command output before it enters the LLM context, so the model sees shorter and more useful results.&lt;/p&gt;
&lt;p&gt;Project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/rtk-ai/rtk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;rtk-ai/rtk&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-problem-it-solves&#34;&gt;What Problem It Solves
&lt;/h2&gt;&lt;p&gt;The real cost of AI coding tools is not only the number of model calls. It is also the useless information pushed into the context window.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ls -la&lt;/code&gt; may output lots of permissions, timestamps, and irrelevant files.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git diff&lt;/code&gt; may include a lot of repeated context.&lt;/li&gt;
&lt;li&gt;When &lt;code&gt;pytest&lt;/code&gt;, &lt;code&gt;cargo test&lt;/code&gt;, or &lt;code&gt;npm test&lt;/code&gt; fails, the important part is the failing case and stack trace, not every passing case.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker ps&lt;/code&gt;, &lt;code&gt;kubectl pods&lt;/code&gt;, and &lt;code&gt;aws&lt;/code&gt; commands often expose many fields, while the agent only needs a few key details.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If all of that output enters the model context unchanged, it burns tokens quickly. RTK does not replace those commands. It adds a compression layer between them and the AI coding agent.&lt;/p&gt;
&lt;h2 id=&#34;how-rtk-works&#34;&gt;How RTK Works
&lt;/h2&gt;&lt;p&gt;RTK&amp;rsquo;s README positions it as a tool that filters and compresses command results before they reach the LLM context. It is a single Rust binary, supports many common development commands, and emphasizes low overhead.&lt;/p&gt;
&lt;p&gt;It mainly applies four strategies:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Smart Filtering&lt;/strong&gt;: removes comments, whitespace, boilerplate, and low-value noise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grouping&lt;/strong&gt;: aggregates similar items, such as by directory, error type, or status.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Truncation&lt;/strong&gt;: keeps the relevant context and cuts repeated or unimportant parts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deduplication&lt;/strong&gt;: collapses repeated log lines into shorter counted output.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the agent&amp;rsquo;s perspective, the commands are still familiar development commands. The difference is that the result returned to the model is shorter.&lt;/p&gt;
&lt;h2 id=&#34;supported-commands&#34;&gt;Supported Commands
&lt;/h2&gt;&lt;p&gt;RTK focuses on everyday development workflows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Files: &lt;code&gt;rtk ls&lt;/code&gt;, &lt;code&gt;rtk read&lt;/code&gt;, &lt;code&gt;rtk find&lt;/code&gt;, &lt;code&gt;rtk grep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Git: &lt;code&gt;rtk git status&lt;/code&gt;, &lt;code&gt;rtk git log&lt;/code&gt;, &lt;code&gt;rtk git diff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GitHub CLI: &lt;code&gt;rtk gh pr list&lt;/code&gt;, &lt;code&gt;rtk gh pr view&lt;/code&gt;, &lt;code&gt;rtk gh issue list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Tests: &lt;code&gt;rtk pytest&lt;/code&gt;, &lt;code&gt;rtk go test&lt;/code&gt;, &lt;code&gt;rtk cargo test&lt;/code&gt;, &lt;code&gt;rtk vitest&lt;/code&gt;, &lt;code&gt;rtk playwright test&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build and lint: &lt;code&gt;rtk lint&lt;/code&gt;, &lt;code&gt;rtk tsc&lt;/code&gt;, &lt;code&gt;rtk next build&lt;/code&gt;, &lt;code&gt;rtk cargo clippy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Containers and cloud: &lt;code&gt;rtk docker ps&lt;/code&gt;, &lt;code&gt;rtk docker logs&lt;/code&gt;, &lt;code&gt;rtk kubectl pods&lt;/code&gt;, &lt;code&gt;rtk aws sts get-caller-identity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Data and logs: &lt;code&gt;rtk json&lt;/code&gt;, &lt;code&gt;rtk deps&lt;/code&gt;, &lt;code&gt;rtk env&lt;/code&gt;, &lt;code&gt;rtk log&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This kind of tool is most useful when an agent reads command output frequently. It does not write code for you. It helps the agent read less noise.&lt;/p&gt;
&lt;h2 id=&#34;installation-and-integration&#34;&gt;Installation and Integration
&lt;/h2&gt;&lt;p&gt;The README lists several installation options.&lt;/p&gt;
&lt;p&gt;Homebrew:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install rtk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Quick install on Linux/macOS:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Cargo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cargo install --git https://github.com/rtk-ai/rtk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After installation, check the version and stats:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rtk --version
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rtk gain
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To integrate it with AI coding tools, use the init commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rtk init -g
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rtk init -g --gemini
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rtk init -g --codex
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rtk init -g --agent cursor
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rtk init --agent windsurf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rtk init --agent cline
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Restart the corresponding AI tool after initialization. For hook-based agents, Bash commands are rewritten before execution. For example, &lt;code&gt;git status&lt;/code&gt; becomes &lt;code&gt;rtk git status&lt;/code&gt;, and the agent receives compressed output.&lt;/p&gt;
&lt;h2 id=&#34;what-to-watch-out-for&#34;&gt;What To Watch Out For
&lt;/h2&gt;&lt;p&gt;RTK&amp;rsquo;s benefit depends on whether the agent actually reads information through shell commands.&lt;/p&gt;
&lt;p&gt;The README specifically notes that built-in tools such as Claude Code&amp;rsquo;s &lt;code&gt;Read&lt;/code&gt;, &lt;code&gt;Grep&lt;/code&gt;, and &lt;code&gt;Glob&lt;/code&gt; do not pass through the Bash hook, so they are not automatically rewritten by RTK. To make RTK participate, use shell commands such as &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;tail&lt;/code&gt;, &lt;code&gt;rg&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, and &lt;code&gt;find&lt;/code&gt;, or call &lt;code&gt;rtk read&lt;/code&gt;, &lt;code&gt;rtk grep&lt;/code&gt;, and &lt;code&gt;rtk find&lt;/code&gt; directly.&lt;/p&gt;
&lt;p&gt;That point matters. RTK is not a globally transparent compressor for all agent I/O. It is closer to a proxy at the shell-command layer.&lt;/p&gt;
&lt;p&gt;Windows users should also note that the README recommends placing &lt;code&gt;rtk.exe&lt;/code&gt; in PATH and running it from Command Prompt, PowerShell, or Windows Terminal instead of double-clicking it. It also says WSL is more natural if you want the full hook experience.&lt;/p&gt;
&lt;h2 id=&#34;who-should-use-it&#34;&gt;Who Should Use It
&lt;/h2&gt;&lt;p&gt;RTK is useful for three groups:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Heavy AI coding users&lt;/strong&gt;: people who ask agents to run many &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;rg&lt;/code&gt;, test, and build commands every day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Large-repository users&lt;/strong&gt;: teams whose command output often reaches hundreds of lines and drowns the agent in irrelevant context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People who care about token cost and context windows&lt;/strong&gt;: users who want the model to focus on failures, changes, and key files.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If your project is small, or if your agent mostly reads files through IDE-native tools, RTK may feel less impactful. It shines when command-line output is both long and frequent.&lt;/p&gt;
&lt;h2 id=&#34;my-take&#34;&gt;My Take
&lt;/h2&gt;&lt;p&gt;RTK points in a practical direction. Many AI coding workflows focus on stronger models, larger context windows, and longer tasks, but there is still a plain development problem: agents often read far more than they need.&lt;/p&gt;
&lt;p&gt;Compressing command output before handing it to the model can reduce token usage and lower the chance that noise steers the model in the wrong direction.&lt;/p&gt;
&lt;p&gt;It is not a magic switch, though. To use RTK well, the agent workflow needs to lean on shell commands, and you need to confirm that the hook actually works in your current tool. For Codex, Claude Code, Gemini CLI, Cursor, and Windsurf, RTK is a useful context throttle to test: it does not change the development commands themselves, but it gives the agent cleaner results to read.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Reading the Official Codex Article: How to Get the Most Out of Codex</title>
        <link>https://knightli.com/en/2026/05/27/getting-the-most-out-of-codex/</link>
        <pubDate>Wed, 27 May 2026 08:21:18 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/27/getting-the-most-out-of-codex/</guid>
        <description>&lt;p&gt;Most developers start using Codex with code tasks: reading a repository, editing a diff, running tests, and opening a pull request.&lt;/p&gt;
&lt;p&gt;That is still Codex&amp;rsquo;s core use case. But a lot of work on a computer is already surrounded by code and tools: running shell commands, browsing web pages, calling APIs, exporting documents, responding to messages, and triggering automation. As these capabilities gradually connect to Codex, it becomes less a narrow coding assistant and more a system that helps you complete work on a computer.&lt;/p&gt;
&lt;p&gt;The Codex app makes this shift more concrete. A thread can preserve context, call tools, display artifacts, and keep moving across multiple rounds of prompts instead of restarting every conversation from scratch.&lt;/p&gt;
&lt;p&gt;To use Codex more fully, the key is combining these capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Durable threads for preserving long-term context&lt;/li&gt;
&lt;li&gt;Voice input, steering, and queuing, so the user still controls the process&lt;/li&gt;
&lt;li&gt;browser, computer use, MCP servers, and connectors, so Codex can move beyond the repository&lt;/li&gt;
&lt;li&gt;thread automations and Goals, so tasks can keep progressing after the user leaves&lt;/li&gt;
&lt;li&gt;The sidebar for reviewing code, documents, slides, web pages, and other artifacts&lt;/li&gt;
&lt;li&gt;Shared memory, which writes important context outside the thread&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;durable-threads&#34;&gt;Durable threads
&lt;/h2&gt;&lt;p&gt;Durable threads are long-running threads that can preserve work context across multiple sessions.&lt;/p&gt;
&lt;p&gt;Pinned threads are a very practical entry point. They are a good place for workflows you return to repeatedly, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Chief of Staff thread&lt;/li&gt;
&lt;li&gt;A release thread&lt;/li&gt;
&lt;li&gt;A document review thread&lt;/li&gt;
&lt;li&gt;An external monitoring thread&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not temporary chats, but persistent workspaces. Codex can return to the same thread later and reuse prior decisions, preferences, and background information, avoiding the need to rebuild context from zero every time.&lt;/p&gt;
&lt;p&gt;Keyboard shortcuts also make this smoother. &lt;code&gt;Command-1&lt;/code&gt; through &lt;code&gt;Command-9&lt;/code&gt; can jump directly to saved threads.&lt;/p&gt;
&lt;h2 id=&#34;voice-input&#34;&gt;Voice input
&lt;/h2&gt;&lt;p&gt;The value of voice input is that it captures ideas before they have been organized into formal text.&lt;/p&gt;
&lt;p&gt;Codex has built-in voice input. It is especially useful for fuzzy starting points that feel natural to say but awkward to type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;我记得 Slack 里好像有个叫 Ben 的人提过这个。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;具体细节我不记得了。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;帮我去找一下。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For an agent that can search, organize context, and report back, this is often enough to get started.&lt;/p&gt;
&lt;p&gt;Voice is also useful for two- or three-minute thought dumps. Meeting transcripts, dictated planning notes, and unorganized raw records are often more useful than a one-sentence summary, because they preserve uncertainty, emphasis, and unfinished lines of thought.&lt;/p&gt;
&lt;h2 id=&#34;steering-and-queuing&#34;&gt;Steering and queuing
&lt;/h2&gt;&lt;p&gt;Voice becomes more useful when combined with explicit control.&lt;/p&gt;
&lt;p&gt;Steering means inserting a new direction while a Codex task is running, so it can change course before the current step finishes.&lt;/p&gt;
&lt;p&gt;For example, while reviewing a web page, the user can annotate in the sidebar and interrupt the current task at the same time:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;这里再小一点。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;这两个元素之间的间距不对。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;这句文案写错了。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Queuing is different. It does not interrupt the current task; it places the next piece of work in the queue:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;这项工作完成后，把预览链接发给 Slack 里的 reviewer。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Steering changes what Codex is doing right now. Queuing changes what it should do next. Both keep the user close to the work as the task unfolds.&lt;/p&gt;
&lt;h2 id=&#34;tools-and-reachable-scope&#34;&gt;Tools and reachable scope
&lt;/h2&gt;&lt;p&gt;Once threads have continuity, the next question is: what can they operate?&lt;/p&gt;
&lt;p&gt;Codex can expand outward layer by layer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$browser&lt;/code&gt;: good for web page inspection, annotation, and review in the sidebar&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@chrome&lt;/code&gt;: good for browser workflows that depend on the user&amp;rsquo;s Chrome login state&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@computer&lt;/code&gt;: good for tasks that can only be completed through a desktop GUI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MCP servers and connectors extend the same idea into more workflows. Slack, Gmail, and Calendar matter because many tasks do not first appear as code. They appear as messages, emails, and calendar problems.&lt;/p&gt;
&lt;p&gt;Skills are good for solidifying repeated work. Once a process has proven useful, it can be packaged as a skill so Codex does not need to relearn the same steps next time.&lt;/p&gt;
&lt;h2 id=&#34;continue-working-from-anywhere&#34;&gt;Continue working from anywhere
&lt;/h2&gt;&lt;p&gt;The Codex mobile app changes how long the user has to stay in front of a computer.&lt;/p&gt;
&lt;p&gt;A task can start on a Mac because the files, permissions, and local environment are there. Later, the user can leave the desktop and continue confirming, adding details, or changing direction from a phone.&lt;/p&gt;
&lt;p&gt;This is valuable in many small scenarios: while Codex runs a long task, the user can leave their desk; if it needs confirmation, they can respond while away; if the direction is wrong, they can redirect it in time. What truly stays in place is the local environment, not the user.&lt;/p&gt;
&lt;h2 id=&#34;automation&#34;&gt;Automation
&lt;/h2&gt;&lt;p&gt;Automations can run Codex work on a schedule.&lt;/p&gt;
&lt;p&gt;If a recurring task should restart from a specific workspace, such as a daily report or routine repository check, scheduled automation is a good fit. If the schedule should return to an existing conversation and reuse its context, thread automation is better.&lt;/p&gt;
&lt;p&gt;Thread automations are more like heartbeat wake-ups: they return to the same Codex thread on a fixed rhythm.&lt;/p&gt;
&lt;p&gt;Pinned threads require the user to come back actively, while thread automation can check every few minutes or every few hours, keep running until a condition is satisfied, and adjust its rhythm over time.&lt;/p&gt;
&lt;p&gt;For example, a Chief of Staff thread could run every 30 minutes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;每 30 分钟检查 Slack 和 Gmail，找出需要我注意但还没有回复的消息。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;帮我判断哪些最重要。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;如果有人问我问题，尽可能深入研究答案，并替我起草回复，但不要发送。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When the user returns, the most time-consuming context gathering is often already done. The actual decision about whether to send still belongs to a human.&lt;/p&gt;
&lt;p&gt;Thread automations are also useful for feedback loops. They can periodically check pull request comments, Google Docs comments, or Slack replies, continuing adjacent work while the user is away.&lt;/p&gt;
&lt;p&gt;For example, in an animation workflow, a reviewer sends video feedback in Slack, and a thread automation checks the thread on a schedule. If there is a new comment, it re-renders the version and replies to the reviewer in the same Slack thread. If an integration cannot complete the final upload, desktop automation can still fill in the last step through the GUI.&lt;/p&gt;
&lt;p&gt;This loop may cross Slack, the codebase, and desktop applications, but to the user it still stays inside one workflow.&lt;/p&gt;
&lt;h2 id=&#34;goals&#34;&gt;Goals
&lt;/h2&gt;&lt;p&gt;Goals are best suited to tasks that have a clear endpoint and can be pushed forward continuously by an agent.&lt;/p&gt;
&lt;p&gt;A weaker goal might be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;实现这个 Markdown 文件里的计划。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;A stronger goal has measurable completion criteria.&lt;/p&gt;
&lt;p&gt;For example, when migrating an internal tool from Python to Rust, you can first create the new directory and then define the target clearly: the new implementation is only complete once the unit tests pass.&lt;/p&gt;
&lt;p&gt;A Goal is essentially continuous execution plus a verifier. The user needs to define the outcome, the stopping condition, and the signals that indicate whether Codex is getting closer to the goal.&lt;/p&gt;
&lt;p&gt;Common verifiers include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test suites&lt;/li&gt;
&lt;li&gt;benchmark&lt;/li&gt;
&lt;li&gt;bug reproduction&lt;/li&gt;
&lt;li&gt;validation matrix&lt;/li&gt;
&lt;li&gt;End-to-end workflows that must keep passing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A task can be ambitious, but without verification criteria, it is more like a wish than a goal.&lt;/p&gt;
&lt;h2 id=&#34;sidebar&#34;&gt;Sidebar
&lt;/h2&gt;&lt;p&gt;The sidebar places work artifacts next to the conversation that generated them. The user does not need to export files, switch context, and then describe the problem afterward. The artifact might be code, but it could also be a deck, PDF, web page, spreadsheet, or another artifact generated during the work.&lt;/p&gt;
&lt;p&gt;It is especially useful for four types of work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inspecting an artifact&lt;/li&gt;
&lt;li&gt;Annotating places that need changes&lt;/li&gt;
&lt;li&gt;Operating a web interface&lt;/li&gt;
&lt;li&gt;Reviewing changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Markdown, spreadsheets, data tables, documents, and slides can all be viewed directly in the sidebar. The user can inspect, annotate, and revise them without turning the process into another handoff.&lt;/p&gt;
&lt;p&gt;If it is a deck or PDF, it can stay beside the thread that produced it and accept review and fixes at any time.&lt;/p&gt;
&lt;p&gt;The browser is a similar work surface. Codex can open a rendered page, inspect it, respond to user annotations on the page, and continue fixing the same object. A web page is both the output and the control surface.&lt;/p&gt;
&lt;p&gt;These surfaces are especially good fits for the sidebar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lightweight static artifacts such as &lt;code&gt;index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Storybook&lt;/li&gt;
&lt;li&gt;Remotion Studio&lt;/li&gt;
&lt;li&gt;Browser slides&lt;/li&gt;
&lt;li&gt;Data analysis applications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A standalone &lt;code&gt;index.html&lt;/code&gt; file can become a long-lived interactive artifact without necessarily requiring a server. Thread automations can also refresh static artifacts on a schedule, so the user sees new results when they return.&lt;/p&gt;
&lt;h2 id=&#34;shared-memory&#34;&gt;Shared memory
&lt;/h2&gt;&lt;p&gt;Long threads are useful, but important context should not exist only in the conversation history.&lt;/p&gt;
&lt;p&gt;Shared memory means storing durable context outside the thread, so future work can continue from an explicit, reviewable place.&lt;/p&gt;
&lt;p&gt;One stable practice is to anchor durable threads in an Obsidian vault. In practice, this can be very simple: a set of ordinary files that are easy to inspect, edit, move, and preserve long term. Teams can put it in cloud storage, Git, Dropbox, Google Drive, or another sync layer.&lt;/p&gt;
&lt;p&gt;A vault might look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vault/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── TODO.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── people/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── projects/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── agent/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── notes/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;A top-level &lt;code&gt;AGENTS.md&lt;/code&gt; can explain how Codex should maintain this workspace: what information should be written down, where it should go, and when not to create noise.&lt;/p&gt;
&lt;p&gt;A practical &lt;code&gt;AGENTS.md&lt;/code&gt; might look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Treat ~/vault as durable work memory.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Prefer canonical notes over note sprawl.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Route TODOs, people, projects, daily summaries, and scratch notes explicitly.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Preserve decisions, blockers, owners, dates, and useful links.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; If nothing meaningful changed, do not churn the vault.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Do not copy a particular vault structure blindly. What matters more is teaching the agent where long-term context should live, which information is worth preserving, and when it should avoid repeatedly changing files.&lt;/p&gt;
&lt;p&gt;The repository stores code. The vault stores rolling context: relevant people, what happened, where things are blocked, who owns what, what comes next, and the details that would otherwise disappear between conversations if they were not written down.&lt;/p&gt;
&lt;p&gt;Codex also has first-party memory capabilities, configurable in &lt;code&gt;Settings &amp;gt; Personalization &amp;gt; Memories&lt;/code&gt;. They are good for recording preferences, repeated workflows, and common pain points, but they work better as a supplement to explicit written context than as a replacement. Chronicle is moving in the same direction as well: helping Codex build memory from recent screen context.&lt;/p&gt;
&lt;h2 id=&#34;expanding-outward-from-code&#34;&gt;Expanding outward from code
&lt;/h2&gt;&lt;p&gt;Codex still starts with code. But more of the work around code can now be reached by the same system: MCP servers, browser interfaces, desktop control, thread automations, and reviewable artifacts.&lt;/p&gt;
&lt;p&gt;This changes how Codex is controlled. Steering interrupts work in progress. Queuing schedules the next step. Thread automations keep a thread active after the user leaves. Goals add clear endpoints and verification signals to long-running tasks.&lt;/p&gt;
&lt;p&gt;When these capabilities connect, Codex can move a workflow from instruction to execution and then onward to artifact review. Even after a task has left the code repository, it can still be completed inside the same system.&lt;/p&gt;
&lt;p&gt;Original link: &lt;a class=&#34;link&#34; href=&#34;https://x.com/jxnlco/status/2057153744630890620&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Getting the most out of Codex&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How to Fix Codex Goal Failed to Set Goal</title>
        <link>https://knightli.com/en/2026/05/27/codex-goal-failed-to-set-goal-config-toml/</link>
        <pubDate>Wed, 27 May 2026 08:17:57 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/27/codex-goal-failed-to-set-goal-config-toml/</guid>
        <description>&lt;p&gt;Some users have recently reported that Codex Goal immediately shows &lt;code&gt;Failed to set goal&lt;/code&gt; or a goal-setting failure when they try to use it. This error does not appear to depend on prompt length, and it can happen in both the Codex app and the VS Code extension.&lt;/p&gt;
&lt;p&gt;Based on the feedback in the discussion, this issue looks more like an abnormal local feature flag or configuration state than a mistake in the goal content itself.&lt;/p&gt;
&lt;h2 id=&#34;first-check-the-goals-feature-switch&#34;&gt;First check the goals feature switch
&lt;/h2&gt;&lt;p&gt;The most direct fix is to check the Codex configuration file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;~/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;codex&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Confirm that it has a &lt;code&gt;[features]&lt;/code&gt; section and that &lt;code&gt;goals&lt;/code&gt; is enabled:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;features&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;goals&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If &lt;code&gt;[features]&lt;/code&gt; already exists, just add &lt;code&gt;goals = true&lt;/code&gt; under that section. If the section does not exist, create it.&lt;/p&gt;
&lt;p&gt;After making the change, restart the Codex app or the VS Code extension, then try setting the Goal again.&lt;/p&gt;
&lt;h2 id=&#34;if-the-issue-continues-check-the-configuration-directory&#34;&gt;If the issue continues, check the configuration directory
&lt;/h2&gt;&lt;p&gt;Some feedback also mentioned that abnormal cache or temporary files inside the &lt;code&gt;.codex&lt;/code&gt; directory can trigger similar issues.&lt;/p&gt;
&lt;p&gt;A safer handling sequence is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Back up &lt;code&gt;~/.codex/config.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Close Codex-related applications.&lt;/li&gt;
&lt;li&gt;Temporarily move or rename the &lt;code&gt;~/.codex&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Open Codex again and let it recreate the configuration directory.&lt;/li&gt;
&lt;li&gt;Merge the settings you still need from the original &lt;code&gt;config.toml&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do not delete the configuration directory directly, especially because it may contain configuration, skills, sessions, or other local state that you maintain manually.&lt;/p&gt;
&lt;h2 id=&#34;also-check-security-software-on-windows&#34;&gt;Also check security software on Windows
&lt;/h2&gt;&lt;p&gt;There has also been feedback that Windows Defender may treat &lt;code&gt;config.toml&lt;/code&gt; as a suspicious file. This is not necessarily the cause for everyone, but if you run into the same issue on Windows, it is worth quickly checking your security software&amp;rsquo;s quarantine history.&lt;/p&gt;
&lt;p&gt;If the configuration file has been quarantined, renamed, or blocked from access, Codex may not be able to read the feature switch, which can also make Goal fail to enable.&lt;/p&gt;
&lt;h2 id=&#34;how-to-tell-whether-the-prompt-is-the-problem&#34;&gt;How to tell whether the prompt is the problem
&lt;/h2&gt;&lt;p&gt;A simple way to check is to test with a very short goal.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Fix a failing test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If even a very short goal immediately reports &lt;code&gt;Failed to set goal&lt;/code&gt;, it is probably not a prompt-writing issue. It is more likely a problem with local configuration, the feature switch, extension state, or the cache directory.&lt;/p&gt;
&lt;p&gt;If only very long and complex goals fail, then consider whether the goal content is too complex, contains special links, or uses a field format the UI does not accept.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;You can troubleshoot Codex Goal&amp;rsquo;s &lt;code&gt;Failed to set goal&lt;/code&gt; in this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Check &lt;code&gt;~/.codex/config.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;goals = true&lt;/code&gt; under &lt;code&gt;[features]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Restart the Codex app or the VS Code extension.&lt;/li&gt;
&lt;li&gt;If it still fails, back up the configuration and rebuild &lt;code&gt;~/.codex&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On Windows, also check whether Defender or other security software has mistakenly blocked the configuration file.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The key point is not &amp;ldquo;how should I write the goal&amp;rdquo;, but first confirming that the Goal feature itself is properly enabled in the local configuration.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>oh-my-codex: Adding Workflows, Skills, and Runtime Guardrails to Codex CLI</title>
        <link>https://knightli.com/en/2026/05/25/oh-my-codex-codex-cli-workflow-layer/</link>
        <pubDate>Mon, 25 May 2026 07:41:45 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/25/oh-my-codex-codex-cli-workflow-layer/</guid>
        <description>&lt;p&gt;&lt;code&gt;Yeachan-Heo/oh-my-codex&lt;/code&gt;, or OMX, is a workflow layer around OpenAI Codex CLI.&lt;/p&gt;
&lt;p&gt;Project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yeachan-Heo/oh-my-codex&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Yeachan-Heo/oh-my-codex&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It is not trying to build yet another coding agent. Its goal is to give people who already use Codex CLI a steadier daily workflow: start sessions with project guidance, clarify before planning when tasks get complex, keep durable goals and state during execution, and use review plus QA to hold the result together at the end.&lt;/p&gt;
&lt;p&gt;At the time of writing, the GitHub page shows about 29.4k stars, and the latest release is &lt;code&gt;v0.18.1&lt;/code&gt;, published on May 21, 2026. The README also makes it clear that the official project is &lt;code&gt;Yeachan-Heo/oh-my-codex&lt;/code&gt;, and the official npm package is &lt;code&gt;oh-my-codex&lt;/code&gt;. Third-party projects using names such as “OMX v2” should not be treated as official continuations unless this repository says so.&lt;/p&gt;
&lt;h2 id=&#34;what-it-is&#34;&gt;What it is
&lt;/h2&gt;&lt;p&gt;OMX does not replace Codex.&lt;/p&gt;
&lt;p&gt;It keeps Codex CLI as the actual execution engine and mainly adds three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A more consistent task workflow.&lt;/li&gt;
&lt;li&gt;Reusable prompts, skills, and specialist agents.&lt;/li&gt;
&lt;li&gt;Plans, logs, state, and runtime records under &lt;code&gt;.omx/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In other words, Codex does the work, while OMX makes that work look more like an engineering process. That is also the main difference between OMX and a normal prompt pack: it is not just a pile of rules inside a system prompt. It breaks clarification, planning, execution, checking, team coordination, and runtime diagnostics into callable surfaces.&lt;/p&gt;
&lt;h2 id=&#34;recommended-installation&#34;&gt;Recommended installation
&lt;/h2&gt;&lt;p&gt;The README and Getting Started docs both emphasize that the recommended default path is macOS or Linux with Codex CLI. Native Windows and Codex App are not the primary experience today and may behave inconsistently or receive less complete support.&lt;/p&gt;
&lt;p&gt;If Codex CLI is already installed, start with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codex --version
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g oh-my-codex
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;omx setup
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;omx doctor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you do not have Codex CLI yet and want npm to manage it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g @openai/codex
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g oh-my-codex
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;omx setup
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;omx doctor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;One detail matters: do not combine &lt;code&gt;@openai/codex&lt;/code&gt; and &lt;code&gt;oh-my-codex&lt;/code&gt; into one global install command on a machine where Homebrew already owns the &lt;code&gt;codex&lt;/code&gt; binary. The README notes that npm may hit an &lt;code&gt;EEXIST&lt;/code&gt; conflict with a Homebrew-owned binary. OMX only needs a working, authenticated &lt;code&gt;codex&lt;/code&gt; command on &lt;code&gt;PATH&lt;/code&gt;; Codex does not have to be installed through npm.&lt;/p&gt;
&lt;p&gt;After installation, run a real execution smoke test:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codex login status
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;omx &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; --skip-git-repo-check -C . &lt;span class=&#34;s2&#34;&gt;&amp;#34;Reply with exactly OMX-EXEC-OK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;omx doctor&lt;/code&gt; can show that the local install shape looks sane, but it cannot prove that the Codex account, proxy, base URL, and authentication path in the current shell/profile can actually make a model call. This distinction matters when you switch between different HOME directories, containers, remote environments, or local OpenAI-compatible proxies.&lt;/p&gt;
&lt;h2 id=&#34;default-workflow&#34;&gt;Default workflow
&lt;/h2&gt;&lt;p&gt;The main OMX workflow is roughly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$deep-interview &amp;#34;clarify the authentication change&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ralplan &amp;#34;approve the auth plan and review tradeoffs&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$prometheus-strict &amp;#34;stress-test the plan before durable execution&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ultragoal &amp;#34;turn the approved plan into durable Codex goals&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The most common path is three steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$deep-interview&lt;/code&gt;: ask for boundaries, goals, and non-goals when the request is still unclear.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ralplan&lt;/code&gt;: turn the request into a plan, then confirm it through architectural and critical review.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ultragoal&lt;/code&gt;: turn the approved plan into more durable goals and checkpoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a task needs parallel coordination, use &lt;code&gt;$team&lt;/code&gt; inside an Ultragoal story. If it only needs one persistent owner, use &lt;code&gt;$ralph&lt;/code&gt;. The naming can feel heavy at first, but the idea is simple: do not let an agent start changing files as soon as it hears a request. First write down what to do, how to do it, how to verify it, and when to stop.&lt;/p&gt;
&lt;h2 id=&#34;what-skills-and-agents-provide&#34;&gt;What skills and agents provide
&lt;/h2&gt;&lt;p&gt;OMX groups skills into several families.&lt;/p&gt;
&lt;p&gt;Canonical Workflow includes &lt;code&gt;$deep-interview&lt;/code&gt;, &lt;code&gt;$ralplan&lt;/code&gt;, &lt;code&gt;$prometheus-strict&lt;/code&gt;, &lt;code&gt;$ultragoal&lt;/code&gt;, &lt;code&gt;$code-review&lt;/code&gt;, and &lt;code&gt;$ultraqa&lt;/code&gt;. These are aimed at complete engineering tasks: clarify, plan, execute, review, and QA.&lt;/p&gt;
&lt;p&gt;Execution Modes include &lt;code&gt;$team&lt;/code&gt;, &lt;code&gt;$ralph&lt;/code&gt;, &lt;code&gt;$autopilot&lt;/code&gt;, &lt;code&gt;$ultrawork&lt;/code&gt;, and others. They decide whether a task moves through a single line, a team runtime, or a stronger autonomous loop.&lt;/p&gt;
&lt;p&gt;The Agent Catalog is more like a role library. It includes &lt;code&gt;analyst&lt;/code&gt;, &lt;code&gt;planner&lt;/code&gt;, &lt;code&gt;architect&lt;/code&gt;, &lt;code&gt;debugger&lt;/code&gt;, &lt;code&gt;executor&lt;/code&gt;, &lt;code&gt;verifier&lt;/code&gt;, &lt;code&gt;security-reviewer&lt;/code&gt;, &lt;code&gt;performance-reviewer&lt;/code&gt;, &lt;code&gt;code-reviewer&lt;/code&gt;, &lt;code&gt;test-engineer&lt;/code&gt;, &lt;code&gt;designer&lt;/code&gt;, &lt;code&gt;researcher&lt;/code&gt;, and more. You do not need to invoke these roles manually every day, but they show that OMX is not a “one big prompt” system. It decomposes engineering work into reusable roles and phases.&lt;/p&gt;
&lt;p&gt;That matters for long-running projects. Many AI coding failures do not happen because the model cannot write code at all. They happen because it moves into execution too quickly and skips requirement confirmation, architecture boundaries, test baselines, and final review. OMX tries to make those steps harder to skip.&lt;/p&gt;
&lt;h2 id=&#34;plugin-shape-and-runtime-state&#34;&gt;Plugin shape and runtime state
&lt;/h2&gt;&lt;p&gt;The README says the repository also includes an official Codex plugin layout at &lt;code&gt;plugins/oh-my-codex&lt;/code&gt;, with marketplace metadata.&lt;/p&gt;
&lt;p&gt;The docs are also clear that this plugin shape is not a replacement for &lt;code&gt;npm install -g oh-my-codex&lt;/code&gt; plus &lt;code&gt;omx setup&lt;/code&gt;. The plugin mainly packages hooks, the skill surface, and Codex lifecycle integration. At runtime, it still depends on the installed &lt;code&gt;omx&lt;/code&gt; CLI.&lt;/p&gt;
&lt;p&gt;The latest &lt;code&gt;v0.18.1&lt;/code&gt; release also focuses on this area: plugin installs now use a pinned OMX launcher, hook failures are safer, Ultragoal state mutations are serialized, release packaging excludes crate-local &lt;code&gt;.omx&lt;/code&gt; runtime caches, and npm, Cargo workspace, lockfiles, and the plugin manifest all share the same version.&lt;/p&gt;
&lt;p&gt;These changes show that OMX is no longer just a prompt repository. It is also dealing seriously with install shape, hook safety, state writes, release package contents, and runtime consistency. For developer tooling, these are not flashy details, but they matter a lot.&lt;/p&gt;
&lt;h2 id=&#34;who-it-fits&#34;&gt;Who it fits
&lt;/h2&gt;&lt;p&gt;OMX is best for developers who already use Codex CLI seriously, especially in situations like these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You often ask Codex to handle multi-file, multi-step tasks.&lt;/li&gt;
&lt;li&gt;You want the agent to clarify requirements before editing code.&lt;/li&gt;
&lt;li&gt;You want planning, execution, checking, review, and QA to be separate stages.&lt;/li&gt;
&lt;li&gt;You want &lt;code&gt;.omx/&lt;/code&gt; state, plans, and logs in the project.&lt;/li&gt;
&lt;li&gt;You want to try tmux/team runtime or stronger long-task execution.&lt;/li&gt;
&lt;li&gt;Your team wants to turn its engineering habits into reusable skills and prompts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you only ask Codex to change one line of config, generate a small script, or explain a code snippet, OMX may feel heavy. It is more like a tool belt for frequent AI coding users than a required first layer for beginners.&lt;/p&gt;
&lt;h2 id=&#34;things-to-watch&#34;&gt;Things to watch
&lt;/h2&gt;&lt;p&gt;First, do not treat OMX as a guarantee of unattended completion. It can strengthen the workflow, but it cannot decide for you whether a requirement is reasonable, whether an architecture should change, or whether a risk is acceptable.&lt;/p&gt;
&lt;p&gt;Second, pay attention to platform boundaries. The README currently recommends macOS/Linux plus Codex CLI. Native Windows exists, but it is not the default best experience. If you use Windows, WSL2 is usually the steadier path.&lt;/p&gt;
&lt;p&gt;Third, &lt;code&gt;omx doctor&lt;/code&gt; is not final validation. The stronger proof is a real model call such as &lt;code&gt;codex login status&lt;/code&gt; plus &lt;code&gt;omx exec&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Fourth, stronger workflow requires clearer task boundaries. &lt;code&gt;$ultragoal&lt;/code&gt;, &lt;code&gt;$team&lt;/code&gt;, and &lt;code&gt;$autopilot&lt;/code&gt; are best for tasks with concrete acceptance criteria. If the request is still vague, use &lt;code&gt;$deep-interview&lt;/code&gt; or a normal conversation first.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;The value of oh-my-codex is not that it turns Codex into a different tool. It adds a more engineering-oriented working layer to Codex CLI.&lt;/p&gt;
&lt;p&gt;It moves AI coding from “I say one thing, you make one pass” toward “clarify, plan, execute, check, and record state.” For lightweight tasks this may be too much. For people who use Codex on real projects often, stable workflows, reusable skills, runtime diagnostics, and durable goals can be exactly what saves effort.&lt;/p&gt;
&lt;p&gt;If Codex CLI is already part of your daily development setup, OMX is worth trying. Even if you do not install it directly, its breakdown of skills, agents, planning, and acceptance flow is useful material for improving your own AI coding workflow.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Yeachan-Heo/oh-my-codex: &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yeachan-Heo/oh-my-codex&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Yeachan-Heo/oh-my-codex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Getting Started: &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yeachan-Heo/oh-my-codex/blob/main/docs/getting-started.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Yeachan-Heo/oh-my-codex/blob/main/docs/getting-started.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Agent Catalog: &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yeachan-Heo/oh-my-codex/blob/main/docs/agents.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Yeachan-Heo/oh-my-codex/blob/main/docs/agents.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Skills Reference: &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yeachan-Heo/oh-my-codex/blob/main/docs/skills.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Yeachan-Heo/oh-my-codex/blob/main/docs/skills.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;v0.18.1 release: &lt;a class=&#34;link&#34; href=&#34;https://github.com/Yeachan-Heo/oh-my-codex/releases/tag/v0.18.1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Yeachan-Heo/oh-my-codex/releases/tag/v0.18.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>CLI-Anything: Turning Software into an Agent-Usable Command Line</title>
        <link>https://knightli.com/en/2026/05/25/cli-anything-agent-native-cli/</link>
        <pubDate>Mon, 25 May 2026 00:24:36 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/25/cli-anything-agent-native-cli/</guid>
        <description>&lt;p&gt;CLI-Anything is an open-source Agent tooling project from HKUDS. Its goal is to turn software that was originally designed for human GUI operation into command-line interfaces that AI Agents can call more easily. It does not reimplement a simplified version of the software. Instead, it builds a CLI harness around the existing codebase and real backend, allowing Agents to complete tasks through stable commands, stateful sessions, and structured output.&lt;/p&gt;
&lt;p&gt;This direction addresses one of the most common gaps when Agents use software: GUI automation depends on screenshots, clicks, and coordinates, so it is easily affected by interface changes; a single API is also often incomplete, forcing the Agent to stitch together a large amount of context on its own. CLI-Anything chooses to condense software capabilities into a command line because commands are naturally easier for models to read, combine, and verify, while also fitting neatly into scripts and automation workflows.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works
&lt;/h2&gt;&lt;p&gt;The official repository describes CLI-Anything as a pipeline for automatically generating CLIs. After receiving a local software source path or a GitHub repository URL, the process analyzes the code structure, identifies the backend and data models, designs command groups, and then implements the CLI, tests, and documentation.&lt;/p&gt;
&lt;p&gt;The generated CLI usually supports two usage modes. One is a REPL for continuous work, which preserves project state. The other is a subcommand mode, which is better suited to scripts and pipelines. Commands also provide JSON output so Agents can parse results directly, while still keeping a human-readable format for debugging.&lt;/p&gt;
&lt;p&gt;In the official example, the Claude Code plugin can be used like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/plugin marketplace add HKUDS/CLI-Anything
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/plugin install cli-anything
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/cli-anything &amp;lt;software-path-or-repo&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If a harness has already been generated for a piece of software, later usage is closer to a normal Python CLI:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cd &amp;lt;software&amp;gt;/agent-harness
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cli-anything-&amp;lt;software&amp;gt; --help
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cli-anything-&amp;lt;software&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cli-anything-&amp;lt;software&amp;gt; --json &amp;lt;command&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;where-it-fits&#34;&gt;Where it fits
&lt;/h2&gt;&lt;p&gt;CLI-Anything is especially suitable for scenarios where &amp;ldquo;the capability exists in real software, but the Agent cannot operate it reliably.&amp;rdquo; Examples include image, video, audio, office documents, 3D modeling, data analysis, or AI/ML toolchains. As long as the project has an analyzable codebase, a callable backend, or a clear data model, it has a chance to be wrapped as a command set that Agents can use.&lt;/p&gt;
&lt;p&gt;Its value is not merely adding another layer of wrapping in the command line. The real value is turning key software operations into discoverable, composable, and testable interfaces. An Agent can first understand capabilities through &lt;code&gt;--help&lt;/code&gt;, then receive results through JSON output, and connect multiple commands into a workflow. For tasks that require batch processing, automatic validation, and continuous iteration, this is more controllable than temporarily asking an Agent to click through an interface.&lt;/p&gt;
&lt;h2 id=&#34;boundaries-to-keep-in-mind&#34;&gt;Boundaries to keep in mind
&lt;/h2&gt;&lt;p&gt;CLI-Anything does not mean that any software can be integrated instantly at no cost. It depends on the target software&amp;rsquo;s source code, backend capabilities, file formats, and testability. If a piece of software is highly closed and its key logic exists only in the GUI layer, the difficulty of generating a high-quality CLI rises significantly.&lt;/p&gt;
&lt;p&gt;The official methodology also emphasizes real backends and test validation. This means generating a harness is not finished after writing a few command wrapper scripts. To use it for serious work, you still need to confirm command coverage, output format, dependency installation, real software invocation, and end-to-end test reliability. A more realistic approach is to first generate a CLI for a clearly defined workflow, then gradually fill in capabilities through commands such as refine, test, and validate.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;CLI-Anything&amp;rsquo;s idea is direct: instead of making Agents adapt to fragile human interfaces, add a stable, structured, and testable command-line entry point to existing software. It is suitable for people who want to bring professional software into Agent workflows, and also for developers studying the shape of &amp;ldquo;Agent-native software.&amp;rdquo; In real adoption, the key question is not how much code one command can generate, but whether the generated CLI can call real capabilities, preserve state, output structured results, and stand up to testing.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>What Is GitHub Spec Kit? Using Spec-Driven Development to Tame AI Coding</title>
        <link>https://knightli.com/en/2026/05/25/github-spec-kit-spec-driven-development/</link>
        <pubDate>Mon, 25 May 2026 00:19:14 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/25/github-spec-kit-spec-driven-development/</guid>
        <description>&lt;p&gt;GitHub&amp;rsquo;s &lt;strong&gt;Spec Kit&lt;/strong&gt; is a new toolkit for AI coding. Its goal is to help developers practice &lt;strong&gt;Spec-Driven Development&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The problem it tackles is straightforward: many AI coding workflows today feel too much like &amp;ldquo;chat while coding.&amp;rdquo; A human gives a rough idea, and an Agent immediately starts changing code. It looks fast in the short term, but the requirement boundaries, acceptance criteria, technical trade-offs, and task breakdown often never settle into anything durable. Once a project becomes even slightly complex, it easily turns into one-off vibe coding.&lt;/p&gt;
&lt;p&gt;Spec Kit takes the opposite route: write the spec clearly first, then move into planning, tasks, and implementation. Code is no longer the first step. The spec is.&lt;/p&gt;
&lt;h2 id=&#34;what-is-spec-kit&#34;&gt;What Is Spec Kit?
&lt;/h2&gt;&lt;p&gt;Spec Kit is GitHub&amp;rsquo;s open-source toolkit for spec-driven development. It provides the &lt;code&gt;specify&lt;/code&gt; CLI, templates, scripts, and commands for AI coding agents, allowing teams to advance development around the same set of structured artifacts.&lt;/p&gt;
&lt;p&gt;Its emphasis is not &amp;ldquo;make AI ask fewer questions.&amp;rdquo; Instead, it asks AI to generate and refine these things before writing code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project principles: the team&amp;rsquo;s constraints around quality, testing, experience, performance, and similar concerns;&lt;/li&gt;
&lt;li&gt;Feature specs: what to build, why to build it, user stories, and functional requirements;&lt;/li&gt;
&lt;li&gt;Technical plans: which technology stack to use, how to implement it, and what architecture decisions are involved;&lt;/li&gt;
&lt;li&gt;Task lists: breaking the plan into executable steps;&lt;/li&gt;
&lt;li&gt;Implementation process: changing code step by step according to tasks, instead of making one chaotic batch of edits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This workflow makes AI coding feel more like engineering collaboration, rather than a one-time prompt performance.&lt;/p&gt;
&lt;h2 id=&#34;basic-usage-flow&#34;&gt;Basic Usage Flow
&lt;/h2&gt;&lt;p&gt;The official README describes a getting-started flow roughly like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;specify init my-project --integration copilot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; my-project
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After initialization, the project gets a &lt;code&gt;.specify&lt;/code&gt; directory, templates, scripts, and commands for Agent integration. You then use &lt;code&gt;/speckit.*&lt;/code&gt; commands inside a supported AI coding agent to move development forward.&lt;/p&gt;
&lt;p&gt;A typical sequence is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/speckit.constitution
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/speckit.specify
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/speckit.clarify
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/speckit.plan
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/speckit.tasks
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/speckit.implement
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here, &lt;code&gt;/speckit.constitution&lt;/code&gt; establishes project principles, &lt;code&gt;/speckit.specify&lt;/code&gt; describes product requirements, &lt;code&gt;/speckit.clarify&lt;/code&gt; fills in ambiguity, &lt;code&gt;/speckit.plan&lt;/code&gt; generates a technical plan, &lt;code&gt;/speckit.tasks&lt;/code&gt; breaks the work into tasks, and &lt;code&gt;/speckit.implement&lt;/code&gt; finally performs the implementation.&lt;/p&gt;
&lt;p&gt;This is very different from directly telling an Agent, &amp;ldquo;Help me build an app.&amp;rdquo; Spec Kit asks you to first make clear what to build and how it will be accepted, then let the Agent start working.&lt;/p&gt;
&lt;h2 id=&#34;it-changes-the-entry-point-of-ai-coding&#34;&gt;It Changes the Entry Point of AI Coding
&lt;/h2&gt;&lt;p&gt;Traditional AI coding often starts with code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;I want to build a task management app. Help me write it.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Spec Kit is closer to this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;First define the users, scenarios, feature boundaries, acceptance criteria, and non-goals for this task management app;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;then choose the technical approach based on those specs;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;then break it into tasks;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;finally implement it step by step.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This shift matters. AI is very good at executing from context, but if the context itself is loose, faster execution can also mean faster drift. Spec Kit turns context into files and templates, so requirements, plans, and tasks can all be reviewed, revised, and version-controlled.&lt;/p&gt;
&lt;p&gt;In other words, it is not making AI more &amp;ldquo;free.&amp;rdquo; It is giving AI clearer engineering rails on which to work freely.&lt;/p&gt;
&lt;h2 id=&#34;how-to-understand-the-core-commands&#34;&gt;How to Understand the Core Commands
&lt;/h2&gt;&lt;h3 id=&#34;speckitconstitution&#34;&gt;&lt;code&gt;/speckit.constitution&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This is the project&amp;rsquo;s &amp;ldquo;constitution.&amp;rdquo; It creates or updates &lt;code&gt;.specify/memory/constitution.md&lt;/code&gt;, which records long-term principles for the project, such as code quality, testing standards, user experience consistency, performance requirements, and rules for technical decisions.&lt;/p&gt;
&lt;p&gt;This step is best for writing down team consensus, not requirements for a single feature.&lt;/p&gt;
&lt;h3 id=&#34;speckitspecify&#34;&gt;&lt;code&gt;/speckit.specify&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This is the feature specification phase. You describe what you want to build, who the users are, what problem it solves, and what the core flows are.&lt;/p&gt;
&lt;p&gt;The official guidance specifically emphasizes that this phase should not focus too early on the technology stack. First make the what and why clear, then discuss the how.&lt;/p&gt;
&lt;h3 id=&#34;speckitclarify&#34;&gt;&lt;code&gt;/speckit.clarify&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This is the phase for filling gaps. Many requirements have holes the first time they are written: how should permissions work? What are the error states? Does the data need to be persisted? How should edge cases be accepted?&lt;/p&gt;
&lt;p&gt;The value of &lt;code&gt;/speckit.clarify&lt;/code&gt; is that it lets the Agent actively find uncertain points in the spec and write the answers back into the specification document, reducing rework later.&lt;/p&gt;
&lt;h3 id=&#34;speckitplan&#34;&gt;&lt;code&gt;/speckit.plan&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This is the technical planning phase. Only here do you start to define the framework, database, architecture, APIs, testing strategy, and constraints.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;/speckit.specify&lt;/code&gt; is product language, then &lt;code&gt;/speckit.plan&lt;/code&gt; is engineering language.&lt;/p&gt;
&lt;h3 id=&#34;speckittasks&#34;&gt;&lt;code&gt;/speckit.tasks&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This step breaks the plan into executable tasks. A good task list should let the Agent advance step by step, while still letting humans understand the purpose of each step.&lt;/p&gt;
&lt;h3 id=&#34;speckitimplement&#34;&gt;&lt;code&gt;/speckit.implement&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Only at the end do you enter implementation. The Agent modifies code according to the specs, plans, and tasks that have already been settled. At this point, it is no longer guessing requirements from a single large prompt; it is executing inside a set of structured documents.&lt;/p&gt;
&lt;h2 id=&#34;why-it-fits-ai-coding&#34;&gt;Why It Fits AI Coding
&lt;/h2&gt;&lt;p&gt;Spec Kit&amp;rsquo;s value is not in any single magic command. It is in restoring the things most easily lost in AI coding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requirements can be reviewed;&lt;/li&gt;
&lt;li&gt;Plans can be discussed;&lt;/li&gt;
&lt;li&gt;Tasks can be traced;&lt;/li&gt;
&lt;li&gt;Decisions have context;&lt;/li&gt;
&lt;li&gt;Artifacts can enter Git history;&lt;/li&gt;
&lt;li&gt;Teams can reuse templates and principles;&lt;/li&gt;
&lt;li&gt;The Agent&amp;rsquo;s implementation no longer depends only on a one-time chat record.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is especially useful for complex projects. The more a project involves multiple collaborators, long-term maintenance, or high quality requirements, the less it can rely only on temporary prompts to drive development.&lt;/p&gt;
&lt;h2 id=&#34;extensions-and-presets&#34;&gt;Extensions and Presets
&lt;/h2&gt;&lt;p&gt;Spec Kit also provides two kinds of customization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extensions&lt;/strong&gt;: add new commands, new templates, or integrations with external tools;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presets&lt;/strong&gt;: change the format and terminology of existing spec, plan, and task templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In simple terms, use an Extension when you want to add new capability; use a Preset when you want to reshape the workflow style.&lt;/p&gt;
&lt;p&gt;For example, a team can use a Preset to require security review, compliance traceability, domain terminology, or test-first rules. It can also use an Extension to add Jira integration, code review, project health checks, and other new phases.&lt;/p&gt;
&lt;p&gt;This means Spec Kit is not trying to lock every team into the same workflow. It provides an extensible skeleton for spec-driven development.&lt;/p&gt;
&lt;h2 id=&#34;who-is-it-for&#34;&gt;Who Is It For?
&lt;/h2&gt;&lt;p&gt;Spec Kit is suitable for scenarios like these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using an AI coding agent to prototype a new project;&lt;/li&gt;
&lt;li&gt;Turning vibe coding into a repeatable workflow;&lt;/li&gt;
&lt;li&gt;Standardizing the requirement and planning format before teams let AI generate code;&lt;/li&gt;
&lt;li&gt;Projects that need clear acceptance criteria and testing requirements;&lt;/li&gt;
&lt;li&gt;Bringing requirements, plans, tasks, and implementation history into version control;&lt;/li&gt;
&lt;li&gt;Teams exploring GitHub Copilot, Claude Code, Codex CLI, and similar tools in a team setting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is not necessarily a good fit for very small one-off scripts. For problems that can be solved in a few lines of code, the full spec workflow may feel heavy. But once a task involves multiple pages, multiple modules, state management, permissions, data models, or long-term maintenance, Spec Kit&amp;rsquo;s structure starts to pay off clearly.&lt;/p&gt;
&lt;h2 id=&#34;my-take&#34;&gt;My Take
&lt;/h2&gt;&lt;p&gt;Spec Kit represents an important turn in AI coding tools: from &amp;ldquo;make the Agent write code faster&amp;rdquo; toward &amp;ldquo;make the Agent participate in software engineering more reliably.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Earlier AI coding focused on prompts and model capability. Spec Kit focuses more on process, artifacts, and constraints. It reminds us that the faster AI writes code, the less we can afford to skip specs, plans, and acceptance criteria.&lt;/p&gt;
&lt;p&gt;If you are already used to letting AI implement features directly, you can try changing the starting move with Spec Kit:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;First let AI help you write the requirement as a spec, then let it write the code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That step may look slower, but in practice it reduces the later rework of &amp;ldquo;the code is done, but it is not what I wanted.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/github/spec-kit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;github/spec-kit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>What Is OpenAI Symphony? Codex Orchestration, Issue-Driven Development, and AI Agent Workflows</title>
        <link>https://knightli.com/en/2026/05/25/openai-codex-orchestration-symphony/</link>
        <pubDate>Mon, 25 May 2026 00:17:32 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/25/openai-codex-orchestration-symphony/</guid>
        <description>&lt;p&gt;OpenAI recently open-sourced an interesting Codex orchestration specification: &lt;strong&gt;Symphony&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It is not another chat-based coding assistant, nor is it a complete new IDE. More precisely, Symphony is a way to orchestrate work around Codex: it turns an issue tracker similar to Linear into the control plane for coding agents, so every open task can correspond to a continuously running Agent.&lt;/p&gt;
&lt;p&gt;One line from the official article captures its direction well: in the past, engineers had to monitor multiple Codex sessions at once, continually assigning work, reviewing output, correcting course, and restarting sessions. Symphony is designed to address exactly that context-switching bottleneck.&lt;/p&gt;
&lt;h2 id=&#34;symphony-is-not-solving-code-writing-but-agent-management&#34;&gt;Symphony is not solving code writing, but Agent management
&lt;/h2&gt;&lt;p&gt;A single Codex session works well for interactive development: you give it a task, it changes the code, you review it, and then you keep asking follow-up questions. But once a team starts using multiple Agents at the same time, the problem shifts from &amp;ldquo;can the code be written?&amp;rdquo; to &amp;ldquo;who is working on what, how far along is it, and who takes over after a failure?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;OpenAI&amp;rsquo;s approach is to move the center of gravity from &amp;ldquo;sessions&amp;rdquo; to &amp;ldquo;tasks&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the issue is the real unit of work;&lt;/li&gt;
&lt;li&gt;every open issue can map to an independent Agent workspace;&lt;/li&gt;
&lt;li&gt;Symphony continuously polls the task board and decides which tasks should be started, retried, stopped, or reclaimed;&lt;/li&gt;
&lt;li&gt;Codex performs implementation, testing, commits, PR creation, status updates, and related actions inside the workspace;&lt;/li&gt;
&lt;li&gt;humans no longer micromanage every session, but instead review results, adjust goals, and maintain boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The shift behind this is important: an Agent is no longer just a tool that humans temporarily summon, but a continuously running kind of executor inside the development workflow.&lt;/p&gt;
&lt;h2 id=&#34;why-an-issue-tracker&#34;&gt;Why an issue tracker?
&lt;/h2&gt;&lt;p&gt;Because teams already use issue trackers to manage real work.&lt;/p&gt;
&lt;p&gt;Requirements, bugs, refactors, migrations, research, priorities, blockers, owners, and milestones are already recorded in Linear, GitHub Issues, or similar systems. Symphony does not reinvent a large console. Instead, it treats these existing systems as the task entry point for Agents.&lt;/p&gt;
&lt;p&gt;This has several advantages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Work does not need to be copied from an issue into a chat window.&lt;/li&gt;
&lt;li&gt;Humans can keep creating, splitting, scheduling, and closing tasks in familiar ways.&lt;/li&gt;
&lt;li&gt;Agent state changes can be written back to the same work system, making async collaboration easier for the team.&lt;/li&gt;
&lt;li&gt;Task dependencies can naturally form a DAG, allowing unblocked tasks to move forward in parallel.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If traditional CI is &amp;ldquo;automation after a code commit,&amp;rdquo; Symphony is closer to &amp;ldquo;automation after an issue is created.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;its-core-workflow&#34;&gt;Its core workflow
&lt;/h2&gt;&lt;p&gt;A typical Symphony flow can be understood as:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;创建 issue
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Symphony 轮询到可执行任务
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 为该 issue 创建独立 workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 启动 Codex agent session
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Agent 阅读任务、修改代码、运行测试
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 创建或更新 PR
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 写回任务状态、评论、证据和交付物
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; 人类 review、合并或要求修改
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The official specification also emphasizes several engineering details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;each issue uses an independent workspace to reduce cross-contamination;&lt;/li&gt;
&lt;li&gt;the orchestrator maintains retry, concurrency, and recovery state;&lt;/li&gt;
&lt;li&gt;workflow policy lives in the repository&amp;rsquo;s &lt;code&gt;WORKFLOW.md&lt;/code&gt;, so teams can version the rules that describe how Agents should handle tasks;&lt;/li&gt;
&lt;li&gt;implementations need to preserve observability, with at least structured logs;&lt;/li&gt;
&lt;li&gt;a successful state does not have to be &lt;code&gt;Done&lt;/code&gt;; it can also be an intermediate state handed to humans for review.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This shows that Symphony is not simply about &amp;ldquo;letting AI write code automatically.&amp;rdquo; It defines a runnable, recoverable, and auditable Agent work system.&lt;/p&gt;
&lt;h2 id=&#34;goal-driven-not-a-rigid-state-machine&#34;&gt;Goal-driven, not a rigid state machine
&lt;/h2&gt;&lt;p&gt;OpenAI mentions an important shift in the article: early on, they tried hard-coding many actions in the outer harness, such as committing code, running tests, and handling GitHub workflows. But as Codex became more capable, that approach started to constrain the Agent.&lt;/p&gt;
&lt;p&gt;The later direction was to give the Agent a goal, rather than encoding every step as a fixed state transition.&lt;/p&gt;
&lt;p&gt;For example, a task&amp;rsquo;s goal might be &amp;ldquo;complete the Vite migration and ensure CI passes.&amp;rdquo; The Agent can decide for itself whether it needs to change configuration, fix tests, read CI logs, handle review feedback, or even create new follow-up issues. Symphony provides boundaries, context, and the runtime framework instead of prescribing every action for the Agent.&lt;/p&gt;
&lt;p&gt;This is also where it differs from traditional automation scripts: scripts are good at repeated, deterministic processes; Symphony is aimed at engineering tasks with uncertainty.&lt;/p&gt;
&lt;h2 id=&#34;how-is-this-different-from-normal-codex-usage&#34;&gt;How is this different from normal Codex usage?
&lt;/h2&gt;&lt;p&gt;A normal Codex session is more like &amp;ldquo;a human writes code with AI&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the human opens a session;&lt;/li&gt;
&lt;li&gt;the human describes the task;&lt;/li&gt;
&lt;li&gt;the human watches the output;&lt;/li&gt;
&lt;li&gt;the human corrects course at any time;&lt;/li&gt;
&lt;li&gt;after one task ends, the human starts the next session.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Symphony is more like &amp;ldquo;a team hands a task pool to a group of Agents&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;humans write clear issues;&lt;/li&gt;
&lt;li&gt;the system continuously discovers executable tasks;&lt;/li&gt;
&lt;li&gt;Agents make progress in isolated environments;&lt;/li&gt;
&lt;li&gt;results come back as PRs, comments, test status, videos, or analysis reports;&lt;/li&gt;
&lt;li&gt;humans review at key checkpoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not about replacing engineers. It is about freeing engineers from the burden of simultaneously watching many sessions. OpenAI notes in the official article that some teams saw a significant increase in PRs merged to the main branch. But the more important point is the change in working style: the startup cost of trying an idea, launching a refactor, or validating a hypothesis becomes lower.&lt;/p&gt;
&lt;h2 id=&#34;where-does-it-fit&#34;&gt;Where does it fit?
&lt;/h2&gt;&lt;p&gt;Symphony is better suited to tasks such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;routine feature implementation;&lt;/li&gt;
&lt;li&gt;small refactors in an existing codebase;&lt;/li&gt;
&lt;li&gt;infrastructure migrations;&lt;/li&gt;
&lt;li&gt;dependency upgrades;&lt;/li&gt;
&lt;li&gt;filling in tests;&lt;/li&gt;
&lt;li&gt;CI fixes;&lt;/li&gt;
&lt;li&gt;research followed by an implementation plan;&lt;/li&gt;
&lt;li&gt;continuing to revise a PR based on review feedback.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is not necessarily a good fit for highly ambiguous tasks that require strong business judgment or architectural decisions. For those problems, an interactive Codex session is still more natural because humans need to stay involved throughout the process.&lt;/p&gt;
&lt;h2 id=&#34;risks-and-boundaries&#34;&gt;Risks and boundaries
&lt;/h2&gt;&lt;p&gt;Symphony is appealing, but in real adoption, teams cannot look only at the &amp;ldquo;automation&amp;rdquo; side.&lt;/p&gt;
&lt;p&gt;Several boundaries need to be made clear in advance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;issues must be written clearly, otherwise Agents will amplify vague requirements into incorrect implementations;&lt;/li&gt;
&lt;li&gt;Agent permissions should be constrained, especially access to repositories, secrets, production environments, and third-party services;&lt;/li&gt;
&lt;li&gt;every workspace should be isolated to avoid contamination between tasks;&lt;/li&gt;
&lt;li&gt;CI, tests, lint, and review remain necessary quality gates;&lt;/li&gt;
&lt;li&gt;task status, PR links, logs, and failure reasons need to be traceable;&lt;/li&gt;
&lt;li&gt;human review cannot be skipped, especially for changes involving security, billing, data migration, and permission logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The official repository also positions Symphony as an engineering preview and reference implementation for trusted environments, not a finished platform that can blindly replace a development process.&lt;/p&gt;
&lt;h2 id=&#34;my-understanding-of-symphony&#34;&gt;My understanding of Symphony
&lt;/h2&gt;&lt;p&gt;The most valuable part of Symphony is not that it uses Linear, nor that the reference implementation chose Elixir. Its value is that it redefines the entry point for programming Agents.&lt;/p&gt;
&lt;p&gt;In the past, we were used to starting AI coding from a chat window. That is flexible, but once the scale grows, human attention becomes the bottleneck. Symphony puts the entry point back in the issue tracker and lets Agents work continuously around real tasks. In that sense, AI coding starts moving from a &amp;ldquo;personal productivity tool&amp;rdquo; toward &amp;ldquo;team workflow infrastructure.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;If you are already using Codex, Claude Code, Cursor Agent, or similar tools, the most important thing to notice about Symphony is not any specific implementation, but the pattern behind it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do not only manage Agent sessions. Manage the work that needs to be done.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This may become a key dividing line for the next stage of AI coding tools.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/zh-Hans-CN/index/open-source-codex-orchestration-symphony/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Open-source specification for Codex orchestration: Symphony&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/openai/symphony&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;openai/symphony&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>What is browser-harness? A browser automation tool that lets AI agents control real Chrome</title>
        <link>https://knightli.com/en/2026/05/24/browser-use-browser-harness-ai-agent-browser-automation/</link>
        <pubDate>Sun, 24 May 2026 17:19:54 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/24/browser-use-browser-harness-ai-agent-browser-automation/</guid>
        <description>&lt;p&gt;&lt;code&gt;browser-use/browser-harness&lt;/code&gt; is a browser control tool for AI agents. Its goal is not to build another heavy automation framework, but to connect large language models directly to real Chrome through CDP, so they can browse pages, click, take screenshots, download files, upload files, and fill forms.&lt;/p&gt;
&lt;p&gt;The README describes the project as a thin, editable CDP harness for letting LLMs connect to a real browser. When a task lacks a helper, the agent can add code during execution and turn reusable experience into domain skills.&lt;/p&gt;
&lt;p&gt;This is worth watching because the browser is still the entry point for many real workflows: admin panels, SaaS dashboards, ecommerce sites, recruiting platforms, CRMs, reimbursement systems, cloud consoles, and document platforms. Many of them do not expose stable APIs, or their API permissions are harder to obtain than webpage access. Giving an agent reliable browser control is a way to fill that last mile of automation.&lt;/p&gt;
&lt;h2 id=&#34;what-browser-harness-is&#34;&gt;What browser-harness is
&lt;/h2&gt;&lt;p&gt;Structurally, browser-harness is closer to a browser runtime for agents than a browser extension for manual users.&lt;/p&gt;
&lt;p&gt;Its core ideas are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connect directly to Chrome or Chromium.&lt;/li&gt;
&lt;li&gt;Control pages through a CDP WebSocket.&lt;/li&gt;
&lt;li&gt;Let agents combine screenshots, coordinate clicks, DOM inspection, network requests, and raw CDP.&lt;/li&gt;
&lt;li&gt;Put task-specific helpers in &lt;code&gt;agent-workspace/agent_helpers.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Store site-specific experience in &lt;code&gt;agent-workspace/domain-skills/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Keep the core thin instead of turning it into a large automation platform.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The README says the core architecture is roughly four core files and about 1,000 lines of code, covering &lt;code&gt;install.md&lt;/code&gt;, &lt;code&gt;SKILL.md&lt;/code&gt;, &lt;code&gt;src/browser_harness/&lt;/code&gt;, &lt;code&gt;agent-workspace/agent_helpers.py&lt;/code&gt;, and &lt;code&gt;agent-workspace/domain-skills/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The point is not to ship built-in support for every website. The point is to give the agent an operation layer close enough to a real browser, so it can fill in missing capabilities for the task at hand.&lt;/p&gt;
&lt;h2 id=&#34;how-it-differs-from-traditional-browser-automation&#34;&gt;How it differs from traditional browser automation
&lt;/h2&gt;&lt;p&gt;Traditional browser automation usually revolves around testing frameworks such as Playwright, Selenium, or Puppeteer. They are good for deterministic scripts: open a page, locate an element, click it, and assert the result.&lt;/p&gt;
&lt;p&gt;browser-harness targets a different kind of work. A user gives a goal, and the agent explores the page, judges the state, handles popups, adds helpers, and reuses site knowledge. It emphasizes adaptation during interaction.&lt;/p&gt;
&lt;p&gt;The difference can be summarized like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Playwright is better when humans write scripts and agents run them.&lt;/li&gt;
&lt;li&gt;browser-harness is better when agents look at the page and act step by step.&lt;/li&gt;
&lt;li&gt;Traditional automation favors fixed flows.&lt;/li&gt;
&lt;li&gt;browser-harness favors open-ended tasks.&lt;/li&gt;
&lt;li&gt;Traditional scripts often depend on selectors.&lt;/li&gt;
&lt;li&gt;browser-harness encourages screenshots first, visible UI actions next, and DOM or CDP when needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This does not mean it replaces Playwright. For stable tests, Playwright is still more mature. browser-harness is valuable because it turns real webpages into an environment an agent can operate, especially when page structure is complex, steps are not fixed, and situational judgment matters.&lt;/p&gt;
&lt;h2 id=&#34;why-real-chrome-matters&#34;&gt;Why real Chrome matters
&lt;/h2&gt;&lt;p&gt;Many browser-agent tools use isolated headless browsers. That is simple to deploy and good for batch jobs, but it does not always reuse the user’s real working environment: login state, extensions, history, bookmarks, and daily browser setup.&lt;/p&gt;
&lt;p&gt;browser-harness supports local Chrome and the Browser Use cloud browser. For local browsers, it offers two approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;chrome://inspect/#remote-debugging&lt;/code&gt; to allow the current Chrome instance to be connected.&lt;/li&gt;
&lt;li&gt;Start an isolated profile with &lt;code&gt;--remote-debugging-port=9222 --user-data-dir=...&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want an agent to help with tasks inside real accounts, the docs lean toward the first approach because it reuses everyday Chrome login state, extensions, and bookmarks. For unattended automation, or when you do not want popups to interrupt work, an isolated profile or cloud browser is usually safer.&lt;/p&gt;
&lt;p&gt;The trade-off is clear: real Chrome is closer to the user’s workflow, but the security boundary is more sensitive. An isolated browser is easier to control, but login and environment setup must be handled again.&lt;/p&gt;
&lt;h2 id=&#34;editable-helpers-and-domain-skills&#34;&gt;Editable helpers and domain skills
&lt;/h2&gt;&lt;p&gt;The most interesting part of browser-harness is that it designs “what the agent learns” into the project structure.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;agent-workspace/agent_helpers.py&lt;/code&gt; stores helpers that are created during tasks. For example, if an agent needs to upload a file and the existing tools are not enough, it can add a stable upload helper. The next time it sees a similar page, it does not have to start from scratch.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;agent-workspace/domain-skills/&lt;/code&gt; stores site-level experience. The README mentions areas such as LinkedIn outreach, Amazon ordering, and reimbursement systems. The project recommends letting agents generate these skills from real tasks instead of hand-writing them, because they should reflect actual page behavior.&lt;/p&gt;
&lt;p&gt;This fits browser automation well. The hard part is often not “how to click a button,” but:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How a website redirects after login.&lt;/li&gt;
&lt;li&gt;Which popups block the main flow.&lt;/li&gt;
&lt;li&gt;Which selectors are stable and which are temporary class names.&lt;/li&gt;
&lt;li&gt;How uploads, downloads, iframes, shadow DOM, and cross-origin components behave.&lt;/li&gt;
&lt;li&gt;What hidden waits and asynchronous states exist in a specific backend.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If this knowledge only stays in one run log, it is quickly lost. Turning it into domain skills gives the agent a chance to improve over time.&lt;/p&gt;
&lt;h2 id=&#34;suitable-scenarios&#34;&gt;Suitable scenarios
&lt;/h2&gt;&lt;p&gt;browser-harness is better suited for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Operating real web admin panels for users.&lt;/li&gt;
&lt;li&gt;Completing repeated flows in systems without APIs.&lt;/li&gt;
&lt;li&gt;Personal or enterprise web tasks that depend heavily on login state.&lt;/li&gt;
&lt;li&gt;Complex interactions where screenshots are needed to judge page state.&lt;/li&gt;
&lt;li&gt;Agents that need to add tools and site knowledge while running.&lt;/li&gt;
&lt;li&gt;Multiple sub-agents each using an isolated browser.&lt;/li&gt;
&lt;li&gt;Researching browser-agent runtime design.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Concrete examples include organizing web tables, submitting internal forms, downloading invoices, uploading files, handling reimbursement workflows, checking order status, configuring SaaS dashboards, and extracting information from logged-in pages.&lt;/p&gt;
&lt;p&gt;If the task is only to fetch static pages, a browser may not be needed. The project’s own &lt;code&gt;SKILL.md&lt;/code&gt; also notes that static pages can often be fetched through HTTP in bulk. Browsers should be reserved for tasks that truly need page state, login state, and interaction.&lt;/p&gt;
&lt;h2 id=&#34;risks-to-watch&#34;&gt;Risks to watch
&lt;/h2&gt;&lt;p&gt;Letting an AI agent control real Chrome is powerful, but risky.&lt;/p&gt;
&lt;p&gt;First, the permission boundary must be clear. Real Chrome may contain email, payment dashboards, cloud consoles, company systems, and personal accounts. Once an agent can operate the browser, it effectively has access to part of those webpage permissions.&lt;/p&gt;
&lt;p&gt;Second, do not hand credentials to the model. For login pages, payment verification, and second confirmations, the user should handle the sensitive step. The agent can wait for login to finish, but it should not read or enter passwords, verification codes, or payment details from screenshots.&lt;/p&gt;
&lt;p&gt;Third, automation is not the same as delegation. Many web tasks look simple but may involve risk controls, mistaken clicks, data deletion, bulk submissions, or irreversible operations. Start with read-only, low-risk, reversible workflows.&lt;/p&gt;
&lt;p&gt;Fourth, domain skills should not leak private data. Site knowledge can be shared, but account names, internal URLs, customer data, coordinate logs, and one-off task details should not be written into skills.&lt;/p&gt;
&lt;p&gt;Fifth, choose the browser connection mode carefully. Reusing daily Chrome is convenient when login state matters. For long-running automation, an isolated profile or cloud browser is more controllable.&lt;/p&gt;
&lt;h2 id=&#34;why-it-matters-for-ai-agent-tools&#34;&gt;Why it matters for AI agent tools
&lt;/h2&gt;&lt;p&gt;browser-harness represents a pragmatic direction for agent tooling: build less platform, and give the model a direct interface to the real environment.&lt;/p&gt;
&lt;p&gt;Many agents fail at two ends. On one end, the model can reason but cannot touch the real page. On the other, automation frameworks are powerful but require humans to hard-code the flow. browser-harness tries to connect the two: the browser holds real-world state, while the agent observes, decides, and adds tools.&lt;/p&gt;
&lt;p&gt;That is also the meaning of a self-improving harness. It does not mean the agent magically becomes smarter. It means reusable operation experience is placed into the project structure, so the next task can avoid some of the same detours.&lt;/p&gt;
&lt;p&gt;For developers, its value is mainly in three areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A browser control layer for personal agents.&lt;/li&gt;
&lt;li&gt;A reference for studying browser automation and agent workflows.&lt;/li&gt;
&lt;li&gt;An experimental framework for turning web workflows into reusable skills.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is not the answer to every browser automation problem, but it points in a clear direction: when agents truly help people do work, the tool layer should not only call APIs. It should also understand and operate the web interfaces people use every day.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;browser-use/browser-harness&lt;/code&gt; is interesting not because it wraps many advanced features, but because it brings several key browser-agent questions into focus: real Chrome, CDP, screenshot-driven control, editable helpers, site skill accumulation, and user permission boundaries.&lt;/p&gt;
&lt;p&gt;If you are writing stable end-to-end tests, Playwright or Selenium is still a better fit. If you want agents such as Codex or Claude Code to handle real webpage tasks, browser-harness offers an entry point that matches how agents work.&lt;/p&gt;
&lt;p&gt;In practice, start with low-risk tasks: let it read pages, take screenshots, and extract information first. Then gradually try clicking and submitting. Once it can reliably understand page state, you can consider giving it longer workflows.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;README: &lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/README.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Installation guide: &lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/install.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/install.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Usage guide: &lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/SKILL.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/SKILL.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>CLIProxyAPI Management Center: A Visual Admin Console for CLIProxyAPI</title>
        <link>https://knightli.com/en/2026/05/24/cliproxyapi-management-center/</link>
        <pubDate>Sun, 24 May 2026 10:05:15 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/24/cliproxyapi-management-center/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/router-for-me/Cli-Proxy-API-Management-Center&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cli-Proxy-API-Management-Center&lt;/a&gt; can be understood as the cockpit for CLIProxyAPI.&lt;/p&gt;
&lt;p&gt;In the previous article, &lt;a class=&#34;link&#34; href=&#34;https://github.com/router-for-me/CLIProxyAPI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CLIProxyAPI&lt;/a&gt; was the service that proxies Gemini CLI, Codex, Claude Code, OpenRouter, and other capabilities into unified APIs. This Management Center solves a different problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Once the proxy service is running, should configuration, accounts, OAuth, logs, quotas, and credentials all be managed by manually editing files and scrolling through terminals?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It provides a web management interface so you can manage CLIProxyAPI configuration and runtime state from a browser.&lt;/p&gt;
&lt;h2 id=&#34;what-it-is&#34;&gt;What It Is
&lt;/h2&gt;&lt;p&gt;According to the project description, Cli-Proxy-API-Management-Center is an independent management frontend for CLIProxyAPI. Its core features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visual editing for CLIProxyAPI configuration.&lt;/li&gt;
&lt;li&gt;Uploading and managing authentication files such as &lt;code&gt;auth.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Viewing request logs and model response logs.&lt;/li&gt;
&lt;li&gt;Managing OAuth authentication flows.&lt;/li&gt;
&lt;li&gt;Checking Gemini CLI account quotas.&lt;/li&gt;
&lt;li&gt;Providing daily maintenance entry points for accounts, configuration, logs, and related tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The official repository also notes that newer versions of CLIProxyAPI already include this management interface, accessible directly through &lt;code&gt;/management.html&lt;/code&gt;. The standalone repository remains useful for people who need separate deployment or secondary development.&lt;/p&gt;
&lt;p&gt;That point matters. Most ordinary users may not need to deploy this repository separately. First check whether your CLIProxyAPI version already ships with the management page.&lt;/p&gt;
&lt;h2 id=&#34;it-manages-the-entry-point-not-the-model-call-itself&#34;&gt;It Manages the Entry Point, Not the Model Call Itself
&lt;/h2&gt;&lt;p&gt;The hard part of CLIProxyAPI is not only forwarding a request to a model.&lt;/p&gt;
&lt;p&gt;The real trouble is in things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to put multiple Gemini, OpenAI, Claude, and Codex accounts into a pool.&lt;/li&gt;
&lt;li&gt;Which account has expired, and which account is close to its quota limit.&lt;/li&gt;
&lt;li&gt;How to import, refresh, and troubleshoot OAuth login states.&lt;/li&gt;
&lt;li&gt;How to edit configuration files without missing commas or fields.&lt;/li&gt;
&lt;li&gt;Which provider, model, and account a request actually used.&lt;/li&gt;
&lt;li&gt;Whether a failed request came from an upstream issue, a protocol issue, or local configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where Management Center is useful: it turns daily maintenance of proxy infrastructure into visual operations.&lt;/p&gt;
&lt;p&gt;If you only run one account locally and call the API occasionally, it may not be essential. But once you start using multiple accounts, multiple models, and multiple client integrations, a backend UI becomes noticeably easier to live with.&lt;/p&gt;
&lt;h2 id=&#34;typical-use-cases&#34;&gt;Typical Use Cases
&lt;/h2&gt;&lt;p&gt;First: managing account pools.&lt;/p&gt;
&lt;p&gt;CLIProxyAPI supports multi-account rotation and load balancing, but the more accounts you have, the less suitable manual configuration-file editing becomes. The management center helps you view account state, import credentials, and troubleshoot abnormal accounts.&lt;/p&gt;
&lt;p&gt;Second: troubleshooting failed requests.&lt;/p&gt;
&lt;p&gt;When a client reports an error, you need to know whether the request reached the proxy, which provider it used, and what error came back. A log UI is much more comfortable than searching through terminal output.&lt;/p&gt;
&lt;p&gt;Third: handling OAuth.&lt;/p&gt;
&lt;p&gt;Tools such as Codex, Claude Code, and Gemini CLI often involve OAuth login state. Management Center provides OAuth-related operation entry points, reducing repeated command-line work.&lt;/p&gt;
&lt;p&gt;Fourth: internal team usage.&lt;/p&gt;
&lt;p&gt;If CLIProxyAPI becomes a shared team gateway, administrators need an interface for quickly checking configuration and state. Otherwise, every change requires logging into a server and editing files, which is inefficient and error-prone.&lt;/p&gt;
&lt;h2 id=&#34;how-it-relates-to-cliproxyapi&#34;&gt;How It Relates to CLIProxyAPI
&lt;/h2&gt;&lt;p&gt;You can think of the two pieces as separate layers:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Client / IDE / Script
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CLIProxyAPI: protocol proxy, account pool, model routing
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Gemini CLI / Codex / Claude Code / OpenRouter / upstream models
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Management Center is not in the core inference request path. It is more like an operations panel:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Browser
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Management Center: edit config, view logs, manage accounts, check quotas
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CLIProxyAPI admin APIs / config / logs / credentials
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;So do not treat it as another model proxy. It is a tool for managing CLIProxyAPI, not a replacement for CLIProxyAPI.&lt;/p&gt;
&lt;h2 id=&#34;why-the-standalone-repository-still-matters&#34;&gt;Why the Standalone Repository Still Matters
&lt;/h2&gt;&lt;p&gt;Since CLIProxyAPI already includes &lt;code&gt;/management.html&lt;/code&gt;, why pay attention to the standalone repository?&lt;/p&gt;
&lt;p&gt;There are three main reasons.&lt;/p&gt;
&lt;p&gt;First, the standalone repository makes the management center&amp;rsquo;s boundaries easier to inspect. You can see what belongs to the frontend, and what must be provided by CLIProxyAPI backend APIs.&lt;/p&gt;
&lt;p&gt;Second, if you want secondary development, such as changing the UI, adding authentication, or integrating your own monitoring system, the standalone repository is a better entry point.&lt;/p&gt;
&lt;p&gt;Third, if your deployment environment is unusual, such as separate frontend and backend hosting, a dedicated management domain, or static assets served through an internal gateway, the standalone version is more flexible.&lt;/p&gt;
&lt;p&gt;For ordinary individual users, the built-in CLIProxyAPI version is usually enough. For teams or deep customization, the standalone repository is more meaningful.&lt;/p&gt;
&lt;h2 id=&#34;what-to-watch-during-deployment&#34;&gt;What to Watch During Deployment
&lt;/h2&gt;&lt;p&gt;The admin console touches sensitive things: accounts, OAuth, API keys, logs, request contents, and upstream quotas.&lt;/p&gt;
&lt;p&gt;So the first rule is: do not expose the management page directly to the public internet.&lt;/p&gt;
&lt;p&gt;Safer options include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow only local access, such as binding to &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If remote access is necessary, put it behind a VPN, Tailscale, an internal jump host, or an authenticated reverse proxy.&lt;/li&gt;
&lt;li&gt;Add authentication to admin endpoints. Do not rely on &amp;ldquo;nobody knows the URL&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Avoid exposing full keys, cookies, OAuth tokens, and raw user requests in logs.&lt;/li&gt;
&lt;li&gt;In team environments, separate people who can call the API from people who can change configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many proxy-tool incidents do not come from model call failures. They come from unprotected admin endpoints, logs, and credential files.&lt;/p&gt;
&lt;h2 id=&#34;what-to-use-it-with&#34;&gt;What to Use It With
&lt;/h2&gt;&lt;p&gt;If you only deploy CLIProxyAPI, a management center already solves basic maintenance needs.&lt;/p&gt;
&lt;p&gt;If you care more about statistics and observability, you can also combine it with other tools in the CLIProxyAPI ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPA Usage Keeper: focused on usage syncing and SQLite storage.&lt;/li&gt;
&lt;li&gt;CLIProxyAPI Usage Dashboard: focused on local-first usage, quota, and chart views.&lt;/li&gt;
&lt;li&gt;CPA-Manager: a heavier management center for request monitoring, cost estimation, account inspection, and abnormal account cleanup suggestions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A simple way to understand the division:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Management Center handles configuration and daily maintenance.&lt;/li&gt;
&lt;li&gt;Usage Dashboard handles usage and quota visibility.&lt;/li&gt;
&lt;li&gt;CPA-Manager handles heavier operations and inspections.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Which one to use depends on your deployment size. A personal local setup does not need the whole suite.&lt;/p&gt;
&lt;h2 id=&#34;usage-suggestions&#34;&gt;Usage Suggestions
&lt;/h2&gt;&lt;p&gt;If you are just starting with CLIProxyAPI, try this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First get CLIProxyAPI itself running and confirm the API responds normally.&lt;/li&gt;
&lt;li&gt;Open the built-in &lt;code&gt;/management.html&lt;/code&gt; and check whether configuration and logs can be read.&lt;/li&gt;
&lt;li&gt;Import one account or one provider, and confirm the management UI reflects the state change.&lt;/li&gt;
&lt;li&gt;If you need public access, add authentication and network isolation before exposing the entry point.&lt;/li&gt;
&lt;li&gt;After the number of accounts and requests grows, add usage statistics and more complete management tools.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do not connect every account, every provider, and every management component at once from the beginning. Proxy and account-pool projects are much easier to verify in small steps.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Cli-Proxy-API-Management-Center has a clear role: it is not a model, not a chat client, and not a new API gateway. It is the visual management layer for CLIProxyAPI.&lt;/p&gt;
&lt;p&gt;When CLIProxyAPI is just a small local tool, you can ignore it. When CLIProxyAPI starts carrying multiple accounts, multiple models, and multiple client integrations, it becomes a very useful console.&lt;/p&gt;
&lt;p&gt;The real thing to watch is the security boundary. The admin backend can modify configuration, view logs, and touch credentials. If exposed incorrectly, its risk is higher than an ordinary API calling endpoint. Keep it in a trusted network, protect it with authentication, and then enjoy the convenience of visual management.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/router-for-me/Cli-Proxy-API-Management-Center&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;router-for-me/Cli-Proxy-API-Management-Center GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/router-for-me/CLIProxyAPI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;router-for-me/CLIProxyAPI GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.router-for.me/cn/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CLIProxyAPI official documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>CLIProxyAPI: Wrapping Codex, Claude Code, and Gemini CLI into a Unified API</title>
        <link>https://knightli.com/en/2026/05/24/cliproxyapi-cli-to-api-gateway/</link>
        <pubDate>Sun, 24 May 2026 10:03:33 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/24/cliproxyapi-cli-to-api-gateway/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/router-for-me/CLIProxyAPI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CLIProxyAPI&lt;/a&gt; is a very practical, community-engineering kind of project. It is not another large model, and it is not merely an API forwarder. Instead, it repackages a set of AI tools that are originally interactive, CLI-oriented, or OAuth-login-oriented into a unified API service.&lt;/p&gt;
&lt;p&gt;It supports Gemini CLI, OpenAI Codex, Claude Code, Amp CLI, AI Studio Build, and upstream OpenAI-compatible services. In plain terms, it tries to answer this question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have CLI tools, subscription accounts, and OAuth login sessions. Can I connect these capabilities to my own client, scripts, IDE, or internal services just like calling a normal API?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CLIProxyAPI&amp;rsquo;s answer is yes: put a proxy layer in the middle and translate CLI capabilities from different sources into OpenAI-, Gemini-, Claude-, and Codex-compatible interfaces.&lt;/p&gt;
&lt;h2 id=&#34;the-real-pain-point-it-solves&#34;&gt;The Real Pain Point It Solves
&lt;/h2&gt;&lt;p&gt;Many AI coding tools are powerful, but their default usage patterns are not automation-friendly.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini CLI can log in with an account, but your program may prefer calling an HTTP API.&lt;/li&gt;
&lt;li&gt;Claude Code is excellent for interactive coding, but integrating it into other clients can run into protocol mismatches.&lt;/li&gt;
&lt;li&gt;Codex CLI supports OAuth login and Responses-style capabilities, but not every upper-layer tool knows how to talk to it.&lt;/li&gt;
&lt;li&gt;A team may have multiple accounts and need rotation, load balancing, unhealthy account removal, and quota visibility.&lt;/li&gt;
&lt;li&gt;You may want some tools to see only an OpenAI-style interface, while the backend is actually Gemini, Claude, or Codex.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CLIProxyAPI is positioned as the protocol adaptation layer between these tools and your clients.&lt;/p&gt;
&lt;p&gt;It hides the complex side behind the scenes: OAuth, CLI login, multiple accounts, different protocols, and different providers. On the front side, it exposes familiar interfaces such as OpenAI Chat Completions, OpenAI Responses, Gemini, Claude Messages, and Codex-related endpoints.&lt;/p&gt;
&lt;h2 id=&#34;capability-overview&#34;&gt;Capability Overview
&lt;/h2&gt;&lt;p&gt;According to the official README and documentation, CLIProxyAPI currently focuses on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Providing OpenAI-, Gemini-, Claude-, and Codex-compatible API endpoints for CLI models.&lt;/li&gt;
&lt;li&gt;Connecting OpenAI Codex and Claude Code through OAuth login.&lt;/li&gt;
&lt;li&gt;Supporting streaming and non-streaming responses, plus WebSocket in some scenarios.&lt;/li&gt;
&lt;li&gt;Supporting function calling, tool calling, and multimodal input.&lt;/li&gt;
&lt;li&gt;Supporting multi-account rotation and load balancing for Gemini, OpenAI, and Claude.&lt;/li&gt;
&lt;li&gt;Supporting Gemini AI Studio API keys.&lt;/li&gt;
&lt;li&gt;Supporting account pools for AI Studio Build, Gemini CLI, Claude Code, and OpenAI Codex.&lt;/li&gt;
&lt;li&gt;Connecting OpenAI-compatible upstreams through configuration, such as OpenRouter.&lt;/li&gt;
&lt;li&gt;Providing a Go SDK so the proxy capability can be embedded into your own services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most valuable part of this kind of project is not that it supports a few more model names. It is that it packages account login, protocol translation, and request routing into one operational layer.&lt;/p&gt;
&lt;h2 id=&#34;who-it-is-for&#34;&gt;Who It Is For
&lt;/h2&gt;&lt;p&gt;CLIProxyAPI is better suited to several groups of users.&lt;/p&gt;
&lt;p&gt;The first group is heavy AI coding users. You already use Codex, Claude Code, and Gemini CLI, but you want to connect them to Cursor, Cline, RooCode, Amp, internal scripts, or custom workflows.&lt;/p&gt;
&lt;p&gt;The second group is people with multiple account pools. For example, you may have several Gemini, OpenAI, or Claude login sessions and do not want to switch manually. You want automatic rotation, balanced usage, and quick troubleshooting when an account becomes abnormal.&lt;/p&gt;
&lt;p&gt;The third group is people building internal team gateways. The team may not want every client to separately adapt to Gemini, Claude, and Codex. Instead, it wants one middle layer that exposes a unified API.&lt;/p&gt;
&lt;p&gt;The fourth group is people who like working with protocols. You may care how Responses, Chat Completions, Claude Messages, and Gemini v1beta interfaces can be converted between one another, or you may want to switch backends from the same client.&lt;/p&gt;
&lt;p&gt;If you only ask AI a few questions occasionally, or only use the official apps for chat, the deployment and maintenance cost of CLIProxyAPI may feel heavy.&lt;/p&gt;
&lt;h2 id=&#34;how-it-differs-from-a-regular-api-proxy&#34;&gt;How It Differs from a Regular API Proxy
&lt;/h2&gt;&lt;p&gt;A typical API proxy looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Client -&amp;gt; Proxy API -&amp;gt; Upstream model API
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;CLIProxyAPI is closer to this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Client -&amp;gt; CLIProxyAPI -&amp;gt; CLI / OAuth session / account pool -&amp;gt; model service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The difference is that it handles more than API key forwarding. It also deals with CLI tools, OAuth accounts, protocol surfaces, and model aliases.&lt;/p&gt;
&lt;p&gt;Tools such as Codex and Claude Code are not traditional &amp;ldquo;give me one API key and I can call it stably&amp;rdquo; services. CLIProxyAPI wraps their login sessions and calling logic so external clients can access them as if they were normal APIs.&lt;/p&gt;
&lt;p&gt;That is what makes it attractive, and also what makes it complex.&lt;/p&gt;
&lt;h2 id=&#34;common-misunderstandings&#34;&gt;Common Misunderstandings
&lt;/h2&gt;&lt;p&gt;First, do not assume that a unified &lt;code&gt;/v1/...&lt;/code&gt; path eliminates all protocol differences.&lt;/p&gt;
&lt;p&gt;The CLIProxyAPI documentation specifically notes that when you need the request and response shape of a certain backend type, you should prefer provider-specific paths. For example, use &lt;code&gt;/api/provider/{provider}/v1/messages&lt;/code&gt; for messages-style requests, &lt;code&gt;/api/provider/{provider}/v1beta/models/...&lt;/code&gt; for Gemini model paths, and &lt;code&gt;/api/provider/{provider}/v1/chat/completions&lt;/code&gt; for chat-completions-style requests.&lt;/p&gt;
&lt;p&gt;A unified entry point is convenient, but the semantics of different protocols do not disappear. Tool calling, streaming responses, multimodal input, and system message handling may all differ by backend.&lt;/p&gt;
&lt;p&gt;Second, a model name does not uniquely identify a backend.&lt;/p&gt;
&lt;p&gt;If multiple backends expose the same client-visible model name, the path alone may not lock the request to the backend that actually performs inference. To strictly pin a backend, use unique aliases, prefixes, or avoid exposing the same model name from multiple backends.&lt;/p&gt;
&lt;p&gt;Third, multi-account rotation is not unlimited quota.&lt;/p&gt;
&lt;p&gt;Rotation only spreads usage more evenly across the account pool. It cannot bypass the real limits of upstream services. Abnormal accounts, exhausted quota, risk controls, and expired OAuth sessions still need monitoring.&lt;/p&gt;
&lt;p&gt;Fourth, it is not a maintenance-free magic box.&lt;/p&gt;
&lt;p&gt;Once you put it into your daily workflow, you need to care about configuration, logs, upstream account status, version upgrades, client compatibility, and security boundaries.&lt;/p&gt;
&lt;h2 id=&#34;management-and-monitoring&#34;&gt;Management and Monitoring
&lt;/h2&gt;&lt;p&gt;The official README notes that since v6.10.0, CLIProxyAPI and CPAMC no longer include built-in data statistics. If you need usage statistics, you can use separate projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPA Usage Keeper: syncs CLIProxyAPI data into SQLite and provides aggregation APIs and a dashboard.&lt;/li&gt;
&lt;li&gt;CLIProxyAPI Usage Dashboard: a local-first usage and quota dashboard that can show accounts, models, time windows, and remaining Codex quota.&lt;/li&gt;
&lt;li&gt;CPA-Manager: a fuller management center for request monitoring, cost estimation, account pool inspection, abnormal account location, and cleanup suggestions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This suggests that CLIProxyAPI&amp;rsquo;s core is closer to a proxy and protocol layer, not an all-in-one commercial admin backend. If a team uses it, logs, monitoring, and account pool management should be considered from the beginning.&lt;/p&gt;
&lt;h2 id=&#34;a-reasonable-way-to-try-it&#34;&gt;A Reasonable Way to Try It
&lt;/h2&gt;&lt;p&gt;If you want to test it, a safer order is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start it with the official Quick Start documentation.&lt;/li&gt;
&lt;li&gt;Connect only one provider first, such as Gemini CLI or Codex, and confirm basic requests work.&lt;/li&gt;
&lt;li&gt;Then test higher-risk capabilities such as streaming responses, tool calling, and multimodal input.&lt;/li&gt;
&lt;li&gt;Confirm which endpoint the client actually uses, and avoid mixing protocol paths.&lt;/li&gt;
&lt;li&gt;Finally add multi-account rotation, management panels, and usage statistics.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do not connect Gemini, Codex, Claude, OpenRouter, multiple accounts, and all clients at once from the start. When something breaks, it becomes hard to tell whether the issue is authentication, protocol conversion, model naming, or the upstream account.&lt;/p&gt;
&lt;h2 id=&#34;think-through-the-security-boundary&#34;&gt;Think Through the Security Boundary
&lt;/h2&gt;&lt;p&gt;CLIProxyAPI can touch account login sessions, API keys, OAuth-related credentials, and request contents. If it only runs on your own machine, the risk is relatively manageable. If it is exposed to the public internet or a team intranet, authentication, access control, log redaction, and network isolation become mandatory.&lt;/p&gt;
&lt;p&gt;Management endpoints especially should be limited to localhost or a trusted internal network. Do not expose management interfaces directly just to save a few minutes.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;CLIProxyAPI&amp;rsquo;s value is that it gathers AI capabilities scattered across multiple CLIs, accounts, and protocols into one programmable API layer.&lt;/p&gt;
&lt;p&gt;It fits heavy AI coding users, multi-account users, and internal team gateway scenarios. It is less suitable for lightweight users who want something completely plug-and-play with no maintenance.&lt;/p&gt;
&lt;p&gt;If you are already experimenting with Codex, Claude Code, and Gemini CLI, and want to connect them to your own client or automation workflow, CLIProxyAPI is worth a serious look. Treat it as infrastructure, not as a disposable small utility.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/router-for-me/CLIProxyAPI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;router-for-me/CLIProxyAPI GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/router-for-me/CLIProxyAPI/blob/main/README_CN.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CLIProxyAPI Chinese README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.router-for.me/cn/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CLIProxyAPI official documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Two Ways to Use DeepSeek Models with Codex: Local Gateway and OpenRouter BYOK</title>
        <link>https://knightli.com/en/2026/05/24/codex-deepseek-config-ccx-openrouter-byok/</link>
        <pubDate>Sun, 24 May 2026 09:52:55 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/24/codex-deepseek-config-ccx-openrouter-byok/</guid>
        <description>&lt;p&gt;If you want Codex to use DeepSeek, the first instinct is usually to edit &lt;code&gt;~/.codex/config.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek-chat&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;base_url&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://api.deepseek.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That idea can work in some older versions or in regular OpenAI SDK scenarios. But with the current Codex CLI, it can easily run into a lower-level mismatch: custom model providers in Codex use the OpenAI Responses protocol, while DeepSeek&amp;rsquo;s official API is mainly exposed through an OpenAI-compatible Chat Completions interface.&lt;/p&gt;
&lt;p&gt;My local version is currently &lt;code&gt;codex-cli 0.111.0&lt;/code&gt;. &lt;code&gt;codex --help&lt;/code&gt; shows support for configuration entry points such as &lt;code&gt;--config&lt;/code&gt;, &lt;code&gt;--model&lt;/code&gt;, and &lt;code&gt;--profile&lt;/code&gt;. The official OpenAI Codex configuration reference is also explicit: &lt;code&gt;model_providers.&amp;lt;id&amp;gt;.wire_api&lt;/code&gt; currently supports only &lt;code&gt;responses&lt;/code&gt;, and defaults to &lt;code&gt;responses&lt;/code&gt; when omitted.&lt;/p&gt;
&lt;p&gt;DeepSeek&amp;rsquo;s official docs, meanwhile, show the call path as &lt;code&gt;https://api.deepseek.com/chat/completions&lt;/code&gt;, with examples such as &lt;code&gt;client.chat.completions.create(...)&lt;/code&gt;. So the issue is not that DeepSeek cannot be called through OpenAI-style tooling. The issue is that the request semantics Codex sends are not exactly the same as what DeepSeek&amp;rsquo;s native API understands.&lt;/p&gt;
&lt;p&gt;That is why changing &lt;code&gt;base_url&lt;/code&gt; directly to &lt;code&gt;https://api.deepseek.com&lt;/code&gt; may produce symptoms such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The request path does not match, resulting in a 404 or an unexpected response format.&lt;/li&gt;
&lt;li&gt;Multi-turn conversations, tool calls, or patch generation fail during parsing.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tool_calls&lt;/code&gt; order, message structure, or streaming event format does not line up.&lt;/li&gt;
&lt;li&gt;The model seems able to answer a plain prompt, but starts failing once Codex does real work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The steadier approach is to put a translation layer between Codex and DeepSeek. There are two common routes.&lt;/p&gt;
&lt;h2 id=&#34;method-1-bridge-deepseek-through-a-local-gateway&#34;&gt;Method 1: Bridge DeepSeek Through a Local Gateway
&lt;/h2&gt;&lt;p&gt;A local gateway should do more than simple forwarding. Its job is to convert Responses-style requests from Codex into Chat Completions-style requests that DeepSeek can handle, then convert DeepSeek&amp;rsquo;s result back into a format Codex can consume.&lt;/p&gt;
&lt;p&gt;If you use a local gateway such as ccx, the configuration idea looks roughly like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;profiles&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;deepseek-ccx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;model_provider&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ccx-bridge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;model_providers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ccx-bridge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Local CCX Gateway&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;base_url&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://localhost:3000/v1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;env_key&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;DEEPSEEK_API_KEY&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then set the DeepSeek key in your terminal and start Codex with that profile:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;your-deepseek-key&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codex --profile deepseek-ccx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$env:DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;your-deepseek-key&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;codex&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-profile&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;deepseek-ccx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;There are two details to watch.&lt;/p&gt;
&lt;p&gt;First, &lt;code&gt;base_url&lt;/code&gt; should point to the gateway endpoint exposed to Codex, not the official DeepSeek address. The gateway calls DeepSeek behind the scenes.&lt;/p&gt;
&lt;p&gt;Second, the correct value for &lt;code&gt;env_key&lt;/code&gt; depends on how the gateway handles authentication. Some gateways read the official DeepSeek key directly. Others ask you to provide a local proxy key, while storing the DeepSeek key in the gateway backend. In that case, &lt;code&gt;env_key&lt;/code&gt; should be changed to whatever environment variable the gateway expects.&lt;/p&gt;
&lt;p&gt;This route is local and controllable, and it is easier to reason about latency and cost. The tradeoff is that you must confirm the gateway really supports the current Responses semantics used by Codex, rather than only acting as a basic Chat Completions proxy.&lt;/p&gt;
&lt;h2 id=&#34;method-2-use-openrouter-byok-as-an-online-bridge&#34;&gt;Method 2: Use OpenRouter BYOK as an Online Bridge
&lt;/h2&gt;&lt;p&gt;If you do not want to run a local gateway, OpenRouter BYOK is another option. BYOK means binding your own upstream provider key to OpenRouter, which then handles routing and forwarding.&lt;/p&gt;
&lt;p&gt;The most common mistake here is the environment variable. Codex is calling OpenRouter, so &lt;code&gt;env_key&lt;/code&gt; should usually be &lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt;, not &lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt;. The DeepSeek key should be added in OpenRouter&amp;rsquo;s BYOK or provider key settings.&lt;/p&gt;
&lt;p&gt;Example configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;profiles&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;deepseek-openrouter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek/deepseek-chat&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;model_provider&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;openrouter&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;model_providers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;openrouter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;OpenRouter&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;base_url&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://openrouter.ai/api/v1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;env_key&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;OPENROUTER_API_KEY&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Start it like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;your-openrouter-key&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codex --profile deepseek-openrouter
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$env:OPENROUTER_API_KEY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;your-openrouter-key&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;codex&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-profile&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;deepseek-openrouter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then add your DeepSeek provider key in the OpenRouter dashboard. OpenRouter&amp;rsquo;s BYOK documentation says provider keys are stored encrypted and used for routing to the corresponding provider.&lt;/p&gt;
&lt;p&gt;This route saves you from maintaining a local gateway and feels more like using a regular third-party API proxy. The downside is that an online service sits in the middle, so troubleshooting may require checking Codex, OpenRouter, and DeepSeek error messages together.&lt;/p&gt;
&lt;h2 id=&#34;should-you-keep-using-the-deepseek-chat-model-name&#34;&gt;Should You Keep Using the deepseek-chat Model Name?
&lt;/h2&gt;&lt;p&gt;In DeepSeek&amp;rsquo;s documentation as of May 2026, the recommended model names include &lt;code&gt;deepseek-v4-flash&lt;/code&gt; and &lt;code&gt;deepseek-v4-pro&lt;/code&gt;, with a note that compatibility aliases such as &lt;code&gt;deepseek-chat&lt;/code&gt; and &lt;code&gt;deepseek-reasoner&lt;/code&gt; will be deprecated after 2026-07-24.&lt;/p&gt;
&lt;p&gt;For new configurations, it is better to test:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you are using OpenRouter, follow OpenRouter&amp;rsquo;s model naming format, for example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek/deepseek-chat&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The actual available names depend on your gateway or OpenRouter&amp;rsquo;s model page. When the model name is wrong, errors usually look like &lt;code&gt;model not found&lt;/code&gt;, 404, or the provider failing to find the matching endpoint.&lt;/p&gt;
&lt;h2 id=&#34;why-directly-setting-deepseeks-official-base_url-is-not-recommended&#34;&gt;Why Directly Setting DeepSeek&amp;rsquo;s Official base_url Is Not Recommended
&lt;/h2&gt;&lt;p&gt;You can certainly try this as an experiment:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;profiles&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;deepseek-direct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek-v4-flash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;model_provider&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;model_providers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;deepseek&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;DeepSeek&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;base_url&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://api.deepseek.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;env_key&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;DEEPSEEK_API_KEY&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;But this is more of a debugging experiment than a stable setup. Codex talks to custom providers through the Responses protocol, while DeepSeek&amp;rsquo;s official examples use &lt;code&gt;/chat/completions&lt;/code&gt;. If DeepSeek or Codex adds a full compatibility layer later, direct connection may become simple. Until then, a bridge layer is more reliable.&lt;/p&gt;
&lt;h2 id=&#34;what-if-codex-still-uses-openai-after-editing-the-config&#34;&gt;What If Codex Still Uses OpenAI After Editing the Config?
&lt;/h2&gt;&lt;p&gt;First, confirm the config file location. The global config should be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.codex/config.toml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The project-level &lt;code&gt;.codex/config.toml&lt;/code&gt; is not the right place for machine-level provider settings such as &lt;code&gt;model_provider&lt;/code&gt; and &lt;code&gt;model_providers&lt;/code&gt;. The official OpenAI docs also note that project-level configuration does not override local provider and authentication fields.&lt;/p&gt;
&lt;p&gt;If Codex still asks you to log in through the web, or appears to use the default OpenAI model, log out first:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codex &lt;span class=&#34;nb&#34;&gt;logout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Some older tutorials write this as &lt;code&gt;/logout&lt;/code&gt; inside the interactive UI. With the current CLI, running &lt;code&gt;codex logout&lt;/code&gt; directly in the terminal is the more reliable option.&lt;/p&gt;
&lt;p&gt;You can also run a quick check with a temporary profile:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codex --profile deepseek-ccx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Or:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codex -c &lt;span class=&#34;nv&#34;&gt;model_provider&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ccx-bridge -c &lt;span class=&#34;nv&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;deepseek-v4-flash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If that works, the config itself is readable. If it does not, check the profile name, TOML syntax, and whether the environment variable only exists in the current shell session.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting-checklist&#34;&gt;Troubleshooting Checklist
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;401&lt;/code&gt;: The key is wrong, or &lt;code&gt;env_key&lt;/code&gt; points to the wrong environment variable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;404&lt;/code&gt;: &lt;code&gt;base_url&lt;/code&gt; or the model name is wrong, or a Responses request is being sent to an endpoint that only supports Chat Completions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tool_calls&lt;/code&gt;, patch, or streaming parse errors: the protocol bridge is likely incomplete.&lt;/li&gt;
&lt;li&gt;Still prompted to log in to OpenAI: run &lt;code&gt;codex logout&lt;/code&gt;, then confirm you are using the correct profile.&lt;/li&gt;
&lt;li&gt;PowerShell environment variable disappears in a new window: &lt;code&gt;$env:...&lt;/code&gt; only applies to the current session. Use user environment variables if you need it to persist.&lt;/li&gt;
&lt;li&gt;OpenRouter BYOK is not using your own DeepSeek key: check whether the provider key is bound in OpenRouter, whether the current OpenRouter API key is allowed to use it, and whether fallback is enabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Using DeepSeek with Codex is not impossible through &lt;code&gt;config.toml&lt;/code&gt;. The catch is that changing only &lt;code&gt;base_url&lt;/code&gt; is usually not enough.&lt;/p&gt;
&lt;p&gt;The two steadier routes today are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use a local gateway as a protocol bridge: Codex talks to the local gateway, and the gateway talks to DeepSeek.&lt;/li&gt;
&lt;li&gt;Use OpenRouter BYOK as an online proxy: Codex talks to OpenRouter, while the DeepSeek key is bound in the OpenRouter dashboard.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you only want a quick test, OpenRouter is easier. If you want tighter control over keys, cost, and logs, a local gateway is better for long-term tinkering.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/codex/config-reference/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Codex Configuration Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://api-docs.deepseek.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DeepSeek API Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openrouter.ai/docs/use-cases/byok/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenRouter BYOK Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>What is CodeGraph? A local code map for Claude Code, Codex, and Cursor</title>
        <link>https://knightli.com/en/2026/05/23/codegraph-local-code-knowledge-graph-ai-coding-agent/</link>
        <pubDate>Sat, 23 May 2026 21:09:46 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/23/codegraph-local-code-knowledge-graph-ai-coding-agent/</guid>
        <description>&lt;p&gt;&lt;code&gt;CodeGraph&lt;/code&gt; is a local code knowledge graph designed for AI coding tools. It indexes a project ahead of time and organizes symbol relationships, call graphs, code structure, route relationships, and related information into a queryable graph. That lets Claude Code, Codex CLI, Cursor, OpenCode, Hermes Agent, and similar tools avoid relying on grep, glob, Read, and exploratory subagents every time they need to understand a project.&lt;/p&gt;
&lt;p&gt;It solves a very practical problem: when an AI Agent works on a large codebase, much of the cost is not spent on changing code, but on finding where the relevant code lives. If every task starts with repeated searches, reads, and filtering, tokens, time, and tool calls are wasted. &lt;code&gt;CodeGraph&lt;/code&gt; tries to turn the repository into a local map first, so the agent can ask the map before deciding which files to read.&lt;/p&gt;
&lt;h2 id=&#34;what-pain-points-does-it-address&#34;&gt;What pain points does it address?
&lt;/h2&gt;&lt;p&gt;AI coding tools usually work well in small projects. There are few files, search is fast, and reading files is cheap. In larger projects, common problems appear:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The agent repeatedly calls grep, find, ls, and Read just to understand one module.&lt;/li&gt;
&lt;li&gt;Exploratory subagents read many irrelevant files, while the main task context remains unclear.&lt;/li&gt;
&lt;li&gt;Architecture questions spend too many tokens locating files.&lt;/li&gt;
&lt;li&gt;Before changing a function, it is unclear who calls it and what it calls.&lt;/li&gt;
&lt;li&gt;In web projects, URL routes and handler functions are not always obvious.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;CodeGraph&lt;/code&gt; tries to move this &amp;ldquo;find the way first&amp;rdquo; work earlier. Once the project index exists, the agent can query related symbols, callers, callees, impact scope, and code snippets directly.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;The project provides cross-platform installation scripts and does not require users to prepare Node.js manually:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;On Windows PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;irm &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;githubusercontent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;colbymchenry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;codegraph&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;install&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;ps1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;iex
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you already have a Node environment, you can use npm directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx @colbymchenry/codegraph
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Or install it globally:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm i -g @colbymchenry/codegraph
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The installer detects and configures installed agents such as Claude Code, Cursor, Codex CLI, opencode, and Hermes Agent. It writes the relevant MCP server configuration and instruction files so those tools know when to call CodeGraph.&lt;/p&gt;
&lt;h2 id=&#34;initializing-a-project&#34;&gt;Initializing a project
&lt;/h2&gt;&lt;p&gt;After installation, build an index inside the target project:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; your-project
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codegraph init -i
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This command creates a project-level knowledge graph index. The README notes that as long as a &lt;code&gt;.codegraph/&lt;/code&gt; directory exists in the project, agents can automatically use CodeGraph tools.&lt;/p&gt;
&lt;p&gt;To stop using it, you can remove the global configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codegraph uninstall
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That removes the MCP server configuration, instructions, and permissions written by the installer. The &lt;code&gt;.codegraph/&lt;/code&gt; index in the project is not deleted automatically. To remove the project index, use &lt;code&gt;codegraph uninit&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;why-it-helps-agents&#34;&gt;Why it helps agents
&lt;/h2&gt;&lt;p&gt;Tools like Claude Code, Codex CLI, and Cursor often explore before making changes: find files, read entry points, inspect references, and follow call chains. For humans this feels like browsing a project. For models, it becomes a series of tool calls and context cost.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CodeGraph&lt;/code&gt; turns that into index queries. An agent can first use &lt;code&gt;codegraph_context&lt;/code&gt; to find relevant entry points, symbols, and snippets, then use &lt;code&gt;codegraph_explore&lt;/code&gt; or other tools to read the necessary details. The benefits are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fewer irrelevant files read.&lt;/li&gt;
&lt;li&gt;Fewer search tool calls.&lt;/li&gt;
&lt;li&gt;Faster discovery of relevant code.&lt;/li&gt;
&lt;li&gt;Clearer impact scope before edits.&lt;/li&gt;
&lt;li&gt;Easier answers to architecture questions in large repositories.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The README reports benchmark results across seven real open source repositories comparing runs with and without CodeGraph. On average, enabling CodeGraph reduced cost, tokens, latency, and tool calls. The exact numbers depend on project size, language, question type, and agent behavior, but the direction is clear: the larger the repository, the more valuable pre-indexing becomes.&lt;/p&gt;
&lt;h2 id=&#34;core-capabilities&#34;&gt;Core capabilities
&lt;/h2&gt;&lt;h3 id=&#34;1-smart-context-construction&#34;&gt;1. Smart context construction
&lt;/h3&gt;&lt;p&gt;One tool call can return entry points, related symbols, and code snippets, reducing the need for the agent to launch many exploratory tasks before filtering the results. This is useful for architecture understanding, module location, and feature entry-point analysis.&lt;/p&gt;
&lt;h3 id=&#34;2-full-text-search&#34;&gt;2. Full-text search
&lt;/h3&gt;&lt;p&gt;CodeGraph uses FTS5 for full-text search, letting it quickly search names and text across the codebase. It does not replace every grep use case, but it gives the agent a more structured first stop.&lt;/p&gt;
&lt;h3 id=&#34;3-impact-analysis&#34;&gt;3. Impact analysis
&lt;/h3&gt;&lt;p&gt;Before changing a function, class, method, or route, the agent can query callers, callees, and impact radius. This is especially useful for refactoring, bug fixing, and deleting old code, where missing upstream or downstream calls is the main risk.&lt;/p&gt;
&lt;h3 id=&#34;4-automatic-freshness&#34;&gt;4. Automatic freshness
&lt;/h3&gt;&lt;p&gt;The README says CodeGraph uses native filesystem events such as FSEvents, inotify, and ReadDirectoryChangesW, along with debounced auto-sync. In practice, the index updates as local code changes, so users do not need to rebuild it manually after every edit.&lt;/p&gt;
&lt;h3 id=&#34;5-multi-language-support&#34;&gt;5. Multi-language support
&lt;/h3&gt;&lt;p&gt;The project lists support for more than 19 languages, including TypeScript, JavaScript, Python, Go, Rust, Java, C#, PHP, Ruby, C, C++, Swift, Kotlin, Dart, Lua, Luau, Svelte, Liquid, and Pascal / Delphi.&lt;/p&gt;
&lt;p&gt;That makes it suitable for multi-language repositories and full-stack projects, not just one language.&lt;/p&gt;
&lt;h3 id=&#34;6-web-route-awareness&#34;&gt;6. Web route awareness
&lt;/h3&gt;&lt;p&gt;CodeGraph also detects route files and route declarations in many web frameworks, connecting URL patterns with handler functions. The README mentions Django, Flask, FastAPI, Express, NestJS, Laravel, Rails, Spring, Gin, Axum, ASP.NET, Vapor, React Router, SvelteKit, and others.&lt;/p&gt;
&lt;p&gt;This is practical because the real entry point of many web projects is not an obvious &lt;code&gt;main&lt;/code&gt; function, but routes, controllers, handlers, views, or resolvers. If an agent can first understand the URL-to-handler relationship, it can understand business flow much faster.&lt;/p&gt;
&lt;h2 id=&#34;local-first-design&#34;&gt;Local-first design
&lt;/h2&gt;&lt;p&gt;CodeGraph emphasizes being &lt;code&gt;100% local&lt;/code&gt;. It does not require an API key or external service. Index data is stored in a local SQLite database.&lt;/p&gt;
&lt;p&gt;For enterprise projects, private repositories, or sensitive code, this matters. The concern with AI coding tools is often not only &amp;ldquo;can they find the code?&amp;rdquo;, but &amp;ldquo;will the code structure and index be sent elsewhere?&amp;rdquo; CodeGraph is positioned as local indexing, local querying, and local service for agents.&lt;/p&gt;
&lt;p&gt;Of course, local indexing also means considering disk usage, indexing time, file watching, and project size. Very large repositories still require resources for initial indexing and later synchronization.&lt;/p&gt;
&lt;h2 id=&#34;suitable-scenarios&#34;&gt;Suitable scenarios
&lt;/h2&gt;&lt;p&gt;CodeGraph is a good fit for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Large codebases where architecture and call-chain questions are common.&lt;/li&gt;
&lt;li&gt;Teams using Claude Code, Codex CLI, Cursor, or similar agents for code understanding and edits.&lt;/li&gt;
&lt;li&gt;Reducing random file reads, broad searches, and repeated exploration by agents.&lt;/li&gt;
&lt;li&gt;Analyzing impact before code changes.&lt;/li&gt;
&lt;li&gt;Web projects with complex routing, where URL-to-handler lookup matters.&lt;/li&gt;
&lt;li&gt;Teams that want a more stable local project index for AI agents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a small project with a few dozen files, normal search may be enough and CodeGraph&amp;rsquo;s advantage may not be obvious. It is most valuable in medium-to-large repositories and workflows where agents do a lot of exploration.&lt;/p&gt;
&lt;h2 id=&#34;things-to-watch-out-for&#34;&gt;Things to watch out for
&lt;/h2&gt;&lt;p&gt;First, CodeGraph is not a substitute for code review or testing. It helps agents find relevant code faster, but it does not guarantee that their changes are correct.&lt;/p&gt;
&lt;p&gt;Second, index quality affects results. If a project has complex structure, lots of generated code, mixed languages, or unignored build artifacts, the index may become noisy. Before using it seriously, check &lt;code&gt;.gitignore&lt;/code&gt;, project layout, and indexing scope.&lt;/p&gt;
&lt;p&gt;Third, MCP configuration and agent instructions matter. The README also warns that CodeGraph helps only when it is queried properly. If an agent ignores it and still reads many files directly, pre-indexing becomes extra overhead.&lt;/p&gt;
&lt;p&gt;Fourth, even though it is local, permissions still matter. The installer writes agent configuration and permission lists. In team environments, review those configurations centrally.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;CodeGraph&lt;/code&gt; can be understood simply: it gives AI agents a local map of the codebase. It does not make the model smarter; it helps the model get less lost.&lt;/p&gt;
&lt;p&gt;When tools like Claude Code, Codex CLI, and Cursor face large repositories, the expensive part is often exploration. CodeGraph uses pre-indexed symbol relationships, call graphs, route graphs, and full-text search to handle &amp;ldquo;where is the code?&amp;rdquo; earlier, leaving more budget for understanding and editing.&lt;/p&gt;
&lt;p&gt;If you already use AI coding tools in real projects and often see the agent read many files without finding the point, CodeGraph is worth trying. It represents an important direction for AI coding tools: not only stronger models, but better local code context for those models.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/colbymchenry/codegraph&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/colbymchenry/codegraph&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Claude Code has a plugin marketplace now: what you can install, how to install it, and what to watch out for</title>
        <link>https://knightli.com/en/2026/05/23/claude-plugins-official-claude-code-plugin-directory/</link>
        <pubDate>Sat, 23 May 2026 19:03:30 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/23/claude-plugins-official-claude-code-plugin-directory/</guid>
        <description>&lt;p&gt;&lt;code&gt;anthropics/claude-plugins-official&lt;/code&gt; is the official Claude Code plugin directory managed by Anthropic. It is not just a normal code repository. It is a marketplace that Claude Code&amp;rsquo;s plugin system can use directly, collecting Claude Code plugins maintained or curated by Anthropic.&lt;/p&gt;
&lt;p&gt;This repository matters because Claude Code is moving from &amp;ldquo;an AI coding command-line tool&amp;rdquo; toward &amp;ldquo;an extensible development environment.&amp;rdquo; Plugins can package Skills, Agents, Hooks, MCP servers, LSP servers, background monitors, and default settings so teams and communities can distribute them in a consistent way.&lt;/p&gt;
&lt;h2 id=&#34;what-is-this-repository&#34;&gt;What is this repository?
&lt;/h2&gt;&lt;p&gt;The README describes it directly: it is a curated directory of high-quality Claude Code plugins.&lt;/p&gt;
&lt;p&gt;The directory is mainly split into two parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/plugins&lt;/code&gt;: plugins developed and maintained internally by Anthropic.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/external_plugins&lt;/code&gt;: third-party plugins from partners and the community.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, it contains both official capabilities and curated external ecosystem entries. For regular users, the direct value is that plugins can be discovered and installed through Claude Code&amp;rsquo;s &lt;code&gt;/plugin&lt;/code&gt; system. For developers, it is a useful window into Claude Code&amp;rsquo;s plugin format and ecosystem direction.&lt;/p&gt;
&lt;h2 id=&#34;how-to-install-plugins&#34;&gt;How to install plugins
&lt;/h2&gt;&lt;p&gt;The README gives a simple installation command. You can install directly through Claude Code&amp;rsquo;s plugin system:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/plugin install {plugin-name}@claude-plugins-official
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can also open the plugin discovery entry inside Claude Code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/plugin &amp;gt; Discover
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The key part is &lt;code&gt;@claude-plugins-official&lt;/code&gt;, which refers to the official plugin marketplace. According to the Claude Code documentation, &lt;code&gt;claude-plugins-official&lt;/code&gt; is the official marketplace maintained by Anthropic and is available by default in Claude Code installations.&lt;/p&gt;
&lt;h2 id=&#34;what-does-a-plugin-look-like&#34;&gt;What does a plugin look like?
&lt;/h2&gt;&lt;p&gt;The repository README shows a standard plugin structure:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;plugin-name/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── .claude-plugin/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── plugin.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── .mcp.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── commands/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── agents/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── skills/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── README.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;.claude-plugin/plugin.json&lt;/code&gt; is the metadata file, usually declaring the plugin name, description, version, author, and related fields. Other directories are optional and depend on what the plugin provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;skills/&lt;/code&gt;: instructions for skills Claude can invoke automatically.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commands/&lt;/code&gt;: slash commands.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agents/&lt;/code&gt;: custom agent definitions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hooks/&lt;/code&gt;: event-triggered logic.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.mcp.json&lt;/code&gt;: MCP server configuration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.lsp.json&lt;/code&gt;: language server configuration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;monitors/&lt;/code&gt;: background monitor configuration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;settings.json&lt;/code&gt;: default settings shipped with the plugin.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means a Claude Code plugin is not one single kind of extension. It is a packaging format. A plugin can be a tiny command, or it can be an entire workflow for a specific stack.&lt;/p&gt;
&lt;h2 id=&#34;what-directions-are-already-in-the-official-directory&#34;&gt;What directions are already in the official directory?
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;/plugins&lt;/code&gt; directory already covers many development scenarios, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LSP plugins: &lt;code&gt;typescript-lsp&lt;/code&gt;, &lt;code&gt;pyright-lsp&lt;/code&gt;, &lt;code&gt;rust-analyzer-lsp&lt;/code&gt;, &lt;code&gt;gopls-lsp&lt;/code&gt;, &lt;code&gt;clangd-lsp&lt;/code&gt;, &lt;code&gt;csharp-lsp&lt;/code&gt;, &lt;code&gt;jdtls-lsp&lt;/code&gt;, &lt;code&gt;kotlin-lsp&lt;/code&gt;, &lt;code&gt;lua-lsp&lt;/code&gt;, &lt;code&gt;php-lsp&lt;/code&gt;, &lt;code&gt;ruby-lsp&lt;/code&gt;, &lt;code&gt;swift-lsp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Programming workflows: &lt;code&gt;code-review&lt;/code&gt;, &lt;code&gt;feature-dev&lt;/code&gt;, &lt;code&gt;code-modernization&lt;/code&gt;, &lt;code&gt;code-simplifier&lt;/code&gt;, &lt;code&gt;commit-commands&lt;/code&gt;, &lt;code&gt;pr-review-toolkit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Claude Code configuration and plugin development: &lt;code&gt;claude-code-setup&lt;/code&gt;, &lt;code&gt;claude-md-management&lt;/code&gt;, &lt;code&gt;plugin-dev&lt;/code&gt;, &lt;code&gt;skill-creator&lt;/code&gt;, &lt;code&gt;mcp-server-dev&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Output styles and specialized capabilities: &lt;code&gt;explanatory-output-style&lt;/code&gt;, &lt;code&gt;learning-output-style&lt;/code&gt;, &lt;code&gt;security-guidance&lt;/code&gt;, &lt;code&gt;session-report&lt;/code&gt;, &lt;code&gt;math-olympiad&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;/external_plugins&lt;/code&gt; directory points toward more third-party tools and services, such as &lt;code&gt;github&lt;/code&gt;, &lt;code&gt;gitlab&lt;/code&gt;, &lt;code&gt;linear&lt;/code&gt;, &lt;code&gt;asana&lt;/code&gt;, &lt;code&gt;firebase&lt;/code&gt;, &lt;code&gt;playwright&lt;/code&gt;, &lt;code&gt;terraform&lt;/code&gt;, &lt;code&gt;context7&lt;/code&gt;, &lt;code&gt;serena&lt;/code&gt;, &lt;code&gt;telegram&lt;/code&gt;, and &lt;code&gt;discord&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Together, these plugins suggest a trend: Claude Code does not only want to edit files. It also wants to connect with code intelligence, project management, cloud services, testing, infrastructure, and team collaboration tools.&lt;/p&gt;
&lt;h2 id=&#34;why-the-plugin-system-matters&#34;&gt;Why the plugin system matters
&lt;/h2&gt;&lt;p&gt;Previously, many Claude Code customizations could live inside a project&amp;rsquo;s &lt;code&gt;.claude/&lt;/code&gt; directory, such as commands, agents, skills, or hooks. That works for personal workflows or one project, but it is not ideal for reuse across projects or consistent team distribution.&lt;/p&gt;
&lt;p&gt;Plugins solve the reuse and distribution problem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The same configuration can be installed across multiple projects.&lt;/li&gt;
&lt;li&gt;Commands and skills are namespaced, reducing conflicts.&lt;/li&gt;
&lt;li&gt;Plugins can be published and updated through a marketplace.&lt;/li&gt;
&lt;li&gt;Teams can package internal best practices as standard plugins.&lt;/li&gt;
&lt;li&gt;The community can maintain extensions for specific frameworks, languages, or services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This resembles VS Code extensions, JetBrains plugins, or browser extensions. Once a tool has a stable plugin ecosystem, it is no longer just a single product; it starts becoming a platform.&lt;/p&gt;
&lt;h2 id=&#34;what-does-it-mean-for-developers&#34;&gt;What does it mean for developers?
&lt;/h2&gt;&lt;p&gt;If you are only a Claude Code user, the most practical use of this repository is finding plugins. For example, if you need LSP support for TypeScript, Python, Rust, or Go, you can first check whether the official directory already has the corresponding plugin. If you need PR review, commit helpers, or code modernization workflows, the official plugins are also a good starting point.&lt;/p&gt;
&lt;p&gt;If you develop plugins, this repository is more like a reference library. You can study its directory layout, &lt;code&gt;plugin.json&lt;/code&gt; style, README structure, and how Anthropic combines skills, agents, MCP, LSP, and hooks.&lt;/p&gt;
&lt;p&gt;The Claude Code documentation also gives a clear guideline: use &lt;code&gt;.claude/&lt;/code&gt; for single-project customization, but turn it into a plugin when you want to share it with a team, reuse it across projects, version releases, or distribute it through a marketplace.&lt;/p&gt;
&lt;h2 id=&#34;security-boundaries-matter&#34;&gt;Security boundaries matter
&lt;/h2&gt;&lt;p&gt;The repository README opens with an important warning: make sure you trust a plugin before installing, updating, or using it. The reason is simple. A plugin may include MCP servers, files, scripts, or other software. Anthropic maintaining the directory does not mean every plugin will behave exactly as expected in your local environment.&lt;/p&gt;
&lt;p&gt;In practice, it is worth doing at least a few checks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read the plugin homepage and README before installing.&lt;/li&gt;
&lt;li&gt;Check whether it includes &lt;code&gt;.mcp.json&lt;/code&gt;, hooks, executable scripts, or background monitors.&lt;/li&gt;
&lt;li&gt;Be extra careful with plugins that access accounts, code repositories, chat tools, or cloud services.&lt;/li&gt;
&lt;li&gt;Test plugins in a sandbox or test repository before enabling them in important projects.&lt;/li&gt;
&lt;li&gt;In team environments, review plugin sources and versions centrally.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI coding plugins often have much higher privileges than ordinary editor themes. They may read project files, call external services, start local commands, or affect commit and deployment flows. Treat the trust boundary more strictly than &amp;ldquo;installing a small tool.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;relationship-with-the-community-marketplace&#34;&gt;Relationship with the community marketplace
&lt;/h2&gt;&lt;p&gt;The Claude Code documentation says Anthropic maintains two public plugin marketplaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;claude-plugins-official&lt;/code&gt;: a curated set of plugins maintained by Anthropic.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claude-community&lt;/code&gt;: a community plugin directory where third-party submissions go through review.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They have different roles. Community plugins can enter the review pipeline through submission forms. The official directory is curated separately by Anthropic, with no public application process. In short, &lt;code&gt;claude-plugins-official&lt;/code&gt; is closer to an official curated directory, while &lt;code&gt;claude-community&lt;/code&gt; is the open community directory.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;The significance of &lt;code&gt;anthropics/claude-plugins-official&lt;/code&gt; is not merely that another GitHub repository exists. It shows Claude Code&amp;rsquo;s extension mechanism becoming platform-like: Skills, Agents, Hooks, MCP, LSP, background monitors, and default settings can now be packaged, installed, updated, and distributed.&lt;/p&gt;
&lt;p&gt;For individual developers, the official plugin directory can lower the cost of configuring Claude Code. For teams, it offers a way to standardize internal workflows. For plugin developers, it shows the plugin structure and ecosystem direction Anthropic is endorsing.&lt;/p&gt;
&lt;p&gt;The next thing to watch is not just any single plugin, but whether the Claude Code plugin ecosystem forms stable layers: official curated plugins, community plugins, private team marketplaces, and specialized extensions for mainstream languages, frameworks, and SaaS services. If that path works, Claude Code will look more and more like a programmable AI development platform, not just a command-line assistant.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/anthropics/claude-plugins-official&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/anthropics/claude-plugins-official&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Claude Code plugin documentation: &lt;a class=&#34;link&#34; href=&#34;https://code.claude.com/docs/en/plugins&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://code.claude.com/docs/en/plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>What is oh-my-pi? An AI coding assistant that connects the terminal, IDE, and debugger</title>
        <link>https://knightli.com/en/2026/05/23/oh-my-pi-ai-coding-agent-terminal-ide-lsp-debugger/</link>
        <pubDate>Sat, 23 May 2026 19:02:20 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/23/oh-my-pi-ai-coding-agent-terminal-ide-lsp-debugger/</guid>
        <description>&lt;p&gt;&lt;code&gt;oh-my-pi&lt;/code&gt; is an AI Coding Agent for the terminal and editor. It is a fork of Mario Zechner&amp;rsquo;s &lt;code&gt;Pi&lt;/code&gt; project, extended by &lt;code&gt;can1357&lt;/code&gt;. Its goal is not just to provide a command-line chat UI, but to connect file reading, code search, structured edits, LSP, debuggers, browsers, subagents, and multiple model providers into one coding workflow.&lt;/p&gt;
&lt;p&gt;From the project README, it feels more like an AI coding tool layer than a simple assistant: you can use it interactively in the terminal, connect editors through ACP, or embed it in Node projects through the SDK. For people already using Claude Code, Codex CLI, Cline, Cursor, or other agent tools, the interesting part is that &lt;code&gt;oh-my-pi&lt;/code&gt; turns many abilities that usually live in separate tools into one built-in tool surface.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-is-it-trying-to-solve&#34;&gt;What problem is it trying to solve?
&lt;/h2&gt;&lt;p&gt;For many AI coding tools, the weak point is not the model itself, but the tool interface around it. When a model wants to change code but only has rough full-file reads, fragile string replacement, and one-off shell commands, the toolchain amplifies failure.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;oh-my-pi&lt;/code&gt; tries to reduce those common points of friction:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File reads prefer structured summaries instead of dumping whole files into context.&lt;/li&gt;
&lt;li&gt;Search, glob, find, syntax highlighting, and token counting are implemented natively where possible, reducing dependence on external commands.&lt;/li&gt;
&lt;li&gt;Code writes can use LSP so renames, references, and file moves behave more like IDE operations.&lt;/li&gt;
&lt;li&gt;Debugging can use DAP tools such as &lt;code&gt;lldb&lt;/code&gt;, &lt;code&gt;dlv&lt;/code&gt;, and &lt;code&gt;debugpy&lt;/code&gt;, instead of relying only on logs and guesses.&lt;/li&gt;
&lt;li&gt;Complex tasks can be split across subagents and returned as structured results.&lt;/li&gt;
&lt;li&gt;Edits use content anchors and previews to reduce the chance of a bad patch landing directly on disk.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These choices show that the focus is not &amp;ldquo;can the model answer?&amp;rdquo;, but &amp;ldquo;can the model reliably complete a real code change?&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;The project provides several installation paths. On macOS and Linux, you can use the install script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://omp.sh/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you use Bun, the README recommends installing the npm package globally:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun install -g @oh-my-pi/pi-coding-agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;On Windows PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;irm &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;omp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;install&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;ps1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;iex
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The README also mentions pinning versions with &lt;code&gt;mise&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mise use -g github:can1357/oh-my-pi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Before installing, check the Bun version requirement. The README lists macOS, Linux, and Windows support, and requires &lt;code&gt;bun &amp;gt;= 1.3.14&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;capabilities-worth-watching&#34;&gt;Capabilities worth watching
&lt;/h2&gt;&lt;h3 id=&#34;1-tool-calling-goes-beyond-shell-commands&#34;&gt;1. Tool calling goes beyond shell commands
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;oh-my-pi&lt;/code&gt; includes tools for file reads, search, writes, edits, AST edits, browser use, task splitting, debugging, and LSP. The README mentions 32 built-in tools, 13 LSP operations, and 27 DAP operations.&lt;/p&gt;
&lt;p&gt;That means the agent does not have to wrap everything as command-line output. Reference lookup can go through LSP, PRs and issues can be read through a unified file-like interface, and web pages or PDFs can be converted into Markdown with link structure intact before being passed to the model.&lt;/p&gt;
&lt;h3 id=&#34;2-lsp-integration-is-useful-for-real-codebases&#34;&gt;2. LSP integration is useful for real codebases
&lt;/h3&gt;&lt;p&gt;In large projects, renaming and moving files often breaks re-exports, aliased imports, barrel files, or cross-directory references. The &lt;code&gt;oh-my-pi&lt;/code&gt; README highlights that write paths can go through LSP. For example, file renames use &lt;code&gt;workspace/willRenameFiles&lt;/code&gt;, making edits closer to semantic IDE operations.&lt;/p&gt;
&lt;p&gt;This is useful for everyday refactoring in TypeScript, Rust, Go, Python, and similar projects, especially in cases where manual edits are possible but easy to miss.&lt;/p&gt;
&lt;h3 id=&#34;3-the-debugger-is-a-first-class-tool&#34;&gt;3. The debugger is a first-class tool
&lt;/h3&gt;&lt;p&gt;Many AI coding flows still debug by adding logs, rerunning, and reading output. &lt;code&gt;oh-my-pi&lt;/code&gt; connects DAP debuggers to the tool surface. The README gives examples with C programs using &lt;code&gt;lldb&lt;/code&gt;, Go services using &lt;code&gt;dlv&lt;/code&gt;, and Python processes using &lt;code&gt;debugpy&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That changes how an agent handles bugs: it can pause a process, inspect stack frames, read local variables, and then decide what to do next, instead of guessing from error text alone.&lt;/p&gt;
&lt;h3 id=&#34;4-hashline-editing-reduces-patch-failures&#34;&gt;4. Hashline editing reduces patch failures
&lt;/h3&gt;&lt;p&gt;The project emphasizes &lt;code&gt;Hashline&lt;/code&gt;, an editing approach based on content anchors. The goal is to let the model point to the content it wants to change instead of repeatedly emitting large diffs. This reduces edit failures caused by whitespace, stale context, or failed string matching.&lt;/p&gt;
&lt;p&gt;For agent tools, this matters a lot. Even a capable model feels clumsy if the write interface keeps failing and forcing retries.&lt;/p&gt;
&lt;h3 id=&#34;5-subagents-and-workspace-isolation&#34;&gt;5. Subagents and workspace isolation
&lt;/h3&gt;&lt;p&gt;The README introduces a &lt;code&gt;task&lt;/code&gt; subagent capability: a task can be split across isolated workers, and results are returned as structured objects. The project also includes workspace isolation logic for parallel tasks, branch exploration, and avoiding overlapping edits.&lt;/p&gt;
&lt;p&gt;This fits code review, migrations, bulk fixes, and test investigation. The value is not only speed; it is also cleaner separation between different exploration paths.&lt;/p&gt;
&lt;h3 id=&#34;6-it-can-inherit-existing-rules-and-configs&#34;&gt;6. It can inherit existing rules and configs
&lt;/h3&gt;&lt;p&gt;On first run, &lt;code&gt;oh-my-pi&lt;/code&gt; can read rules and configuration left by other tools, including &lt;code&gt;.claude&lt;/code&gt;, &lt;code&gt;.cursor&lt;/code&gt;, &lt;code&gt;.windsurf&lt;/code&gt;, &lt;code&gt;.gemini&lt;/code&gt;, &lt;code&gt;.codex&lt;/code&gt;, &lt;code&gt;.cline&lt;/code&gt;, &lt;code&gt;.github/copilot&lt;/code&gt;, and &lt;code&gt;.vscode&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That is practical. Many teams have already written rules for several AI tools. Rewriting them for every new tool is expensive, so &lt;code&gt;oh-my-pi&lt;/code&gt; tries to reuse what is already on disk.&lt;/p&gt;
&lt;h2 id=&#34;four-entry-points&#34;&gt;Four entry points
&lt;/h2&gt;&lt;p&gt;The project provides four main ways to use it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interactive TUI: run &lt;code&gt;omp&lt;/code&gt; directly in the terminal.&lt;/li&gt;
&lt;li&gt;One-shot command: use &lt;code&gt;omp -p&lt;/code&gt; to send a single prompt.&lt;/li&gt;
&lt;li&gt;Node SDK: embed it in a Node or TypeScript project through &lt;code&gt;@oh-my-pi/pi-coding-agent&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;RPC / ACP: connect other programs and editors through stdio or Agent Client Protocol.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means it is not only for individual terminal users. It also leaves room for IDEs, plugins, automation platforms, and internal tools.&lt;/p&gt;
&lt;h2 id=&#34;who-should-try-it&#34;&gt;Who should try it?
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;oh-my-pi&lt;/code&gt; is a good fit for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developers who often edit, debug, and review code in the terminal.&lt;/li&gt;
&lt;li&gt;People already using AI Coding Agents but unhappy with file reading, patching, search, or debugging reliability.&lt;/li&gt;
&lt;li&gt;Developers who want to connect an agent to an editor, RPC layer, or Node service.&lt;/li&gt;
&lt;li&gt;Users who need to switch between multiple models and providers in one tool.&lt;/li&gt;
&lt;li&gt;Tool builders interested in LSP, DAP, AST editing, and subagent workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you only want a chat-style coding assistant that works immediately, the learning curve may feel high. It is better suited to people willing to understand the toolchain and treat the agent as a configurable development environment.&lt;/p&gt;
&lt;h2 id=&#34;what-to-keep-in-mind&#34;&gt;What to keep in mind
&lt;/h2&gt;&lt;p&gt;First, &lt;code&gt;oh-my-pi&lt;/code&gt; is still a fast-moving open source project. Commits are frequent, and there are many issues and pull requests, so installation and usage may change.&lt;/p&gt;
&lt;p&gt;Second, its capabilities depend heavily on your local environment. LSP, debuggers, Bun, model-provider authentication, terminal setup, and Windows or Unix differences can all affect the experience.&lt;/p&gt;
&lt;p&gt;Third, having many built-in tools does not mean every scenario should enable everything. In practice, it is better to enable the tools needed for the task and configure rules, permissions, and workspace boundaries clearly.&lt;/p&gt;
&lt;p&gt;Fourth, an AI Agent can write code, but it can also change the wrong code. Even with previews and content-anchored edits, important projects still need version control, tests, and human review.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;The interesting part of &lt;code&gt;oh-my-pi&lt;/code&gt; is not that it is another AI terminal shell. It is that it reorganizes the tool layer that often holds AI coding back: file reading, search, editing, LSP, debugging, browser access, subagents, and SDK integration all sit inside one agent workflow.&lt;/p&gt;
&lt;p&gt;It is worth watching for people who care about AI coding infrastructure, and for developers comparing different Coding Agent approaches. The competition in AI coding tools is no longer just about model answer quality. It is also about who can connect models reliably to real codebases, real debugging workflows, and real team rules. &lt;code&gt;oh-my-pi&lt;/code&gt; is an ambitious open source attempt in that direction.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/can1357/oh-my-pi&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/can1357/oh-my-pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official site: &lt;a class=&#34;link&#34; href=&#34;https://omp.sh/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://omp.sh/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SDK documentation: &lt;a class=&#34;link&#34; href=&#34;https://omp.sh/docs/sdk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://omp.sh/docs/sdk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Bun: JavaScript runtime, package manager, test runner, and bundler in one tool</title>
        <link>https://knightli.com/en/2026/05/17/bun-javascript-toolkit/</link>
        <pubDate>Sun, 17 May 2026 17:42:25 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/17/bun-javascript-toolkit/</guid>
        <description>&lt;p&gt;Bun is an open source JavaScript / TypeScript all-in-one toolchain from oven-sh.&lt;/p&gt;
&lt;p&gt;It is not just trying to be a faster Node.js replacement. It puts the runtime, package manager, script runner, test runner, and bundler behind the same &lt;code&gt;bun&lt;/code&gt; command. For frontend and Node.js developers, the appeal is simple: install fewer tools, wait less during installation and builds, and complete many common tasks with one command.&lt;/p&gt;
&lt;p&gt;Project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/oven-sh/bun&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/oven-sh/bun&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;bottom-line&#34;&gt;Bottom line
&lt;/h2&gt;&lt;p&gt;Bun is best for people who want to simplify the JavaScript toolchain.&lt;/p&gt;
&lt;p&gt;It can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run JavaScript, TypeScript, JSX, and TSX.&lt;/li&gt;
&lt;li&gt;Act as a Node.js-compatible runtime.&lt;/li&gt;
&lt;li&gt;Replace npm / yarn / pnpm for package management.&lt;/li&gt;
&lt;li&gt;Run scripts from &lt;code&gt;package.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Execute tests.&lt;/li&gt;
&lt;li&gt;Bundle frontend or backend code.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;bunx&lt;/code&gt; to run commands from npm packages.&lt;/li&gt;
&lt;li&gt;Provide built-in APIs such as &lt;code&gt;Bun.serve&lt;/code&gt;, &lt;code&gt;bun:sqlite&lt;/code&gt;, &lt;code&gt;Bun.sql&lt;/code&gt;, &lt;code&gt;Bun.redis&lt;/code&gt;, and &lt;code&gt;Bun.s3&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Its clearest value is developer experience: fast installs, fast startup, unified commands, and TypeScript / JSX that work out of the box.&lt;/p&gt;
&lt;p&gt;But Bun is not something every project should switch to immediately. Large Node.js applications, projects with many native extensions, and production services with strict stability requirements still need careful compatibility, build, test, and deployment validation.&lt;/p&gt;
&lt;h2 id=&#34;what-bun-is&#34;&gt;What Bun is
&lt;/h2&gt;&lt;p&gt;According to the official README, Bun is an all-in-one toolkit for JavaScript and TypeScript applications. It ships as a single executable named &lt;code&gt;bun&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;At its core is the Bun runtime: a fast JavaScript runtime intended as a drop-in replacement for Node.js. Bun is written in Zig, built on JavaScriptCore, and optimized for startup time and memory usage.&lt;/p&gt;
&lt;p&gt;That means you can run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run index.tsx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;TypeScript and JSX can run without extra setup.&lt;/p&gt;
&lt;p&gt;The same &lt;code&gt;bun&lt;/code&gt; command also includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;test runner&lt;/li&gt;
&lt;li&gt;script runner&lt;/li&gt;
&lt;li&gt;Node.js-compatible package manager&lt;/li&gt;
&lt;li&gt;bundler&lt;/li&gt;
&lt;li&gt;package runner&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Common commands include:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run start
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun install &amp;lt;pkg&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bunx cowsay &lt;span class=&#34;s1&#34;&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;A typical project may otherwise include &lt;code&gt;node&lt;/code&gt;, &lt;code&gt;npm&lt;/code&gt;, &lt;code&gt;pnpm&lt;/code&gt;, &lt;code&gt;tsx&lt;/code&gt;, &lt;code&gt;jest&lt;/code&gt;, &lt;code&gt;vitest&lt;/code&gt;, &lt;code&gt;webpack&lt;/code&gt;, &lt;code&gt;esbuild&lt;/code&gt;, and &lt;code&gt;ts-node&lt;/code&gt;. Bun tries to absorb many of those high-frequency paths into one tool.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;Bun supports Linux, macOS, and Windows on x64 and arm64.&lt;/p&gt;
&lt;p&gt;The official install script is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://bun.com/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Windows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;powershell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;irm bun.sh/install.ps1 | iex&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It can also be installed through npm:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g bun
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;macOS Homebrew:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew tap oven-sh/bun
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install bun
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Docker:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker pull oven/bun
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --rm --init --ulimit &lt;span class=&#34;nv&#34;&gt;memlock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;-1:-1 oven/bun
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Linux users should note the kernel requirement. The README strongly recommends Linux kernel &lt;code&gt;5.6&lt;/code&gt; or newer, with &lt;code&gt;5.1&lt;/code&gt; as the minimum.&lt;/p&gt;
&lt;p&gt;Upgrade to the latest version:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Upgrade to canary:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun upgrade --canary
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Canary is usually not a good choice for production unless you are validating a new feature or investigating a specific bug.&lt;/p&gt;
&lt;h2 id=&#34;why-bun-is-fast&#34;&gt;Why Bun is fast
&lt;/h2&gt;&lt;p&gt;Bun’s speed comes from several layers.&lt;/p&gt;
&lt;p&gt;First, runtime startup is fast. Many CLI tools and development scripts are not limited by long CPU work, but by process startup, module loading, TypeScript transpilation, and dependency resolution. Bun optimizes these paths.&lt;/p&gt;
&lt;p&gt;Second, package management is fast. &lt;code&gt;bun install&lt;/code&gt; aims to replace npm / yarn / pnpm installation workflows. It uses a global cache and its own lockfile, which can noticeably reduce waiting time in dependency-heavy projects.&lt;/p&gt;
&lt;p&gt;Third, TypeScript / JSX work out of the box. Many projects only need to run a &lt;code&gt;.ts&lt;/code&gt; or &lt;code&gt;.tsx&lt;/code&gt; script. Traditional Node.js setups need &lt;code&gt;tsx&lt;/code&gt;, &lt;code&gt;ts-node&lt;/code&gt;, Babel, or a build step. Bun can run these files directly and reduces glue tooling.&lt;/p&gt;
&lt;p&gt;Fourth, built-in tools reduce process and configuration switching. Testing, scripts, bundling, and runtime execution all live in one tool.&lt;/p&gt;
&lt;p&gt;Still, “Bun is fast” does not mean every project will be faster. Real results depend on dependency types, script logic, test framework, build configuration, Node.js API usage, and CI cache strategy.&lt;/p&gt;
&lt;h2 id=&#34;package-management-replacing-npm--yarn--pnpm&#34;&gt;Package management: replacing npm / yarn / pnpm
&lt;/h2&gt;&lt;p&gt;Bun can install dependencies directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Add a dependency:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun add react
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Add a development dependency:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun add -d typescript
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Remove a dependency:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun remove react
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explain why a dependency exists:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun why react
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Security audit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun audit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When migrating from npm or pnpm, check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether &lt;code&gt;bun.lock&lt;/code&gt; is committed.&lt;/li&gt;
&lt;li&gt;Whether CI uses &lt;code&gt;bun install --frozen-lockfile&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Whether private registries and &lt;code&gt;.npmrc&lt;/code&gt; are compatible.&lt;/li&gt;
&lt;li&gt;Whether workspace behavior matches expectations.&lt;/li&gt;
&lt;li&gt;Whether lifecycle scripts introduce security risk.&lt;/li&gt;
&lt;li&gt;Whether pnpm-specific monorepo behavior can migrate smoothly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Small projects can try it directly. Large monorepos should not switch everything at once; start with one package or a non-blocking CI job.&lt;/p&gt;
&lt;h2 id=&#34;running-scripts-and-typescript&#34;&gt;Running scripts and TypeScript
&lt;/h2&gt;&lt;p&gt;Bun can run scripts from &lt;code&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It can also run files directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run index.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run index.tsx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is useful for tool scripts such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;scripts/build.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/seed.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/migrate.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/check.ts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With Node.js, these often require a TypeScript loader or precompilation. Bun’s direct execution makes those scripts lighter.&lt;/p&gt;
&lt;p&gt;If a script depends on Node.js-specific behavior, especially loaders, ESM/CJS edges, native modules, child processes, file watching, or edge APIs, it still needs testing.&lt;/p&gt;
&lt;h2 id=&#34;test-runner&#34;&gt;Test runner
&lt;/h2&gt;&lt;p&gt;Bun includes a test runner:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It is suitable for small projects that want less Jest / Vitest configuration, and for moving some unit tests, tool tests, or library tests to a lighter runner.&lt;/p&gt;
&lt;p&gt;When migrating tests, pay attention to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;expect&lt;/code&gt; behavior.&lt;/li&gt;
&lt;li&gt;mock API differences.&lt;/li&gt;
&lt;li&gt;snapshot behavior.&lt;/li&gt;
&lt;li&gt;DOM test environment.&lt;/li&gt;
&lt;li&gt;test discovery rules.&lt;/li&gt;
&lt;li&gt;coverage output.&lt;/li&gt;
&lt;li&gt;CI reporter support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a project deeply depends on Jest features, such as custom matchers, complex mocks, jsdom, babel-jest, or ts-jest, migration should be gradual. Let new modules use &lt;code&gt;bun test&lt;/code&gt; while old suites remain on the existing framework.&lt;/p&gt;
&lt;h2 id=&#34;bundling-and-builds&#34;&gt;Bundling and builds
&lt;/h2&gt;&lt;p&gt;Bun also provides a bundler:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun build ./src/index.ts --outdir ./dist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It can be used for frontend bundles, backend scripts, CLI tools, and libraries. Bun’s docs also cover loaders, plugins, macros, CSS, HTML, HMR, minifier, and single-file executables.&lt;/p&gt;
&lt;p&gt;Good early candidates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Small frontend tools.&lt;/li&gt;
&lt;li&gt;Node.js CLI projects.&lt;/li&gt;
&lt;li&gt;Internal scripts.&lt;/li&gt;
&lt;li&gt;Single-file services.&lt;/li&gt;
&lt;li&gt;Projects that do not depend on complex webpack loaders.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Be careful with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complex webpack plugin chains.&lt;/li&gt;
&lt;li&gt;Large Vite plugin setups.&lt;/li&gt;
&lt;li&gt;Deep Babel transformations.&lt;/li&gt;
&lt;li&gt;Special CSS / asset pipelines.&lt;/li&gt;
&lt;li&gt;Micro-frontends and module federation.&lt;/li&gt;
&lt;li&gt;Projects with strict requirements for hashes, chunks, and compatibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bun’s bundler is attractive, but migrating build tools is usually riskier than changing the package manager. Validate it separately.&lt;/p&gt;
&lt;h2 id=&#34;running-http-services&#34;&gt;Running HTTP services
&lt;/h2&gt;&lt;p&gt;Bun provides &lt;code&gt;Bun.serve&lt;/code&gt; for HTTP services:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Bun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;serve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;3000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello from Bun&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is convenient for small APIs, internal services, webhook receivers, and edge-style services. Bun also provides APIs such as WebSockets, Workers, Streams, SQLite, PostgreSQL, Redis, S3, and TCP/UDP sockets.&lt;/p&gt;
&lt;p&gt;If you already use Express, Fastify, NestJS, Next.js, Hono, Elysia, or another framework, check their Bun compatibility before rewriting anything.&lt;/p&gt;
&lt;p&gt;A practical path is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use Bun first for development scripts and package management.&lt;/li&gt;
&lt;li&gt;Then try Bun for tests.&lt;/li&gt;
&lt;li&gt;Only later evaluate whether the production runtime should move to Bun.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Runtime migration needs the most care because it directly affects production behavior.&lt;/p&gt;
&lt;h2 id=&#34;relationship-with-nodejs&#34;&gt;Relationship with Node.js
&lt;/h2&gt;&lt;p&gt;One of Bun’s goals is to be a drop-in replacement for Node.js, but compatibility is not the same as complete equivalence.&lt;/p&gt;
&lt;p&gt;The Node.js ecosystem has accumulated many subtle behaviors around:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CJS / ESM interop.&lt;/li&gt;
&lt;li&gt;Node built-in modules.&lt;/li&gt;
&lt;li&gt;Native extensions.&lt;/li&gt;
&lt;li&gt;npm lifecycle scripts.&lt;/li&gt;
&lt;li&gt;Filesystem edge behavior.&lt;/li&gt;
&lt;li&gt;stream and Buffer details.&lt;/li&gt;
&lt;li&gt;worker / child_process.&lt;/li&gt;
&lt;li&gt;debugging and profiling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bun is improving compatibility quickly, but production migration should be judged by tests.&lt;/p&gt;
&lt;p&gt;Practical questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do your tests pass under Bun?&lt;/li&gt;
&lt;li&gt;Do key dependencies support Bun?&lt;/li&gt;
&lt;li&gt;Are build artifacts equivalent?&lt;/li&gt;
&lt;li&gt;Are CI and local behavior consistent?&lt;/li&gt;
&lt;li&gt;Do you have monitoring and rollback in production?&lt;/li&gt;
&lt;li&gt;Are Docker images and deployment scripts stable?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Replacing only the package manager is lower risk. Replacing the production runtime is much higher risk.&lt;/p&gt;
&lt;h2 id=&#34;suitable-projects&#34;&gt;Suitable projects
&lt;/h2&gt;&lt;p&gt;Bun fits well for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New small JavaScript / TypeScript projects.&lt;/li&gt;
&lt;li&gt;Internal tools and scripts.&lt;/li&gt;
&lt;li&gt;CLI projects.&lt;/li&gt;
&lt;li&gt;CI jobs that need faster dependency installation.&lt;/li&gt;
&lt;li&gt;Frontend projects that want less toolchain complexity.&lt;/li&gt;
&lt;li&gt;Scripts and services where startup speed matters.&lt;/li&gt;
&lt;li&gt;Developers who want TypeScript to run out of the box.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use more caution with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Very large monorepos.&lt;/li&gt;
&lt;li&gt;Projects deeply tied to pnpm workspace behavior.&lt;/li&gt;
&lt;li&gt;Services with many Node.js native extensions.&lt;/li&gt;
&lt;li&gt;Frontend builds with highly customized pipelines.&lt;/li&gt;
&lt;li&gt;Backends that require strict production runtime consistency.&lt;/li&gt;
&lt;li&gt;Test suites deeply tied to Jest.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A conservative but practical strategy is to treat Bun as a development tool first, not as an immediate replacement for every production runtime.&lt;/p&gt;
&lt;h2 id=&#34;migration-advice&#34;&gt;Migration advice
&lt;/h2&gt;&lt;p&gt;To try Bun in an existing project:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Bun locally.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;bun install&lt;/code&gt; and inspect dependency installation.&lt;/li&gt;
&lt;li&gt;Commit or temporarily keep &lt;code&gt;bun.lock&lt;/code&gt; to avoid lockfile confusion.&lt;/li&gt;
&lt;li&gt;Try &lt;code&gt;bun run &amp;lt;script&amp;gt;&lt;/code&gt; on common scripts.&lt;/li&gt;
&lt;li&gt;Migrate a small number of tests with &lt;code&gt;bun test&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add a non-blocking Bun job in CI.&lt;/li&gt;
&lt;li&gt;If compatibility looks good, consider changing the main install flow.&lt;/li&gt;
&lt;li&gt;Evaluate production runtime migration last.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For team projects, keep a rollback path:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preserve the old npm / pnpm / yarn flow during migration.&lt;/li&gt;
&lt;li&gt;Run both flows in CI for a while.&lt;/li&gt;
&lt;li&gt;Do not change runtime, package manager, test framework, and bundler in the same change.&lt;/li&gt;
&lt;li&gt;Split migration into small, verifiable steps.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is slower, but it avoids mixing too many problems together.&lt;/p&gt;
&lt;h2 id=&#34;common-commands&#34;&gt;Common commands
&lt;/h2&gt;&lt;p&gt;Install:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://bun.com/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Upgrade:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Install dependencies:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Add a dependency:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun add lodash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Run a script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Run TypeScript directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run scripts/build.ts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Test:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Bundle:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun build ./src/index.ts --outdir ./dist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Run a package command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bunx cowsay &lt;span class=&#34;s1&#34;&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Bun’s value is not just “faster than Node.js.” More importantly, it pulls many scattered JavaScript / TypeScript development tools into one &lt;code&gt;bun&lt;/code&gt; command: runtime, package manager, script runner, test runner, and bundler.&lt;/p&gt;
&lt;p&gt;For new projects and internal tools, this integrated experience can be pleasant: fast installs, fast startup, less configuration, and direct TypeScript / JSX execution. For large existing projects, Bun is better introduced through low-risk areas first, such as package installation, scripts, and selected tests, before validating builds and runtime behavior.&lt;/p&gt;
&lt;p&gt;If Node.js toolchain installation speed, configuration fragments, and slow test startup often bother you, Bun is worth a serious try. But production migration still comes back to basic engineering judgment: do tests pass, are dependencies compatible, is CI stable, and do you have rollback?&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/oven-sh/bun&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;oven-sh/bun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bun.com/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bun Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bun.com/docs/installation&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bun Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bun.com/docs/runtime/nodejs-compat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bun Node.js compatibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Godot Game Development Beginner Guide: From Nodes and Scenes to Your First 2D Game</title>
        <link>https://knightli.com/en/2026/05/17/godot-game-development-beginner-guide/</link>
        <pubDate>Sun, 17 May 2026 12:37:30 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/17/godot-game-development-beginner-guide/</guid>
        <description>&lt;p&gt;Godot is an open-source game engine suitable for 2D games, independent prototypes, and medium-scale 3D projects.&lt;/p&gt;
&lt;p&gt;Its biggest strengths are that it is lightweight, open source, fast to start, and built around a clear node-and-scene model. For beginners, Godot is usually easier to approach than Unity. For independent developers, it is also easier to keep projects small and controllable.&lt;/p&gt;
&lt;p&gt;This guide keeps the path simple: understand nodes and scenes, learn basic GDScript, then build a small 2D game that connects input, physics, collision, UI, audio, and export.&lt;/p&gt;
&lt;h2 id=&#34;bottom-line&#34;&gt;Bottom line
&lt;/h2&gt;&lt;p&gt;Do not start by learning every engine feature.&lt;/p&gt;
&lt;p&gt;A better path is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start with 2D, not 3D.&lt;/li&gt;
&lt;li&gt;Understand nodes and scenes before complex architecture.&lt;/li&gt;
&lt;li&gt;Learn GDScript first, not C#.&lt;/li&gt;
&lt;li&gt;Build one small game that can start, fail, and restart.&lt;/li&gt;
&lt;li&gt;Then add animation, audio, UI, levels, and export.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Completing one tiny game teaches more than watching many unrelated tutorials.&lt;/p&gt;
&lt;h2 id=&#34;who-godot-is-good-for&#34;&gt;Who Godot is good for
&lt;/h2&gt;&lt;p&gt;Godot is a strong fit if you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;want to learn game development from zero,&lt;/li&gt;
&lt;li&gt;want to build 2D indie games,&lt;/li&gt;
&lt;li&gt;need fast gameplay prototypes,&lt;/li&gt;
&lt;li&gt;do not want a heavy commercial engine workflow,&lt;/li&gt;
&lt;li&gt;want to understand how engines organize game objects,&lt;/li&gt;
&lt;li&gt;have some Python or JavaScript experience and want an easy scripting language.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unity and Unreal still have advantages for large commercial pipelines, asset stores, mobile monetization SDKs, or high-end 3D visuals. But for learning and making your own games, Godot is an excellent starting point.&lt;/p&gt;
&lt;h2 id=&#34;installation-and-project-creation&#34;&gt;Installation and project creation
&lt;/h2&gt;&lt;p&gt;Godot is simple to install: download it from the official website, unzip it, and run it.&lt;/p&gt;
&lt;p&gt;For the first project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the default renderer.&lt;/li&gt;
&lt;li&gt;Use an English project name.&lt;/li&gt;
&lt;li&gt;Avoid paths with too many spaces or non-ASCII characters.&lt;/li&gt;
&lt;li&gt;Use Git from the beginning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A simple project name:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;first-godot-game
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Learn the editor areas first: Scene tree, FileSystem, Inspector, Script editor, and 2D / 3D viewport.&lt;/p&gt;
&lt;h2 id=&#34;core-idea-nodes-and-scenes&#34;&gt;Core idea: nodes and scenes
&lt;/h2&gt;&lt;p&gt;The two most important Godot concepts are nodes and scenes.&lt;/p&gt;
&lt;p&gt;Nodes are functional units:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Node2D&lt;/code&gt;: base 2D object.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sprite2D&lt;/code&gt;: displays an image.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CollisionShape2D&lt;/code&gt;: collision shape.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CharacterBody2D&lt;/code&gt;: controllable character.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Camera2D&lt;/code&gt;: 2D camera.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AudioStreamPlayer&lt;/code&gt;: audio playback.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Label&lt;/code&gt;: text display.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A scene is a reusable group of nodes. A player can be a scene, an enemy can be a scene, and a level can be a scene.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Player (CharacterBody2D)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── Sprite2D
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── CollisionShape2D
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── Camera2D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The player handles movement, &lt;code&gt;Sprite2D&lt;/code&gt; displays the image, &lt;code&gt;CollisionShape2D&lt;/code&gt; handles collision, and &lt;code&gt;Camera2D&lt;/code&gt; follows the player.&lt;/p&gt;
&lt;h2 id=&#34;what-to-build-first&#34;&gt;What to build first
&lt;/h2&gt;&lt;p&gt;Do not start with an RPG, open world, networking, or complex platformer.&lt;/p&gt;
&lt;p&gt;Build a tiny 2D dodging game:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The player moves up, down, left, and right.&lt;/li&gt;
&lt;li&gt;Enemies spawn from screen edges.&lt;/li&gt;
&lt;li&gt;Touching an enemy means failure.&lt;/li&gt;
&lt;li&gt;Survival time becomes score.&lt;/li&gt;
&lt;li&gt;There is a start button, game-over screen, and restart.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This small project covers movement, input, collision, spawning, UI, timers, audio, and scene reloads.&lt;/p&gt;
&lt;h2 id=&#34;player-movement&#34;&gt;Player movement
&lt;/h2&gt;&lt;p&gt;Use &lt;code&gt;CharacterBody2D&lt;/code&gt; for a controllable player.&lt;/p&gt;
&lt;p&gt;Attach a script to &lt;code&gt;Player&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;CharacterBody2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@export&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;speed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;300.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_physics_process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Vector2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ZERO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get_axis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;move_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;move_right&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get_axis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;move_up&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;move_down&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;normalized&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;velocity&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;speed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;move_and_slide&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then define input actions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_left  -&amp;gt; A / Left
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_right -&amp;gt; D / Right
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_up    -&amp;gt; W / Up
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_down  -&amp;gt; S / Down
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Use input actions instead of hard-coded key codes. It makes keyboard, gamepad, touch, and remapping easier later.&lt;/p&gt;
&lt;h2 id=&#34;collision-and-physics&#34;&gt;Collision and physics
&lt;/h2&gt;&lt;p&gt;Common 2D nodes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CollisionShape2D&lt;/code&gt;: defines collision shape.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Area2D&lt;/code&gt;: detects overlap and triggers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CharacterBody2D&lt;/code&gt;: player or controlled character.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RigidBody2D&lt;/code&gt;: physics-driven object.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StaticBody2D&lt;/code&gt;: walls, floors, fixed obstacles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For beginners: if you control movement manually, use &lt;code&gt;CharacterBody2D&lt;/code&gt;. If you only need to detect contact, use &lt;code&gt;Area2D&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_on_body_entered&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Player&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;get_tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;reload_current_scene&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Later, replace direct reloads with a &lt;code&gt;game_over&lt;/code&gt; signal. For the first project, getting the loop working is more important.&lt;/p&gt;
&lt;h2 id=&#34;instancing-enemies&#34;&gt;Instancing enemies
&lt;/h2&gt;&lt;p&gt;Godot scenes can be used like prefabs.&lt;/p&gt;
&lt;p&gt;If you have &lt;code&gt;Enemy.tscn&lt;/code&gt;, spawn it from the main scene:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@export&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enemy_scene&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PackedScene&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;spawn_enemy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enemy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enemy_scene&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;instantiate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;enemy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;position&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Vector2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;800&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;randf_range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;550&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;add_child&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;enemy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Add a &lt;code&gt;Timer&lt;/code&gt; to call &lt;code&gt;spawn_enemy()&lt;/code&gt; repeatedly.&lt;/p&gt;
&lt;h2 id=&#34;ui-and-score&#34;&gt;UI and score
&lt;/h2&gt;&lt;p&gt;Use &lt;code&gt;Control&lt;/code&gt; nodes for UI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CanvasLayer&lt;/code&gt;: keeps UI fixed on screen.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Label&lt;/code&gt;: text.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Button&lt;/code&gt;: button.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Panel&lt;/code&gt;: background.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VBoxContainer&lt;/code&gt; / &lt;code&gt;HBoxContainer&lt;/code&gt;: layout.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Simple survival score:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;$CanvasLayer/ScoreLabel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;score&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;audio-and-feedback&#34;&gt;Audio and feedback
&lt;/h2&gt;&lt;p&gt;Even simple games need feedback:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;click sounds,&lt;/li&gt;
&lt;li&gt;hit sounds,&lt;/li&gt;
&lt;li&gt;score sounds,&lt;/li&gt;
&lt;li&gt;failure sounds,&lt;/li&gt;
&lt;li&gt;screen shake or flash,&lt;/li&gt;
&lt;li&gt;button hover / pressed states.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use &lt;code&gt;AudioStreamPlayer&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;$HitSound&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;play&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Functionality is only the first step. Good feedback makes the player feel the game responding.&lt;/p&gt;
&lt;h2 id=&#34;project-organization&#34;&gt;Project organization
&lt;/h2&gt;&lt;p&gt;Start with clean folders:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;res://
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── scenes/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── Main.tscn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── Player.tscn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── Enemy.tscn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── player.gd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── enemy.gd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── assets/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── sprites/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── audio/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── ui/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── GameOver.tscn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Do not dump everything into the root directory. Small games grow faster than expected.&lt;/p&gt;
&lt;h2 id=&#34;common-beginner-mistakes&#34;&gt;Common beginner mistakes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Choosing the wrong node type.&lt;/li&gt;
&lt;li&gt;Forgetting collision shapes.&lt;/li&gt;
&lt;li&gt;Hard-coding keyboard keys.&lt;/li&gt;
&lt;li&gt;Putting player, enemies, UI, audio, and level logic into one script.&lt;/li&gt;
&lt;li&gt;Starting with a project that is too large.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A tiny finished game is more valuable than an abandoned big idea.&lt;/p&gt;
&lt;h2 id=&#34;suggested-learning-path&#34;&gt;Suggested learning path
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Editor basics.&lt;/li&gt;
&lt;li&gt;Nodes and scenes.&lt;/li&gt;
&lt;li&gt;GDScript basics.&lt;/li&gt;
&lt;li&gt;Input actions.&lt;/li&gt;
&lt;li&gt;2D movement.&lt;/li&gt;
&lt;li&gt;Collision and &lt;code&gt;Area2D&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Timer&lt;/code&gt; and spawning.&lt;/li&gt;
&lt;li&gt;UI and score.&lt;/li&gt;
&lt;li&gt;Audio and animation.&lt;/li&gt;
&lt;li&gt;Export to desktop or web.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;godot-vs-unity&#34;&gt;Godot vs Unity
&lt;/h2&gt;&lt;p&gt;Godot is comfortable for 2D indie games, teaching projects, and personal prototypes.&lt;/p&gt;
&lt;p&gt;Unity still has stronger asset stores, commercial plugins, mobile ads, monetization SDKs, and mature team workflows.&lt;/p&gt;
&lt;p&gt;Unreal is better for high-end 3D and advanced rendering.&lt;/p&gt;
&lt;p&gt;For beginners, do not let engine choice become procrastination. The core skills are game loops, input, collision, feedback, scene organization, state management, and version control.&lt;/p&gt;
&lt;h2 id=&#34;completion-checklist&#34;&gt;Completion checklist
&lt;/h2&gt;&lt;p&gt;You have really completed the first step when your game has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;player movement,&lt;/li&gt;
&lt;li&gt;enemies or obstacles,&lt;/li&gt;
&lt;li&gt;collision failure,&lt;/li&gt;
&lt;li&gt;score or objective,&lt;/li&gt;
&lt;li&gt;start screen,&lt;/li&gt;
&lt;li&gt;game-over screen,&lt;/li&gt;
&lt;li&gt;restart,&lt;/li&gt;
&lt;li&gt;at least two sounds,&lt;/li&gt;
&lt;li&gt;simple animation or visual feedback,&lt;/li&gt;
&lt;li&gt;an exported playable build.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Godot&amp;rsquo;s entry point is not memorizing every feature. It is understanding how the engine organizes games: nodes form scenes, scenes form games, scripts drive behavior, signals connect events, and resources live in folders.&lt;/p&gt;
&lt;p&gt;Start with a small 2D game. Once movement, collision, UI, audio, and restart work, then learn animation trees, TileMap, saving, state machines, 3D, shaders, and export optimization.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>DeepSeek-TUI: Turning DeepSeek V4 into a Terminal Coding Agent</title>
        <link>https://knightli.com/en/2026/05/16/deepseek-tui-terminal-coding-agent/</link>
        <pubDate>Sat, 16 May 2026 22:41:41 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/16/deepseek-tui-terminal-coding-agent/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/Hmbown/DeepSeek-TUI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DeepSeek-TUI&lt;/a&gt; is an open source project that brings DeepSeek V4 into terminal-based development workflows. It is not just a chat wrapper. It is closer to a &amp;ldquo;command-line coding agent&amp;rdquo; like Claude Code or Codex CLI: it can read files, edit code, run commands, call tools, and keep working through tasks in a TUI.&lt;/p&gt;
&lt;p&gt;If you already switch between an editor and a terminal, the value of this kind of tool is straightforward: you do not need to copy code back and forth into a web chat window, and you do not need to manually describe the whole project structure. You give it a task, and it can read context from the current workspace, plan steps, make changes, then return the result for your review.&lt;/p&gt;
&lt;h2 id=&#34;it-solves-the-entry-point-problem-for-deepseek&#34;&gt;It Solves the Entry Point Problem for DeepSeek
&lt;/h2&gt;&lt;p&gt;DeepSeek models already provide strong reasoning and coding capabilities, but model capability needs an engineering layer before it can land in real development workflows.&lt;/p&gt;
&lt;p&gt;Web chat is suitable for asking questions, but not for long-running project edits. APIs are suitable for system integration, but individual developers still need to build tool calling, context management, file operations, and permission control themselves. DeepSeek-TUI tries to fill this layer: it wraps DeepSeek V4 into an Agent that can work inside the terminal.&lt;/p&gt;
&lt;p&gt;According to the project description, its main capabilities include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A terminal TUI;&lt;/li&gt;
&lt;li&gt;Conversation and task execution for DeepSeek V4;&lt;/li&gt;
&lt;li&gt;Tool calling and file operations;&lt;/li&gt;
&lt;li&gt;1M context support;&lt;/li&gt;
&lt;li&gt;Auto mode;&lt;/li&gt;
&lt;li&gt;Sub-agents;&lt;/li&gt;
&lt;li&gt;Sandboxed execution;&lt;/li&gt;
&lt;li&gt;A persistent task queue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Together, these features are not aimed at making the model sound more human. They are aimed at making the model easier to bring into the development environment.&lt;/p&gt;
&lt;h2 id=&#34;a-tui-fits-long-tasks-better-than-plain-cli-text&#34;&gt;A TUI Fits Long Tasks Better Than Plain CLI Text
&lt;/h2&gt;&lt;p&gt;Many AI CLI tools start with plain text interaction: enter a prompt, wait for output, then copy commands or add more context. This is simple, but longer tasks quickly become messy.&lt;/p&gt;
&lt;p&gt;The advantage of a TUI is that it can place conversations, files, execution results, and task status in a more stable interface. For a coding Agent, that matters. A code task is rarely a single question and answer. It often includes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Understanding the project structure;&lt;/li&gt;
&lt;li&gt;Finding relevant files;&lt;/li&gt;
&lt;li&gt;Editing code;&lt;/li&gt;
&lt;li&gt;Running tests or commands;&lt;/li&gt;
&lt;li&gt;Fixing issues based on errors;&lt;/li&gt;
&lt;li&gt;Summarizing changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the interface is only a stream of logs, it is hard for the user to see where the Agent is in the process. A TUI at least provides a better place to observe and take over.&lt;/p&gt;
&lt;h2 id=&#34;auto-mode-is-best-for-tasks-with-clear-boundaries&#34;&gt;Auto Mode Is Best for Tasks with Clear Boundaries
&lt;/h2&gt;&lt;p&gt;The Auto mode mentioned by DeepSeek-TUI is best for tasks with clear boundaries. For example: fixing a small bug, adding a script, changing a configuration, organizing a set of documents, or implementing a local feature.&lt;/p&gt;
&lt;p&gt;These tasks have something in common: the goal is clear, the verification method is clear, and the impact scope is controllable. The Agent can inspect files, edit files, run commands, and then hand the result back to the user for confirmation.&lt;/p&gt;
&lt;p&gt;But Auto mode should not mean unlimited permission. In real projects, file deletion, large-scale refactors, database migrations, and deployment commands should all require explicit confirmation. The efficiency of coding Agents comes from automation, but so does the risk. The more a tool can execute commands, the more it needs sandboxing, permission boundaries, and human review.&lt;/p&gt;
&lt;h2 id=&#34;sub-agents-matter-because-they-split-tasks&#34;&gt;Sub-Agents Matter Because They Split Tasks
&lt;/h2&gt;&lt;p&gt;Sub-agents are not a new concept, but they are useful in coding scenarios.&lt;/p&gt;
&lt;p&gt;A moderately complex task usually requires several kinds of work at the same time: someone reads the code, someone changes the implementation, someone checks tests, and someone organizes documentation. Traditional multi-agent systems often feel ornamental because they have no real tools or real workspace; they only discuss inside a conversation.&lt;/p&gt;
&lt;p&gt;If sub-agents can work with the file system, command execution, and task queues, they become more like a task decomposition mechanism. For example, one sub-agent can analyze dependencies, another can modify a specific module, and the main agent can integrate the result. This can reduce the problem of putting too much unrelated information into one context.&lt;/p&gt;
&lt;p&gt;Of course, sub-agents also add cost: more tokens, more complex state, and responsibility boundaries that are harder to track. They are better suited to medium-complexity tasks and above, not necessarily every small edit.&lt;/p&gt;
&lt;h2 id=&#34;1m-context-is-not-magic-but-it-helps-with-projects&#34;&gt;1M Context Is Not Magic, but It Helps with Projects
&lt;/h2&gt;&lt;p&gt;1M context sounds exaggerated, but in coding scenarios it is not just a marketing number.&lt;/p&gt;
&lt;p&gt;The context of a real codebase is fragmented: README files, configuration files, type definitions, tests, call chains, historical conventions, and error logs can all affect one change. Longer context can reduce the problem of editing after seeing only a local fragment, and it can help the model retain more project constraints.&lt;/p&gt;
&lt;p&gt;Still, longer context does not automatically mean better judgment. Code tasks still need retrieval, filtering, and verification. Putting an entire project into context is not necessarily better than reading the relevant files precisely. A good coding Agent should treat long context as a buffer, not as a shortcut that replaces engineering judgment.&lt;/p&gt;
&lt;h2 id=&#34;who-it-is-best-for&#34;&gt;Who It Is Best For
&lt;/h2&gt;&lt;p&gt;DeepSeek-TUI is better suited to several groups:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developers who want to use DeepSeek for coding tasks in the terminal;&lt;/li&gt;
&lt;li&gt;People who do not want to build tool calling and file operation frameworks themselves;&lt;/li&gt;
&lt;li&gt;Users familiar with Claude Code or Codex CLI who want to try a DeepSeek-based entry point;&lt;/li&gt;
&lt;li&gt;People who need local project context instead of only asking about code snippets in a web page;&lt;/li&gt;
&lt;li&gt;Developers who want to put AI coding workflows into a command-line environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you only occasionally ask how to write a function, web chat is enough. If you want the model to participate directly in project edits, a terminal Agent becomes more meaningful.&lt;/p&gt;
&lt;h2 id=&#34;risks-to-watch&#34;&gt;Risks to Watch
&lt;/h2&gt;&lt;p&gt;There are three things to watch most closely with this kind of tool.&lt;/p&gt;
&lt;p&gt;The first is permissions. As long as a tool can read and write files or execute commands, you need to know what it can access by default, whether it can delete files, whether it can access the network, and whether dangerous commands require confirmation.&lt;/p&gt;
&lt;p&gt;The second is rollback. Before using it, it is best to keep the Git working tree clean, so every Agent change can be clearly seen through &lt;code&gt;git diff&lt;/code&gt;. Do not let an Agent automatically edit a project while many unrelated changes are already uncommitted.&lt;/p&gt;
&lt;p&gt;The third is verification. Code written by an Agent does not mean the task is complete. Tests, builds, linting, and human review still need to remain. AI coding tools can speed up progress, but they cannot replace final engineering confirmation.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;The significance of DeepSeek-TUI is not that it adds another chat client. It puts DeepSeek V4 into a terminal environment that is closer to real development work.&lt;/p&gt;
&lt;p&gt;For developers, model capability is only the first step. The real experience depends on whether it can read a project, safely edit files, run verification commands, maintain state in long tasks, and let the user take over at any time.&lt;/p&gt;
&lt;p&gt;If you want to use DeepSeek for daily code changes, project reading, and automated development tasks, DeepSeek-TUI is worth watching. The direction is also clear: AI coding tools are moving from &amp;ldquo;answering code questions&amp;rdquo; to &amp;ldquo;participating in project execution.&amp;rdquo;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Codex Mobile Remote Access: Use the ChatGPT App to Follow Coding Tasks on Your Mac</title>
        <link>https://knightli.com/en/2026/05/16/codex-mobile-remote-access-chatgpt-app/</link>
        <pubDate>Sat, 16 May 2026 17:42:40 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/16/codex-mobile-remote-access-chatgpt-app/</guid>
        <description>&lt;p&gt;In mid-May 2026, OpenAI brought &lt;code&gt;Codex remote access&lt;/code&gt; into the ChatGPT mobile app. The point is not to write code on a phone. It is to let you follow and steer Codex while it keeps working on a Mac.&lt;/p&gt;
&lt;p&gt;Think of it as a mobile approval and monitoring surface: Codex still reads the project, runs commands, edits files, and checks test results on the computer; the phone is used to review progress, answer questions, add instructions, and approve actions.&lt;/p&gt;
&lt;p&gt;For people who often let Codex run longer tasks, this is useful. You no longer need to sit in front of the Mac waiting for Codex to ask for approval or get stuck.&lt;/p&gt;
&lt;h2 id=&#34;what-it-can-do&#34;&gt;What it can do
&lt;/h2&gt;&lt;p&gt;According to OpenAI&amp;rsquo;s Codex remote connections documentation, mobile access can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;start new threads in projects on the host, or continue existing ones;&lt;/li&gt;
&lt;li&gt;send follow-up instructions, answer questions, and steer active work;&lt;/li&gt;
&lt;li&gt;approve commands and other actions;&lt;/li&gt;
&lt;li&gt;review outputs, diffs, test results, terminal output, and screenshots;&lt;/li&gt;
&lt;li&gt;receive notifications when Codex completes a task or needs attention;&lt;/li&gt;
&lt;li&gt;switch between connected hosts and threads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the mobile app is not just a small chat box. It connects to the actual Codex work context on the host.&lt;/p&gt;
&lt;h2 id=&#34;requirements&#34;&gt;Requirements
&lt;/h2&gt;&lt;p&gt;First, you need Codex access in the ChatGPT account and workspace you want to use. The phone and Mac must use the same account and workspace.&lt;/p&gt;
&lt;p&gt;Second, install the latest ChatGPT mobile app on iOS or Android. If Codex does not appear in the app, update ChatGPT first.&lt;/p&gt;
&lt;p&gt;Third, the host currently needs to be a Mac that is awake, online, running the Codex App, and signed in to the same account and workspace. OpenAI&amp;rsquo;s documentation says mobile setup and device control currently require &lt;code&gt;Codex App for macOS&lt;/code&gt;; setup is not available from Codex CLI or the IDE Extension.&lt;/p&gt;
&lt;p&gt;Fourth, complete any required MFA, SSO, or passkey flow. In a ChatGPT workspace, an admin may also need to enable Remote Control access.&lt;/p&gt;
&lt;p&gt;This makes the feature a mobile control layer for Codex App on macOS, not a generic remote desktop or a universal Codex connection for every environment.&lt;/p&gt;
&lt;h2 id=&#34;limits-of-codex-mobile-remote-access&#34;&gt;Limits of Codex mobile remote access
&lt;/h2&gt;&lt;p&gt;The feature is convenient, but the limits matter.&lt;/p&gt;
&lt;p&gt;First, it currently needs a &lt;code&gt;macOS host&lt;/code&gt;. The phone connects to Codex App running on a Mac, not directly to Codex CLI, the IDE Extension, or any Linux / Windows development machine.&lt;/p&gt;
&lt;p&gt;Second, the host must stay online. The Mac needs to remain awake, connected to the network, and running Codex App. If it sleeps, loses network access, or closes Codex, the remote session can disconnect.&lt;/p&gt;
&lt;p&gt;Third, connection uses a QR-code setup flow. You start &lt;code&gt;Set up Codex mobile&lt;/code&gt; on the Mac, scan the QR code with your phone, and finish setup in ChatGPT. It is not a simple &amp;ldquo;enter host address&amp;rdquo; flow.&lt;/p&gt;
&lt;p&gt;Fourth, remote actions still go through approvals. You can approve commands and actions from the phone, but you should read what Codex is asking to do before confirming, especially for terminal commands, file edits, tests, and external access.&lt;/p&gt;
&lt;p&gt;In short, it is for following up after you leave the computer. It is not a full development environment replacement and should not be treated as unattended remote control.&lt;/p&gt;
&lt;h2 id=&#34;how-to-connect&#34;&gt;How to connect
&lt;/h2&gt;&lt;p&gt;Start from Codex App on the Mac:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Codex on the Mac.&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Set up Codex mobile&lt;/code&gt; in the sidebar.&lt;/li&gt;
&lt;li&gt;Codex enables remote access for this host and shows a QR code.&lt;/li&gt;
&lt;li&gt;Scan the QR code with your phone to open the Codex mobile setup flow in ChatGPT.&lt;/li&gt;
&lt;li&gt;Confirm the same ChatGPT account and workspace.&lt;/li&gt;
&lt;li&gt;Complete any required MFA, SSO, or passkey verification.&lt;/li&gt;
&lt;li&gt;After setup succeeds, the Mac appears in Codex on your phone.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After connection, use &lt;code&gt;Settings &amp;gt; Connections&lt;/code&gt; in Codex on the Mac to manage connected devices. You can also configure whether the computer stays awake, whether Computer Use is enabled, and whether the Chrome extension is installed.&lt;/p&gt;
&lt;h2 id=&#34;what-the-phone-is-good-for&#34;&gt;What the phone is good for
&lt;/h2&gt;&lt;p&gt;The phone is best for approvals, course corrections, and result review.&lt;/p&gt;
&lt;p&gt;Approvals are the obvious case: Codex asks to run a command or continue an action, and you can decide from the phone.&lt;/p&gt;
&lt;p&gt;Course correction is just as useful. If Codex misunderstood the task, chose the wrong direction, or hit a failing test, you can send a short instruction and let it continue.&lt;/p&gt;
&lt;p&gt;Result review is the third case. You can inspect diffs, test output, terminal logs, and screenshots without returning to the computer.&lt;/p&gt;
&lt;p&gt;The value is not &amp;ldquo;coding on a phone&amp;rdquo;; it is turning the phone into a small control surface for engineering work that still runs on the host.&lt;/p&gt;
&lt;h2 id=&#34;common-issues&#34;&gt;Common issues
&lt;/h2&gt;&lt;p&gt;If the host does not appear on your phone, confirm that Codex App is running on the Mac, &lt;code&gt;Allow other devices to connect&lt;/code&gt; is enabled, and both devices use the same ChatGPT account and workspace.&lt;/p&gt;
&lt;p&gt;If the approval request does not appear, open the ChatGPT mobile app, go to Codex, scan the QR code again, or restart setup from the host. Workspace users should also confirm that Remote Control access is enabled by an admin.&lt;/p&gt;
&lt;p&gt;If the remote session disconnects, check whether the Mac slept, lost network access, or closed Codex App.&lt;/p&gt;
&lt;p&gt;If authentication blocks setup, complete MFA, SSO, or passkey prompts first. In enterprise environments, workspace permissions may require admin help.&lt;/p&gt;
&lt;h2 id=&#34;best-use-cases&#34;&gt;Best use cases
&lt;/h2&gt;&lt;p&gt;It fits users who run longer Codex coding tasks, want to approve commands away from the desk, manage multiple projects or threads, and already use a Mac as the main development machine.&lt;/p&gt;
&lt;p&gt;It is less useful if you mainly use Windows or Linux, only use Codex CLI or an IDE Extension, expect the phone to be an independent development environment, or work on an unstable network.&lt;/p&gt;
&lt;h2 id=&#34;my-take&#34;&gt;My take
&lt;/h2&gt;&lt;p&gt;Codex mobile remote access is not about moving development to a phone. It is about making the waiting time around Codex more manageable.&lt;/p&gt;
&lt;p&gt;Previously, long Codex tasks often stopped at approval, clarification, failing tests, or direction changes. Now those moments can be handled from the ChatGPT mobile app, while the Mac continues to do the actual engineering work.&lt;/p&gt;
&lt;p&gt;If you already use Codex heavily on a Mac, this is worth enabling. If you only ask occasional coding questions, the value will be less obvious.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center: ChatGPT Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/codex/remote-connections&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Developers: Codex Remote Connections&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Claude Code &#43; Ollama Local Deployment Guide: Build a Free AI Coding Assistant with CC Switch</title>
        <link>https://knightli.com/en/2026/05/15/claude-code-ollama-cc-switch-local-agent/</link>
        <pubDate>Fri, 15 May 2026 23:27:50 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/15/claude-code-ollama-cc-switch-local-agent/</guid>
        <description>&lt;p&gt;&lt;code&gt;Claude Code&lt;/code&gt; has become a popular AI coding assistant recently. Its appeal is not just that it can chat about code, but that it can read a project, modify files, run commands, install dependencies, and keep fixing errors in an agent-like workflow.&lt;/p&gt;
&lt;p&gt;The hard part is cost. Once a project grows, long context and repeated agent turns can burn through API quota quickly. If you just want to experiment, refactor small utilities, generate scripts, or work on a private local project, it is natural to ask: can Claude Code&amp;rsquo;s workflow be kept while the model runs locally?&lt;/p&gt;
&lt;p&gt;The key tool in this setup is &lt;code&gt;CC Switch&lt;/code&gt;. It lets Claude Code connect to the local &lt;code&gt;Ollama&lt;/code&gt; service through an OpenAI-compatible API endpoint, so requests can be forwarded to a local model instead of the official Claude API.&lt;/p&gt;
&lt;h2 id=&#34;what-this-setup-solves&#34;&gt;What This Setup Solves
&lt;/h2&gt;&lt;p&gt;You can think of the whole setup as:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Claude Code desktop
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ CC Switch API forwarding layer
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ Ollama local model
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Claude Code is still responsible for the coding workflow and project operations. CC Switch handles model provider configuration and API compatibility. Ollama runs the model locally.&lt;/p&gt;
&lt;p&gt;This does not make a local model suddenly become Claude. Its real value is that it makes Claude Code&amp;rsquo;s agent workflow usable in lower-cost, offline, and private local scenarios.&lt;/p&gt;
&lt;h2 id=&#34;basic-preparation&#34;&gt;Basic Preparation
&lt;/h2&gt;&lt;p&gt;Before you start, prepare these pieces:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;Git&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;Ollama&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pull a local model suitable for coding.&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;CC Switch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Have Claude Code available on your machine.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For the model side, you can start with coding-oriented models, such as Qwen Coder, DeepSeek Coder, or other models with decent tool-calling and code generation behavior. The larger the model, the better the result may be, but memory and GPU pressure will also rise.&lt;/p&gt;
&lt;p&gt;If your machine only has limited memory, start with a smaller model first. Confirm that the workflow runs smoothly before trying a larger one.&lt;/p&gt;
&lt;h2 id=&#34;key-cc-switch-configuration&#34;&gt;Key CC Switch Configuration
&lt;/h2&gt;&lt;p&gt;After Ollama starts, its default local API address is usually:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://127.0.0.1:11434/v1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In CC Switch, choose an OpenAI-compatible provider type, commonly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OpenAI Chat Completions
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then point the base URL to Ollama&amp;rsquo;s local address.&lt;/p&gt;
&lt;p&gt;For the API key field, local Ollama normally does not need a real key, but many tools still require an environment variable or placeholder. You can use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ANTHROPIC_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;or another placeholder variable accepted by your local setup.&lt;/p&gt;
&lt;p&gt;One configuration item is worth special attention:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#34;inferenceModels&amp;#34;=&amp;#34;[\&amp;#34;haiku\&amp;#34;,\&amp;#34;sonnet\&amp;#34;,\&amp;#34;opus\&amp;#34;]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This means mapping Claude Code&amp;rsquo;s expected model roles to the local provider. In practice, you need to bind &lt;code&gt;haiku&lt;/code&gt;, &lt;code&gt;sonnet&lt;/code&gt;, and &lt;code&gt;opus&lt;/code&gt; to the model names exposed by Ollama or CC Switch. If this mapping is wrong, Claude Code may fail to call the model or may keep falling back to an unexpected configuration.&lt;/p&gt;
&lt;h2 id=&#34;where-claude-code-is-strong&#34;&gt;Where Claude Code Is Strong
&lt;/h2&gt;&lt;p&gt;Claude Code&amp;rsquo;s biggest advantage is not raw completion. It is the full coding workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reading and understanding project structure;&lt;/li&gt;
&lt;li&gt;locating related files based on a task;&lt;/li&gt;
&lt;li&gt;editing code directly;&lt;/li&gt;
&lt;li&gt;running commands and tests;&lt;/li&gt;
&lt;li&gt;observing errors and iterating;&lt;/li&gt;
&lt;li&gt;completing multi-step tasks in one session.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why many people want to keep Claude Code even when switching to a local model. A normal chat UI can generate code snippets, but it does not naturally operate inside a repository. Claude Code is closer to an executable development assistant.&lt;/p&gt;
&lt;h2 id=&#34;what-role-ollama-plays-here&#34;&gt;What Role Ollama Plays Here
&lt;/h2&gt;&lt;p&gt;Ollama is responsible for local model runtime and management. It handles model downloading, loading, and local inference.&lt;/p&gt;
&lt;p&gt;The advantage is clear: requests stay on your machine, repeated use does not create API bills, and you can use it when the network is limited. For private code, this is also easier to accept than sending every context window to a cloud model.&lt;/p&gt;
&lt;p&gt;The trade-off is also clear. Local models depend heavily on your hardware and on model quality. A smaller model can handle simple edits, explanations, and script generation, but it may struggle with large cross-file refactors or subtle architectural decisions.&lt;/p&gt;
&lt;h2 id=&#34;where-the-experience-has-boundaries&#34;&gt;Where The Experience Has Boundaries
&lt;/h2&gt;&lt;p&gt;This setup should not be treated as a full replacement for Claude&amp;rsquo;s strongest cloud models.&lt;/p&gt;
&lt;p&gt;You may run into these issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;weaker long-context understanding;&lt;/li&gt;
&lt;li&gt;unstable tool-calling behavior in complex tasks;&lt;/li&gt;
&lt;li&gt;slower inference on CPU-only machines;&lt;/li&gt;
&lt;li&gt;more hallucinated file paths or APIs;&lt;/li&gt;
&lt;li&gt;less reliable multi-round planning;&lt;/li&gt;
&lt;li&gt;lower success rate on large repository refactors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the better expectation is: use it as a free local development assistant, not as a perfect substitute for a top-tier cloud model.&lt;/p&gt;
&lt;h2 id=&#34;multimodal-compatibility-is-still-unstable&#34;&gt;Multimodal Compatibility Is Still Unstable
&lt;/h2&gt;&lt;p&gt;Some users want Claude Code to handle screenshots, UI images, diagrams, or other multimodal inputs. This part depends on the local model and the forwarding layer.&lt;/p&gt;
&lt;p&gt;If the selected Ollama model does not support vision, or CC Switch does not translate the request format correctly, multimodal features may fail. Even with a vision model, behavior may differ from Claude&amp;rsquo;s official API.&lt;/p&gt;
&lt;p&gt;For now, this setup is more suitable for text and code workflows. Treat multimodal support as experimental.&lt;/p&gt;
&lt;h2 id=&#34;who-should-try-it&#34;&gt;Who Should Try It
&lt;/h2&gt;&lt;p&gt;This setup is suitable for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;developers who want to try Claude Code&amp;rsquo;s workflow at low cost;&lt;/li&gt;
&lt;li&gt;users who frequently write scripts, small tools, and automation snippets;&lt;/li&gt;
&lt;li&gt;teams that want to keep code on local machines;&lt;/li&gt;
&lt;li&gt;learners who want an AI coding assistant without constant API spend;&lt;/li&gt;
&lt;li&gt;people testing different local coding models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is less suitable if you rely heavily on long context, large monorepos, strict code review quality, or complex full-project refactors.&lt;/p&gt;
&lt;h2 id=&#34;usage-advice&#34;&gt;Usage Advice
&lt;/h2&gt;&lt;p&gt;Start with small tasks.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;explain a single file;&lt;/li&gt;
&lt;li&gt;refactor a small function;&lt;/li&gt;
&lt;li&gt;generate a shell script;&lt;/li&gt;
&lt;li&gt;fix a simple error;&lt;/li&gt;
&lt;li&gt;add a small feature;&lt;/li&gt;
&lt;li&gt;write unit tests for a narrow module.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After each change, run tests or at least review the diff yourself. A local model can be useful, but you should not blindly accept every generated edit.&lt;/p&gt;
&lt;p&gt;If the model keeps losing context, reduce the task scope. Instead of asking it to &amp;ldquo;refactor the whole project&amp;rdquo;, ask it to &amp;ldquo;refactor this function&amp;rdquo; or &amp;ldquo;add validation in this file&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Claude Code + CC Switch + Ollama&lt;/code&gt; is an interesting combination. It keeps Claude Code&amp;rsquo;s agent-style development workflow while moving inference to a local model.&lt;/p&gt;
&lt;p&gt;Its biggest strengths are lower cost, local privacy, and a smooth development workflow. Its limits are also obvious: model quality, hardware performance, long context, and tool-calling stability all affect the final experience.&lt;/p&gt;
&lt;p&gt;If you already use Ollama and want a more practical local AI coding workflow, this setup is worth trying. Just remember to start small, verify every change, and treat the local model as an assistant rather than an automatic engineer.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Prompt-Vault: a prompt specification library for testing AI coding ability</title>
        <link>https://knightli.com/en/2026/05/15/prompt-vault-coding-prompt-benchmark/</link>
        <pubDate>Fri, 15 May 2026 09:00:52 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/15/prompt-vault-coding-prompt-benchmark/</guid>
        <description>&lt;p&gt;&lt;code&gt;w512/Prompt-Vault&lt;/code&gt; is a small but useful prompt repository. It does not collect magic prompts; it organizes executable coding prompts into difficulty levels so they can be used to test LLMs and coding agents.&lt;/p&gt;
&lt;p&gt;Project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/w512/Prompt-Vault&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/w512/Prompt-Vault&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The repository is small, but the structure is clear: &lt;code&gt;Easy&lt;/code&gt;, &lt;code&gt;Medium&lt;/code&gt;, and &lt;code&gt;Hard&lt;/code&gt;. Each Markdown file is a standalone task. The README also says these prompts are suitable for testing language models or practicing small projects.&lt;/p&gt;
&lt;h2 id=&#34;not-a-prompt-scrapbook&#34;&gt;Not a prompt scrapbook
&lt;/h2&gt;&lt;p&gt;Many prompt repositories look large but are hard to evaluate. The titles are attractive, but the prompts lack acceptance criteria.&lt;/p&gt;
&lt;p&gt;Prompt-Vault is closer to a specification library. Each task tries to describe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What app to build&lt;/li&gt;
&lt;li&gt;Required features&lt;/li&gt;
&lt;li&gt;UI style&lt;/li&gt;
&lt;li&gt;Technical constraints&lt;/li&gt;
&lt;li&gt;Whether it must run as a single file&lt;/li&gt;
&lt;li&gt;Whether dependencies are allowed&lt;/li&gt;
&lt;li&gt;Whether data should persist&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is much better for testing models than &amp;ldquo;make a nice Kanban board&amp;rdquo;, because it reveals whether the model truly understands requirements.&lt;/p&gt;
&lt;h2 id=&#34;easy-basic-interaction&#34;&gt;Easy: basic interaction
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Easy/Bubble_Sort_Visualizer.md&lt;/code&gt; asks for a single-file &lt;code&gt;index.html&lt;/code&gt; that visualizes bubble sort with bars, start/reset buttons, a speed slider, comparison count, and a dark theme.&lt;/p&gt;
&lt;p&gt;It tests whether a model can connect algorithm state to UI, control animation timing, handle reset and running states, and keep the code readable.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Easy/ToDo_List.md&lt;/code&gt; starts from static HTML and gradually adds task creation, completed state, deletion, counters, Active / Completed stats, and &lt;code&gt;localStorage&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It is a simple task, but it tests whether a model can evolve code step by step instead of dumping a messy implementation.&lt;/p&gt;
&lt;h2 id=&#34;medium-state-and-animation-complexity&#34;&gt;Medium: state and animation complexity
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Medium/Sorting_Visualization.md&lt;/code&gt; upgrades the challenge. The same page must support Bubble Sort, Insertion Sort, Selection Sort, Merge Sort, Quick Sort, and Heap Sort.&lt;/p&gt;
&lt;p&gt;It also needs algorithm selection, speed and size sliders, reset, start / pause, and a live stats panel.&lt;/p&gt;
&lt;p&gt;This catches many failures: an agent may implement one bubble sort animation, but multiple algorithms plus pause/resume and stats often break state management.&lt;/p&gt;
&lt;p&gt;Useful checks include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does every algorithm really sort?&lt;/li&gt;
&lt;li&gt;Does the animation match the algorithm steps?&lt;/li&gt;
&lt;li&gt;Can it pause and resume?&lt;/li&gt;
&lt;li&gt;Does reset stop old animation loops?&lt;/li&gt;
&lt;li&gt;Does changing array size break state?&lt;/li&gt;
&lt;li&gt;Are the statistics credible?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;hard-product-completeness&#34;&gt;Hard: product completeness
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Hard/Kanban_Board.md&lt;/code&gt; asks for a complete board: default columns, custom columns, double-click rename, delete empty columns, cards with title and description, priority, deadline, drag-and-drop, search, priority filter, &lt;code&gt;localStorage&lt;/code&gt;, footer stats, glassmorphism dark theme, and responsive horizontal scrolling.&lt;/p&gt;
&lt;p&gt;This tests product completeness, not just one feature.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Hard/Markdown_Editor_Desktop.md&lt;/code&gt; asks for a Tauri 2 cross-platform Markdown editor. It includes split editing and preview, sync scrolling, live rendering, preview mode, focus mode, open/save/save-as, unsaved title markers, formatting toolbar, shortcuts, themes, font settings, Vue 3, Pinia, &lt;code&gt;marked.js&lt;/code&gt;, &lt;code&gt;prism.js&lt;/code&gt;, and Tauri plugins.&lt;/p&gt;
&lt;p&gt;This is no longer a simple web prompt. It tests frontend state, Tauri plugins, filesystem permissions, IPC boundaries, and desktop packaging.&lt;/p&gt;
&lt;h2 id=&#34;why-it-is-valuable&#34;&gt;Why it is valuable
&lt;/h2&gt;&lt;p&gt;Prompt-Vault is valuable because it provides reusable evaluation samples.&lt;/p&gt;
&lt;p&gt;If you compare models or coding agents, you can run the same prompt repeatedly and observe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which model follows constraints&lt;/li&gt;
&lt;li&gt;Which model misses fewer features&lt;/li&gt;
&lt;li&gt;Which model handles edge cases&lt;/li&gt;
&lt;li&gt;Which output is easier to maintain&lt;/li&gt;
&lt;li&gt;Which model is better at UI details&lt;/li&gt;
&lt;li&gt;Which model is stable under single-file constraints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is more reliable than &amp;ldquo;it feels smarter&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Frontend tasks are especially useful because many failures are not syntax errors. They are missing button states, broken animation, lost persistence, wrong drag targets, or stale statistics.&lt;/p&gt;
&lt;h2 id=&#34;how-to-extend-it&#34;&gt;How to extend it
&lt;/h2&gt;&lt;p&gt;The repository could become a stronger benchmark by adding acceptance checklists, failure cases, scoring dimensions, reference implementations, and cross-model result records.&lt;/p&gt;
&lt;p&gt;For example, a sorting task should include checks such as &amp;ldquo;rapid Start / Reset clicks must not create multiple animation loops.&amp;rdquo; A Kanban task should specify what happens when deleting a non-empty column.&lt;/p&gt;
&lt;p&gt;These details make the prompt useful for human review and automated agent evaluation.&lt;/p&gt;
&lt;h2 id=&#34;suggested-use&#34;&gt;Suggested use
&lt;/h2&gt;&lt;p&gt;To test an AI coding tool:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Give one prompt unchanged.&lt;/li&gt;
&lt;li&gt;Do not add extra hints.&lt;/li&gt;
&lt;li&gt;Run the generated result.&lt;/li&gt;
&lt;li&gt;Check features one by one.&lt;/li&gt;
&lt;li&gt;Record missing features and bugs.&lt;/li&gt;
&lt;li&gt;Give one repair round.&lt;/li&gt;
&lt;li&gt;Compare time, token cost, and final code quality.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is closer to real development than simply checking whether a page appears.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Prompt-Vault is a lightweight prompt specification library. It is useful for AI coding tests and for frontend practice projects.&lt;/p&gt;
&lt;p&gt;It reminds us that a good coding prompt is not just a wish. It should define requirements, constraints, interactions, state, acceptance, and run mode.&lt;/p&gt;
&lt;p&gt;If you compare Codex, Claude Code, Cursor, Gemini CLI, or other coding agents, this kind of leveled prompt is worth keeping.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>What is Token Efficiency? DeepSeek V4, big-model planning, and small-model execution</title>
        <link>https://knightli.com/en/2026/05/15/token-efficiency-agent-orchestration/</link>
        <pubDate>Fri, 15 May 2026 08:59:33 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/15/token-efficiency-agent-orchestration/</guid>
        <description>&lt;p&gt;The next important metric for AI coding may not be who has the strongest model, but who can complete more verifiable work with fewer tokens, lower cost, and a more stable process.&lt;/p&gt;
&lt;p&gt;That is the value of Token Efficiency.&lt;/p&gt;
&lt;p&gt;Many people hear Token Efficiency and think only about cheaper models, longer context, or cheaper cache hits. Those are base conditions. Real productivity comes from model division of labor, task orchestration, context budgeting, and evaluation.&lt;/p&gt;
&lt;p&gt;In other words, Token Efficiency is not a cost-saving trick. It is an engineering method for turning tokens into output.&lt;/p&gt;
&lt;h2 id=&#34;deepseek-v4-productizing-the-split-between-planner-and-executor&#34;&gt;DeepSeek V4: productizing the split between planner and executor
&lt;/h2&gt;&lt;p&gt;The missing background in this topic is the positioning of DeepSeek V4.&lt;/p&gt;
&lt;p&gt;DeepSeek V4 is not just another stronger model. It splits the two capabilities needed for Token Efficiency into &lt;code&gt;V4 Pro&lt;/code&gt; and &lt;code&gt;V4 Flash&lt;/code&gt;: &lt;code&gt;V4 Pro&lt;/code&gt; is better suited for planning, reasoning, architecture judgment, and critical review, while &lt;code&gt;V4 Flash&lt;/code&gt; fits high-frequency execution, batch rewriting, code completion, data organization, and ordinary agent-loop nodes.&lt;/p&gt;
&lt;p&gt;That maps directly to two roles in AI coding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;V4 Pro&lt;/code&gt;: planner / consultant for requirement breakdown, technical design, complex bug analysis, architecture review, and final acceptance.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;V4 Flash&lt;/code&gt;: executor for file scanning, simple implementation, test completion, documentation, candidate generation, and repetitive work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DeepSeek&amp;rsquo;s API documentation shows that both &lt;code&gt;V4 Flash&lt;/code&gt; and &lt;code&gt;V4 Pro&lt;/code&gt; support &lt;code&gt;1M&lt;/code&gt; context, JSON Output, Tool Calls, Chat Prefix Completion, and FIM Completion. The pricing page also prices cache-hit input separately and notes that input cache-hit prices have been reduced to one tenth of the launch price.&lt;/p&gt;
&lt;p&gt;Together, these are why it matters for Token Efficiency: &lt;code&gt;1M&lt;/code&gt; context reduces compression in complex agent tasks; low cache-hit pricing lowers the cost of repeatedly loading prompts, project docs, code, and history; the &lt;code&gt;Flash / Pro&lt;/code&gt; split solves the problem of using a flagship model for every step or an unstable small model for every step.&lt;/p&gt;
&lt;p&gt;DeepSeek V4 should therefore be understood in three ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cheap execution layer&lt;/strong&gt;: many agent nodes can run on &lt;code&gt;V4 Flash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usable judgment layer&lt;/strong&gt;: key steps can still call &lt;code&gt;V4 Pro&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long-chain friendly&lt;/strong&gt;: &lt;code&gt;1M&lt;/code&gt; context and cache pricing make codebases, docs, and tool history easier to keep in the usable window.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Its significance for AI coding is not just another model option. It offers a realistic cost structure for the &amp;ldquo;consultant model + executor model + harness orchestration&amp;rdquo; pattern.&lt;/p&gt;
&lt;h2 id=&#34;do-not-let-the-strongest-model-do-everything&#34;&gt;Do not let the strongest model do everything
&lt;/h2&gt;&lt;p&gt;The old approach was to pick the smartest model and let it handle requirement analysis, code, tests, and summaries end to end.&lt;/p&gt;
&lt;p&gt;That is simple but not always efficient. Many tasks do not need frontier reasoning. Expensive models should behave more like consultants, architects, or planners that appear only at key decision points.&lt;/p&gt;
&lt;p&gt;A better structure is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Big models break down problems and make key decisions.&lt;/li&gt;
&lt;li&gt;Small models execute, batch-process, and repeat edits.&lt;/li&gt;
&lt;li&gt;Tools and harnesses manage process, state, context, and validation.&lt;/li&gt;
&lt;li&gt;Humans define product goals, accept results, and make tradeoffs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This prevents frontier reasoning from being wasted on mechanical execution.&lt;/p&gt;
&lt;h2 id=&#34;context-is-not-always-better-when-larger&#34;&gt;Context is not always better when larger
&lt;/h2&gt;&lt;p&gt;Long context matters for coding agents because code, docs, chat history, test output, and logs all consume the window. When the window fills up, compression, forgetting, and misjudgment appear.&lt;/p&gt;
&lt;p&gt;But long context does not mean dumping everything into the model.&lt;/p&gt;
&lt;p&gt;Token Efficiency means each task should fit inside a clear, controlled context window:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bring only necessary files.&lt;/li&gt;
&lt;li&gt;Include only decision-relevant documents.&lt;/li&gt;
&lt;li&gt;Keep only the current state from history.&lt;/li&gt;
&lt;li&gt;Give each node clear input and output.&lt;/li&gt;
&lt;li&gt;Compress completed work into structured summaries for the next node.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cheap context can tempt people to include noise. Noise does not make a model smarter.&lt;/p&gt;
&lt;h2 id=&#34;harness-matters-more-than-a-single-model&#34;&gt;Harness matters more than a single model
&lt;/h2&gt;&lt;p&gt;Connecting Claude Code, Codex, or another coding agent to a cheap model is not enough. Small models drift in long-chain tasks unless a stronger process controls them.&lt;/p&gt;
&lt;p&gt;A harness is a scheduling system. It decides how to split tasks, run nodes, choose models, validate results, retry failures, and pass context.&lt;/p&gt;
&lt;p&gt;A useful orchestration system should answer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which tasks need planning?&lt;/li&gt;
&lt;li&gt;Which tasks can execute directly?&lt;/li&gt;
&lt;li&gt;Which nodes can run in parallel?&lt;/li&gt;
&lt;li&gt;Which nodes must be serial?&lt;/li&gt;
&lt;li&gt;Which nodes use big models or small models?&lt;/li&gt;
&lt;li&gt;What is the context budget for each node?&lt;/li&gt;
&lt;li&gt;What structured output does each node produce?&lt;/li&gt;
&lt;li&gt;Who reviews and decides whether to continue?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without this software layer, small models are merely cheap. With it, they can become leverage.&lt;/p&gt;
&lt;h2 id=&#34;split-tasks-with-dags&#34;&gt;Split tasks with DAGs
&lt;/h2&gt;&lt;p&gt;A good approach is to split complex work into a directed acyclic graph.&lt;/p&gt;
&lt;p&gt;A feature task might become:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Requirement clarification&lt;/li&gt;
&lt;li&gt;Technical design&lt;/li&gt;
&lt;li&gt;Task decomposition&lt;/li&gt;
&lt;li&gt;Implementation&lt;/li&gt;
&lt;li&gt;Test completion&lt;/li&gt;
&lt;li&gt;Code Review&lt;/li&gt;
&lt;li&gt;Fixes&lt;/li&gt;
&lt;li&gt;PR submission&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each node can be an independent agent with its own role, prompt, tools, permissions, and output format. Nodes should pass structured results, not long chat transcripts.&lt;/p&gt;
&lt;p&gt;This makes each node shorter, easier for small models, and easier to measure.&lt;/p&gt;
&lt;h2 id=&#34;run-multiple-task-replicas&#34;&gt;Run multiple task replicas
&lt;/h2&gt;&lt;p&gt;When tokens are cheap enough, the same task does not have to run only once.&lt;/p&gt;
&lt;p&gt;You can run the same task with different models, prompts, or orchestrations, then pick the best result or merge useful parts. This is suitable for design proposals, copy, test cases, bug hypotheses, refactor options, and code review.&lt;/p&gt;
&lt;p&gt;It is not suitable for tasks with external side effects, shared mutable state, or unclear acceptance criteria.&lt;/p&gt;
&lt;p&gt;The goal is not gambling. It is collecting comparable samples that can improve orchestration, model selection, and node skills.&lt;/p&gt;
&lt;h2 id=&#34;build-an-evaluation-system&#34;&gt;Build an evaluation system
&lt;/h2&gt;&lt;p&gt;Token Efficiency cannot be judged only by price. A cheap model with a high failure rate can consume more human time and become more expensive.&lt;/p&gt;
&lt;p&gt;Start recording:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Completion rate&lt;/li&gt;
&lt;li&gt;Human interventions&lt;/li&gt;
&lt;li&gt;Tool-call failure rate&lt;/li&gt;
&lt;li&gt;Test pass rate&lt;/li&gt;
&lt;li&gt;Review findings&lt;/li&gt;
&lt;li&gt;Token cost per task&lt;/li&gt;
&lt;li&gt;Time per task&lt;/li&gt;
&lt;li&gt;Rework count&lt;/li&gt;
&lt;li&gt;Differences between model combinations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this data, you can decide which tasks fit small models, which require big models, and which should stay human-led.&lt;/p&gt;
&lt;h2 id=&#34;make-business-workflows-atomic&#34;&gt;Make business workflows atomic
&lt;/h2&gt;&lt;p&gt;Most users do not need to build a full harness today. But they can start decomposing their business workflow into atomic nodes.&lt;/p&gt;
&lt;p&gt;Content production can become topic selection, research, outline, draft, fact check, style rewrite, SEO title, translation, and publishing check.&lt;/p&gt;
&lt;p&gt;Software development can become requirement confirmation, technical design, data structure, API change, unit tests, implementation, migration script, documentation, and review.&lt;/p&gt;
&lt;p&gt;Each node should have clear input, output, acceptance, and context limits. When harness tools mature, these workflows can plug in directly.&lt;/p&gt;
&lt;h2 id=&#34;hardware-is-not-the-first-priority&#34;&gt;Hardware is not the first priority
&lt;/h2&gt;&lt;p&gt;Many discussions of Token Efficiency jump to local deployment and GPUs. For most people, API should still be the first choice.&lt;/p&gt;
&lt;p&gt;Before the economic model works, local hardware is only prepaid cost. A safer sequence is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use API to validate the workflow.&lt;/li&gt;
&lt;li&gt;Record task evaluation and cost.&lt;/li&gt;
&lt;li&gt;Find stable high-frequency execution nodes.&lt;/li&gt;
&lt;li&gt;Consider which nodes should be localized.&lt;/li&gt;
&lt;li&gt;Then calculate hardware, power, maintenance, and depreciation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For personal productivity, API is often enough. For startups exploring inference frameworks and model boundaries, local CUDA platforms can be useful. For production workloads with clear unit economics, multi-GPU deployment becomes worth discussing.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Token Efficiency is not replacing expensive models with cheap ones. It is redesigning the AI workflow.&lt;/p&gt;
&lt;p&gt;Big models make key judgments, small models execute in bulk, the harness schedules and validates, and humans define goals and acceptance. Only when these layers work together can tokens reliably become productivity.&lt;/p&gt;
&lt;p&gt;Models will get cheaper, context windows will grow, and small models will improve. The future gap may not be who calls the strongest model, but who can use the same tokens to produce more real output.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Superpowers: a skills framework that pulls coding agents back into engineering process</title>
        <link>https://knightli.com/en/2026/05/15/obra-superpowers-agentic-skills-framework/</link>
        <pubDate>Fri, 15 May 2026 08:53:17 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/15/obra-superpowers-agentic-skills-framework/</guid>
        <description>&lt;p&gt;&lt;code&gt;obra/superpowers&lt;/code&gt; is both a skills framework for coding agents and a software development methodology. Its goal is not to add another universal prompt, but to make agents follow a process: clarify goals, produce a design, write a plan, implement through TDD, then review and finish.&lt;/p&gt;
&lt;p&gt;Project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/obra/superpowers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/obra/superpowers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At the time of writing, the GitHub API shows more than 190,000 stars, an MIT license, and recent activity. The README describes it plainly: &lt;code&gt;An agentic skills framework &amp;amp; software development methodology that works.&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-problem-it-solves&#34;&gt;What problem it solves
&lt;/h2&gt;&lt;p&gt;Many AI coding tools are not weak at writing code; they are too eager to write code.&lt;/p&gt;
&lt;p&gt;A user says something vague, the agent edits files, and the result looks finished while boundaries, tests, and architecture remain unclear. Small tasks may survive this. Complex projects turn it into rework and technical debt.&lt;/p&gt;
&lt;p&gt;Superpowers makes the agent enter a workflow before touching code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When the user wants to build something, ask about the goal first.&lt;/li&gt;
&lt;li&gt;Turn the conversation into a spec and confirm it in sections.&lt;/li&gt;
&lt;li&gt;After design approval, write an implementation plan.&lt;/li&gt;
&lt;li&gt;After the user says &amp;ldquo;go&amp;rdquo;, begin implementation.&lt;/li&gt;
&lt;li&gt;During implementation, emphasize TDD, YAGNI, DRY, and code review.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is not new software engineering. It is important because fast agents need stronger guardrails.&lt;/p&gt;
&lt;h2 id=&#34;supported-tools&#34;&gt;Supported tools
&lt;/h2&gt;&lt;p&gt;Superpowers is not tied to a single agent. The README lists installation paths for Claude Code, Codex CLI, Codex App, Factory Droid, Gemini CLI, OpenCode, Cursor, and GitHub Copilot CLI.&lt;/p&gt;
&lt;p&gt;That makes it more like a workflow layer across harnesses than a model-specific trick.&lt;/p&gt;
&lt;h2 id=&#34;the-base-workflow&#34;&gt;The base workflow
&lt;/h2&gt;&lt;p&gt;The base workflow has several stages.&lt;/p&gt;
&lt;p&gt;First is &lt;code&gt;brainstorming&lt;/code&gt;. Before implementation, the agent turns rough ideas into an executable design and confirms it with the user.&lt;/p&gt;
&lt;p&gt;Second is &lt;code&gt;using-git-worktrees&lt;/code&gt;. After design approval, it creates an isolated worktree and branch, then checks that install and test baselines are clean.&lt;/p&gt;
&lt;p&gt;Third is &lt;code&gt;writing-plans&lt;/code&gt;. It decomposes design into small tasks with paths, code scopes, and validation steps. The plan should be clear enough for someone without context to execute.&lt;/p&gt;
&lt;p&gt;Fourth is execution. &lt;code&gt;subagent-driven-development&lt;/code&gt; can dispatch tasks to subagents, while &lt;code&gt;executing-plans&lt;/code&gt; runs them in batches. Each task should be reviewable and verifiable.&lt;/p&gt;
&lt;p&gt;Fifth is &lt;code&gt;test-driven-development&lt;/code&gt;: true RED-GREEN-REFACTOR. Write a failing test, confirm failure, implement minimally, confirm pass, refactor.&lt;/p&gt;
&lt;p&gt;Sixth is &lt;code&gt;requesting-code-review&lt;/code&gt;. Reviews happen between tasks; critical findings block progress.&lt;/p&gt;
&lt;p&gt;Finally, &lt;code&gt;finishing-a-development-branch&lt;/code&gt; validates tests and offers choices such as merge, PR, keep, or discard the worktree.&lt;/p&gt;
&lt;h2 id=&#34;what-is-in-the-skills-library&#34;&gt;What is in the skills library
&lt;/h2&gt;&lt;p&gt;The skills library can be grouped by purpose.&lt;/p&gt;
&lt;p&gt;Testing centers on &lt;code&gt;test-driven-development&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Debugging includes &lt;code&gt;systematic-debugging&lt;/code&gt; and &lt;code&gt;verification-before-completion&lt;/code&gt;. They focus on reproduction, minimization, hypotheses, validation, and not claiming completion before verification.&lt;/p&gt;
&lt;p&gt;Collaboration skills include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;brainstorming&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;writing-plans&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;executing-plans&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dispatching-parallel-agents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requesting-code-review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;receiving-code-review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;using-git-worktrees&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;finishing-a-development-branch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subagent-driven-development&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Meta skills include &lt;code&gt;writing-skills&lt;/code&gt; and &lt;code&gt;using-superpowers&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Together they give the agent engineering habits: when to ask, when to plan, when to test, and when to stop for review.&lt;/p&gt;
&lt;h2 id=&#34;how-it-differs-from-a-prompt&#34;&gt;How it differs from a prompt
&lt;/h2&gt;&lt;p&gt;A normal prompt often piles rules into one system message: do not over-edit, think first, test, explain, be concise. As rules accumulate, complex tasks make the model forget or ignore some of them.&lt;/p&gt;
&lt;p&gt;Superpowers splits rules into phase-specific workflow modules. Each skill is shorter and focused. The agent knows the current phase, complex processes become checkable, and teams can turn their own practices into reusable skills.&lt;/p&gt;
&lt;p&gt;The lesson is not just &amp;ldquo;use a smarter model&amp;rdquo;. Give the model a repeatable way to work.&lt;/p&gt;
&lt;h2 id=&#34;who-should-use-it&#34;&gt;Who should use it
&lt;/h2&gt;&lt;p&gt;Superpowers is most useful for developers already using coding agents on real projects, especially when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The task spans multiple files.&lt;/li&gt;
&lt;li&gt;The agent should design before implementation.&lt;/li&gt;
&lt;li&gt;TDD or validation matters.&lt;/li&gt;
&lt;li&gt;Multiple branches or worktrees are common.&lt;/li&gt;
&lt;li&gt;Subagents can help with implementation or review.&lt;/li&gt;
&lt;li&gt;A team wants to encode its workflow as skills.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a one-line config change, it may feel heavy. For multi-step development, the constraints are valuable.&lt;/p&gt;
&lt;h2 id=&#34;notes-before-using-it&#34;&gt;Notes before using it
&lt;/h2&gt;&lt;p&gt;Do not treat it as full autopilot. It gives the agent process, but humans still own requirements, tradeoffs, and final acceptance.&lt;/p&gt;
&lt;p&gt;TDD and review add upfront cost. For small tasks they may slow things down; for complex tasks they reduce rework.&lt;/p&gt;
&lt;p&gt;Parallel subagents are not always better. They work when boundaries and write scopes are clear. If the requirement is still fuzzy, parallelism only multiplies confusion.&lt;/p&gt;
&lt;p&gt;Teams must maintain skill quality. Outdated processes, vague instructions, and conflicting rules can also hurt agents.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Superpowers is valuable because it pulls coding agents away from &amp;ldquo;receive request, edit code&amp;rdquo; and back into software engineering process.&lt;/p&gt;
&lt;p&gt;AI coding often lacks not generation speed, but clarification, planning, verification, review, and closure. The stronger the model becomes, the less these steps should be skipped.&lt;/p&gt;
&lt;p&gt;If you use Codex, Claude Code, Cursor, or Gemini CLI on real projects, Superpowers is worth studying. Even if you do not install it, its skill decomposition is a good reference for designing your own agent workflow.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Reject Vibe Coding: Matt Pocock&#39;s skills repo adds engineering constraints to AI coding</title>
        <link>https://knightli.com/en/2026/05/15/matt-pocock-skills-ai-engineering-workflow/</link>
        <pubDate>Fri, 15 May 2026 08:46:23 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/15/matt-pocock-skills-ai-engineering-workflow/</guid>
        <description>&lt;p&gt;The faster AI writes code, the faster a project can lose control. The real question is not whether a model can generate functions, but whether it understands the requirement, follows the team&amp;rsquo;s language, and makes small changes inside the existing architecture.&lt;/p&gt;
&lt;p&gt;Matt Pocock&amp;rsquo;s &lt;code&gt;mattpocock/skills&lt;/code&gt; repository points in the opposite direction of casual vibe coding: do not let AI take over the whole development process. Put it inside mature software engineering constraints.&lt;/p&gt;
&lt;p&gt;Project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/mattpocock/skills&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/mattpocock/skills&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is not about one magic prompt. It is a set of composable agent skills that turn requirement clarification, domain modeling, TDD, debugging, and architecture review into AI-friendly workflows.&lt;/p&gt;
&lt;h2 id=&#34;solve-alignment-failure-first&#34;&gt;Solve alignment failure first
&lt;/h2&gt;&lt;p&gt;The most common failure in AI coding is assuming the model understood the request when it merely guessed from a vague sentence.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grill-me&lt;/code&gt; flips the interaction. Before writing code, the agent acts like a demanding reviewer and keeps asking about branches, boundaries, and unresolved decisions.&lt;/p&gt;
&lt;p&gt;If you ask for a login page, it should first ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How should password reset work?&lt;/li&gt;
&lt;li&gt;Should third-party login be supported?&lt;/li&gt;
&lt;li&gt;What should failed-login errors look like?&lt;/li&gt;
&lt;li&gt;Are account lockout, CAPTCHA, or risk controls in scope?&lt;/li&gt;
&lt;li&gt;Where should the user go after success?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This feels slower, but it prevents expensive rework later. The cheaper code generation becomes, the more costly unclear requirements become.&lt;/p&gt;
&lt;h2 id=&#34;write-domain-language-into-context&#34;&gt;Write domain language into context
&lt;/h2&gt;&lt;p&gt;Another common problem is generic vocabulary. The model does not know the team&amp;rsquo;s business terms, so names and documents drift.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grill-with-docs&lt;/code&gt; asks questions while also checking &lt;code&gt;CONTEXT.md&lt;/code&gt;, ADRs, and domain docs. Once terms and decisions are confirmed, they can be written back into shared context.&lt;/p&gt;
&lt;p&gt;This is close to the &amp;ldquo;ubiquitous language&amp;rdquo; idea in domain-driven design. If a team says customer instead of user, or transaction instead of order, the model should inherit that language.&lt;/p&gt;
&lt;p&gt;Context documents are valuable because they reduce guessing.&lt;/p&gt;
&lt;h2 id=&#34;use-tdd-to-slow-down-generation&#34;&gt;Use TDD to slow down generation
&lt;/h2&gt;&lt;p&gt;AI is risky because it is fast. Bad code used to take time to write; now hundreds of lines can appear in seconds. The problem is not speed itself, but lack of feedback loops.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;tdd&lt;/code&gt; skill brings back red-green-refactor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write a failing test for one behavior.&lt;/li&gt;
&lt;li&gt;Implement only enough code to pass.&lt;/li&gt;
&lt;li&gt;Refactor.&lt;/li&gt;
&lt;li&gt;Continue with the next vertical slice.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The key is one behavior at a time. AI executes, while humans keep control of direction and boundaries.&lt;/p&gt;
&lt;h2 id=&#34;debug-through-a-loop&#34;&gt;Debug through a loop
&lt;/h2&gt;&lt;p&gt;When facing a bug, many agents guess and patch repeatedly until the code becomes messier.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;diagnose&lt;/code&gt; asks the agent to build a feedback loop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reproduce the issue&lt;/li&gt;
&lt;li&gt;Minimize the case&lt;/li&gt;
&lt;li&gt;Form a hypothesis&lt;/li&gt;
&lt;li&gt;Add observations or logs&lt;/li&gt;
&lt;li&gt;Fix the cause&lt;/li&gt;
&lt;li&gt;Add a regression test&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This process is old, but it matters even more with AI. The model is good at trying things; the loop keeps it close to the root cause.&lt;/p&gt;
&lt;h2 id=&#34;review-architecture-regularly&#34;&gt;Review architecture regularly
&lt;/h2&gt;&lt;p&gt;A task passing tests does not mean the codebase is healthier. Repeated AI patches can blur module boundaries, make interfaces more complex, and make tests harder to write.&lt;/p&gt;
&lt;p&gt;Skills such as &lt;code&gt;improve-codebase-architecture&lt;/code&gt; ask the agent to step back and inspect the whole codebase:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Are responsibilities mixing across modules?&lt;/li&gt;
&lt;li&gt;Which interfaces are too complex?&lt;/li&gt;
&lt;li&gt;Which paths are hard to test?&lt;/li&gt;
&lt;li&gt;Which names conflict with domain language?&lt;/li&gt;
&lt;li&gt;Which duplicate logic should be merged?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not automatic large-scale refactoring. It is structured observation and suggested direction; humans still decide whether and how far to change.&lt;/p&gt;
&lt;h2 id=&#34;what-really-needs-limiting-is-freedom&#34;&gt;What really needs limiting is freedom
&lt;/h2&gt;&lt;p&gt;The core idea is simple: AI coding is not about letting the model improvise freely. It is about giving it clear goals, context, tests, and stopping conditions.&lt;/p&gt;
&lt;p&gt;Humans define the problem, architecture, tradeoffs, and acceptance criteria. AI generates code, fills in tests, repeats edits, and handles local refactors. Used well, AI amplifies capability; used poorly, it amplifies confusion.&lt;/p&gt;
&lt;p&gt;Software engineering fundamentals did not become obsolete because AI improved. Requirement clarity, domain language, TDD, diagnosis, and architecture review are becoming more important.&lt;/p&gt;
&lt;p&gt;More people will be able to write code. The gap will be between people who can put AI inside a maintainable, verifiable, evolving engineering system and those who cannot.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>What is cc-haha? A project that turns Claude Code into a desktop workbench</title>
        <link>https://knightli.com/en/2026/05/14/cc-haha-claude-code-desktop-workbench/</link>
        <pubDate>Thu, 14 May 2026 22:38:04 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/14/cc-haha-claude-code-desktop-workbench/</guid>
        <description>&lt;p&gt;&lt;code&gt;cc-haha&lt;/code&gt; is a project built around a modified Claude Code workflow. Its full repository name is &lt;code&gt;NanmiCoder/cc-haha&lt;/code&gt;. The project page says plainly that it is based on Claude Code source code leaked from the Anthropic npm registry on &lt;code&gt;2026-03-31&lt;/code&gt;, and that its current main form is a desktop Claude Code workbench.&lt;/p&gt;
&lt;p&gt;Project URL: &lt;a class=&#34;link&#34; href=&#34;https://github.com/NanmiCoder/cc-haha&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/NanmiCoder/cc-haha&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are two important points in that description.&lt;/p&gt;
&lt;p&gt;First, it is not Anthropic&amp;rsquo;s official Claude Code. The README also states that the original source code copyright belongs to Anthropic and that the project is only for learning and research.&lt;/p&gt;
&lt;p&gt;Second, its focus is no longer just &amp;ldquo;run a Claude Code CLI locally.&amp;rdquo; Judging from the README and the latest release, &lt;code&gt;cc-haha&lt;/code&gt; is more like a desktop app that brings Claude Code sessions, projects, permissions, diffs, Computer Use, remote access, and model provider configuration into one place.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-is-it-trying-to-solve&#34;&gt;What problem is it trying to solve?
&lt;/h2&gt;&lt;p&gt;Claude Code is originally terminal-oriented. Sessions, command execution, permission prompts, file edits, and context switching all happen in the terminal. That works for people who are comfortable with CLI tools, but long-term use exposes a few rough edges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple projects and sessions are hard to manage side by side.&lt;/li&gt;
&lt;li&gt;To see what files the AI changed, you often need to switch to Git or an editor.&lt;/li&gt;
&lt;li&gt;Permission approvals, command execution, and file diffs are spread across different surfaces.&lt;/li&gt;
&lt;li&gt;Remote viewing from a phone or another device requires extra setup.&lt;/li&gt;
&lt;li&gt;Connecting non-Anthropic models requires dealing with protocol compatibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;cc-haha&lt;/code&gt; tries to package these pieces into a graphical workbench. It is not just a skin for Claude Code; it moves session management and local development flow control into the desktop app.&lt;/p&gt;
&lt;h2 id=&#34;desktop-workbench-from-terminal-to-control-center&#34;&gt;Desktop workbench: from terminal to control center
&lt;/h2&gt;&lt;p&gt;According to the README, the &lt;code&gt;cc-haha&lt;/code&gt; desktop app brings these capabilities into a macOS / Windows app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multi-session workbench: manage tasks with tabs, project switching, terminal entry points, and session history.&lt;/li&gt;
&lt;li&gt;Branch / Worktree launch: choose a repository branch for a new session and decide whether to use the current worktree or an isolated Worktree.&lt;/li&gt;
&lt;li&gt;Right-side code changes panel: view modified files, added and removed lines, and workspace status while chatting.&lt;/li&gt;
&lt;li&gt;Visualized code edits: inspect AI edits, diffs, and execution steps.&lt;/li&gt;
&lt;li&gt;Permission and approval flow: review dangerous commands, tool calls, and AI questions in the desktop app.&lt;/li&gt;
&lt;li&gt;Multiple model providers: supports Anthropic-compatible APIs, third-party models, WebSearch fallback, and local configuration.&lt;/li&gt;
&lt;li&gt;H5 remote access: use a one-time token to connect to the current desktop session from a phone or another device.&lt;/li&gt;
&lt;li&gt;IM integration: use Telegram, Feishu, WeChat, or DingTalk to chat remotely, switch projects, and approve permissions.&lt;/li&gt;
&lt;li&gt;Scheduled tasks and token usage: create scheduled tasks and view local token usage trends.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These features make it closer to an &amp;ldquo;AI coding workbench&amp;rdquo; than a simple command-line replacement. It tries to put the common surfaces of AI coding into one place: chat, file changes, permissions, projects, remote access, and model configuration.&lt;/p&gt;
&lt;h2 id=&#34;installation-and-startup&#34;&gt;Installation and startup
&lt;/h2&gt;&lt;p&gt;Most users should download the desktop installer from Releases.&lt;/p&gt;
&lt;p&gt;The README describes the desktop install flow as:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to GitHub Releases and download the macOS or Windows installer.&lt;/li&gt;
&lt;li&gt;On first launch, configure the model provider, API key, and default model in the desktop settings.&lt;/li&gt;
&lt;li&gt;If macOS says the app cannot be opened, follow the installation guide to handle Gatekeeper permissions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The latest release page shows that &lt;code&gt;v0.2.6&lt;/code&gt; was published on &lt;code&gt;2026-05-13&lt;/code&gt;. That version mainly focuses on restoring secure H5 mobile access, desktop session management, file mention search, and desktop UX polish.&lt;/p&gt;
&lt;p&gt;If you want to start the CLI from source, the README provides:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp .env.example .env
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./bin/claude-haha
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That path is better for people who want to debug the lower-level CLI, server, or build their own changes. For normal use, the desktop app is more direct.&lt;/p&gt;
&lt;h2 id=&#34;what-changed-in-v026&#34;&gt;What changed in v0.2.6
&lt;/h2&gt;&lt;p&gt;The main point of &lt;code&gt;v0.2.6&lt;/code&gt; is that H5/LAN access was pulled back from a temporary open state into an explicit enablement and token pairing model.&lt;/p&gt;
&lt;p&gt;Notable changes include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;H5/LAN access must be explicitly enabled locally.&lt;/li&gt;
&lt;li&gt;QR links carry a one-time visible token.&lt;/li&gt;
&lt;li&gt;Remote APIs, proxies, and WebSockets are no longer exposed without protection.&lt;/li&gt;
&lt;li&gt;Settings now has a separate H5 Access page.&lt;/li&gt;
&lt;li&gt;The desktop sidebar gained batch management for selecting and deleting sessions.&lt;/li&gt;
&lt;li&gt;Desktop file mention search became git-first, respects ignore rules, and reduces noise from &lt;code&gt;node_modules&lt;/code&gt; and build output.&lt;/li&gt;
&lt;li&gt;A pure white theme was added, and bugs such as long URLs breaking chat layout and draft leakage across tabs were fixed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This shows the project has moved beyond &amp;ldquo;it runs&amp;rdquo; and is now filling in the safety boundaries and daily UX details that a desktop product needs.&lt;/p&gt;
&lt;p&gt;The H5 access part deserves special care. The author explicitly notes in the release that H5 is a browser access entry for individuals or trusted teams, not a public multi-tenant login system. In practice, it should not be treated as an internet-facing SaaS admin console.&lt;/p&gt;
&lt;h2 id=&#34;computer-use-letting-the-agent-operate-the-desktop&#34;&gt;Computer Use: letting the Agent operate the desktop
&lt;/h2&gt;&lt;p&gt;Another important selling point of &lt;code&gt;cc-haha&lt;/code&gt; is Computer Use.&lt;/p&gt;
&lt;p&gt;The project docs say this feature is a heavily modified version of the Computer Use implementation in the leaked Claude Code source. The official implementation depends on Anthropic&amp;rsquo;s private native modules, such as &lt;code&gt;@ant/computer-use-swift&lt;/code&gt; and &lt;code&gt;@ant/computer-use-input&lt;/code&gt;, which are not publicly available. &lt;code&gt;cc-haha&lt;/code&gt; replaces the low-level operation layer with a Python bridge using public libraries such as &lt;code&gt;pyautogui&lt;/code&gt;, &lt;code&gt;mss&lt;/code&gt;, and &lt;code&gt;pyobjc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Computer Use supports operations such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Screenshot: &lt;code&gt;screenshot&lt;/code&gt;, &lt;code&gt;zoom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mouse: click, drag, move, scroll, and read cursor position&lt;/li&gt;
&lt;li&gt;Keyboard: type text, press keys, hold keys&lt;/li&gt;
&lt;li&gt;Applications: open applications, switch displays&lt;/li&gt;
&lt;li&gt;Permissions: request app access, list granted applications&lt;/li&gt;
&lt;li&gt;Clipboard: read and write clipboard content&lt;/li&gt;
&lt;li&gt;Other: wait, batch operations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Its workflow is a &amp;ldquo;screenshot - analyze - act&amp;rdquo; loop:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The model receives a user request.&lt;/li&gt;
&lt;li&gt;It calls &lt;code&gt;screenshot&lt;/code&gt; to capture the screen.&lt;/li&gt;
&lt;li&gt;The model uses vision to identify buttons, input fields, and coordinates.&lt;/li&gt;
&lt;li&gt;It calls click, typing, or application tools.&lt;/li&gt;
&lt;li&gt;It screenshots again to confirm the result, then continues.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the docs, the fully supported platform is mainly macOS, including Apple Silicon and Intel. Windows / Linux are theoretically possible, but the &lt;code&gt;pyobjc&lt;/code&gt; app-management parts need platform-specific replacements and are not fully adapted yet.&lt;/p&gt;
&lt;p&gt;Runtime requirements include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Bun &amp;gt;= 1.1.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Python &amp;gt;= 3.8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;macOS Accessibility permission&lt;/li&gt;
&lt;li&gt;macOS Screen Recording permission&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This kind of feature is powerful, but it also raises permission risk. When letting AI operate desktop apps, it is better to authorize only the applications that are clearly needed and avoid leaving sensitive content open in unrelated windows.&lt;/p&gt;
&lt;h2 id=&#34;multi-model-access-through-an-anthropic-compatible-layer&#34;&gt;Multi-model access through an Anthropic-compatible layer
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;cc-haha&lt;/code&gt; still communicates using the Anthropic Messages API protocol. The project docs recommend using LiteLLM as a protocol conversion proxy.&lt;/p&gt;
&lt;p&gt;The basic structure is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude-code-haha ──Anthropic协议──▶ LiteLLM Proxy ──OpenAI协议──▶ 目标模型 API
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In other words, &lt;code&gt;cc-haha&lt;/code&gt; sends Anthropic Messages API requests, LiteLLM converts them to formats such as OpenAI Chat Completions, and then forwards them to OpenAI, DeepSeek, Ollama, or other model services.&lt;/p&gt;
&lt;p&gt;The LiteLLM install command in the docs is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s1&#34;&gt;&amp;#39;litellm[proxy]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then you can configure OpenAI, DeepSeek, Ollama, and other models in &lt;code&gt;litellm_config.yaml&lt;/code&gt;. After the proxy starts, set these values in &lt;code&gt;.env&lt;/code&gt; or &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;sk-anything
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://localhost:4000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ANTHROPIC_MODEL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;gpt-4o
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;gpt-4o
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;gpt-4o
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;gpt-4o
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;API_TIMEOUT_MS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DISABLE_TELEMETRY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;There are a few practical caveats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;drop_params: true&lt;/code&gt; is important, because Anthropic parameters such as &lt;code&gt;thinking&lt;/code&gt; and &lt;code&gt;cache_control&lt;/code&gt; do not exist in the OpenAI API.&lt;/li&gt;
&lt;li&gt;Extended Thinking is an Anthropic-specific feature and is unavailable with third-party models.&lt;/li&gt;
&lt;li&gt;Prompt Caching will not work in the Anthropic-native way.&lt;/li&gt;
&lt;li&gt;Tool calls must be converted from Anthropic &lt;code&gt;tool_use&lt;/code&gt; to OpenAI function calling, so complex tool use may have compatibility issues.&lt;/li&gt;
&lt;li&gt;Small local Ollama models may not handle this tool-heavy workflow reliably.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So multi-model access can work, but that does not mean every model will feel the same. &lt;code&gt;cc-haha&lt;/code&gt; still demands strong tool use, code understanding, and long-context ability from the model.&lt;/p&gt;
&lt;h2 id=&#34;who-is-it-for&#34;&gt;Who is it for?
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;cc-haha&lt;/code&gt; is better suited for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;People already familiar with Claude Code who want desktop session management.&lt;/li&gt;
&lt;li&gt;Users who often work across multiple repositories, branches, and AI sessions.&lt;/li&gt;
&lt;li&gt;People who want to inspect AI file changes, diffs, and workspace status in a side panel.&lt;/li&gt;
&lt;li&gt;Users who want to experiment with Computer Use and let an Agent operate desktop apps.&lt;/li&gt;
&lt;li&gt;People who want to connect OpenAI, DeepSeek, Ollama, or other models through an Anthropic-compatible protocol.&lt;/li&gt;
&lt;li&gt;Users who need phone or IM-based remote viewing and permission approval.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is less suitable for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users who only want the stable official Claude Code experience.&lt;/li&gt;
&lt;li&gt;People who cannot accept the leaked-source background and copyright uncertainty.&lt;/li&gt;
&lt;li&gt;Users who do not want to grant high system permissions to local tools.&lt;/li&gt;
&lt;li&gt;Teams that need enterprise compliance, auditability, and official support.&lt;/li&gt;
&lt;li&gt;Users unfamiliar with API keys, proxies, model compatibility, and local service configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;risks-and-boundaries&#34;&gt;Risks and boundaries
&lt;/h2&gt;&lt;p&gt;This article cannot only talk about features. It also has to talk about risk.&lt;/p&gt;
&lt;p&gt;The origin of &lt;code&gt;cc-haha&lt;/code&gt; means it is not an ordinary community reimplementation. The README clearly states that it is based on leaked Claude Code source code and that the original source belongs to Anthropic. This creates uncertainty around copyright, compliance, and long-term maintenance.&lt;/p&gt;
&lt;p&gt;Computer Use, H5 remote access, IM integration, and local permission approval are also high-permission capabilities. The more convenient they are, the more clearly boundaries need to be defined:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do not expose H5 access on untrusted networks.&lt;/li&gt;
&lt;li&gt;Do not treat the token as a long-term public login credential.&lt;/li&gt;
&lt;li&gt;Do not grant the Agent access to unrelated sensitive applications.&lt;/li&gt;
&lt;li&gt;Do not casually use it in production or company compliance environments.&lt;/li&gt;
&lt;li&gt;Do not expose third-party model proxy settings or API keys in public repositories.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your goal is to study AI coding tool architecture, desktop workflows, and Computer Use implementation, it is a useful reference. If you want to put it into a long-term production workflow, evaluate legal, permission, security, and maintenance risks first.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;The most interesting thing about &lt;code&gt;cc-haha&lt;/code&gt; is not whether it can replicate Claude Code. It is that it pushes Claude Code-style AI coding tools toward a desktop workbench form.&lt;/p&gt;
&lt;p&gt;Sessions, projects, Worktree, diffs, permissions, remote access, Computer Use, model providers, scheduled tasks, and token usage are all brought into one desktop experience. That suggests the next step for AI coding tools is not only stronger models, but also a more complete workflow interface.&lt;/p&gt;
&lt;p&gt;But its boundaries are also clear: it is not an official Anthropic product, it has a sensitive source-code background, and its high-permission features require caution. A better way to view it is as a project for observing where AI coding tools may evolve, not as a careless replacement for official Claude Code.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;GitHub repository: &lt;a class=&#34;link&#34; href=&#34;https://github.com/NanmiCoder/cc-haha&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/NanmiCoder/cc-haha&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Latest release: &lt;a class=&#34;link&#34; href=&#34;https://github.com/NanmiCoder/cc-haha/releases/tag/v0.2.6&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/NanmiCoder/cc-haha/releases/tag/v0.2.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Computer Use documentation: &lt;a class=&#34;link&#34; href=&#34;https://github.com/NanmiCoder/cc-haha/blob/main/docs/computer-use.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/NanmiCoder/cc-haha/blob/main/docs/computer-use.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Third-party model documentation: &lt;a class=&#34;link&#34; href=&#34;https://github.com/NanmiCoder/cc-haha/blob/main/docs/guide/third-party-models.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/NanmiCoder/cc-haha/blob/main/docs/guide/third-party-models.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Codex /goal vs Claude Code /goal: running long tasks until they are done</title>
        <link>https://knightli.com/en/2026/05/14/codex-goal-vs-claude-code-goal/</link>
        <pubDate>Thu, 14 May 2026 22:25:31 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/14/codex-goal-vs-claude-code-goal/</guid>
        <description>&lt;p&gt;&lt;code&gt;/goal&lt;/code&gt; is becoming an important command in AI coding tools.&lt;/p&gt;
&lt;p&gt;It is not about making the model write a few more lines of code. It solves a more practical problem: when a task has clear completion conditions, can the agent keep going until those conditions are met, instead of stopping after every turn and waiting for the user to say &amp;ldquo;continue&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;Codex CLI has already added an experimental &lt;code&gt;/goal&lt;/code&gt; command in its official docs. Claude Code has also published its own &lt;code&gt;/goal&lt;/code&gt; documentation, describing it as an automation capability that can keep working across multiple turns. The names are the same, but the product direction is not exactly the same.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-does-goal-solve&#34;&gt;What problem does &lt;code&gt;/goal&lt;/code&gt; solve?
&lt;/h2&gt;&lt;p&gt;Ordinary AI coding conversations usually work as a one-turn-at-a-time loop:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The user describes a task.&lt;/li&gt;
&lt;li&gt;The agent analyzes, edits code, and runs tests.&lt;/li&gt;
&lt;li&gt;The agent reports the result.&lt;/li&gt;
&lt;li&gt;The user decides what to do next.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That workflow is fine for short tasks. But for migrations, refactors, test fixes, or issue backlog cleanup, it gets fragmented. The agent may move forward a little, then stop and wait for you to type &amp;ldquo;continue&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/goal&lt;/code&gt; changes the question from &amp;ldquo;what should you do next?&amp;rdquo; to &amp;ldquo;what final state counts as done?&amp;rdquo; For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal 完成登录模块迁移，所有 auth 测试通过，lint 无报错
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This kind of target naturally fits long tasks because it has a clear endpoint: tests pass, the build succeeds, files are split, a queue is empty, or acceptance criteria are satisfied.&lt;/p&gt;
&lt;h2 id=&#34;codex-goal-experimental-and-attached-to-the-current-thread&#34;&gt;Codex &lt;code&gt;/goal&lt;/code&gt;: experimental and attached to the current thread
&lt;/h2&gt;&lt;p&gt;OpenAI&amp;rsquo;s Codex CLI documentation marks &lt;code&gt;/goal&lt;/code&gt; as experimental. It is not a stable default capability and requires &lt;code&gt;features.goals&lt;/code&gt; to be enabled first.&lt;/p&gt;
&lt;p&gt;There are two ways to enable it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/experimental
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Or add this to &lt;code&gt;config.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;features&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;goals&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Once enabled, you can use it like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal Finish the migration and keep tests green
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Common commands include:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal pause
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal resume
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal clear
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;According to OpenAI&amp;rsquo;s docs, Codex attaches the goal to the current active thread and keeps tracking that target while a larger task continues.&lt;/p&gt;
&lt;p&gt;One detail matters here: the official wording for Codex &lt;code&gt;/goal&lt;/code&gt; is restrained. It emphasizes setting an experimental goal for long-running work and attaching the goal to the current thread, but it does not describe, in the same level of detail as Claude Code&amp;rsquo;s docs, an independent evaluator that automatically checks every turn and starts the next one. So for now, it is better to treat Codex &lt;code&gt;/goal&lt;/code&gt; as an experimental long-task goal mechanism, not a fully stable unattended execution mode.&lt;/p&gt;
&lt;h2 id=&#34;claude-code-goal-multi-turn-execution-driven-by-completion-conditions&#34;&gt;Claude Code &lt;code&gt;/goal&lt;/code&gt;: multi-turn execution driven by completion conditions
&lt;/h2&gt;&lt;p&gt;Claude Code&amp;rsquo;s &lt;code&gt;/goal&lt;/code&gt; documentation is more explicit: after the user sets a completion condition, Claude keeps working across turns until that condition is met.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal all tests in test/auth pass and the lint step is clean
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Claude Code&amp;rsquo;s mechanism is roughly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After the current turn finishes, control is not immediately returned to the user.&lt;/li&gt;
&lt;li&gt;A small, fast model checks whether the goal condition has already been met.&lt;/li&gt;
&lt;li&gt;If it has not been met, Claude automatically starts the next turn.&lt;/li&gt;
&lt;li&gt;If it has been met, the goal is cleared automatically and the completion status is recorded in the transcript.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This makes Claude Code&amp;rsquo;s &lt;code&gt;/goal&lt;/code&gt; more like &amp;ldquo;auto-continue until the completion condition is satisfied.&amp;rdquo; It does not merely pin a target to the conversation; it gives an independent evaluation step the decision of whether to continue.&lt;/p&gt;
&lt;p&gt;Claude Code also supports checking status directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The status shows the goal condition, elapsed time, evaluated turn count, token usage, and the evaluator&amp;rsquo;s latest reason.&lt;/p&gt;
&lt;p&gt;To stop early, use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal clear
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;off&lt;/code&gt;, &lt;code&gt;reset&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;, and &lt;code&gt;cancel&lt;/code&gt; also work as clearing aliases. After a goal is enabled, if the session is interrupted and later resumed with &lt;code&gt;--resume&lt;/code&gt; or &lt;code&gt;--continue&lt;/code&gt;, an active goal can be restored. However, elapsed time, turn count, and token baselines are recalculated.&lt;/p&gt;
&lt;h2 id=&#34;the-biggest-difference&#34;&gt;The biggest difference
&lt;/h2&gt;&lt;p&gt;Both Codex and Claude Code are pushing AI coding from single-turn answers toward long-running task execution, but their &lt;code&gt;/goal&lt;/code&gt; commands have different positioning.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Comparison&lt;/th&gt;
          &lt;th&gt;Codex CLI &lt;code&gt;/goal&lt;/code&gt;&lt;/th&gt;
          &lt;th&gt;Claude Code &lt;code&gt;/goal&lt;/code&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Status&lt;/td&gt;
          &lt;td&gt;experimental&lt;/td&gt;
          &lt;td&gt;documented on a dedicated official page&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Enablement&lt;/td&gt;
          &lt;td&gt;requires &lt;code&gt;features.goals&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;usable directly in a trusted workspace&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Goal scope&lt;/td&gt;
          &lt;td&gt;current active thread&lt;/td&gt;
          &lt;td&gt;current session&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Common operations&lt;/td&gt;
          &lt;td&gt;set / view / pause / resume / clear&lt;/td&gt;
          &lt;td&gt;set / view / clear&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Automatic evaluation&lt;/td&gt;
          &lt;td&gt;docs emphasize attachment and tracking&lt;/td&gt;
          &lt;td&gt;docs explicitly describe evaluator checks after each turn&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Auto-continuation&lt;/td&gt;
          &lt;td&gt;official wording is restrained&lt;/td&gt;
          &lt;td&gt;starts the next turn automatically when conditions are unmet&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Best fit&lt;/td&gt;
          &lt;td&gt;keeping a long-term target in a Codex task&lt;/td&gt;
          &lt;td&gt;letting Claude Code keep moving toward completion conditions&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In short, Codex &lt;code&gt;/goal&lt;/code&gt; is closer to &amp;ldquo;attach an experimental long-term target to the current thread.&amp;rdquo; Claude Code &lt;code&gt;/goal&lt;/code&gt; is closer to &amp;ldquo;set a verifiable stop condition for the current session and let it keep working until satisfied.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;how-to-write-a-good-goal&#34;&gt;How to write a good &lt;code&gt;/goal&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Whichever tool you use, &lt;code&gt;/goal&lt;/code&gt; is not a good place for vague wishes.&lt;/p&gt;
&lt;p&gt;Not a great goal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal 把项目优化一下
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;A better goal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal 将 payment 模块迁移到新 API，npm test -- payment 退出码为 0，git diff 只包含 payment 相关文件
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;A good goal usually includes three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A clear completed state.&lt;/li&gt;
&lt;li&gt;An executable validation method.&lt;/li&gt;
&lt;li&gt;Boundaries that must be respected.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the goal is large, add a stop condition:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/goal 修复 eslint 报错，npm run lint 退出码为 0；如果超过 20 轮仍未完成，停止并总结剩余问题
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This matters. The stronger &lt;code&gt;/goal&lt;/code&gt; becomes, the more it needs boundaries. Otherwise, the agent may modify too many files, run too long, consume too many tokens, or keep pushing forward on a question that should have been paused for human input.&lt;/p&gt;
&lt;h2 id=&#34;when-goal-is-a-good-fit&#34;&gt;When &lt;code&gt;/goal&lt;/code&gt; is a good fit
&lt;/h2&gt;&lt;p&gt;Good fits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test fixes: until specific tests pass.&lt;/li&gt;
&lt;li&gt;Code migrations: until all call sites are updated and compilation succeeds.&lt;/li&gt;
&lt;li&gt;Batch cleanup: until a class of lint or type errors is reduced to zero.&lt;/li&gt;
&lt;li&gt;Documentation completion: until all specified modules have documentation.&lt;/li&gt;
&lt;li&gt;Issue queue handling: until every issue under a tag is handled or clearly classified.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Poor fits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The requirement itself is still unclear.&lt;/li&gt;
&lt;li&gt;The task needs frequent product judgment.&lt;/li&gt;
&lt;li&gt;It involves high-risk deletion, data migration, or permission changes.&lt;/li&gt;
&lt;li&gt;Acceptance can only be judged subjectively.&lt;/li&gt;
&lt;li&gt;The task spans many unrelated modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A practical rule: if you can write &amp;ldquo;which command to run, what result to see, and which files must not be touched,&amp;rdquo; it is a good candidate for &lt;code&gt;/goal&lt;/code&gt;. If you can only write &amp;ldquo;make this better,&amp;rdquo; ordinary conversation, plan mode, or human review is still safer.&lt;/p&gt;
&lt;h2 id=&#34;what-this-means-for-ai-coding-tools&#34;&gt;What this means for AI coding tools
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/goal&lt;/code&gt; points to a clear direction: AI coding tools are moving from interactive assistants toward continuously executable work units.&lt;/p&gt;
&lt;p&gt;In the past, using an agent often meant staying nearby. If it got stuck, you prompted it. If tests finished, you told it to continue. If errors appeared, you issued another command. &lt;code&gt;/goal&lt;/code&gt; compresses that interaction into a completion condition and lets the agent decide what the next turn should do.&lt;/p&gt;
&lt;p&gt;But this also raises the bar for users. Writing prompts is no longer just describing a task; it also means defining acceptance criteria, validation commands, modification boundaries, and stop rules. In other words, the user&amp;rsquo;s job shifts from &amp;ldquo;keep telling it to continue&amp;rdquo; to &amp;ldquo;define what done means.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The fact that both Codex and Claude Code have reached &lt;code&gt;/goal&lt;/code&gt; shows that long-running agents are no longer only for background tasks or cloud queues. Local terminal coding tools now also need stronger autonomous progress.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Codex CLI and Claude Code both have &lt;code&gt;/goal&lt;/code&gt;, but at this stage they should not be treated as the same feature.&lt;/p&gt;
&lt;p&gt;Codex &lt;code&gt;/goal&lt;/code&gt; is still experimental, requires &lt;code&gt;features.goals&lt;/code&gt;, and is better understood as a way to maintain a long-term target in the current Codex thread. Claude Code &lt;code&gt;/goal&lt;/code&gt; more explicitly connects completion conditions with auto-continuation, using an independent evaluator to decide whether to keep going.&lt;/p&gt;
&lt;p&gt;For everyday development, this kind of command is best for engineering tasks with clear acceptance criteria. It does not replace product judgment or code review, but it can reduce the repetitive &amp;ldquo;continue,&amp;rdquo; &amp;ldquo;run it again,&amp;rdquo; and &amp;ldquo;fix until tests pass&amp;rdquo; loop inside long tasks.&lt;/p&gt;
&lt;p&gt;The real skill is not memorizing the command. It is learning how to write tasks as clear, verifiable, stoppable goals.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;OpenAI Codex CLI Slash Commands: &lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/codex/cli/slash-commands&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://developers.openai.com/codex/cli/slash-commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Claude Code Goal documentation: &lt;a class=&#34;link&#34; href=&#34;https://code.claude.com/docs/en/goal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://code.claude.com/docs/en/goal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>How Can Codex Use Chinese LLMs? OpenAI-Compatible APIs and the CodexBridge Approach</title>
        <link>https://knightli.com/en/2026/05/13/codexbridge-openai-compatible-api/</link>
        <pubDate>Wed, 13 May 2026 23:08:28 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/13/codexbridge-openai-compatible-api/</guid>
        <description>&lt;p&gt;CodexBridge is a local bridge for exposing Codex CLI/SDK as an OpenAI-compatible HTTP service. With it, Codex no longer has to live only in the terminal. OpenWebUI, Cherry Studio, scripts, automation systems, or any client that supports OpenAI Chat Completions can call it.&lt;/p&gt;
&lt;p&gt;The two core endpoints are &lt;code&gt;/v1/chat/completions&lt;/code&gt; and &lt;code&gt;/v1/models&lt;/code&gt;. The former handles conversations and supports both normal and SSE streaming responses. The latter lets clients discover models in the same way they read an OpenAI-style model list. For tools that already support OpenAI APIs, this usually means changing only the base URL, API key, and model name.&lt;/p&gt;
&lt;p&gt;Project: &lt;a class=&#34;link&#34; href=&#34;https://github.com/begonia599/CodexBridge&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/begonia599/CodexBridge&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-it-is-useful-for&#34;&gt;What it is useful for
&lt;/h2&gt;&lt;p&gt;CodexBridge is useful when you want to plug Codex into existing AI clients or workflows. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select Codex directly in OpenWebUI or Cherry Studio.&lt;/li&gt;
&lt;li&gt;Call local Codex from &lt;code&gt;curl&lt;/code&gt;, Python, Node.js, or other scripts.&lt;/li&gt;
&lt;li&gt;Let one frontend connect to OpenAI, Ollama, other compatible APIs, and Codex at the same time.&lt;/li&gt;
&lt;li&gt;Keep Codex&amp;rsquo;s local threads, sandbox, working directory, and approval behavior.&lt;/li&gt;
&lt;li&gt;Provide a unified &lt;code&gt;/v1/chat/completions&lt;/code&gt; endpoint for internal tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is not a new LLM, and it is not a full replacement for Codex CLI. More precisely, it is an adapter layer: Codex remains the upstream engine, while the bridge converts OpenAI-style requests into conversation input that Codex can handle.&lt;/p&gt;
&lt;h2 id=&#34;basic-requirements&#34;&gt;Basic requirements
&lt;/h2&gt;&lt;p&gt;You need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 18 or later.&lt;/li&gt;
&lt;li&gt;Codex CLI installed and logged in.&lt;/li&gt;
&lt;li&gt;npm, or pnpm / yarn if you prefer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basic source deployment:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/begonia599/CodexBridge
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; codexbridge
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp .env.example .env
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp .env .env.local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then edit &lt;code&gt;.env&lt;/code&gt; or &lt;code&gt;.env.local&lt;/code&gt; to set the API key, default model, working directory, sandbox mode, network access, and related options.&lt;/p&gt;
&lt;p&gt;Start the HTTP service:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run codex:server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The default port is &lt;code&gt;8080&lt;/code&gt;, and it can be changed with &lt;code&gt;PORT&lt;/code&gt;. After startup, the service exposes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GET /health
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;POST /v1/chat/completions
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GET /v1/models
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;cli-conversation-mode&#34;&gt;CLI conversation mode
&lt;/h2&gt;&lt;p&gt;Besides the HTTP service, CodexBridge also includes a lightweight CLI:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run codex:chat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can type natural-language messages directly. Two useful commands are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/reset&lt;/code&gt;: create a new Codex thread.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/exit&lt;/code&gt;: exit the CLI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The current thread ID is stored in &lt;code&gt;.codex_thread.json&lt;/code&gt;. If this file still exists the next time the CLI starts, the previous conversation can continue.&lt;/p&gt;
&lt;h2 id=&#34;http-example&#34;&gt;HTTP example
&lt;/h2&gt;&lt;p&gt;A minimal request looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl http://localhost:8080/v1/chat/completions &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;content-type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;authorization: Bearer 123321&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;model&amp;#34;:&amp;#34;gpt-5-codex:medium&amp;#34;,&amp;#34;session_id&amp;#34;:&amp;#34;demo&amp;#34;,&amp;#34;messages&amp;#34;:[{&amp;#34;role&amp;#34;:&amp;#34;user&amp;#34;,&amp;#34;content&amp;#34;:&amp;#34;ls&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Key points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The token in &lt;code&gt;authorization&lt;/code&gt; must match &lt;code&gt;CODEX_BRIDGE_API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt; can include reasoning effort, such as &lt;code&gt;gpt-5-codex:medium&lt;/code&gt; or &lt;code&gt;gpt-5-codex:high&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session_id&lt;/code&gt; binds the request to a conversation and allows reuse of the same Codex thread.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For streaming output, add &lt;code&gt;stream: true&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -N http://localhost:8080/v1/chat/completions &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;content-type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;authorization: Bearer 123321&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;model&amp;#34;:&amp;#34;gpt-5-codex:high&amp;#34;,&amp;#34;session_id&amp;#34;:&amp;#34;stream&amp;#34;,&amp;#34;stream&amp;#34;:true,&amp;#34;messages&amp;#34;:[{&amp;#34;role&amp;#34;:&amp;#34;user&amp;#34;,&amp;#34;content&amp;#34;:&amp;#34;Explain step by step how to create a Node.js project&amp;#34;}]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For clients that support OpenAI streaming responses, this feels much closer to a normal chat experience.&lt;/p&gt;
&lt;h2 id=&#34;how-sessions-are-persisted&#34;&gt;How sessions are persisted
&lt;/h2&gt;&lt;p&gt;Session mapping is one of CodexBridge&amp;rsquo;s important features. A request can pass a session ID through these fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;session_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conversation_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;thread_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It can also be passed through request headers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x-session-id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session-id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x-conversation-id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x-thread-id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x-user-id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For production use, enable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_REQUIRE_SESSION_ID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This requires every request to include a session ID, preventing different users or chat windows from being mixed into the same temporary context. The bridge-side mapping is saved in &lt;code&gt;.codex_threads.json&lt;/code&gt;. Deleting this file resets the bridge mapping, while Codex&amp;rsquo;s own threads remain under &lt;code&gt;~/.codex/sessions&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;CODEX_REQUIRE_SESSION_ID=false&lt;/code&gt; and the request provides no session ID, the bridge expands the current &lt;code&gt;messages&lt;/code&gt; into one-off input for Codex. This is fine for temporary calls, but not for long-running conversations.&lt;/p&gt;
&lt;h2 id=&#34;multimodal-input&#34;&gt;Multimodal input
&lt;/h2&gt;&lt;p&gt;CodexBridge supports OpenAI-style content blocks and converts images into Codex-compatible &lt;code&gt;local_image&lt;/code&gt; input.&lt;/p&gt;
&lt;p&gt;Remote images can be written as:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;image_url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;image_url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://example.com/demo.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Local images can be written as:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;local_image&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;./images/demo.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Remote resources are downloaded into a temporary directory and cleaned up after the turn. In real use, watch the request body size, especially when sending base64 images. You may need to increase &lt;code&gt;CODEX_JSON_LIMIT&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;structured-output&#34;&gt;Structured output
&lt;/h2&gt;&lt;p&gt;If the client supports &lt;code&gt;response_format&lt;/code&gt;, CodexBridge can map it to Codex&amp;rsquo;s &lt;code&gt;outputSchema&lt;/code&gt;. This is useful when you want Codex to return a fixed JSON structure, such as a check result, summary, classification result, or automation report.&lt;/p&gt;
&lt;p&gt;A minimal example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;gpt-5-codex&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;session_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;lint&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;response_format&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;json_schema&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;json_schema&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;lint_report&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;schema&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;nt&#34;&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;nt&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;#34;enum&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;action_required&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;required&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;additionalProperties&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;messages&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Check lint issues under src/ and return the result as JSON&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;type: &amp;quot;json_schema&amp;quot;&lt;/code&gt; must include a &lt;code&gt;schema&lt;/code&gt;, otherwise the service returns 400.&lt;/p&gt;
&lt;h2 id=&#34;key-environment-variables&#34;&gt;Key environment variables
&lt;/h2&gt;&lt;p&gt;Common configuration can be grouped as follows.&lt;/p&gt;
&lt;p&gt;Service and authentication:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_BRIDGE_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;123321&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_JSON_LIMIT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;10mb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Default model:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_MODEL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;gpt-5-codex
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_REASONING&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;medium
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Codex runtime:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_WORKDIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_SANDBOX_MODE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;read-only
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_APPROVAL_POLICY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;never
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_SKIP_GIT_CHECK&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Network access:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_NETWORK_ACCESS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_WEB_SEARCH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If the service is only used for frontend chat, keeping network access off by default is safer. Enable these switches only when Codex clearly needs to run &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;git clone&lt;/code&gt;, or web search.&lt;/p&gt;
&lt;h2 id=&#34;docker-and-one-line-scripts&#34;&gt;Docker and one-line scripts
&lt;/h2&gt;&lt;p&gt;The project also provides Docker deployment for long-running service use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose logs -f codexbridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It also provides a Linux install script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://raw.githubusercontent.com/begonia599/CodexBridge/master/scripts/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The script installs dependencies, clones or updates the repository, copies &lt;code&gt;.env.example&lt;/code&gt;, and starts the service with Docker Compose. It requires &lt;code&gt;sudo&lt;/code&gt;, so it is best suited to a clean server. If the machine already has a complex Node.js, Docker, or Codex setup, read the script before running it.&lt;/p&gt;
&lt;h2 id=&#34;common-issues&#34;&gt;Common issues
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Request returns 413&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The request body is usually too large, often because of base64 images. Increase:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_JSON_LIMIT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;20mb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;API key is rejected&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Check that the request header includes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Authorization: Bearer &amp;lt;your CODEX_BRIDGE_API_KEY&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;or use &lt;code&gt;x-api-key&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Codex reports a Git repository restriction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If the working directory is not a trusted repository, Codex may trigger a check. Use this only in an environment you trust:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CODEX_SKIP_GIT_CHECK&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Reset conversations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The bridge mapping lives in &lt;code&gt;.codex_threads.json&lt;/code&gt;, while Codex&amp;rsquo;s own threads live in &lt;code&gt;~/.codex/sessions&lt;/code&gt;. Stop the service and delete the corresponding files or directories to reset them.&lt;/p&gt;
&lt;h2 id=&#34;recommendations&#34;&gt;Recommendations
&lt;/h2&gt;&lt;p&gt;For local testing, start with the default API key and the &lt;code&gt;read-only&lt;/code&gt; sandbox. After OpenWebUI, Cherry Studio, or scripts can call the service normally, gradually adjust &lt;code&gt;CODEX_WORKDIR&lt;/code&gt;, &lt;code&gt;CODEX_SANDBOX_MODE&lt;/code&gt;, &lt;code&gt;CODEX_NETWORK_ACCESS&lt;/code&gt;, and &lt;code&gt;CODEX_APPROVAL_POLICY&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For multi-user use, do at least three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Require &lt;code&gt;session_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Change the default API key.&lt;/li&gt;
&lt;li&gt;Clearly limit the working directory and sandbox permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CodexBridge is valuable not because it is complex, but because it places Codex inside the existing OpenAI-compatible ecosystem. If a client can change its base URL, it can treat Codex like a normal chat model while still retaining Codex&amp;rsquo;s local threads, sandbox, and tool behavior.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Why DeepSeek Became the Cost-Saving Key in This Round of AI Coding Tools</title>
        <link>https://knightli.com/en/2026/05/11/deepseek-ai-coding-cost-saving/</link>
        <pubDate>Mon, 11 May 2026 04:59:00 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/11/deepseek-ai-coding-cost-saving/</guid>
        <description>&lt;p&gt;In this round of AI coding tool competition, the surface battle is about model capability, plugin ecosystems, and agent automation. But once you actually use these tools, the first wall you hit is cost.&lt;/p&gt;
&lt;p&gt;Claude Code, Codex, OpenClaw, and Superpowers are all useful, but they share one trait: once a task becomes complex, they eat tokens aggressively. They need to read the project, build a plan, call tools, summarize context, repeatedly check results, and sometimes launch multiple subtasks. The smarter the model and the more automated the workflow, the easier it is for the bill to quietly grow.&lt;/p&gt;
&lt;p&gt;That is why DeepSeek has become important in this cycle. Not merely because it can write code, but because its long context and cache pricing happen to hit the most expensive part of AI coding tools.&lt;/p&gt;
&lt;h2 id=&#34;why-agent-tools-burn-so-many-tokens&#34;&gt;Why Agent Tools Burn So Many Tokens
&lt;/h2&gt;&lt;p&gt;Traditional chat-style coding assistants usually work in question-and-answer mode. You ask how to write a function, and the model returns a code snippet. This still costs tokens, but it is relatively controllable.&lt;/p&gt;
&lt;p&gt;Agent tools are different. They do not just answer questions. They enter the project like a temporary engineer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;scan directories and key files;&lt;/li&gt;
&lt;li&gt;understand the requirement and existing architecture;&lt;/li&gt;
&lt;li&gt;make a plan;&lt;/li&gt;
&lt;li&gt;modify files;&lt;/li&gt;
&lt;li&gt;run commands or tests;&lt;/li&gt;
&lt;li&gt;keep fixing based on errors;&lt;/li&gt;
&lt;li&gt;summarize what changed at the end.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During this process, the model repeatedly reads the same context. Project descriptions, code snippets, tool outputs, conversation history, plans, and error logs all get placed back into the context. Once the task is a little complex, hundreds of thousands of tokens can disappear quickly.&lt;/p&gt;
&lt;p&gt;If you add more aggressive plugins, the cost becomes even more obvious. Some OpenCode or Claude Code enhancement tools may organize a whole agent team by default. You only wanted to change a small feature, but it may still start planning, review, execution, and retrospective steps. The task may look more &amp;ldquo;intelligent&amp;rdquo;, but the token count keeps climbing.&lt;/p&gt;
&lt;h2 id=&#34;the-advantage-of-superpowers-is-on-demand-activation&#34;&gt;The Advantage of Superpowers Is On-Demand Activation
&lt;/h2&gt;&lt;p&gt;One advantage of tools like Superpowers is that they do not force a full agent workflow onto every task.&lt;/p&gt;
&lt;p&gt;Most of the time, you can still let Claude Code, OpenCode, or Codex work in their normal mode. Only when you explicitly call a skill, such as brainstorming, planning, executing a plan, or doing a retrospective, does it enter a heavier automation flow.&lt;/p&gt;
&lt;p&gt;That matters for cost.&lt;/p&gt;
&lt;p&gt;AI coding should not use heavy artillery for every task. Changing one config line, checking one error, or writing a small script can be handled through ordinary conversation. Only complex refactors, cross-file changes, long-document processing, and multi-round validation deserve a full agent workflow.&lt;/p&gt;
&lt;p&gt;The stronger the tool, the more you need to control when it triggers. Otherwise, more automation simply means more waste.&lt;/p&gt;
&lt;h2 id=&#34;deepseeks-key-advantage-is-cheap-cache-hits&#34;&gt;DeepSeek&amp;rsquo;s Key Advantage Is Cheap Cache Hits
&lt;/h2&gt;&lt;p&gt;One important reason DeepSeek fits these agent tools is its low cache-hit cost.&lt;/p&gt;
&lt;p&gt;AI coding tasks contain a lot of repeated prefixes: project background, system prompts, tool instructions, file content, and earlier conversation turns often appear again in later requests. If the model service supports prompt caching, those repeated parts become much cheaper after a cache hit.&lt;/p&gt;
&lt;p&gt;For many models, a cache hit is only somewhat cheaper than a miss, perhaps around one third of the original price. DeepSeek&amp;rsquo;s advantage is that the gap after a cache hit can be much larger. For long-context, multi-round agent workflows that repeatedly read the same project, this gap shows up directly on the bill.&lt;/p&gt;
&lt;p&gt;In other words, DeepSeek is not necessarily the strongest answer on every single turn. But in scenarios with long tasks, many rounds, and repeated context reads, its cost structure is unusually suitable for AI coding.&lt;/p&gt;
&lt;h2 id=&#34;long-context-makes-claude-code-more-useful&#34;&gt;Long Context Makes Claude Code More Useful
&lt;/h2&gt;&lt;p&gt;When Claude Code or similar tools are connected to DeepSeek V4, another clear advantage is long context.&lt;/p&gt;
&lt;p&gt;AI coding tools fear insufficient context. Once context runs short, compression becomes frequent. Once compression becomes frequent, previously read details may be lost. The model may start forgetting the project structure, constraints, or why a certain file was changed, and quality declines afterward.&lt;/p&gt;
&lt;p&gt;DeepSeek V4&amp;rsquo;s long-context capability makes it better suited for code repositories, document batch processing, subtitle translation, and site article cleanup. Especially when connected to tools like Claude Code or OpenClaw, the right configuration can delay context compression and preserve more project detail.&lt;/p&gt;
&lt;p&gt;That is why some tasks feel &amp;ldquo;durable&amp;rdquo; when run on DeepSeek. It may not be dazzling at every step, but it can tolerate long-running, low-cost, repeated calls.&lt;/p&gt;
&lt;h2 id=&#34;how-to-split-work-between-v4-pro-and-v4-flash&#34;&gt;How to Split Work Between V4 Pro and V4 Flash
&lt;/h2&gt;&lt;p&gt;DeepSeek V4 Pro and V4 Flash should not be mixed casually.&lt;/p&gt;
&lt;p&gt;For simple tasks, &lt;code&gt;DeepSeek V4 Flash&lt;/code&gt; is usually a better fit. It is fast and cheap, and is often enough for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;subtitle translation;&lt;/li&gt;
&lt;li&gt;document cleanup;&lt;/li&gt;
&lt;li&gt;ordinary script generation;&lt;/li&gt;
&lt;li&gt;small code edits;&lt;/li&gt;
&lt;li&gt;lightweight OpenClaw tasks;&lt;/li&gt;
&lt;li&gt;simple site content processing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For complex tasks, consider &lt;code&gt;DeepSeek V4 Pro&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;large-scale refactoring;&lt;/li&gt;
&lt;li&gt;multi-module code understanding;&lt;/li&gt;
&lt;li&gt;complex reasoning;&lt;/li&gt;
&lt;li&gt;long-chain agent tasks;&lt;/li&gt;
&lt;li&gt;high-risk code changes;&lt;/li&gt;
&lt;li&gt;engineering tasks that require stronger planning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many people want to attach the strongest model immediately, but that is often uneconomical. The practical way to use AI coding tools is to layer tasks: let the cheaper model handle a large amount of routine work, and reserve the expensive model for key decision points.&lt;/p&gt;
&lt;h2 id=&#34;minimax-doubao-and-deepseek-occupy-different-positions&#34;&gt;MiniMax, Doubao, and DeepSeek Occupy Different Positions
&lt;/h2&gt;&lt;p&gt;Among domestic models and plans, MiniMax, Doubao, Kimi, and DeepSeek each have their own place.&lt;/p&gt;
&lt;p&gt;MiniMax&amp;rsquo;s advantage is generous quota, low price, and broad functionality. It may not be the smartest coding model, but it is cost-effective for translation, lightweight cleanup, and batch processing. For example, batch subtitle processing, format conversion, and simple proofreading are good fits for MiniMax-style plans.&lt;/p&gt;
&lt;p&gt;Doubao&amp;rsquo;s advantage is a broader tool ecosystem: image, video, search, TTS, possible STT, and embedding can be connected together. It feels more like a comprehensive toolbox.&lt;/p&gt;
&lt;p&gt;DeepSeek&amp;rsquo;s position is clearer: text, code, long context, and low-cost caching. It lacks a complete image generation, voice, and video ecosystem, and its weaknesses are obvious. But in AI coding and long-text agent workflows, its strengths are long enough to matter.&lt;/p&gt;
&lt;p&gt;So this is not about one tool replacing another. It is about splitting the task and using each tool where it fits.&lt;/p&gt;
&lt;h2 id=&#34;saving-money-is-not-just-choosing-a-cheap-model&#34;&gt;Saving Money Is Not Just Choosing a Cheap Model
&lt;/h2&gt;&lt;p&gt;Saving money in AI coding does not mean simply switching every request to the cheapest model.&lt;/p&gt;
&lt;p&gt;The effective methods are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Do not start a heavy agent for simple tasks.&lt;/li&gt;
&lt;li&gt;Do not use Pro when Flash is enough.&lt;/li&gt;
&lt;li&gt;Use cache as much as possible for long tasks.&lt;/li&gt;
&lt;li&gt;Keep repeated context stable, so meaningless changes do not break cache hits.&lt;/li&gt;
&lt;li&gt;Let a cheaper model draft and batch-process first, then use a stronger model for key reviews.&lt;/li&gt;
&lt;li&gt;Tell the agent clearly not to repeat facts or summarize the same point again and again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The last point matters more than it looks. AI tools are prone to verbosity, and verbosity is not only a reading problem; it is also a cost problem. Putting &amp;ldquo;describe each fact once and state each opinion once&amp;rdquo; into the prompt can improve both article quality and token consumption.&lt;/p&gt;
&lt;h2 id=&#34;what-ai-coding-workflows-deepseek-fits-best&#34;&gt;What AI Coding Workflows DeepSeek Fits Best
&lt;/h2&gt;&lt;p&gt;DeepSeek is best suited for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reading long code repositories;&lt;/li&gt;
&lt;li&gt;lightweight multi-file edits;&lt;/li&gt;
&lt;li&gt;batch document cleanup;&lt;/li&gt;
&lt;li&gt;batch subtitle translation;&lt;/li&gt;
&lt;li&gt;Hugo article cleanup;&lt;/li&gt;
&lt;li&gt;agent plan execution;&lt;/li&gt;
&lt;li&gt;low-cost automation with lots of repeated context.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is not the best fit for every task. If you need especially strong frontend taste, complex product judgment, or cross-modal creation, you may still need Claude, GPT, Gemini, Doubao, or other tools.&lt;/p&gt;
&lt;p&gt;But whenever a task is long-text, long-context, repeated-call, and cost-sensitive, DeepSeek can easily become the first choice.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;In this round of AI coding tools, DeepSeek&amp;rsquo;s value is not just that a domestic model can write code. Its real value is that it addresses the most practical pain point of agent tools: long tasks are too expensive.&lt;/p&gt;
&lt;p&gt;Tools like Claude Code, OpenClaw, and Superpowers make the development process increasingly automated, but behind that automation are massive context reads and multi-round calls. Whoever can lower this part of the cost can make AI coding go from &amp;ldquo;fun once in a while&amp;rdquo; to &amp;ldquo;affordable every day&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;DeepSeek&amp;rsquo;s long context, low cache cost, and layered use of V4 Flash / V4 Pro put it in exactly that position.&lt;/p&gt;
&lt;p&gt;The real cost-saving key in this cycle is not avoiding good models. It is combining good models, cheap models, cache, and agent workflows properly. Once you understand that bill, AI coding tools can become real productivity rather than a beautiful but expensive toy.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How to Choose AI Coding Plans: Convenience for Light Users, Flexibility for Heavy Users</title>
        <link>https://knightli.com/en/2026/05/10/ai-coding-plan-selection/</link>
        <pubDate>Sun, 10 May 2026 08:20:58 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/10/ai-coding-plan-selection/</guid>
        <description>&lt;p&gt;AI coding plans have changed quickly over the past six months. Many tools have shifted from message-style pricing to usage-based pricing, generous low-cost tiers have become tighter, and some overseas services have added stricter identity checks, regional limits, and usage rules.&lt;/p&gt;
&lt;p&gt;For developers, the question is no longer just which model is strongest. It is also about how much to spend every month, whether the quota is enough, whether the tool feels comfortable to use, and whether you can switch smoothly when a provider suddenly raises prices or changes the rules.&lt;/p&gt;
&lt;p&gt;A practical conclusion is this: light users should buy convenience, mid-level users should buy value, and heavy users should buy flexibility. The heavier your usage, the less you should bind models and tools together in a single plan.&lt;/p&gt;
&lt;h2 id=&#34;four-things-to-evaluate-before-choosing-a-plan&#34;&gt;Four things to evaluate before choosing a plan
&lt;/h2&gt;&lt;p&gt;In the past, people usually looked at three things when choosing an AI coding plan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Whether the model was strong enough.&lt;/li&gt;
&lt;li&gt;Whether the response speed was stable.&lt;/li&gt;
&lt;li&gt;Whether the usage quota was sufficient.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now there is a fourth factor: whether the model and the tool can be separated.&lt;/p&gt;
&lt;p&gt;The model provides reasoning ability, while the tool provides context management, file editing, agent orchestration, and workflow experience. Both matter, but they are better not fully tied together. For example, if you like Claude models, you can buy an official plan or connect the API to another tool. If you like a certain editor or agent environment, it is better if it can connect to different models instead of only its own.&lt;/p&gt;
&lt;p&gt;The value here is not complexity for its own sake. It is risk reduction. AI coding is one of the fastest-changing segments in the industry. A plan that feels generous today may switch pricing in two months, and a tool that feels good today may become worse after the next model integration change. Separating models from tools gives you room to move.&lt;/p&gt;
&lt;h2 id=&#34;overseas-plans-are-getting-tighter&#34;&gt;Overseas plans are getting tighter
&lt;/h2&gt;&lt;p&gt;Tools such as GitHub Copilot, Cursor, Windsurf, and Claude Code are still the primary choices for many users, but the trend is clear: cheap plans with unusually high quotas are becoming harder to sustain, and usage-based billing is becoming more common.&lt;/p&gt;
&lt;p&gt;Once services like GitHub Copilot lean more heavily on usage-based billing, the room for plan-based arbitrage becomes much smaller. For light users, these products are still convenient. But for people who frequently use agents, long context, and complex code tasks, actual consumption starts to look much closer to real API cost.&lt;/p&gt;
&lt;p&gt;Cursor and Windsurf essentially package model capability into an IDE experience. Their strength is convenience and a mature editor workflow. Their weakness is tighter tool lock-in. Once you become dependent on their proprietary agents, indexing, and automation flow, migration costs can rise quickly.&lt;/p&gt;
&lt;p&gt;Claude Code remains attractive in terms of experience and ecosystem attention, but overseas subscriptions, identity verification, regional restrictions, and the safety of relay services are all risks that users in China have to factor in. Third-party relay services may mix models, be unstable, expose user data, or even disappear entirely, which makes them hard to treat as long-term infrastructure for important work.&lt;/p&gt;
&lt;h2 id=&#34;the-strengths-and-limits-of-domestic-plans&#34;&gt;The strengths and limits of domestic plans
&lt;/h2&gt;&lt;p&gt;One advantage of domestic AI coding plans is that many of them are offered through APIs, which means they are less tightly bound to a specific tool. You can connect them to OpenCode, Cline, Continue, your own scripts, or internal agents.&lt;/p&gt;
&lt;p&gt;The weakness is also clear: if you want model strength, high speed, and generous quota all at once, very few plans can deliver everything together.&lt;/p&gt;
&lt;p&gt;GLM models are strong within the domestic model landscape, but throughput during peak hours may not be stable, which can make heavy tasks feel slow. Kimi is capable, but pricing and quota rules still need ongoing attention, especially whether backend quota is transparent. Models like MiniMax are friendlier in speed and allowance, which makes them suitable for light day-to-day tasks, batch jobs, and simpler coding help, though they may sit a tier lower on harder engineering reasoning. DeepSeek can be highly cost-effective when a new model is still in its promotional pricing period, but once that ends, you have to evaluate it again under normal pricing.&lt;/p&gt;
&lt;p&gt;That is why domestic options are often better used as a model pool: different tasks use different models, instead of betting everything on one model and one plan.&lt;/p&gt;
&lt;h2 id=&#34;light-users-choose-what-feels-convenient-and-do-not-overbuild&#34;&gt;Light users: choose what feels convenient and do not overbuild
&lt;/h2&gt;&lt;p&gt;If you only ask AI to tweak scripts, patch documentation, explain errors, or generate small tools once or twice a week, you probably do not need a complicated setup.&lt;/p&gt;
&lt;p&gt;For this kind of user, convenience matters most. Cursor, Windsurf, Trae, CodeBuddy, Tongyi Lingma, GitHub Copilot, and similar tools are all worth trying. The goal is not the absolute lowest unit cost. The goal is low friction: something stable inside your editor, decent completions, and easy recovery when it makes a mistake.&lt;/p&gt;
&lt;p&gt;Light users usually should not spend too much time building multi-layer API setups, relays, and proxy chains just to save a little money. The time cost, account risk, and debugging overhead are often more expensive than the subscription fee you save.&lt;/p&gt;
&lt;h2 id=&#34;mid-level-users-focus-on-value-but-also-on-portability&#34;&gt;Mid-level users: focus on value, but also on portability
&lt;/h2&gt;&lt;p&gt;If you use AI every day for coding, project edits, test generation, and document work, then quota and actual consumption start to matter much more.&lt;/p&gt;
&lt;p&gt;For this kind of user, it makes sense to separate the main tool from backup models. For example, one convenient IDE plan can handle daily editing, while a multi-tool API or aggregator plan can be used for longer-context and more complex agent tasks.&lt;/p&gt;
&lt;p&gt;Three things matter most at this stage:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Whether it supports third-party tool integration.&lt;/li&gt;
&lt;li&gt;Whether token or quota consumption is visible and understandable.&lt;/li&gt;
&lt;li&gt;Whether overage means throttling, downgrade, shutdown, or pure usage-based billing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If a plan looks cheap but can only be used inside its own tool, you need to count migration cost as part of the real price. If a plan costs more but can plug into multiple tools, it may be the better long-term choice.&lt;/p&gt;
&lt;h2 id=&#34;heavy-users-do-not-lock-models-and-tools-together&#34;&gt;Heavy users: do not lock models and tools together
&lt;/h2&gt;&lt;p&gt;For heavy users, flexibility is the core requirement.&lt;/p&gt;
&lt;p&gt;When a person or team uses AI agents intensively every day, consumption grows very quickly. Repository search, long-context edits, multi-round debugging, and automated test repair can all multiply token use. Once you rely on a single plan, three problems show up easily:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The quota suddenly becomes too small.&lt;/li&gt;
&lt;li&gt;The pricing rule suddenly changes.&lt;/li&gt;
&lt;li&gt;A tool or model becomes temporarily unavailable.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A more stable approach is to prepare a layered setup: one primary agent tool, one or more replaceable model endpoints, one low-cost model for simple work, and one high-capability model for harder tasks. Small routine work should not always go to the most expensive model, and critical work should not rely only on the cheapest model either.&lt;/p&gt;
&lt;p&gt;For heavy users, the ability for tools to connect to any model and for models to connect to any tool matters more than saving a few dozen dollars per month. The real expense is not the subscription itself. It is the cost of being locked into one ecosystem and having to rebuild your workflow later.&lt;/p&gt;
&lt;h2 id=&#34;a-more-stable-combination-strategy&#34;&gt;A more stable combination strategy
&lt;/h2&gt;&lt;p&gt;A relatively steady way to structure your setup looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use a low-cost model for light tasks such as code explanations, small scripts, formatting, and simple documents.&lt;/li&gt;
&lt;li&gt;Use a value-oriented model for mid-level tasks such as standard feature work, test completion, and refactor suggestions.&lt;/li&gt;
&lt;li&gt;Use a stronger model for difficult tasks such as architecture changes, cross-file fixes, hard bugs, and long-context reasoning.&lt;/li&gt;
&lt;li&gt;Keep the tool layer open by choosing tools that can connect to APIs, export configuration, and switch models.&lt;/li&gt;
&lt;li&gt;Maintain a backup path so that when a main plan changes rules, you can switch quickly to another model or tool.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This may not be the absolute cheapest setup, but it is much more resilient. AI coding prices and quotas will keep changing. The thing worth investing in for the long term is a portable workflow, not a short-term deal that only looks unusually generous for a while.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;AI coding plans should not be judged by monthly price alone. Light users should keep things simple and choose a convenient tool. Mid-level users should start paying attention to quota, consumption, and portability. Heavy users should decouple models from tools and avoid being trapped in one ecosystem.&lt;/p&gt;
&lt;p&gt;The most useful thing to remember is that plans will change, models will change, and tools will change too. Keeping the choice in your own hands is the most important form of cost control in long-term AI coding work.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Codex vs Claude Code: How to Choose Between Two Subagent Designs</title>
        <link>https://knightli.com/en/2026/05/08/codex-vs-claude-code-subagent-design/</link>
        <pubDate>Fri, 08 May 2026 14:14:01 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/08/codex-vs-claude-code-subagent-design/</guid>
        <description>&lt;p&gt;AI coding tools are paying more attention to subagents. This is not just feature chasing. A single agent eventually hits limits when it has to handle real engineering work.&lt;/p&gt;
&lt;p&gt;If one agent reads code, checks logs, edits implementation, runs tests, analyzes failures, and summarizes results at the same time, the main context quickly becomes noisy. Search results, command output, test logs, and intermediate reasoning get mixed together. Later decisions become less reliable. Work also becomes hard to parallelize: exploration, implementation, verification, and review all sit on one main thread.&lt;/p&gt;
&lt;p&gt;The purpose of subagents is to reduce that pressure. The main session stops doing everything from start to finish and becomes more like a coordinator: define goals, assign work, receive results, and merge them into the final answer. A subagent handles a local piece of work, such as exploration, implementation, verification, or review, and returns a compressed conclusion.&lt;/p&gt;
&lt;p&gt;So a subagent is not “another copy of me.” It is a way to split tangled engineering work into clearer roles.&lt;/p&gt;
&lt;h2 id=&#34;shared-foundations&#34;&gt;Shared Foundations
&lt;/h2&gt;&lt;p&gt;A mature subagent system usually needs four foundations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Context isolation.&lt;/li&gt;
&lt;li&gt;Role specialization.&lt;/li&gt;
&lt;li&gt;Project and user-level configuration.&lt;/li&gt;
&lt;li&gt;Tool and permission boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Context isolation comes first. Real repositories produce a lot of intermediate material: dozens of search hits, hundreds of test log lines, noisy command output. If all of that is poured into the main session, the main thread gets confused. A subagent can digest that local process and bring back only the signals that matter.&lt;/p&gt;
&lt;p&gt;Role specialization is just as important. Multi-agent does not mean opening several identical models. Exploration roles should search, read, and summarize. Implementation roles should focus on local code changes. Verification roles should run checks, identify risks, and report clearly.&lt;/p&gt;
&lt;p&gt;Tool and permission boundaries determine whether the system can be used safely. A subagent should not automatically inherit every capability of the main session. A read-only explorer does not need write access. A verifier may not need to change implementation. Background tasks and isolated worktrees need visible boundaries.&lt;/p&gt;
&lt;p&gt;Codex and Claude Code share these concerns, but they take different routes.&lt;/p&gt;
&lt;h2 id=&#34;codex-explicit-delegation&#34;&gt;Codex: Explicit Delegation
&lt;/h2&gt;&lt;p&gt;Codex’s subagent design feels restrained.&lt;/p&gt;
&lt;p&gt;It gives you a controlled, lightweight delegation mechanism around the current main session. When to delegate, who receives the task, and when results are collected are all explicit decisions. The control flow stays in the current task.&lt;/p&gt;
&lt;p&gt;Its traits are clear:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The main session explicitly delegates subwork.&lt;/li&gt;
&lt;li&gt;The role set stays small.&lt;/li&gt;
&lt;li&gt;The main session knows which agent is doing what.&lt;/li&gt;
&lt;li&gt;Results return to the main line for final judgment.&lt;/li&gt;
&lt;li&gt;Collaboration boundaries are transparent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This works well for teams that care about manual orchestration, predictability, and execution determinism. You can ask an explorer to inspect a call chain, ask a worker to make a bounded change, then let the main session merge the result and decide whether to test further.&lt;/p&gt;
&lt;p&gt;The tradeoff is that orchestration pressure still sits with the main session. The main thread must decide when to split work, how to split it, who should take it, and how to merge the result. For lightweight collaboration this is pleasant; for long-running engineering workflows it can become tiring.&lt;/p&gt;
&lt;h2 id=&#34;claude-code-agents-as-workstations&#34;&gt;Claude Code: Agents as Workstations
&lt;/h2&gt;&lt;p&gt;Claude Code takes a more platform-like route.&lt;/p&gt;
&lt;p&gt;It treats agents as describable, selectable, configurable, memorable, isolated, and background-capable objects. A subagent is not just a helper in a conversation. It is closer to a workstation in an engineering system.&lt;/p&gt;
&lt;p&gt;The system can expose agent lists, use cases, descriptions, and tool boundaries to the model, allowing the model to decide which role should handle a turn. That makes delegation more automatic.&lt;/p&gt;
&lt;p&gt;Several capabilities define this direction.&lt;/p&gt;
&lt;p&gt;First, a role system. Explorer, planner, general-purpose, and verifier roles can carry usage descriptions, tool restrictions, default models, and runtime conditions. A read-only explorer can be prevented from editing files. A planner can focus on architecture. A verifier can focus on checks.&lt;/p&gt;
&lt;p&gt;Second, inheritance and overrides. A subagent is not completely free. It inherits the larger boundary of the main session by default, but can adjust local behavior within allowed rules. The main session defines the big boundary; the agent performs local assembly inside it.&lt;/p&gt;
&lt;p&gt;Third, memory. Memory is not just “remember a few things.” It can have scope. User memory is like long-term preference. Project memory is repository background. Local memory is environment-specific state. This lets some agents avoid relearning the project from scratch.&lt;/p&gt;
&lt;p&gt;Fourth, background work and worktree isolation. Some verification tasks can keep running in the background, while the main thread continues. When stronger isolation is needed, an agent can work in a separate worktree, keeping the project connected but the operation space separated.&lt;/p&gt;
&lt;p&gt;Fifth, plugin ecosystem. If agents are first-class objects, you have to think about distribution, installation, priority, override rules, and safety. Plugin agents can enter the system, but high-risk fields such as permission mode, hooks, and MCP servers should remain guarded.&lt;/p&gt;
&lt;p&gt;This makes Claude Code feel more like an agent runtime than a one-session collaboration tool.&lt;/p&gt;
&lt;h2 id=&#34;the-difference&#34;&gt;The Difference
&lt;/h2&gt;&lt;p&gt;Codex is closer to a controlled delegation tool:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explicit delegation.&lt;/li&gt;
&lt;li&gt;Lightweight role set.&lt;/li&gt;
&lt;li&gt;Clean control flow.&lt;/li&gt;
&lt;li&gt;Subtasks centered on the current session.&lt;/li&gt;
&lt;li&gt;Good for deterministic, human-orchestrated work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Claude Code is closer to an engineering workstation system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agents are formally modeled.&lt;/li&gt;
&lt;li&gt;Roles are more systematic.&lt;/li&gt;
&lt;li&gt;Memory, background execution, isolation, and plugins are part of the runtime.&lt;/li&gt;
&lt;li&gt;The model can help choose roles.&lt;/li&gt;
&lt;li&gt;Good for long-term projects and platform-like workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The real question is not which one has more features. It is whether you want a subagent to be “a helper I explicitly call” or “a long-lived workstation in the system.”&lt;/p&gt;
&lt;h2 id=&#34;how-to-choose&#34;&gt;How to Choose
&lt;/h2&gt;&lt;p&gt;Choose the Codex style if you value explicit control, lightweight delegation, and safe parallelism inside the current session. It is good for code review, small changes, clearly scoped implementation tasks, and workflows where a human wants to keep the rhythm.&lt;/p&gt;
&lt;p&gt;Choose the Claude Code style if you want systematic roles, long-term memory, background execution, worktree isolation, plugin extension, and a more complete agent runtime.&lt;/p&gt;
&lt;p&gt;Ask two questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Are you comfortable with the model choosing who should do the work?&lt;/li&gt;
&lt;li&gt;Do you need a fuller agent runtime?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the first question makes you uncomfortable, explicit delegation is likely better. If the second answer is yes, a platform-like workstation system may fit better.&lt;/p&gt;
&lt;h2 id=&#34;practical-advice&#34;&gt;Practical Advice
&lt;/h2&gt;&lt;p&gt;Do not treat subagents as “more models means stronger.” Better practice is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give every role a clear task boundary.&lt;/li&gt;
&lt;li&gt;Limit the tools each role can use.&lt;/li&gt;
&lt;li&gt;Ask subagents to return conclusions, not raw logs.&lt;/li&gt;
&lt;li&gt;Keep final decisions in the main session.&lt;/li&gt;
&lt;li&gt;Make background tasks and worktree isolation visible.&lt;/li&gt;
&lt;li&gt;Set clear safety boundaries for plugin agents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The value of subagents is not quantity. It is clean division of labor, cleaner context, and more stable main-thread decisions.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Codex and Claude Code solve the same problem: one agent cannot comfortably carry all real engineering work. Both recognize the importance of context isolation, role specialization, permissions, and local summarization.&lt;/p&gt;
&lt;p&gt;Codex is more restrained, emphasizing explicit delegation and main-session control. Claude Code is more systematic, treating agents as configurable, memorable, isolated, background-capable workstations that can also enter a plugin ecosystem.&lt;/p&gt;
&lt;p&gt;The choice is not which brand wins. It is whether your workflow needs a controlled collaboration tool or a full agent runtime.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>9Router: Connect Claude Code, Codex, and Cursor to One AI Router</title>
        <link>https://knightli.com/en/2026/05/08/9router-ai-coding-router-token-saver/</link>
        <pubDate>Fri, 08 May 2026 13:41:15 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/08/9router-ai-coding-router-token-saver/</guid>
        <description>&lt;p&gt;9Router is a local router for AI coding tools. It lets Claude Code, Codex, Cursor, Cline, Copilot, OpenCode, OpenClaw, and similar tools connect to one OpenAI-compatible endpoint, then routes requests to different models and providers.&lt;/p&gt;
&lt;p&gt;It is not trying to be another chat client. It sits between your AI coding tools and model providers, solving a few practical problems: incompatible API formats, manual provider switching, fast token burn from tool output, interrupted work when quotas run out, and messy multi-account configuration.&lt;/p&gt;
&lt;p&gt;According to the project README, 9Router supports 40+ providers and 100+ models. It includes RTK Token Saver, automatic fallback, quota tracking, multi-account rotation, format translation, and request logging. The project is written in JavaScript and uses Node.js, Next.js, React, Tailwind CSS, and LowDB. It is licensed under MIT.&lt;/p&gt;
&lt;h2 id=&#34;what-it-is-good-for&#34;&gt;What It Is Good For
&lt;/h2&gt;&lt;p&gt;9Router is most useful when you use multiple AI coding tools and multiple model sources at the same time.&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code uses a subscription account.&lt;/li&gt;
&lt;li&gt;Codex or Cursor needs a custom OpenAI endpoint.&lt;/li&gt;
&lt;li&gt;Cline, Continue, or RooCode needs an OpenAI-compatible API.&lt;/li&gt;
&lt;li&gt;Free providers are used for experiments.&lt;/li&gt;
&lt;li&gt;GLM, MiniMax, or Kimi is used as a cheaper backup.&lt;/li&gt;
&lt;li&gt;High-quality models are reserved for difficult tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without 9Router, these settings are scattered across many tools. Each tool needs its own endpoint, API key, model name, and fallback plan. 9Router centralizes that into one local routing layer.&lt;/p&gt;
&lt;p&gt;Default local API:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://localhost:20128/v1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dashboard:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://localhost:20128/dashboard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;quick-install&#34;&gt;Quick Install
&lt;/h2&gt;&lt;p&gt;For local use, npm is the simplest path:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g 9router
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;9router
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The dashboard opens locally, and the README uses &lt;code&gt;20128&lt;/code&gt; as the default port.&lt;/p&gt;
&lt;p&gt;Run from source:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/decolua/9router.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; 9router
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp .env.example .env
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;20128&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;NEXT_PUBLIC_BASE_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://localhost:20128 npm run dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Production mode:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;20128&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;HOSTNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0.0.0.0 &lt;span class=&#34;nv&#34;&gt;NEXT_PUBLIC_BASE_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://localhost:20128 npm run start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The npm package requires Node.js &lt;code&gt;&amp;gt;=18.0.0&lt;/code&gt;. For VPS or Docker deployment, configure &lt;code&gt;JWT_SECRET&lt;/code&gt;, &lt;code&gt;INITIAL_PASSWORD&lt;/code&gt;, &lt;code&gt;DATA_DIR&lt;/code&gt;, and &lt;code&gt;API_KEY_SECRET&lt;/code&gt; instead of exposing defaults.&lt;/p&gt;
&lt;h2 id=&#34;connect-coding-tools&#34;&gt;Connect Coding Tools
&lt;/h2&gt;&lt;p&gt;9Router exposes an OpenAI-compatible API, so most tools that support custom OpenAI endpoints can connect to it.&lt;/p&gt;
&lt;p&gt;Typical configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Base URL: http://localhost:20128/v1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;API Key: copied from the 9Router dashboard
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Model: a model name or combo name configured in 9Router
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For Codex CLI:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://localhost:20128&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;your-9router-api-key&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;codex &lt;span class=&#34;s2&#34;&gt;&amp;#34;your prompt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For Cline, Continue, or RooCode, choose &lt;code&gt;OpenAI Compatible&lt;/code&gt; and set:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Base URL: http://localhost:20128/v1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;API Key: your-9router-api-key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Model: cc/claude-opus-4-7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Model names depend on connected providers. The README shows prefixes such as &lt;code&gt;cc/&lt;/code&gt;, &lt;code&gt;cx/&lt;/code&gt;, &lt;code&gt;gh/&lt;/code&gt;, &lt;code&gt;glm/&lt;/code&gt;, &lt;code&gt;minimax/&lt;/code&gt;, &lt;code&gt;kr/&lt;/code&gt;, and &lt;code&gt;vertex/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;rtk-token-saver&#34;&gt;RTK Token Saver
&lt;/h2&gt;&lt;p&gt;AI coding tools often burn tokens fastest on tool outputs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git diff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tree&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;logs&lt;/li&gt;
&lt;li&gt;long file lists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;9Router includes RTK Token Saver, which compresses these outputs before they are sent to the model. The project says this can save 20%-40% input tokens in many requests.&lt;/p&gt;
&lt;p&gt;The value is that you do not need to change tools or models. The routing layer removes waste before the request reaches the provider. Still, for critical logs or complete file content, test the behavior first and make sure answer quality does not drop.&lt;/p&gt;
&lt;h2 id=&#34;automatic-fallback&#34;&gt;Automatic Fallback
&lt;/h2&gt;&lt;p&gt;9Router can arrange models in priority order:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. Subscription model
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. Cheap API
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. Free provider
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When the first tier is rate-limited, out of quota, or failing, it can switch to the next one. This reduces manual switching and keeps coding sessions from stopping suddenly.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. cc/claude-opus-4-7
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. glm/glm-5.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. kr/claude-sonnet-4.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Fallback changes output consistency. Different models have different style and reasoning quality. For large refactors, protocols, migrations, or other consistency-sensitive work, prefer a fixed model and switch manually only when needed.&lt;/p&gt;
&lt;h2 id=&#34;be-careful-with-free-providers&#34;&gt;Be Careful with Free Providers
&lt;/h2&gt;&lt;p&gt;The README highlights Kiro, OpenCode Free, Vertex, and also notes that some old free tiers have changed or are no longer recommended.&lt;/p&gt;
&lt;p&gt;Always confirm provider policy at the time of use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is it really free?&lt;/li&gt;
&lt;li&gt;Is it region-limited?&lt;/li&gt;
&lt;li&gt;Is third-party tool access allowed?&lt;/li&gt;
&lt;li&gt;Can it trigger bans or rate limits?&lt;/li&gt;
&lt;li&gt;Does the free quota expire?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;9Router manages routing, not upstream terms. Be especially careful when using personal subscriptions, OAuth tokens, or free quotas with automated tools.&lt;/p&gt;
&lt;h2 id=&#34;local-deployment-advice&#34;&gt;Local Deployment Advice
&lt;/h2&gt;&lt;p&gt;For personal use, bind to &lt;code&gt;localhost&lt;/code&gt;. Local tools can reach it, but the internet cannot.&lt;/p&gt;
&lt;p&gt;For VPS or LAN deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the default login password.&lt;/li&gt;
&lt;li&gt;Set a strong &lt;code&gt;JWT_SECRET&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;API_KEY_SECRET&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Put authentication in front of the dashboard.&lt;/li&gt;
&lt;li&gt;Do not expose the dashboard directly to the public internet.&lt;/li&gt;
&lt;li&gt;Require Bearer API keys for &lt;code&gt;/v1/*&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Back up &lt;code&gt;DATA_DIR&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -d &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --name 9router &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -p 20128:20128 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --env-file ./.env &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -v 9router-data:/app/data &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -v 9router-usage:/root/.9router &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  9router
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Start locally first, verify providers, combos, logs, and model names, then decide whether server deployment is worth it.&lt;/p&gt;
&lt;h2 id=&#34;who-should-use-it&#34;&gt;Who Should Use It
&lt;/h2&gt;&lt;p&gt;9Router is a good fit if you use multiple AI coding tools, multiple providers, subscription plus free or cheap tiers, and want a central fallback policy. It is less useful if you only use one model and one tool.&lt;/p&gt;
&lt;p&gt;Its real value is turning scattered model access into a configurable local routing layer.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;9Router is a local gateway for AI coding tools. It lets Claude Code, Codex, Cursor, Cline, and similar tools talk to &lt;code&gt;http://localhost:20128/v1&lt;/code&gt;, while it handles model selection, format translation, token compression, quota tracking, and fallback.&lt;/p&gt;
&lt;p&gt;It is best for heavy AI coding users who already switch between providers. Start with one tool and one provider, then add accounts and combos gradually.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/decolua/9router&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;9Router GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://9router.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;9Router website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/9router&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;9Router npm package&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>goose: An Open Source AI Agent with Desktop, CLI, and API</title>
        <link>https://knightli.com/en/2026/05/08/goose-open-source-ai-agent-desktop-cli-api/</link>
        <pubDate>Fri, 08 May 2026 13:41:15 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/08/goose-open-source-ai-agent-desktop-cli-api/</guid>
        <description>&lt;p&gt;goose is an open source AI agent that runs on your own machine. It is not limited to code completion; it aims to cover code, research, writing, automation, data analysis, and other tasks. The README positions it as a desktop app, CLI, and API that can serve both normal users and custom workflows.&lt;/p&gt;
&lt;p&gt;The project has moved from &lt;code&gt;block/goose&lt;/code&gt; to the Agentic AI Foundation (AAIF) at the Linux Foundation. The current repository is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://github.com/aaif-goose/goose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;goose is mainly written in Rust and TypeScript and uses the Apache-2.0 license. Its GitHub description says it is an open source, extensible AI agent that goes beyond code suggestions and can install, execute, edit, and test with any LLM.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-it-solves&#34;&gt;What Problem It Solves
&lt;/h2&gt;&lt;p&gt;Many AI coding tools focus on suggestions or local code edits. goose takes a broader view: let an AI agent complete tasks directly on your machine.&lt;/p&gt;
&lt;p&gt;It can be used for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code changes and tests.&lt;/li&gt;
&lt;li&gt;Local automation.&lt;/li&gt;
&lt;li&gt;Research and writing.&lt;/li&gt;
&lt;li&gt;Data analysis.&lt;/li&gt;
&lt;li&gt;Multi-step workflows.&lt;/li&gt;
&lt;li&gt;Embedding through an API.&lt;/li&gt;
&lt;li&gt;Tool extension through MCP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you only need IDE completion, a Copilot-style tool may be enough. goose is more useful when you want AI inside the local task execution chain.&lt;/p&gt;
&lt;h2 id=&#34;desktop-cli-and-api&#34;&gt;Desktop, CLI, and API
&lt;/h2&gt;&lt;p&gt;goose has three entry points.&lt;/p&gt;
&lt;p&gt;The desktop app supports macOS, Linux, and Windows. It is good for users who prefer a visual interface.&lt;/p&gt;
&lt;p&gt;The CLI fits terminal workflows and local development automation.&lt;/p&gt;
&lt;p&gt;The API lets other systems or internal tools embed goose as an agent runtime.&lt;/p&gt;
&lt;p&gt;Personal users can start with the desktop app or CLI. Teams and workflow builders should also look at the API and custom distribution support.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;The README recommends downloading the desktop app:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://goose-docs.ai/docs/getting-started/installation
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;CLI install:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://github.com/aaif-goose/goose/releases/download/stable/download_cli.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;GitHub Releases provide builds for multiple platforms. The latest release checked here was &lt;code&gt;v1.33.1&lt;/code&gt;, published on 2026-04-29, with macOS, Linux, Windows, deb, rpm, and Flatpak assets.&lt;/p&gt;
&lt;p&gt;After installation, configure a provider from the official quickstart and test in a low-risk directory first. goose can execute local tasks, so avoid giving it broad permissions in a production repository from the start.&lt;/p&gt;
&lt;h2 id=&#34;providers&#34;&gt;Providers
&lt;/h2&gt;&lt;p&gt;goose supports 15+ providers, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Anthropic&lt;/li&gt;
&lt;li&gt;OpenAI&lt;/li&gt;
&lt;li&gt;Google&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;OpenRouter&lt;/li&gt;
&lt;li&gt;Azure&lt;/li&gt;
&lt;li&gt;Bedrock&lt;/li&gt;
&lt;li&gt;other cloud or OpenAI-compatible providers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It can use API keys, and it can also use existing Claude, ChatGPT, or Gemini subscriptions through ACP.&lt;/p&gt;
&lt;p&gt;ACP is important because many users already pay for subscriptions, but different tools cannot easily reuse them. goose uses ACP providers to bring those subscriptions into an agent workflow.&lt;/p&gt;
&lt;p&gt;Provider policies change quickly. Check whether the access method is allowed, whether there are quotas, and whether it is suitable for company code or sensitive data.&lt;/p&gt;
&lt;h2 id=&#34;mcp-extensions&#34;&gt;MCP Extensions
&lt;/h2&gt;&lt;p&gt;goose supports Model Context Protocol extensions. The README mentions 70+ extensions.&lt;/p&gt;
&lt;p&gt;MCP matters because an agent should not only chat and edit files. Through standard protocol servers, it can connect to documentation, databases, browsers, internal systems, search services, design tools, or project management tools.&lt;/p&gt;
&lt;p&gt;For teams, MCP can become a safer integration layer: expose internal capabilities through explicit interfaces instead of letting the model touch every system directly.&lt;/p&gt;
&lt;h2 id=&#34;difference-from-a-coding-assistant&#34;&gt;Difference from a Coding Assistant
&lt;/h2&gt;&lt;p&gt;goose is not just a code completion tool. It is closer to a local agent runtime.&lt;/p&gt;
&lt;p&gt;Common coding assistants focus on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code completion.&lt;/li&gt;
&lt;li&gt;Code explanation.&lt;/li&gt;
&lt;li&gt;Function generation.&lt;/li&gt;
&lt;li&gt;Local editor edits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;goose emphasizes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Local task execution.&lt;/li&gt;
&lt;li&gt;Multi-step workflows.&lt;/li&gt;
&lt;li&gt;Switchable providers.&lt;/li&gt;
&lt;li&gt;Extensions.&lt;/li&gt;
&lt;li&gt;Desktop and CLI.&lt;/li&gt;
&lt;li&gt;Embeddable API.&lt;/li&gt;
&lt;li&gt;Non-code tasks too.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This also means more complexity. You must think about model configuration, permissions, extensions, workspace scope, logs, and credentials.&lt;/p&gt;
&lt;h2 id=&#34;custom-distributions&#34;&gt;Custom Distributions
&lt;/h2&gt;&lt;p&gt;The repository includes &lt;code&gt;CUSTOM_DISTROS.md&lt;/code&gt;, which explains how to build a custom goose distribution with preconfigured providers, extensions, and branding.&lt;/p&gt;
&lt;p&gt;This is useful for teams:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preconfigure allowed model providers.&lt;/li&gt;
&lt;li&gt;Connect internal MCP servers.&lt;/li&gt;
&lt;li&gt;Set safety policies and logging.&lt;/li&gt;
&lt;li&gt;Block disallowed external services.&lt;/li&gt;
&lt;li&gt;Apply company branding and onboarding.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Members do not need to configure everything from scratch, and the risk of wrong provider or key setup is reduced.&lt;/p&gt;
&lt;h2 id=&#34;suggested-use&#34;&gt;Suggested Use
&lt;/h2&gt;&lt;p&gt;Start gradually:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the desktop app or CLI.&lt;/li&gt;
&lt;li&gt;Configure one known-good provider.&lt;/li&gt;
&lt;li&gt;Run simple tasks in a test directory.&lt;/li&gt;
&lt;li&gt;Observe what it reads and executes.&lt;/li&gt;
&lt;li&gt;Add MCP extensions.&lt;/li&gt;
&lt;li&gt;Try larger repositories later.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Keep a few habits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commit important changes before agent work.&lt;/li&gt;
&lt;li&gt;Do not store API keys in project files.&lt;/li&gt;
&lt;li&gt;Use high-permission modes only in trusted workspaces.&lt;/li&gt;
&lt;li&gt;Review company data and provider policy first.&lt;/li&gt;
&lt;li&gt;Keep human review for automation results.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;who-should-use-it&#34;&gt;Who Should Use It
&lt;/h2&gt;&lt;p&gt;goose is a good fit if you want a desktop and CLI AI agent, multiple model providers, MCP integration, API embedding, or custom team distributions. It may be heavy if all you need is IDE code completion.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;goose is an open source AI agent under AAIF/Linux Foundation. It provides desktop, CLI, and API entry points, supports 15+ providers, ACP subscription access, and 70+ MCP extensions.&lt;/p&gt;
&lt;p&gt;Its value is not only writing code, but placing models, tools, extensions, and local execution into one agent framework. Start small, define permission and data boundaries, then expand usage.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/aaif-goose/goose&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;goose GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://goose-docs.ai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;goose documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://goose-docs.ai/docs/getting-started/installation&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;goose installation guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://aaif.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Agentic AI Foundation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>How to Change the VS Code Display Language: Chinese, English, and More</title>
        <link>https://knightli.com/en/2026/05/08/vscode-switch-display-language/</link>
        <pubDate>Fri, 08 May 2026 13:18:57 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/08/vscode-switch-display-language/</guid>
        <description>&lt;p&gt;VS Code supports many display languages. The usual approach is to install the matching language pack, then choose the display language from the Command Palette. If you want to pin VS Code to a specific language, you can also edit the &lt;code&gt;locale&lt;/code&gt; value in &lt;code&gt;argv.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This method works not only for Simplified Chinese, but also for English, Traditional Chinese, Japanese, Korean, French, German, Spanish, and other languages.&lt;/p&gt;
&lt;h2 id=&#34;install-the-language-pack&#34;&gt;Install the Language Pack
&lt;/h2&gt;&lt;p&gt;If you want to switch to a non-English interface, you usually need to install a language pack first.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the Extensions panel in the left sidebar, or press &lt;code&gt;Ctrl+Shift+X&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Search for the target language, such as &lt;code&gt;Chinese&lt;/code&gt;, &lt;code&gt;Japanese&lt;/code&gt;, &lt;code&gt;Korean&lt;/code&gt;, or &lt;code&gt;French&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Select the matching language pack and click &lt;code&gt;Install&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Restart VS Code when prompted.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For Simplified Chinese, the common language pack is &lt;code&gt;Chinese (Simplified)&lt;/code&gt;. For Traditional Chinese, use &lt;code&gt;Chinese (Traditional)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;change-the-language-from-the-command-palette&#34;&gt;Change the Language from the Command Palette
&lt;/h2&gt;&lt;p&gt;This is the recommended method for most users.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the Command Palette with &lt;code&gt;Ctrl+Shift+P&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;Configure Display Language&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;code&gt;Configure Display Language&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;Choose the language you want from the list.&lt;/li&gt;
&lt;li&gt;Restart VS Code when prompted.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After restarting, menus, settings pages, and common prompts will use the selected language. If the target language is not listed, install its language pack from the Extensions panel first.&lt;/p&gt;
&lt;h2 id=&#34;set-the-language-manually-in-argvjson&#34;&gt;Set the Language Manually in argv.json
&lt;/h2&gt;&lt;p&gt;If switching from the Command Palette does not work, or if you want to explicitly lock VS Code to a language, you can edit the runtime arguments file directly.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the Command Palette with &lt;code&gt;Ctrl+Shift+P&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Type and select &lt;code&gt;Preferences: Configure Runtime Arguments&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Find or add the &lt;code&gt;locale&lt;/code&gt; setting.&lt;/li&gt;
&lt;li&gt;Change its value to the target language code.&lt;/li&gt;
&lt;li&gt;Save the file and restart VS Code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For example, switch to English:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Switch to Simplified Chinese:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;zh-cn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Switch to Japanese:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;argv.json&lt;/code&gt; is a JSON file, so pay attention to commas and quotation marks. If the configuration is invalid, VS Code may not read the language setting correctly.&lt;/p&gt;
&lt;h2 id=&#34;common-display-language-codes&#34;&gt;Common Display Language Codes
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Display language&lt;/th&gt;
          &lt;th&gt;locale&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;English (US)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;en&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Simplified Chinese&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;zh-cn&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Traditional Chinese&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;zh-tw&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;French&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;fr&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;German&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;de&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Italian&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;it&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Spanish&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;es&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Japanese&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ja&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Korean&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ko&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Russian&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ru&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Portuguese (Brazil)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;pt-br&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Turkish&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;tr&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Bulgarian&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;bg&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Hungarian&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;hu&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;what-to-do-if-the-language-does-not-change&#34;&gt;What to Do If the Language Does Not Change
&lt;/h2&gt;&lt;p&gt;Check the following items in order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Confirm that the target language pack is installed.&lt;/li&gt;
&lt;li&gt;Confirm that &lt;code&gt;locale&lt;/code&gt; uses the correct language code. For example, Simplified Chinese is &lt;code&gt;zh-cn&lt;/code&gt;, not &lt;code&gt;zh-CN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fully close and reopen VS Code after changing the language.&lt;/li&gt;
&lt;li&gt;If you edited &lt;code&gt;argv.json&lt;/code&gt; manually, check that the JSON syntax is valid.&lt;/li&gt;
&lt;li&gt;If the configuration is messy, remove the &lt;code&gt;locale&lt;/code&gt; entry and choose the language again through &lt;code&gt;Configure Display Language&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In most cases, &lt;code&gt;Configure Display Language&lt;/code&gt; is the simplest option. Edit &lt;code&gt;argv.json&lt;/code&gt; only when you need to force a specific language or the Command Palette switch does not take effect.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.csdn.net/mighty13/article/details/114420578&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;VScode: Change the VS Code display language to Simplified Chinese and switch the VS Code display language&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>24 Claude Code Tips: Plan Mode, Rewind, CLAUDE.md, Skills, Agents, and Plugins</title>
        <link>https://knightli.com/en/2026/05/08/claude-code-24-tips-plan-rewind-skills-agents/</link>
        <pubDate>Fri, 08 May 2026 08:54:14 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/08/claude-code-24-tips-plan-rewind-skills-agents/</guid>
        <description>&lt;p&gt;Claude Code is not just a chat box. It is closer to a coding Agent that can enter a project directory, read and write files, run commands, and maintain context.&lt;/p&gt;
&lt;p&gt;If you only throw a requirement at it and wait for code, problems appear quickly: unclear plans, repeated permission prompts, growing context, unsatisfactory output, no clear rollback path, and no persistent place for project rules.&lt;/p&gt;
&lt;p&gt;Here is a set of common operations for developers getting started with Claude Code.&lt;/p&gt;
&lt;h2 id=&#34;start-inside-the-project-directory&#34;&gt;Start Inside the Project Directory
&lt;/h2&gt;&lt;p&gt;Claude Code works best when launched inside the project directory, not from a random terminal location.&lt;/p&gt;
&lt;p&gt;Create a folder as the project directory, enter it, open a command line, and start Claude Code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When first entering a project, if Claude Code asks whether to trust the current folder, confirm before continuing. This lets it read files, create files, and run later operations around the current project.&lt;/p&gt;
&lt;p&gt;A simple practice task is to ask it to create a photographer portfolio website. The task is visual enough to inspect, and it also lets you practice file generation, command execution, rewind, and later refactoring.&lt;/p&gt;
&lt;h2 id=&#34;use-plan-mode-first&#34;&gt;Use Plan Mode First
&lt;/h2&gt;&lt;p&gt;For more complex tasks, Claude Code may enter plan mode. Plan mode is meant to discuss requirements and break down steps before you approve execution.&lt;/p&gt;
&lt;p&gt;After it writes a plan, you usually see options like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Approve the plan and automatically allow future edit tools.&lt;/li&gt;
&lt;li&gt;Approve the plan, but require manual approval for later edits.&lt;/li&gt;
&lt;li&gt;Pause and continue discussing the plan with Claude Code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the task is clear, approve and continue. If it is not clear yet, ask it to refine the plan, such as page style, tech stack, directory structure, interactions, and acceptance criteria.&lt;/p&gt;
&lt;p&gt;Plan mode reduces rework. If an Agent starts directly, it may quickly generate many files; if the direction is wrong, later changes can get messy.&lt;/p&gt;
&lt;h2 id=&#34;switch-modes-with-shift--tab&#34;&gt;Switch Modes With Shift + Tab
&lt;/h2&gt;&lt;p&gt;In Claude Code, &lt;code&gt;Shift + Tab&lt;/code&gt; can switch between working modes. A common use is entering plan mode or switching into an auto-approve-edit mode.&lt;/p&gt;
&lt;p&gt;Suggested habits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New projects, new features, major changes: start in plan mode.&lt;/li&gt;
&lt;li&gt;Small edits and clear fixes: execute directly.&lt;/li&gt;
&lt;li&gt;Deletion, bulk replacement, dependency installation: keep manual approval.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In plan mode, Claude Code may ask project-detail questions. Use arrow keys to choose and Enter to confirm. After submitting feedback, it updates the plan.&lt;/p&gt;
&lt;h2 id=&#34;do-not-open-all-permissions-blindly&#34;&gt;Do Not Open All Permissions Blindly
&lt;/h2&gt;&lt;p&gt;When Claude Code runs commands, edits files, or starts programs, it may request permission.&lt;/p&gt;
&lt;p&gt;Common choices include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow only this time.&lt;/li&gt;
&lt;li&gt;Allow this command type for the current session.&lt;/li&gt;
&lt;li&gt;Reject or pause.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For local preview, dev server startup, or file inspection, approve as needed. But do not permanently use a mode that auto-approves all permissions just to save clicks.&lt;/p&gt;
&lt;p&gt;Full automation is only suitable when the task is low-risk, clearly understood, and the project already has Git backups. For daily use, keep human approval for deletion, overwriting folders, dependency installation, networking, commits, and scripts.&lt;/p&gt;
&lt;h2 id=&#34;run-local-commands-in-terminal-mode&#34;&gt;Run Local Commands in Terminal Mode
&lt;/h2&gt;&lt;p&gt;Claude Code can enter a terminal-command mode to run local commands.&lt;/p&gt;
&lt;p&gt;For example, after generating a page, you can open an HTML file with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;start index.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;start&lt;/code&gt; is a Windows command for opening a file, followed by the filename. This is faster than finding the file manually.&lt;/p&gt;
&lt;p&gt;Terminal mode is useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Opening generated pages.&lt;/li&gt;
&lt;li&gt;Listing directory contents.&lt;/li&gt;
&lt;li&gt;Starting local development servers.&lt;/li&gt;
&lt;li&gt;Running tests or builds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still, be careful with high-risk commands such as recursive deletion, moving directories, bulk overwrites, and system environment changes.&lt;/p&gt;
&lt;h2 id=&#34;rewind-when-the-result-goes-wrong&#34;&gt;Rewind When the Result Goes Wrong
&lt;/h2&gt;&lt;p&gt;If the page or code produced by Claude Code is not what you want, and each correction makes it worse, rewind early.&lt;/p&gt;
&lt;p&gt;Rewind can return code or conversation to a previous point. Common options include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rewind both code and conversation.&lt;/li&gt;
&lt;li&gt;Rewind only conversation.&lt;/li&gt;
&lt;li&gt;Rewind only code.&lt;/li&gt;
&lt;li&gt;Compress earlier content into a summary.&lt;/li&gt;
&lt;li&gt;Cancel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the direction is clearly wrong, it is usually better to rewind both code and conversation. That returns context and files to a cleaner state together.&lt;/p&gt;
&lt;p&gt;Note that Claude Code rewind usually only covers files it created or changed through built-in tools. Files created through external commands may not be fully rewindable. Important projects should still use Git.&lt;/p&gt;
&lt;h2 id=&#34;write-long-prompts-in-an-editor&#34;&gt;Write Long Prompts in an Editor
&lt;/h2&gt;&lt;p&gt;Do not squeeze complex requirements into one input line.&lt;/p&gt;
&lt;p&gt;If the system supports editing a long prompt in a text editor, open the editor, write the requirement clearly, save it, and then send it to Claude Code.&lt;/p&gt;
&lt;p&gt;Long prompts should include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The goal.&lt;/li&gt;
&lt;li&gt;The tech stack.&lt;/li&gt;
&lt;li&gt;What not to do.&lt;/li&gt;
&lt;li&gt;Which files must be kept.&lt;/li&gt;
&lt;li&gt;How to verify completion.&lt;/li&gt;
&lt;li&gt;Page or feature acceptance criteria.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, if you want Claude Code to refactor a plain HTML page into a more modern stack, do not just say &amp;ldquo;refactor it.&amp;rdquo; Explain component structure, visual preservation, responsive layout, and ask it to run a build check.&lt;/p&gt;
&lt;h2 id=&#34;restore-sessions-after-exit&#34;&gt;Restore Sessions After Exit
&lt;/h2&gt;&lt;p&gt;If you need to quit Claude Code midway, exit normally. Later, return to the same project directory and start again:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If previous records do not appear directly, use history-related commands to view and load recent sessions.&lt;/p&gt;
&lt;p&gt;This is useful for continuing interrupted work. But do not treat session history as the only memory. Project rules, tech stack, common commands, and notes should live in project files.&lt;/p&gt;
&lt;h2 id=&#34;use-claudemd-for-project-rules&#34;&gt;Use CLAUDE.md for Project Rules
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; is an important memory file for Claude Code. It usually sits at the project root and tells Claude Code project rules, tech stack, directory structure, and collaboration constraints.&lt;/p&gt;
&lt;p&gt;You can ask Claude Code to initialize it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; is good for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project goals.&lt;/li&gt;
&lt;li&gt;Tech stack.&lt;/li&gt;
&lt;li&gt;Common start, test, and build commands.&lt;/li&gt;
&lt;li&gt;Directory notes.&lt;/li&gt;
&lt;li&gt;Code style.&lt;/li&gt;
&lt;li&gt;Forbidden actions.&lt;/li&gt;
&lt;li&gt;Commit and deployment rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During each conversation, Claude Code can use these rules as part of the context. Think of it as a project manual.&lt;/p&gt;
&lt;p&gt;A simple test is to add a clear rule into &lt;code&gt;CLAUDE.md&lt;/code&gt;, then ask Claude Code something. If its answer follows the rule, it has read the project memory.&lt;/p&gt;
&lt;h2 id=&#34;reference-files-with-&#34;&gt;Reference Files With @
&lt;/h2&gt;&lt;p&gt;Typing &lt;code&gt;@&lt;/code&gt; in the input box lets you select files or Agents and add them to the current context.&lt;/p&gt;
&lt;p&gt;This is useful when you want Claude Code to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read a config file.&lt;/li&gt;
&lt;li&gt;Modify a specific page.&lt;/li&gt;
&lt;li&gt;Continue based on &lt;code&gt;CLAUDE.md&lt;/code&gt; or another document.&lt;/li&gt;
&lt;li&gt;Only inspect a specific file instead of guessing the whole project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compared with copying file contents into the input box, &lt;code&gt;@&lt;/code&gt; references are clearer and less error-prone.&lt;/p&gt;
&lt;h2 id=&#34;view-and-compress-context&#34;&gt;View and Compress Context
&lt;/h2&gt;&lt;p&gt;After a long conversation, context grows. When it gets too long, the model may slow down or start ignoring earlier details.&lt;/p&gt;
&lt;p&gt;Use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/context
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If context is long, compress history:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/compact
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If the result is still poor, consider clearing the current context:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/clear
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After clearing, Claude Code can still understand part of the project through files, &lt;code&gt;CLAUDE.md&lt;/code&gt;, and the current directory, but it will not keep the full conversation history.&lt;/p&gt;
&lt;p&gt;A practical habit: start a new chat after a task is done, write project rules into &lt;code&gt;CLAUDE.md&lt;/code&gt;, and do not let temporary discussion grow forever in one chat.&lt;/p&gt;
&lt;h2 id=&#34;skills-turn-repeated-work-into-instructions&#34;&gt;Skills: Turn Repeated Work Into Instructions
&lt;/h2&gt;&lt;p&gt;Skills are reusable task instructions for Claude Code. They are not one-off prompts, but packaged workflows.&lt;/p&gt;
&lt;p&gt;For example, if you often generate weekly reports, create a weekly-report Skill that defines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Required input.&lt;/li&gt;
&lt;li&gt;Output format.&lt;/li&gt;
&lt;li&gt;Tone and structure.&lt;/li&gt;
&lt;li&gt;What must be preserved.&lt;/li&gt;
&lt;li&gt;What must not be invented.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Skills usually contain &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, and detailed instructions. Once installed in the global Skills directory, Claude Code can recognize and load them for related tasks.&lt;/p&gt;
&lt;p&gt;Good Skill candidates include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Weekly reports.&lt;/li&gt;
&lt;li&gt;Code review templates.&lt;/li&gt;
&lt;li&gt;Document cleanup.&lt;/li&gt;
&lt;li&gt;Image batch processing.&lt;/li&gt;
&lt;li&gt;Fixed-format articles.&lt;/li&gt;
&lt;li&gt;Project initialization flows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you repeatedly copy the same prompt, consider turning it into a Skill.&lt;/p&gt;
&lt;h2 id=&#34;agents-delegate-subtasks-to-independent-helpers&#34;&gt;Agents: Delegate Subtasks to Independent Helpers
&lt;/h2&gt;&lt;p&gt;Agents are different from Skills.&lt;/p&gt;
&lt;p&gt;A Skill is more like an instruction manual. An Agent is more like an independent helper that can work outside the main conversation and return results.&lt;/p&gt;
&lt;p&gt;The value of Agents is context isolation. For code inspection, you can create a read-only Agent that only reads the project and outputs a report, without modifying files. This avoids polluting the main conversation and lowers risk.&lt;/p&gt;
&lt;p&gt;When creating an Agent, consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project-level or user-level Agent.&lt;/li&gt;
&lt;li&gt;Whether Claude Code should generate the config.&lt;/li&gt;
&lt;li&gt;Which tools are allowed.&lt;/li&gt;
&lt;li&gt;Which model to use.&lt;/li&gt;
&lt;li&gt;Whether memory should be saved.&lt;/li&gt;
&lt;li&gt;Whether the Agent prompt is clear enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For code-audit Agents, give read-only permissions first. Let it output a report, then decide in the main conversation whether to change code.&lt;/p&gt;
&lt;h2 id=&#34;plugins-package-skills-agents-mcp-and-hooks&#34;&gt;Plugins: Package Skills, Agents, MCP, and Hooks
&lt;/h2&gt;&lt;p&gt;Plugins are more complete capability packages. They may include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Skills&lt;/li&gt;
&lt;li&gt;Agents&lt;/li&gt;
&lt;li&gt;MCP&lt;/li&gt;
&lt;li&gt;Hooks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compared with installing one Skill, a plugin is better for a full capability set. For example, a frontend design plugin may package visual rules, layout habits, component preferences, and related Agents together.&lt;/p&gt;
&lt;p&gt;When installing a plugin, you may choose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install to the user directory, effective for all projects.&lt;/li&gt;
&lt;li&gt;Install to the project directory, shareable with the project.&lt;/li&gt;
&lt;li&gt;Install to a local project directory, effective only on your computer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use the user directory for personal common capabilities, the project directory for team conventions, and local project install for temporary testing.&lt;/p&gt;
&lt;h2 id=&#34;plugins-can-improve-specific-tasks&#34;&gt;Plugins Can Improve Specific Tasks
&lt;/h2&gt;&lt;p&gt;For frontend page generation, plugins can be more stable than raw prompts.&lt;/p&gt;
&lt;p&gt;For example, for &amp;ldquo;make a photographer portfolio website,&amp;rdquo; a plain prompt may generate an acceptable page. If you explicitly use a frontend design plugin, the structure, visual hierarchy, spacing, colors, and overall finish are often better.&lt;/p&gt;
&lt;p&gt;This does not mean plugins replace human taste. A better workflow is to let the plugin generate a stronger first draft, then refine details manually.&lt;/p&gt;
&lt;h2 id=&#34;a-more-stable-claude-code-workflow&#34;&gt;A More Stable Claude Code Workflow
&lt;/h2&gt;&lt;p&gt;Putting these tips together gives a steadier workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start &lt;code&gt;claude&lt;/code&gt; inside the project directory.&lt;/li&gt;
&lt;li&gt;Discuss requirements in plan mode first.&lt;/li&gt;
&lt;li&gt;Confirm tech stack and acceptance criteria before approving the plan.&lt;/li&gt;
&lt;li&gt;Keep manual approval for high-risk actions.&lt;/li&gt;
&lt;li&gt;Use terminal mode for local preview and tests.&lt;/li&gt;
&lt;li&gt;Rewind early when the result goes off track.&lt;/li&gt;
&lt;li&gt;Write project rules into &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check and compress context during long chats.&lt;/li&gt;
&lt;li&gt;Turn repeated workflows into Skills.&lt;/li&gt;
&lt;li&gt;Delegate inspection, research, and analysis to read-only Agents.&lt;/li&gt;
&lt;li&gt;Use plugins for domain-specific tasks.&lt;/li&gt;
&lt;li&gt;Always keep Git checkpoints for important projects.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is much more stable than simply sending one requirement and waiting for generation.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Claude Code efficiency does not come only from model capability. It also comes from workflow control.&lt;/p&gt;
&lt;p&gt;Plan mode sets direction, permission approval controls risk, rewind reduces rework, &lt;code&gt;CLAUDE.md&lt;/code&gt; stores project rules, &lt;code&gt;/context&lt;/code&gt;, &lt;code&gt;/compact&lt;/code&gt;, and &lt;code&gt;/clear&lt;/code&gt; manage context, Skills reuse fixed workflows, Agents isolate complex subtasks, and plugins package complete capabilities.&lt;/p&gt;
&lt;p&gt;The best way to use Claude Code is to let it move tasks forward inside clear boundaries, not to hand the entire project to it at once.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>opencode, Claude Code, and Codex: What&#39;s the Difference? A Guide to Open Source AI Coding Tools</title>
        <link>https://knightli.com/en/2026/05/08/opencode-open-source-ai-coding-agent/</link>
        <pubDate>Fri, 08 May 2026 08:33:37 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/08/opencode-open-source-ai-coding-agent/</guid>
        <description>&lt;p&gt;&lt;code&gt;opencode&lt;/code&gt; is an open source AI Coding Agent from anomalyco. Its positioning is straightforward: give developers a programmable, extensible coding assistant in the terminal that can connect to multiple model providers.&lt;/p&gt;
&lt;p&gt;If you compare it with &lt;code&gt;Claude Code&lt;/code&gt; and &lt;code&gt;Codex&lt;/code&gt;, all three solve the same broad problem: bringing AI into real codebases so it can understand context, edit files, run commands, and execute tests. But their product directions are different.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;opencode&lt;/code&gt; emphasizes open source, multi-model support, and a terminal TUI. &lt;code&gt;Claude Code&lt;/code&gt; emphasizes Anthropic&amp;rsquo;s model ecosystem and local engineering collaboration. &lt;code&gt;Codex&lt;/code&gt; is OpenAI&amp;rsquo;s AI coding agent, available through the terminal, IDEs, the Codex app, and cloud tasks.&lt;/p&gt;
&lt;h2 id=&#34;who-opencode-is-for&#34;&gt;Who opencode Is For
&lt;/h2&gt;&lt;p&gt;opencode is a better fit for these kinds of developers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;People who want to complete code changes, project analysis, and engineering tasks in the terminal.&lt;/li&gt;
&lt;li&gt;People who do not want their AI Coding Agent tied to a single model provider.&lt;/li&gt;
&lt;li&gt;People who prefer open source tools and want to audit, extend, or build on top of them.&lt;/li&gt;
&lt;li&gt;People already comfortable with Neovim, TUIs, and command-line workflows.&lt;/li&gt;
&lt;li&gt;People who want to eventually drive the same coding agent remotely through a desktop app, mobile app, or other clients.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Its point is not to create another chat window, but to put AI coding capability inside the terminal and project directories developers already use.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;The official README provides several installation methods.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Direct install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://opencode.ai/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm i -g opencode-ai@latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scoop install opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;choco install opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# macOS and Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install anomalyco/tap/opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Arch Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo pacman -S opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;paru -S opencode-bin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Other methods&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mise use -g opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nix run nixpkgs#opencode
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The official README also recommends removing versions older than 0.1.x before installing to avoid problems caused by older remnants.&lt;/p&gt;
&lt;p&gt;The installation script chooses the installation directory by priority:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;$OPENCODE_INSTALL_DIR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$XDG_BIN_DIR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$HOME/bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$HOME/.opencode/bin&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you need to specify a path, use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;OPENCODE_INSTALL_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/bin curl -fsSL https://opencode.ai/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;XDG_BIN_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/.local/bin curl -fsSL https://opencode.ai/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;the-desktop-app-is-still-beta&#34;&gt;The Desktop App Is Still Beta
&lt;/h2&gt;&lt;p&gt;In addition to the command-line tool, opencode also provides a desktop app, currently marked as Beta. It can be downloaded from GitHub Releases or &lt;code&gt;opencode.ai/download&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The desktop app covers these platforms:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Platform&lt;/th&gt;
          &lt;th&gt;File&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS Apple Silicon&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;opencode-desktop-mac-arm64.dmg&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS Intel&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;opencode-desktop-mac-x64.dmg&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;opencode-desktop-windows-x64.exe&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Linux&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;.deb&lt;/code&gt;, &lt;code&gt;.rpm&lt;/code&gt;, or &lt;code&gt;.AppImage&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;macOS and Windows users can also install the desktop app through package managers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# macOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install --cask opencode-desktop
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scoop bucket add extras
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scoop install extras/opencode-desktop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;two-built-in-agent-modes&#34;&gt;Two Built-In Agent Modes
&lt;/h2&gt;&lt;p&gt;opencode includes two built-in Agents, switchable with the &lt;code&gt;Tab&lt;/code&gt; key.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;build&lt;/code&gt; is the default mode. It has full development permissions and is suitable for editing code directly, running commands, and moving engineering tasks forward.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;plan&lt;/code&gt; is read-only mode. It is better for analyzing unfamiliar codebases, understanding project structure, and planning changes. It denies file edits by default and asks before running bash commands.&lt;/p&gt;
&lt;p&gt;opencode also includes a &lt;code&gt;general&lt;/code&gt; subagent for complex searches and multi-step tasks. Users can invoke it by typing &lt;code&gt;@general&lt;/code&gt; in a message.&lt;/p&gt;
&lt;p&gt;This design is practical: use &lt;code&gt;plan&lt;/code&gt; to understand the project before acting, then switch to &lt;code&gt;build&lt;/code&gt; when code needs to change. For large repositories, separating read and write permissions helps reduce mistakes.&lt;/p&gt;
&lt;h2 id=&#34;what-is-codex&#34;&gt;What Is Codex?
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Codex&lt;/code&gt; is OpenAI&amp;rsquo;s AI coding agent for helping developers write code, review code, fix bugs, and ship engineering tasks.&lt;/p&gt;
&lt;p&gt;Unlike a simple code completion tool, Codex is closer to an Agent that can operate on a codebase. It can pair with you in local tools, and it can also take delegated tasks in the cloud. OpenAI&amp;rsquo;s official materials describe Codex as available through multiple surfaces, including CLI, IDEs, the Codex app, and ChatGPT/Codex cloud workflows.&lt;/p&gt;
&lt;p&gt;For developers, Codex has several important traits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It can read codebases, edit files, run commands, and execute tests.&lt;/li&gt;
&lt;li&gt;It supports multiple interfaces, including terminal, IDE, app, and cloud.&lt;/li&gt;
&lt;li&gt;It fits bug fixing, feature work, refactoring, migrations, code review, and test generation.&lt;/li&gt;
&lt;li&gt;It is more closely tied to OpenAI accounts, models, and the Codex product ecosystem.&lt;/li&gt;
&lt;li&gt;Cloud tasks are useful for running multiple well-scoped engineering tasks in parallel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If opencode is more like an open terminal agent framework, Codex is more like a full AI coding workbench from OpenAI: local pairing, cloud delegation, and longer engineering workflows for teams.&lt;/p&gt;
&lt;h2 id=&#34;core-differences&#34;&gt;Core Differences
&lt;/h2&gt;&lt;p&gt;opencode, Claude Code, and Codex are all AI coding tools, but the choice becomes clearer if you look at these dimensions.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Tool&lt;/th&gt;
          &lt;th&gt;Core Positioning&lt;/th&gt;
          &lt;th&gt;Main Advantages&lt;/th&gt;
          &lt;th&gt;Best Fit&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;opencode&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Open source AI Coding Agent&lt;/td&gt;
          &lt;td&gt;Open source, multi-model, TUI, client/server architecture&lt;/td&gt;
          &lt;td&gt;Developers who want an open toolchain, replaceable models, and a terminal-first workflow&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Claude Code&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Anthropic&amp;rsquo;s command-line coding tool&lt;/td&gt;
          &lt;td&gt;Claude model experience, code understanding, long context, engineering task collaboration&lt;/td&gt;
          &lt;td&gt;Developers already using the Claude/Anthropic ecosystem who want to work on local code tasks&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Codex&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;OpenAI&amp;rsquo;s AI coding agent&lt;/td&gt;
          &lt;td&gt;CLI, IDE, Codex app, cloud tasks, multi-Agent workflows&lt;/td&gt;
          &lt;td&gt;Teams already using ChatGPT/OpenAI who want both local pairing and cloud delegation&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In short, opencode is about openness and replaceability, Claude Code is about the Claude ecosystem and local engineering agents, and Codex is about the OpenAI ecosystem and multi-surface collaboration.&lt;/p&gt;
&lt;h2 id=&#34;how-it-differs-from-claude-code&#34;&gt;How It Differs From Claude Code
&lt;/h2&gt;&lt;p&gt;opencode&amp;rsquo;s official FAQ directly compares it with Claude Code. The two are similar in capability, but the main differences are these.&lt;/p&gt;
&lt;p&gt;First, opencode is a 100% open source project, hosted on GitHub and released under the MIT license.&lt;/p&gt;
&lt;p&gt;Second, opencode is not tied to a single model provider. It recommends models provided through OpenCode Zen, but it can also work with Claude, OpenAI, Google, or local models. For developers, this means that when model cost, capability, or availability changes, you are not locked into one platform.&lt;/p&gt;
&lt;p&gt;Third, opencode includes optional LSP support. For code completion, navigation, diagnostics, and project understanding, LSP is a very important foundation.&lt;/p&gt;
&lt;p&gt;Fourth, opencode emphasizes TUI. It is built by Neovim users and the creators of terminal.shop, so the product focus is clearly on the terminal experience.&lt;/p&gt;
&lt;p&gt;Fifth, opencode uses a client/server architecture. That means opencode can run on your computer while being controlled in the future by a TUI, desktop app, mobile app, or other clients. The TUI is only one possible frontend.&lt;/p&gt;
&lt;h2 id=&#34;when-to-choose-opencode-claude-code-or-codex&#34;&gt;When to Choose opencode, Claude Code, or Codex
&lt;/h2&gt;&lt;p&gt;If you already use Claude Code or Codex, opencode does not have to replace them immediately. A better way to think about it is that opencode provides an open, model-replaceable, terminal-first option.&lt;/p&gt;
&lt;p&gt;Consider opencode first when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want your AI coding tool to be as open source as possible.&lt;/li&gt;
&lt;li&gt;You do not want your workflow tied to one model provider.&lt;/li&gt;
&lt;li&gt;You want to test Claude, OpenAI, Google, or local models with the same tool.&lt;/li&gt;
&lt;li&gt;You like TUI workflows and do not want a desktop or web app to interrupt your main workflow.&lt;/li&gt;
&lt;li&gt;You care about the remote-control potential of a client/server architecture.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consider Claude Code first when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You mainly use Claude models.&lt;/li&gt;
&lt;li&gt;You care about long context, code understanding, and complex engineering task collaboration.&lt;/li&gt;
&lt;li&gt;You want to keep moving edits, tests, and refactors forward in a local repository.&lt;/li&gt;
&lt;li&gt;You trust Anthropic&amp;rsquo;s default Claude Code product experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consider Codex first when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You already use ChatGPT or the OpenAI account ecosystem.&lt;/li&gt;
&lt;li&gt;You want one coding agent across terminal, IDE, desktop app, and cloud tasks.&lt;/li&gt;
&lt;li&gt;You want to delegate well-scoped bug fixes, feature work, migrations, or test generation to the cloud in parallel.&lt;/li&gt;
&lt;li&gt;You need code review, background tasks, team collaboration, and multi-Agent workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you care more about an official end-to-end experience, default model configuration, enterprise management, and ready-made integrations, Claude Code or Codex may be easier. If you care more about control, openness, and being provider-agnostic, opencode is worth watching.&lt;/p&gt;
&lt;h2 id=&#34;things-to-note&#34;&gt;Things to Note
&lt;/h2&gt;&lt;p&gt;opencode, Claude Code, and Codex are all moving quickly. GitHub releases, installation commands, desktop app file names, model availability, and plan access can all change. Before installing or choosing a tool, check the official README, documentation, and release pages.&lt;/p&gt;
&lt;p&gt;Also, opencode&amp;rsquo;s desktop app is still marked as Beta, so it should not be treated as the default stable production tool. For everyday engineering tasks, the terminal version is still the main entry point.&lt;/p&gt;
&lt;p&gt;From a tooling trend perspective, opencode represents the open-toolchain direction for AI Coding Agents: replaceable models, replaceable clients, and an open core agent capability. Codex and Claude Code are closer to model companies turning coding agents into complete product surfaces. For developers, both directions will likely coexist for a long time.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;opencode GitHub: &lt;a class=&#34;link&#34; href=&#34;https://github.com/anomalyco/opencode&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/anomalyco/opencode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;opencode official site: &lt;a class=&#34;link&#34; href=&#34;https://opencode.ai&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://opencode.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;opencode docs: &lt;a class=&#34;link&#34; href=&#34;https://opencode.ai/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://opencode.ai/docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;opencode Releases: &lt;a class=&#34;link&#34; href=&#34;https://github.com/anomalyco/opencode/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/anomalyco/opencode/releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenAI Codex: &lt;a class=&#34;link&#34; href=&#34;https://openai.com/codex/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/codex/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Using Codex with your ChatGPT plan: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11369540-codex-in-chatgpt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/11369540-codex-in-chatgpt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenAI Codex CLI Getting Started: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11096431-openai-codex-ci-getting-started&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/11096431-openai-codex-ci-getting-started&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>uv Installation Guide: Choosing Between macOS, Linux, Windows, pipx, Homebrew, and WinGet</title>
        <link>https://knightli.com/en/2026/05/07/uv-installation-guide/</link>
        <pubDate>Thu, 07 May 2026 23:23:58 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/07/uv-installation-guide/</guid>
        <description>&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; is a Python toolchain manager from Astral. It can manage Python versions, virtual environments, dependencies, scripts, projects, and tools. There are many ways to install it. The official documentation provides standalone installer scripts and also supports PyPI, Homebrew, WinGet, Scoop, Docker, GitHub Releases, and Cargo.&lt;/p&gt;
&lt;p&gt;If you just want a quick installation, use the official standalone installer first. If you prefer your system package manager to maintain versions, use Homebrew, WinGet, or Scoop. If you already like installing Python tools in isolated environments, use &lt;code&gt;pipx&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;quick-choice&#34;&gt;Quick Choice
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Scenario&lt;/th&gt;
          &lt;th&gt;Recommended method&lt;/th&gt;
          &lt;th&gt;Command&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Quick install on macOS / Linux&lt;/td&gt;
          &lt;td&gt;Official standalone installer&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS / Linux without curl&lt;/td&gt;
          &lt;td&gt;Official script + wget&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;wget -qO- https://astral.sh/uv/install.sh | sh&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Quick install on Windows&lt;/td&gt;
          &lt;td&gt;PowerShell installer&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;powershell -ExecutionPolicy ByPass -c &amp;quot;irm https://astral.sh/uv/install.ps1 | iex&amp;quot;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Isolated Python tool install&lt;/td&gt;
          &lt;td&gt;pipx&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;pipx install uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Temporary or traditional Python install&lt;/td&gt;
          &lt;td&gt;pip&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;pip install uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS package management&lt;/td&gt;
          &lt;td&gt;Homebrew&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;brew install uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS MacPorts users&lt;/td&gt;
          &lt;td&gt;MacPorts&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;sudo port install uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows package management&lt;/td&gt;
          &lt;td&gt;WinGet&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;winget install --id=astral-sh.uv -e&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Scoop users&lt;/td&gt;
          &lt;td&gt;Scoop&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;scoop install main/uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Rust users&lt;/td&gt;
          &lt;td&gt;Cargo&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;cargo install --locked uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The generally recommended options are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS / Linux: official standalone installer;&lt;/li&gt;
&lt;li&gt;Windows: official PowerShell installer or WinGet;&lt;/li&gt;
&lt;li&gt;If you already manage Python CLI tools with &lt;code&gt;pipx&lt;/code&gt;: &lt;code&gt;pipx install uv&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;macos-and-linux-official-installer&#34;&gt;macOS and Linux: Official Installer
&lt;/h2&gt;&lt;p&gt;The most direct official method is to download the script with &lt;code&gt;curl&lt;/code&gt; and run it with &lt;code&gt;sh&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -LsSf https://astral.sh/uv/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If the system does not have &lt;code&gt;curl&lt;/code&gt;, use &lt;code&gt;wget&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget -qO- https://astral.sh/uv/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To install a specific version, put the version number in the URL. For example, the official example uses &lt;code&gt;0.11.11&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -LsSf https://astral.sh/uv/0.11.11/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This method fits most personal development environments. It is simple, cross-platform, and works best with uv&amp;rsquo;s official update mechanism.&lt;/p&gt;
&lt;p&gt;The installer puts binaries such as &lt;code&gt;uv&lt;/code&gt; and &lt;code&gt;uvx&lt;/code&gt; under the user directory, and may modify the shell profile so the commands can be used directly in the terminal. If you do not want the installer to modify PATH, check the official installer options, such as setting &lt;code&gt;UV_NO_MODIFY_PATH=1&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;windows-powershell-installer&#34;&gt;Windows: PowerShell Installer
&lt;/h2&gt;&lt;p&gt;The official Windows method is to run the installer script with PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;powershell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ExecutionPolicy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ByPass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;irm https://astral.sh/uv/install.ps1 | iex&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To install a specific version, also put the version number in the URL:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;powershell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ExecutionPolicy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ByPass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;irm https://astral.sh/uv/0.11.11/install.ps1 | iex&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;ExecutionPolicy ByPass&lt;/code&gt; allows PowerShell to fetch and run the installer script from the internet. As a safer habit, you can inspect the script before running it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;powershell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;irm https://astral.sh/uv/install.ps1 | more&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you prefer Windows package managers, WinGet or Scoop may be a better first choice.&lt;/p&gt;
&lt;h2 id=&#34;installing-with-pipx&#34;&gt;Installing with pipx
&lt;/h2&gt;&lt;p&gt;The official documentation notes that uv is published to PyPI. If you install from PyPI, it is recommended to put it in an isolated environment, for example with &lt;code&gt;pipx&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pipx install uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is suitable if you already use &lt;code&gt;pipx&lt;/code&gt; as your Python CLI tool manager. It avoids mixing uv with your current project environment.&lt;/p&gt;
&lt;p&gt;If you do not have &lt;code&gt;pipx&lt;/code&gt;, you can also use &lt;code&gt;pip&lt;/code&gt; directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Note that uv provides prebuilt wheels on many platforms. If a platform does not have a matching wheel, it will build from source, which requires a Rust toolchain.&lt;/p&gt;
&lt;p&gt;My suggestion: on a personal machine, &lt;code&gt;pipx install uv&lt;/code&gt; is cleaner than &lt;code&gt;pip install uv&lt;/code&gt;; inside a project environment, do not install uv as a project dependency.&lt;/p&gt;
&lt;h2 id=&#34;homebrew-macports-winget-and-scoop&#34;&gt;Homebrew, MacPorts, WinGet, and Scoop
&lt;/h2&gt;&lt;p&gt;If you prefer system package managers, uv also supports common channels.&lt;/p&gt;
&lt;p&gt;Use Homebrew on macOS:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;MacPorts users can use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo port install uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Use WinGet on Windows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;winget&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;astral-sh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;uv&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-e&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Scoop users can use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;scoop&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The benefit of these methods is that version maintenance is delegated to the system package manager. The downside is that update timing depends on the corresponding package source, not the uv official installer.&lt;/p&gt;
&lt;h2 id=&#34;docker-github-releases-and-cargo&#34;&gt;Docker, GitHub Releases, and Cargo
&lt;/h2&gt;&lt;p&gt;uv also provides Docker images on GitHub Container Registry:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghcr.io/astral-sh/uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is suitable for CI, Dockerfiles, image builds, and temporary runtime environments. In real usage, read the official Docker integration documentation as well.&lt;/p&gt;
&lt;p&gt;If you want to download binaries manually, use GitHub Releases. Each release page usually includes binaries for supported platforms and explains how to invoke the standalone installer with a GitHub URL.&lt;/p&gt;
&lt;p&gt;Rust users can also install from crates.io:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cargo install --locked uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This builds from source and requires a compatible Rust toolchain. Unless you specifically want to install from the Rust ecosystem, ordinary users do not need to choose Cargo first.&lt;/p&gt;
&lt;h2 id=&#34;upgrading-uv&#34;&gt;Upgrading uv
&lt;/h2&gt;&lt;p&gt;If uv was installed with the official standalone installer, use the self-update command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv self update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The official documentation notes that updating uv reruns the installer and may modify the shell profile. If you do not want the update to modify PATH, set:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;UV_NO_MODIFY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you installed uv another way, use the corresponding package manager. For example, if you installed it with &lt;code&gt;pip&lt;/code&gt;, use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install --upgrade uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Homebrew, WinGet, Scoop, and MacPorts should also use their own upgrade commands.&lt;/p&gt;
&lt;h2 id=&#34;enabling-shell-completion&#34;&gt;Enabling Shell Completion
&lt;/h2&gt;&lt;p&gt;uv supports shell completion. The official documentation recommends checking your current shell first:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$SHELL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Bash:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;eval &amp;#34;$(uv generate-shell-completion bash)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Zsh:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;eval &amp;#34;$(uv generate-shell-completion zsh)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;fish:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;uv generate-shell-completion fish | source&amp;#39;&lt;/span&gt; &amp;gt; ~/.config/fish/completions/uv.fish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;New-Item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ItemType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Add-Content&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Value&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;(&amp;amp; uv generate-shell-completion powershell) | Out-String | Invoke-Expression&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you often use &lt;code&gt;uvx&lt;/code&gt;, you can enable completion for &lt;code&gt;uvx&lt;/code&gt; separately.&lt;/p&gt;
&lt;p&gt;Bash:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;eval &amp;#34;$(uvx --generate-shell-completion bash)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Zsh:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;eval &amp;#34;$(uvx --generate-shell-completion zsh)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;fish:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;uvx --generate-shell-completion fish | source&amp;#39;&lt;/span&gt; &amp;gt; ~/.config/fish/completions/uvx.fish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;New-Item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ItemType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Add-Content&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Value&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;(&amp;amp; uvx --generate-shell-completion powershell) | Out-String | Invoke-Expression&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After configuration, restart the shell or reload the corresponding configuration file.&lt;/p&gt;
&lt;h2 id=&#34;uninstalling-uv&#34;&gt;Uninstalling uv
&lt;/h2&gt;&lt;p&gt;To uninstall uv, you can first clean the cache and uv-managed data:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv cache clean
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -r &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;uv python dir&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -r &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;uv tool dir&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then delete the binaries.&lt;/p&gt;
&lt;p&gt;macOS / Linux:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm ~/.local/bin/uv ~/.local/bin/uvx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Windows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;rm &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;rm &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uvx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;rm &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uvw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The official documentation also notes that before &lt;code&gt;0.5.0&lt;/code&gt;, uv installed into &lt;code&gt;~/.cargo/bin&lt;/code&gt;. If you upgraded from an earlier version, old binaries may still be there and need to be removed manually.&lt;/p&gt;
&lt;h2 id=&#34;what-to-do-after-installation&#34;&gt;What to Do After Installation
&lt;/h2&gt;&lt;p&gt;After installation, check the version first:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then start with a few common tasks:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv python install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv venv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv pip install requests
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uvx ruff --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For a new project, continue with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv init&lt;/code&gt;: initialize a project;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv add&lt;/code&gt;: add dependencies;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv sync&lt;/code&gt;: sync the environment;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv run&lt;/code&gt;: run commands inside the project environment;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uvx&lt;/code&gt;: run Python CLI tools temporarily.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;my-recommendation&#34;&gt;My Recommendation
&lt;/h2&gt;&lt;p&gt;On a personal development machine, prefer the official standalone installer because it follows the uv official documentation most closely and supports &lt;code&gt;uv self update&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Windows users who do not want to run a remote script can use WinGet or Scoop. macOS users who prefer managing all tools with Homebrew can directly use &lt;code&gt;brew install uv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you already manage Python CLI tools with &lt;code&gt;pipx&lt;/code&gt;, use &lt;code&gt;pipx install uv&lt;/code&gt;. But I do not recommend installing uv with &lt;code&gt;pip install uv&lt;/code&gt; inside a specific project virtual environment, because that tends to mix the toolchain with project dependencies.&lt;/p&gt;
&lt;p&gt;For CI or container builds, start with Docker and GitHub Releases, and pin versions according to your image build process.&lt;/p&gt;
&lt;h2 id=&#34;related-links&#34;&gt;Related Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;uv installation documentation: &lt;a class=&#34;link&#34; href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.astral.sh/uv/getting-started/installation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;uv First steps: &lt;a class=&#34;link&#34; href=&#34;https://docs.astral.sh/uv/getting-started/first-steps/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.astral.sh/uv/getting-started/first-steps/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;uv Docker integration: &lt;a class=&#34;link&#34; href=&#34;https://docs.astral.sh/uv/guides/integration/docker/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.astral.sh/uv/guides/integration/docker/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;uv GitHub Releases: &lt;a class=&#34;link&#34; href=&#34;https://github.com/astral-sh/uv/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/astral-sh/uv/releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Codex App Beginner Guide: Installation, Sandbox, Parallel Tasks, Skills, and MCP</title>
        <link>https://knightli.com/en/2026/05/06/codex-app-complete-guide-skills-mcp/</link>
        <pubDate>Wed, 06 May 2026 08:41:17 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/06/codex-app-complete-guide-skills-mcp/</guid>
        <description>&lt;p&gt;Codex App can be understood as a task workspace for AI coding. It is not a traditional IDE, nor just a chat window. It brings multitasking, project management, sandbox permissions, Git, cloud execution, plugins, Skills, MCP, and automation into one interface.&lt;/p&gt;
&lt;p&gt;If you already use Codex CLI, Claude Code, Cursor, or other coding agents, the most interesting part of Codex App is that it turns &amp;ldquo;running multiple agents in parallel&amp;rdquo; into a clearer desktop workflow.&lt;/p&gt;
&lt;h2 id=&#34;what-codex-app-is-good-for&#34;&gt;What Codex App Is Good For
&lt;/h2&gt;&lt;p&gt;The core value of Codex App is not answering questions, but letting AI continuously execute tasks inside a project directory:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edit code, run commands, and start development servers.&lt;/li&gt;
&lt;li&gt;Manage multiple projects and multiple tasks.&lt;/li&gt;
&lt;li&gt;Run long tasks locally or in the cloud.&lt;/li&gt;
&lt;li&gt;Call plugins, Skills, and MCP for extended capabilities.&lt;/li&gt;
&lt;li&gt;Manage changes through Git, worktree, and PR workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI also positions Codex App as an interface for managing multiple coding agents. It is suitable for people who need to advance several coding tasks at once, especially frontend pages, scripts, small apps, documentation, and automation workflows.&lt;/p&gt;
&lt;h2 id=&#34;preparation-before-installation&#34;&gt;Preparation Before Installation
&lt;/h2&gt;&lt;p&gt;Before using Codex App, it is best to prepare three basic tools:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Node.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VS Code&lt;/code&gt; or your preferred IDE&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Codex App supports macOS and Windows. After installation, sign in with your ChatGPT account. On first launch, you can choose your main usage scenario, such as programming or daily work. Codex will preload some plugins and Skills based on your choices, and you can adjust them later in settings and the plugin marketplace.&lt;/p&gt;
&lt;p&gt;The main features on Windows and macOS are broadly similar, but some computer automation capabilities may depend on platform and plugin support. Use whatever your current version actually displays.&lt;/p&gt;
&lt;h2 id=&#34;interface-structure-projects-tasks-and-chats&#34;&gt;Interface Structure: Projects, Tasks, and Chats
&lt;/h2&gt;&lt;p&gt;Codex App uses a classic three-column layout:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Left: projects, tasks, chat history, plugins, and automation entry points.&lt;/li&gt;
&lt;li&gt;Middle: current chat window.&lt;/li&gt;
&lt;li&gt;Right: files, browser, terminal, run results, and other panels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A project usually corresponds to a local folder. You can open multiple chats inside the same project, or open several projects at once so different agents can work in parallel.&lt;/p&gt;
&lt;p&gt;The task list shows different states:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Running: the agent is still executing.&lt;/li&gt;
&lt;li&gt;Waiting for approval: you need to confirm permissions, networking, dependency installation, or a high-risk action.&lt;/li&gt;
&lt;li&gt;Completed: the task has finished, and you can inspect the result or continue asking.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is more intuitive than switching between multiple terminal windows, and it is better suited to managing several AI tasks at once.&lt;/p&gt;
&lt;h2 id=&#34;sandbox-and-permission-control&#34;&gt;Sandbox and Permission Control
&lt;/h2&gt;&lt;p&gt;Codex App&amp;rsquo;s permission system is built around the sandbox. By default, the current project folder becomes the agent&amp;rsquo;s main workspace.&lt;/p&gt;
&lt;p&gt;Common permission boundaries include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It can read and modify files inside the project directory.&lt;/li&gt;
&lt;li&gt;It cannot freely modify files outside the project by default.&lt;/li&gt;
&lt;li&gt;Networking or high-risk commands are restricted by default.&lt;/li&gt;
&lt;li&gt;When elevated access is needed, it asks the user for approval.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A practical mode is &amp;ldquo;auto review&amp;rdquo;: low-risk actions are automatically allowed, while high-risk actions are still confirmed by the user. This reduces frequent pop-ups while keeping dangerous operations from happening silently.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Full access&amp;rdquo; should be enabled cautiously. It is suitable when you know exactly what the agent needs to do and the project already has Git backups and important files have separate backups. It is not recommended as a long-term daily default.&lt;/p&gt;
&lt;h2 id=&#34;context-models-and-quotas&#34;&gt;Context, Models, and Quotas
&lt;/h2&gt;&lt;p&gt;Codex App shows the current chat&amp;rsquo;s context usage. The longer the conversation and the more history it contains, the more context the model needs to process.&lt;/p&gt;
&lt;p&gt;Useful habits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start a new chat after finishing a task.&lt;/li&gt;
&lt;li&gt;Long chats can be compressed manually, but do not treat compression as perfect memory.&lt;/li&gt;
&lt;li&gt;For complex tasks, clearly state goals, boundaries, and acceptance criteria.&lt;/li&gt;
&lt;li&gt;Do not dump large irrelevant logs, errors, or files into a chat all at once.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For model selection, adjust reasoning strength according to task complexity. Simple edits, writing, and repetitive tasks do not always need the strongest model. Architecture migration, difficult bugs, and cross-file refactors are better suited to stronger models.&lt;/p&gt;
&lt;p&gt;If the interface has a fast mode, remember that it usually consumes more quota. Use it when speed matters, but not as a daily default.&lt;/p&gt;
&lt;h2 id=&#34;image-generation-and-multimodal-inputs&#34;&gt;Image Generation and Multimodal Inputs
&lt;/h2&gt;&lt;p&gt;Codex App can accept images and files as context, and can call image generation in suitable scenarios.&lt;/p&gt;
&lt;p&gt;This is useful for frontend and content projects. For example, you can ask Codex to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix page styles based on screenshots.&lt;/li&gt;
&lt;li&gt;Replace unsuitable images in a webpage.&lt;/li&gt;
&lt;li&gt;Generate product images, carousel images, or page assets.&lt;/li&gt;
&lt;li&gt;Point out what needs to be changed from a UI screenshot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A more efficient approach is not to say only &amp;ldquo;make it look better&amp;rdquo;, but to use screenshots and point to concrete problems, such as &amp;ldquo;the spacing in this card is too large&amp;rdquo;, &amp;ldquo;this image does not match the service scene&amp;rdquo;, or &amp;ldquo;make the map area clearer&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;steer-correcting-direction-during-execution&#34;&gt;Steer: Correcting Direction During Execution
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Steer&lt;/code&gt; can be understood as taking over the direction during execution. If the agent has already started but you realize it misunderstood the direction, you should not always wait for it to finish before correcting it.&lt;/p&gt;
&lt;p&gt;You can use steering to insert a new instruction into the current execution flow and make Codex correct course.&lt;/p&gt;
&lt;p&gt;Good use cases for Steer include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The agent misunderstood the requirement.&lt;/li&gt;
&lt;li&gt;The generated page style is clearly wrong.&lt;/li&gt;
&lt;li&gt;The current plan is too expensive or heavy.&lt;/li&gt;
&lt;li&gt;You need to add a key constraint temporarily.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In general, keep the default queued behavior and manually use Steer only when intervention is needed. This avoids disrupting normal tasks while still letting you pull the direction back at key moments.&lt;/p&gt;
&lt;h2 id=&#34;plan-mode-and-built-in-browser&#34;&gt;Plan Mode and Built-In Browser
&lt;/h2&gt;&lt;p&gt;For complex tasks, start with plan mode. In plan mode, Codex does not immediately modify code. It first outputs a plan and may ask key questions with cards.&lt;/p&gt;
&lt;p&gt;Tasks suitable for plan mode include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Framework migration, such as moving a React project to Next.js.&lt;/li&gt;
&lt;li&gt;Large refactors.&lt;/li&gt;
&lt;li&gt;Features involving databases, authentication, or deployment.&lt;/li&gt;
&lt;li&gt;Requirements where you have not decided the technical path.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The right panel in Codex App can open a built-in browser to preview the local development server. You can annotate the page and let Codex modify a specific UI location. This &amp;ldquo;look at the page, click the position, ask AI to change it&amp;rdquo; workflow is often better for frontend debugging than pure text descriptions.&lt;/p&gt;
&lt;h2 id=&#34;git-ide-and-code-rollback&#34;&gt;Git, IDE, and Code Rollback
&lt;/h2&gt;&lt;p&gt;Codex App is not a full IDE. It can view code and add annotations, but handwritten editing is still better done in VS Code, Cursor, Windsurf, or another IDE.&lt;/p&gt;
&lt;p&gt;Every Codex project should initialize Git early:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ask Codex to create or check &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Commit once after reaching a usable state.&lt;/li&gt;
&lt;li&gt;Ensure a clean commit point before each large change.&lt;/li&gt;
&lt;li&gt;Roll back with Git if you are not satisfied.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you roll back only the chat history, the code will not automatically roll back. A safer approach is to return the chat to the right point, then use a Git commit hash to return the code to the corresponding state.&lt;/p&gt;
&lt;h2 id=&#34;worktree-parallel-development-in-multiple-directions&#34;&gt;Worktree: Parallel Development in Multiple Directions
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;git worktree&lt;/code&gt; is especially suitable for parallel agents in Codex App.&lt;/p&gt;
&lt;p&gt;It creates multiple independent working directories from the same repository, each corresponding to a different branch. This lets different agents work in different folders at the same time without overwriting each other.&lt;/p&gt;
&lt;p&gt;Typical usage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One worktree optimizes the customer review component.&lt;/li&gt;
&lt;li&gt;One worktree adjusts store information and map layout.&lt;/li&gt;
&lt;li&gt;Merge both tasks back to main after completion.&lt;/li&gt;
&lt;li&gt;Remove temporary worktrees after merging.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is much safer than letting multiple agents modify code in the same directory. If conflicts happen, review and merge them using normal Git workflows.&lt;/p&gt;
&lt;h2 id=&#34;cloud-execution-environment&#34;&gt;Cloud Execution Environment
&lt;/h2&gt;&lt;p&gt;Codex can work not only on your local machine, but also in a cloud environment.&lt;/p&gt;
&lt;p&gt;Cloud execution is suitable when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You are outside and only have a phone.&lt;/li&gt;
&lt;li&gt;You want agents to run long tasks in the background.&lt;/li&gt;
&lt;li&gt;The code has already been synced to GitHub and Codex needs to modify the remote repository.&lt;/li&gt;
&lt;li&gt;You want changes reviewed and merged through PRs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A typical flow is: push local code to GitHub, let Codex pull the repository in a cloud environment, execute the task, generate changes, then present them as a PR or diff for review.&lt;/p&gt;
&lt;p&gt;When continuing local development, remember to pull down the latest remote changes.&lt;/p&gt;
&lt;h2 id=&#34;memory-system-write-a-good-agentsmd&#34;&gt;Memory System: Write a Good AGENTS.md
&lt;/h2&gt;&lt;p&gt;New chats do not have complete historical memory by default. Once a project becomes complex, repeatedly explaining the background is inefficient.&lt;/p&gt;
&lt;p&gt;The most general solution is to maintain &lt;code&gt;AGENTS.md&lt;/code&gt; in the project root. This file can record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project goals and main tech stack.&lt;/li&gt;
&lt;li&gt;Common commands.&lt;/li&gt;
&lt;li&gt;Directory structure.&lt;/li&gt;
&lt;li&gt;Code style and naming conventions.&lt;/li&gt;
&lt;li&gt;Prohibited actions, such as bulk deleting files.&lt;/li&gt;
&lt;li&gt;Test, build, and deployment rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also ask Codex to read the project and generate a first version of &lt;code&gt;AGENTS.md&lt;/code&gt;, then review it manually. For complex projects, this file is worth maintaining.&lt;/p&gt;
&lt;p&gt;Global rules should be used carefully. They are suitable for universal safety constraints, such as &amp;ldquo;do not recursively delete directories&amp;rdquo; or &amp;ldquo;confirm before destructive operations&amp;rdquo;. Do not put project-specific details into global rules, or they will pollute other projects.&lt;/p&gt;
&lt;h2 id=&#34;plugins-and-automations&#34;&gt;Plugins and Automations
&lt;/h2&gt;&lt;p&gt;Plugins connect Codex to external services such as GitHub, Gmail, Google Drive, databases, and deployment platforms.&lt;/p&gt;
&lt;p&gt;Their value is reducing copy and paste. For example, Codex can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check star trends for a GitHub repository.&lt;/li&gt;
&lt;li&gt;Summarize email content and send it to you.&lt;/li&gt;
&lt;li&gt;Run a recurring check.&lt;/li&gt;
&lt;li&gt;Write the result as a summary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Automations are suitable for repeated tasks. For example, checking repository data every Friday afternoon and sending an email report. Simple automation tasks usually do not require the strongest model; a lighter model is enough.&lt;/p&gt;
&lt;h2 id=&#34;skills-turn-workflows-into-reusable-capabilities&#34;&gt;Skills: Turn Workflows Into Reusable Capabilities
&lt;/h2&gt;&lt;p&gt;Skills are &amp;ldquo;professional playbooks&amp;rdquo; for Codex. They are not one-off prompts. They package a task flow, rules, scripts, and notes so Codex can reuse them reliably later.&lt;/p&gt;
&lt;p&gt;Common sources include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Official Skills.&lt;/li&gt;
&lt;li&gt;Third-party Skills.&lt;/li&gt;
&lt;li&gt;Skills you write yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Good candidates for Skills include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Turning subtitles into illustrated notes.&lt;/li&gt;
&lt;li&gt;Writing weekly reports in a company format.&lt;/li&gt;
&lt;li&gt;Batch-processing images or documents.&lt;/li&gt;
&lt;li&gt;Fixed-format code reviews.&lt;/li&gt;
&lt;li&gt;Project initialization for a specific framework.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have copied and pasted the same prompt many times, it is worth turning it into a Skill.&lt;/p&gt;
&lt;h2 id=&#34;mcp-connect-external-tools-and-databases&#34;&gt;MCP: Connect External Tools and Databases
&lt;/h2&gt;&lt;p&gt;MCP can be understood as a standardized tool protocol for large models. Through MCP, Codex can call external services to complete more concrete tasks.&lt;/p&gt;
&lt;p&gt;For example, after connecting Supabase, Codex can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create database tables.&lt;/li&gt;
&lt;li&gt;Read database schemas.&lt;/li&gt;
&lt;li&gt;Modify backend endpoints.&lt;/li&gt;
&lt;li&gt;Submit frontend forms to the database.&lt;/li&gt;
&lt;li&gt;Debug problems based on database state.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is powerful, but permissions matter. Databases, production environments, deployment platforms, and email accounts are high-risk resources. When connecting for the first time, use a test project and a low-privilege account.&lt;/p&gt;
&lt;h2 id=&#34;deployment-plugins&#34;&gt;Deployment Plugins
&lt;/h2&gt;&lt;p&gt;Deployment platform plugins can let Codex complete builds and releases directly, such as deploying a frontend project to Netlify.&lt;/p&gt;
&lt;p&gt;These plugins are suitable for small websites, prototypes, internal tools, and demo projects. In real use, pay attention to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run a local build before deployment.&lt;/li&gt;
&lt;li&gt;Do not write environment variables directly into code.&lt;/li&gt;
&lt;li&gt;Check whether the page opens normally after publishing.&lt;/li&gt;
&lt;li&gt;Keep human review for production projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI can help connect the deployment flow, but deployment permissions should still be managed carefully.&lt;/p&gt;
&lt;h2 id=&#34;computer-automation&#34;&gt;Computer Automation
&lt;/h2&gt;&lt;p&gt;With supported platforms and plugin environments, Codex can also operate browsers or desktop apps, completing tasks closer to RPA.&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open a chat app and prepare a message.&lt;/li&gt;
&lt;li&gt;Browse a project board and summarize task status.&lt;/li&gt;
&lt;li&gt;Generate an English brief.&lt;/li&gt;
&lt;li&gt;Send it to a specified recipient after you confirm.&lt;/li&gt;
&lt;li&gt;Turn the flow into a scheduled automation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These capabilities are imaginative, but they require the strongest safety boundaries. Any operation involving sending messages, sending email, submitting forms, payments, or deleting data should retain human confirmation.&lt;/p&gt;
&lt;h2 id=&#34;usage-suggestions&#34;&gt;Usage Suggestions
&lt;/h2&gt;&lt;p&gt;The right way to use Codex App is not to let it fully take over everything at once, but to break tasks down and let it execute efficiently in a controlled environment.&lt;/p&gt;
&lt;p&gt;Recommended habits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initialize Git for every project.&lt;/li&gt;
&lt;li&gt;Use plan mode for complex tasks.&lt;/li&gt;
&lt;li&gt;Use worktree for parallel tasks.&lt;/li&gt;
&lt;li&gt;Put project rules in &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Keep human confirmation for high-risk actions.&lt;/li&gt;
&lt;li&gt;Turn repeated workflows into Skills or automations.&lt;/li&gt;
&lt;li&gt;Validate plugins and MCP in a test environment first.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-the-codex-app/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing the Codex app - OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11369540-codex-in-chatgpt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Using Codex with your ChatGPT plan - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/academy/codex-plugins-and-skills/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Plugins and skills - OpenAI Academy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Codex App is not &amp;ldquo;one more AI chat window&amp;rdquo;. Its focus is turning AI coding into a manageable workspace where local projects, cloud tasks, Git, worktree, plugins, Skills, MCP, and automation can connect.&lt;/p&gt;
&lt;p&gt;The key to using it well is balancing freedom and control. Small tasks can be handed to Codex boldly. Complex tasks should start with a plan. High-risk actions must be confirmed. Used this way, Codex can become not just a code-writing assistant, but a long-term engineering tool.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How to Use DeepSeek V4 Pro in Cline</title>
        <link>https://knightli.com/en/2026/05/01/use-deepseek-v4-pro-in-cline/</link>
        <pubDate>Fri, 01 May 2026 20:59:06 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/01/use-deepseek-v4-pro-in-cline/</guid>
        <description>&lt;p&gt;Cline already supports the OpenAI Compatible Provider.
DeepSeek API is also compatible with OpenAI SDK-style calls, so connecting &lt;code&gt;deepseek-v4-pro&lt;/code&gt; to Cline is not complicated: choose OpenAI Compatible, then fill in DeepSeek&amp;rsquo;s Base URL, API Key, and model name.&lt;/p&gt;
&lt;p&gt;The steps below cover both the VS Code extension UI and Cline CLI.&lt;/p&gt;
&lt;h2 id=&#34;prepare-a-deepseek-api-key&#34;&gt;Prepare a DeepSeek API Key
&lt;/h2&gt;&lt;p&gt;First, create an API Key on the DeepSeek platform.&lt;/p&gt;
&lt;p&gt;You need three values:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Item&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Provider&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;OpenAI Compatible&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Base URL&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;https://api.deepseek.com&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Model ID&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;DeepSeek&amp;rsquo;s official documentation states that the V4 series uses the existing OpenAI-compatible interface. Keep &lt;code&gt;base_url&lt;/code&gt; as &lt;code&gt;https://api.deepseek.com&lt;/code&gt;, and set &lt;code&gt;model&lt;/code&gt; to &lt;code&gt;deepseek-v4-pro&lt;/code&gt; or &lt;code&gt;deepseek-v4-flash&lt;/code&gt; when calling it.&lt;/p&gt;
&lt;h2 id=&#34;configure-it-in-the-cline-extension&#34;&gt;Configure It in the Cline Extension
&lt;/h2&gt;&lt;p&gt;If you use the Cline extension in VS Code, configure it this way:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Cline from the VS Code sidebar.&lt;/li&gt;
&lt;li&gt;Go to Cline settings or model configuration.&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;OpenAI Compatible&lt;/code&gt; as the provider.&lt;/li&gt;
&lt;li&gt;Enter your DeepSeek API Key.&lt;/li&gt;
&lt;li&gt;Set Base URL to:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://api.deepseek.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;Set Model ID to:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deepseek-v4-pro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Save the configuration and run a simple test in Cline.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Start with a low-risk read-only task:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Please read the current project directory structure and summarize what type of project this is. Do not modify any files.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If Cline can read and answer normally, the model connection is working.&lt;/p&gt;
&lt;h2 id=&#34;configure-it-in-cline-cli&#34;&gt;Configure It in Cline CLI
&lt;/h2&gt;&lt;p&gt;If you use Cline CLI, run &lt;code&gt;cline provider configure openai-compatible&lt;/code&gt; to enter interactive configuration.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cline provider configure openai-compatible
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Fill in:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;API Key: sk-...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Base URL: https://api.deepseek.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Model ID: deepseek-v4-pro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After configuration, test it with a read-only task:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cline &lt;span class=&#34;s2&#34;&gt;&amp;#34;Summarize this repository structure without changing files.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you want to lower cost first, you can temporarily change Model ID to:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deepseek-v4-flash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then switch back to &lt;code&gt;deepseek-v4-pro&lt;/code&gt; for complex planning, fact checking, multi-tool collaboration, or high-risk code changes.&lt;/p&gt;
&lt;h2 id=&#34;recommended-model-split&#34;&gt;Recommended Model Split
&lt;/h2&gt;&lt;p&gt;DeepSeek V4 Pro and Flash are better used with a clear split.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Model&lt;/th&gt;
          &lt;th&gt;Best for&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;deepseek-v4-flash&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Routine code reading, small batch fixes, script generation, context summarization, low-risk frontend changes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Architecture planning, complex bugs, cross-file refactors, fact checking, multi-tool calls, high-risk changes&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For Agent tools like Cline, cost mainly comes from long context, repeated file reads, plan generation, and multi-round tool calls.
If the task is light, use Flash for volume; if the task needs stronger judgment, switch to Pro.&lt;/p&gt;
&lt;h2 id=&#34;how-to-set-context-length&#34;&gt;How to Set Context Length
&lt;/h2&gt;&lt;p&gt;DeepSeek V4 Pro and Flash both support long context.
If Cline requires a manual context window value, you can understand it according to the 1M context listed on DeepSeek&amp;rsquo;s official model page.&lt;/p&gt;
&lt;p&gt;In practice, do not put every file into context at the beginning.
Cline reads files according to the task, and a better workflow is usually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;first ask it to inspect the directory structure;&lt;/li&gt;
&lt;li&gt;then ask it to locate relevant files;&lt;/li&gt;
&lt;li&gt;finally let it modify only the target files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This saves tokens and keeps the task boundary clearer.&lt;/p&gt;
&lt;h2 id=&#34;common-issues&#34;&gt;Common Issues
&lt;/h2&gt;&lt;h3 id=&#34;1-model-not-found&#34;&gt;1. Model Not Found
&lt;/h3&gt;&lt;p&gt;First check that Model ID is exactly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deepseek-v4-pro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Do not write &lt;code&gt;DeepSeek V4 Pro&lt;/code&gt;, &lt;code&gt;deepseek-v4&lt;/code&gt;, or another display name.&lt;/p&gt;
&lt;h3 id=&#34;2-401-or-authentication-failed&#34;&gt;2. 401 or Authentication Failed
&lt;/h3&gt;&lt;p&gt;Check the API Key:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;whether it was copied completely;&lt;/li&gt;
&lt;li&gt;whether it contains extra spaces;&lt;/li&gt;
&lt;li&gt;whether it was entered into the provider configuration Cline is currently using;&lt;/li&gt;
&lt;li&gt;whether the DeepSeek account has available balance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-connection-failed&#34;&gt;3. Connection Failed
&lt;/h3&gt;&lt;p&gt;Check the Base URL:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://api.deepseek.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Do not append &lt;code&gt;/v1/chat/completions&lt;/code&gt; at the end.
Cline&amp;rsquo;s OpenAI Compatible Provider will construct compatible interface requests itself.&lt;/p&gt;
&lt;h3 id=&#34;4-cline-calls-are-too-expensive&#34;&gt;4. Cline Calls Are Too Expensive
&lt;/h3&gt;&lt;p&gt;You can switch routine tasks to &lt;code&gt;deepseek-v4-flash&lt;/code&gt; and use &lt;code&gt;deepseek-v4-pro&lt;/code&gt; only for complex tasks.&lt;/p&gt;
&lt;p&gt;Also, make the task description as clear as possible:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Only modify files related to the login page. Do not refactor unrelated modules. First provide a plan, and modify code only after confirmation.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Agent tasks are most expensive when boundaries are unclear.
The clearer the boundary, the fewer files it reads, the fewer tool calls it makes, and the more controllable the cost becomes.&lt;/p&gt;
&lt;h3 id=&#34;5-error-reasoning_content-must-be-passed-back&#34;&gt;5. Error: reasoning_content must be passed back
&lt;/h3&gt;&lt;p&gt;If you see an error like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;400 The `reasoning_content` in the thinking mode must be passed back to the API.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;invalid_request_error&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;modelId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek-v4-pro&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is usually not a Key, quota, or Base URL problem. It means DeepSeek V4 Pro&amp;rsquo;s thinking mode and the current client&amp;rsquo;s multi-round tool-call history are not aligned.&lt;/p&gt;
&lt;p&gt;DeepSeek&amp;rsquo;s official documentation states:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;thinking mode is &lt;code&gt;enabled&lt;/code&gt; by default;&lt;/li&gt;
&lt;li&gt;thinking mode returns &lt;code&gt;reasoning_content&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;if a tool call happens in one round, subsequent requests must pass back the &lt;code&gt;reasoning_content&lt;/code&gt; from that assistant message;&lt;/li&gt;
&lt;li&gt;if the client does not pass it back correctly, the API returns 400.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When Cline connects through the OpenAI Compatible Provider, this error may appear in the second round or after tool calls if the current version does not fully preserve and return DeepSeek&amp;rsquo;s &lt;code&gt;reasoning_content&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Try this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Upgrade Cline to the latest version;&lt;/li&gt;
&lt;li&gt;confirm you are using &lt;code&gt;OpenAI Compatible&lt;/code&gt;, not the normal &lt;code&gt;OpenAI&lt;/code&gt; provider;&lt;/li&gt;
&lt;li&gt;if Cline supports a custom request body, try disabling thinking mode:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;thinking&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;if Cline does not support extra body parameters, temporarily use another model or a compatible proxy service;&lt;/li&gt;
&lt;li&gt;switch back to &lt;code&gt;deepseek-v4-pro&lt;/code&gt; after Cline supports passing back DeepSeek V4 &lt;code&gt;reasoning_content&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note that disabling thinking mode may reduce complex reasoning ability, but it can work around client compatibility issues where &lt;code&gt;reasoning_content&lt;/code&gt; is not passed back.&lt;/p&gt;
&lt;h2 id=&#34;copyable-configuration&#34;&gt;Copyable Configuration
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Provider: OpenAI Compatible
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;API Key: sk-your DeepSeek API Key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Base URL: https://api.deepseek.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Model ID: deepseek-v4-pro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For low-cost mode:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Provider: OpenAI Compatible
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;API Key: sk-your DeepSeek API Key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Base URL: https://api.deepseek.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Model ID: deepseek-v4-flash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;There are only three key steps to calling DeepSeek V4 Pro in Cline:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;choose &lt;code&gt;OpenAI Compatible&lt;/code&gt; as the provider;&lt;/li&gt;
&lt;li&gt;set Base URL to &lt;code&gt;https://api.deepseek.com&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;set Model ID to &lt;code&gt;deepseek-v4-pro&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After configuration, test with a read-only task before giving it real code changes.
If you often run Agent tasks, split Flash and Pro: Flash handles high-frequency lightweight work, while Pro handles complex judgment and fallback tasks.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.cline.bot/provider-config/openai-compatible&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cline Docs: OpenAI Compatible Provider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.cline.bot/provider-config/overview&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cline Docs: Provider Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://api-docs.deepseek.com/news/news202605&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DeepSeek API Docs: News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://api-docs.deepseek.com/quick_start/pricing/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DeepSeek API Docs: Models &amp;amp; Pricing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>mattpocock/skills: A Practical Skill Collection for AI Coding Agents</title>
        <link>https://knightli.com/en/2026/05/01/mattpocock-skills-ai-agent-coding-workflows/</link>
        <pubDate>Fri, 01 May 2026 03:43:20 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/01/mattpocock-skills-ai-agent-coding-workflows/</guid>
        <description>&lt;p&gt;&lt;code&gt;mattpocock/skills&lt;/code&gt; is a public collection of AI coding agent skills from Matt Pocock.&lt;/p&gt;
&lt;p&gt;It is not a full application, nor a new chat client. It is a set of working skills that can be used by AI coding assistants. The idea is practical: break common AI coding problems into small skills that an Agent can call in the right task, instead of relying on one huge prompt every time.&lt;/p&gt;
&lt;p&gt;If you often use Claude Code, Codex, Cursor, or similar AI coding tools, this kind of skills collection is worth watching. What really affects the AI coding experience is often not whether the model can write code, but whether it can move through the task in your preferred working style.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-it-solves&#34;&gt;What Problem It Solves
&lt;/h2&gt;&lt;p&gt;AI coding assistants are powerful, but they can easily go wrong.&lt;/p&gt;
&lt;p&gt;Common situations include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Starting code changes before understanding the requirement&lt;/li&gt;
&lt;li&gt;Modifying too many files at once&lt;/li&gt;
&lt;li&gt;Producing lots of explanation but little useful action&lt;/li&gt;
&lt;li&gt;Blindly trying things after errors&lt;/li&gt;
&lt;li&gt;Not running tests or checks in time&lt;/li&gt;
&lt;li&gt;Ignoring existing project patterns&lt;/li&gt;
&lt;li&gt;Introducing unnecessary abstractions to finish a task&lt;/li&gt;
&lt;li&gt;Writing code without truly reviewing risks afterward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These problems are not always caused by weak model capability. Often, the workflow is not constrained well enough.&lt;/p&gt;
&lt;p&gt;The value of &lt;code&gt;mattpocock/skills&lt;/code&gt; is that it turns these common failure modes into reusable operating methods, making the Agent behave more like an experienced engineering collaborator in different scenarios.&lt;/p&gt;
&lt;h2 id=&#34;what-are-skills&#34;&gt;What Are Skills
&lt;/h2&gt;&lt;p&gt;In the AI Agent context, a skill can be understood as a reusable task instruction, working method, or professional workflow.&lt;/p&gt;
&lt;p&gt;It does not have to be a code plugin, and it does not always need to call an external service. In many cases, a skill is simply a clear set of rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When to use it&lt;/li&gt;
&lt;li&gt;What to do first&lt;/li&gt;
&lt;li&gt;What not to do&lt;/li&gt;
&lt;li&gt;What output is required&lt;/li&gt;
&lt;li&gt;How to judge task completion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is somewhat like a normal prompt template, but the granularity is closer to a task capability.&lt;/p&gt;
&lt;p&gt;Normal prompt templates are usually copied and pasted manually by the user. Skills are better as part of an agent toolbox, allowing the Agent to choose the right workflow for the task.&lt;/p&gt;
&lt;h2 id=&#34;why-small-and-composable-matters&#34;&gt;Why Small and Composable Matters
&lt;/h2&gt;&lt;p&gt;The README emphasizes that these skills are small and composable.&lt;/p&gt;
&lt;p&gt;This direction matters.&lt;/p&gt;
&lt;p&gt;If one skill tries to handle everything, it quickly becomes a new giant prompt: long, vague, and hard to maintain. The advantage of small skills is clear boundaries.&lt;/p&gt;
&lt;p&gt;For example, one skill can focus on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Planning first&lt;/li&gt;
&lt;li&gt;Fixing TypeScript errors&lt;/li&gt;
&lt;li&gt;Running tests and fixing based on results&lt;/li&gt;
&lt;li&gt;Doing code review&lt;/li&gt;
&lt;li&gt;Summarizing project conventions&lt;/li&gt;
&lt;li&gt;Improving prompts&lt;/li&gt;
&lt;li&gt;Removing unnecessary abstractions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These skills can be combined according to the task. A simple task may need only one skill, while a complex task can chain several together.&lt;/p&gt;
&lt;p&gt;This is closer to real engineering work. You do not use the same workflow for every problem; you choose tools according to the situation.&lt;/p&gt;
&lt;h2 id=&#34;keeping-the-engineer-in-control&#34;&gt;Keeping the Engineer in Control
&lt;/h2&gt;&lt;p&gt;One important direction of this repository is keeping the engineer in control.&lt;/p&gt;
&lt;p&gt;AI coding can easily slide into two extremes.&lt;/p&gt;
&lt;p&gt;The first is fully manual. AI only helps write a few lines of code, while all context, planning, and verification still depend on you.&lt;/p&gt;
&lt;p&gt;The second is fully hands-off. You throw a task to an Agent, let it change a lot of things, and then face a diff that is hard to review.&lt;/p&gt;
&lt;p&gt;Skills help find a more stable middle position.&lt;/p&gt;
&lt;p&gt;They let AI take on more repetitive workflow, while still constraining it with rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand the task before acting&lt;/li&gt;
&lt;li&gt;Read relevant files before editing&lt;/li&gt;
&lt;li&gt;Keep the modification scope controlled&lt;/li&gt;
&lt;li&gt;Report uncertainty&lt;/li&gt;
&lt;li&gt;Verify after changes&lt;/li&gt;
&lt;li&gt;Do not refactor unrelated code just to show off&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This does not weaken AI. It makes AI actions easier for humans to review and take over.&lt;/p&gt;
&lt;h2 id=&#34;alignment-problems&#34;&gt;Alignment Problems
&lt;/h2&gt;&lt;p&gt;The first kind of AI coding failure is often alignment failure.&lt;/p&gt;
&lt;p&gt;The user wants a very specific change, but the Agent may understand it as a larger refactor. The user only wants a bug fixed, but it changes styles along the way. The user wants existing architecture to be followed, but it introduces a new pattern.&lt;/p&gt;
&lt;p&gt;Skills can help the Agent do several things at the start of a task:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Restate the goal&lt;/li&gt;
&lt;li&gt;Identify the impact scope&lt;/li&gt;
&lt;li&gt;Recognize existing implementation patterns&lt;/li&gt;
&lt;li&gt;Provide a plan&lt;/li&gt;
&lt;li&gt;Clarify what will not be done&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This step is like an engineer’s self-check before starting work.&lt;/p&gt;
&lt;p&gt;If the Agent cannot clearly state the task boundary and starts writing code directly, it is easy for the task to drift.&lt;/p&gt;
&lt;h2 id=&#34;feedback-loop-problems&#34;&gt;Feedback Loop Problems
&lt;/h2&gt;&lt;p&gt;AI should not write code through one-shot generation alone.&lt;/p&gt;
&lt;p&gt;In real development, feedback loops matter:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Change a small piece&lt;/li&gt;
&lt;li&gt;Run tests or type checks&lt;/li&gt;
&lt;li&gt;Read the errors&lt;/li&gt;
&lt;li&gt;Fix them&lt;/li&gt;
&lt;li&gt;Verify again&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Many Agents fail because they skip the middle feedback. They change many things at once and then summarize from intuition that “it should work.”&lt;/p&gt;
&lt;p&gt;Skills can make the feedback loop explicit. For example, they can require the Agent to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run relevant checks after modification&lt;/li&gt;
&lt;li&gt;Read error messages first if checks fail&lt;/li&gt;
&lt;li&gt;Avoid blindly changing unrelated files&lt;/li&gt;
&lt;li&gt;Re-verify after each round of fixes&lt;/li&gt;
&lt;li&gt;Report final verification results&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This makes AI coding more like real debugging and less like one-shot writing.&lt;/p&gt;
&lt;h2 id=&#34;architecture-control-problems&#34;&gt;Architecture Control Problems
&lt;/h2&gt;&lt;p&gt;AI is good at generating abstractions, and also good at over-generating abstractions.&lt;/p&gt;
&lt;p&gt;To complete a small requirement, it may create a service layer, helper functions, configuration objects, type wrappers, and adapters, making the code much more complex than the requirement itself.&lt;/p&gt;
&lt;p&gt;This is especially dangerous in large projects. AI-generated abstractions often look “professional,” but they may not match existing project style and may increase maintenance cost.&lt;/p&gt;
&lt;p&gt;Good skills remind the Agent to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefer existing patterns&lt;/li&gt;
&lt;li&gt;Avoid unnecessary new abstractions&lt;/li&gt;
&lt;li&gt;Avoid refactoring unrelated areas&lt;/li&gt;
&lt;li&gt;Match the change to the size of the task&lt;/li&gt;
&lt;li&gt;Understand the code before designing structure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This reduces output that looks engineered but is actually harder to maintain.&lt;/p&gt;
&lt;h2 id=&#34;why-review-skills-matter&#34;&gt;Why Review Skills Matter
&lt;/h2&gt;&lt;p&gt;Writing code and reviewing code are different states.&lt;/p&gt;
&lt;p&gt;When an Agent writes code, it usually tends to prove that its implementation works. It may explain why the change should work, but it does not always actively look for risks.&lt;/p&gt;
&lt;p&gt;The purpose of a review skill is to switch the Agent’s role:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find potential bugs&lt;/li&gt;
&lt;li&gt;Find behavior regressions&lt;/li&gt;
&lt;li&gt;Find missing tests&lt;/li&gt;
&lt;li&gt;Find edge cases&lt;/li&gt;
&lt;li&gt;Find increased complexity&lt;/li&gt;
&lt;li&gt;Find inconsistencies with existing conventions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This matters for AI coding because AI generates code quickly. Without review, users can easily be overwhelmed by large diffs.&lt;/p&gt;
&lt;p&gt;A good review output should list issues first, not praise the implementation first. It should help the engineer decide whether the change can be merged.&lt;/p&gt;
&lt;h2 id=&#34;difference-from-normal-rules-files&#34;&gt;Difference from Normal Rules Files
&lt;/h2&gt;&lt;p&gt;Many AI coding tools support rules, instructions, or memory.&lt;/p&gt;
&lt;p&gt;These files usually record long-term rules, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project tech stack&lt;/li&gt;
&lt;li&gt;Naming conventions&lt;/li&gt;
&lt;li&gt;Test commands&lt;/li&gt;
&lt;li&gt;Directories not to modify&lt;/li&gt;
&lt;li&gt;Answer style preferences&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Skills are more focused on task workflow.&lt;/p&gt;
&lt;p&gt;Rules tell the Agent “how to behave in the long term,” while skills tell the Agent “how to execute this kind of task.”&lt;/p&gt;
&lt;p&gt;The two work best together.&lt;/p&gt;
&lt;p&gt;For example, rules can say the project uses &lt;code&gt;pnpm test&lt;/code&gt;, while a review skill requires checking test coverage after changes. Then the Agent knows not only the command, but also when to use it.&lt;/p&gt;
&lt;h2 id=&#34;suitable-scenarios&#34;&gt;Suitable Scenarios
&lt;/h2&gt;&lt;p&gt;Repositories like &lt;code&gt;mattpocock/skills&lt;/code&gt; are suitable for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frequent use of AI coding tools&lt;/li&gt;
&lt;li&gt;Agents working on real codebases&lt;/li&gt;
&lt;li&gt;Reducing out-of-scope AI edits&lt;/li&gt;
&lt;li&gt;Making the Agent verify results more actively&lt;/li&gt;
&lt;li&gt;Turning your engineering habits into skills&lt;/li&gt;
&lt;li&gt;Learning how others design agent workflows&lt;/li&gt;
&lt;li&gt;Turning temporary prompts into a maintainable skill collection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you only occasionally ask AI to write a small function, you may not need to maintain skills.&lt;/p&gt;
&lt;p&gt;But if you already treat AI as a long-term development partner, skills become increasingly important. They are like a reusable working method for the Agent.&lt;/p&gt;
&lt;h2 id=&#34;how-to-learn-from-this-repository&#34;&gt;How to Learn from This Repository
&lt;/h2&gt;&lt;p&gt;Even if you do not use every skill directly, you can learn several things from this repository.&lt;/p&gt;
&lt;p&gt;First, write down failure modes.&lt;/p&gt;
&lt;p&gt;Do not only complain when AI makes a mistake. Turn the patterns it often gets wrong into rules, so a skill can prevent them next time.&lt;/p&gt;
&lt;p&gt;Second, keep skills short.&lt;/p&gt;
&lt;p&gt;One skill should solve one clear problem. The shorter it is, the easier it is to call correctly and maintain.&lt;/p&gt;
&lt;p&gt;Third, make output format clear.&lt;/p&gt;
&lt;p&gt;If you want the Agent to list a plan first, execute next, and summarize verification results at the end, write that structure clearly. Vague requirements usually produce vague results.&lt;/p&gt;
&lt;p&gt;Fourth, keep human handoff points.&lt;/p&gt;
&lt;p&gt;A good skill should not let AI run too far alone. When there is uncertainty, expanded impact scope, failing tests, or a product decision, it should stop and explain the situation.&lt;/p&gt;
&lt;h2 id=&#34;notes-for-use&#34;&gt;Notes for Use
&lt;/h2&gt;&lt;p&gt;First, do not turn everything into a skill.&lt;/p&gt;
&lt;p&gt;Too many skills make the system complex, and the Agent may not know which one to choose. Start with the highest-frequency and most painful scenarios.&lt;/p&gt;
&lt;p&gt;Second, skills need iteration.&lt;/p&gt;
&lt;p&gt;The first version of a skill may not be good. Watch how AI actually executes it, then gradually delete, add, and rewrite.&lt;/p&gt;
&lt;p&gt;Third, do not let skills replace engineering judgment.&lt;/p&gt;
&lt;p&gt;Skills can improve workflow, but they cannot guarantee correct implementation. Tests, review, build checks, and human judgment still matter.&lt;/p&gt;
&lt;p&gt;Fourth, pay attention to differences between Agents.&lt;/p&gt;
&lt;p&gt;Claude Code, Codex, Cursor, and Copilot support instructions, skills, and rules differently. The same idea can be reused, but the specific format should be adjusted for each tool.&lt;/p&gt;
&lt;h2 id=&#34;reference&#34;&gt;Reference
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/mattpocock/skills&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;mattpocock/skills&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;final-thought&#34;&gt;Final Thought
&lt;/h2&gt;&lt;p&gt;What makes &lt;code&gt;mattpocock/skills&lt;/code&gt; worth watching is not one magic prompt inside it, but the practical AI coding idea it demonstrates: break engineering experience into small skills, then let the Agent combine them by scenario.&lt;/p&gt;
&lt;p&gt;As AI coding moves from occasional assistance into daily workflow, skills become important tools for constraining Agents, keeping engineers in control, and improving feedback quality.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Compound Engineering Plugin: Turning AI Coding into a Plan, Execute, Review Engineering Loop</title>
        <link>https://knightli.com/en/2026/05/01/compound-engineering-plugin-ai-coding-workflow/</link>
        <pubDate>Fri, 01 May 2026 03:15:39 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/01/compound-engineering-plugin-ai-coding-workflow/</guid>
        <description>&lt;p&gt;&lt;code&gt;Compound Engineering Plugin&lt;/code&gt; is an open-source AI coding workflow plugin from Every Inc.&lt;/p&gt;
&lt;p&gt;It is not focused on “making AI write a piece of code faster.” Instead, it places AI coding inside a loop that looks more like an engineering team: plan first, implement next, review afterward, then preserve what was learned. For people who frequently use tools such as Claude Code, Codex, Cursor, and Copilot, this kind of plugin solves a workflow problem, not just a prompt problem.&lt;/p&gt;
&lt;p&gt;AI coding tools are becoming stronger, but in real projects the hardest part is often not generating code. It is making the AI continuously follow project rules, understand task boundaries, avoid repeating mistakes, and accumulate context across multiple iterations.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-it-solves&#34;&gt;What Problem It Solves
&lt;/h2&gt;&lt;p&gt;Many people use AI coding assistants in a flow like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Describe the requirement directly&lt;/li&gt;
&lt;li&gt;Ask AI to modify the code&lt;/li&gt;
&lt;li&gt;Check whether the result runs&lt;/li&gt;
&lt;li&gt;Add more explanation after errors appear&lt;/li&gt;
&lt;li&gt;Explain the background again in the next task&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This can work for small tasks, but it easily breaks down in complex projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requirements are not clarified before AI starts editing&lt;/li&gt;
&lt;li&gt;There is no systematic review after code changes&lt;/li&gt;
&lt;li&gt;Project conventions depend on repeated user reminders&lt;/li&gt;
&lt;li&gt;Similar mistakes happen again next time&lt;/li&gt;
&lt;li&gt;Multiple Agent tools lack a shared working method&lt;/li&gt;
&lt;li&gt;Experience is not turned into reusable rules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Compound Engineering Plugin&lt;/code&gt; is designed for this class of problems. It splits AI coding into multiple stages, so an Agent is not only executing commands but participating in a more complete engineering process.&lt;/p&gt;
&lt;h2 id=&#34;what-is-compound-engineering&#34;&gt;What Is Compound Engineering
&lt;/h2&gt;&lt;p&gt;From the project README, Compound Engineering can be understood as a method for AI-assisted software development.&lt;/p&gt;
&lt;p&gt;It emphasizes a loop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plan: understand the goal, split the task, confirm the path&lt;/li&gt;
&lt;li&gt;Execute: modify code according to the plan, run commands, handle problems&lt;/li&gt;
&lt;li&gt;Review: check implementation quality, risks, and test coverage&lt;/li&gt;
&lt;li&gt;Learn: preserve experience as reusable rules for future work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This loop resembles how real engineering teams work.&lt;/p&gt;
&lt;p&gt;A reliable engineer does not receive a requirement and immediately make random changes, nor does he finish edits and hand them off without checking. He first judges the impact scope, then implements, then checks risks and test results, and finally records the traps he stepped into. AI Agents need similar constraints.&lt;/p&gt;
&lt;h2 id=&#34;why-a-plugin-is-needed&#34;&gt;Why a Plugin Is Needed
&lt;/h2&gt;&lt;p&gt;A prompt can tell AI, “Please plan before executing,” but prompts themselves are not always stable.&lt;/p&gt;
&lt;p&gt;Once a conversation becomes long and context becomes complex, the model may skip planning, ignore rules, or become overconfident in order to finish the task. The value of a plugin is that it fixes the workflow so different Agent environments can follow similar methods.&lt;/p&gt;
&lt;p&gt;This kind of plugin usually breaks a workflow into commands, rules, templates, or subflows. The user does not need to manually write the full prompt every time. Instead, a fixed entry point triggers a specific stage.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ask the Agent to generate a plan first&lt;/li&gt;
&lt;li&gt;Implement step by step according to the plan&lt;/li&gt;
&lt;li&gt;Trigger review after edits&lt;/li&gt;
&lt;li&gt;Return to fixing after problems are found&lt;/li&gt;
&lt;li&gt;Write useful experience into memory or rules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This makes AI coding feel more like controlled collaboration instead of one-off chat.&lt;/p&gt;
&lt;h2 id=&#34;supported-agent-environments&#34;&gt;Supported Agent Environments
&lt;/h2&gt;&lt;p&gt;The README mentions support for multiple AI coding environments, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code&lt;/li&gt;
&lt;li&gt;Codex&lt;/li&gt;
&lt;li&gt;Cursor&lt;/li&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;Amp&lt;/li&gt;
&lt;li&gt;Factory&lt;/li&gt;
&lt;li&gt;Qwen Code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is worth noting.&lt;/p&gt;
&lt;p&gt;Many workflow tools are tied to one client. Once you switch tools, the rules cannot be reused. &lt;code&gt;Compound Engineering Plugin&lt;/code&gt; is more like a cross-Agent engineering method, bringing similar planning, execution, and review workflows to different tools.&lt;/p&gt;
&lt;p&gt;If you use multiple AI coding assistants at the same time, this unified workflow becomes more valuable. Different tools have different capabilities, but project conventions, review habits, and task decomposition methods should remain as consistent as possible.&lt;/p&gt;
&lt;h2 id=&#34;why-the-planning-stage-matters&#34;&gt;Why the Planning Stage Matters
&lt;/h2&gt;&lt;p&gt;The value of the planning stage is to stop AI from acting too early.&lt;/p&gt;
&lt;p&gt;In complex tasks, the truly important questions are usually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which files need to change?&lt;/li&gt;
&lt;li&gt;Which modules may be affected?&lt;/li&gt;
&lt;li&gt;What existing pattern should be followed?&lt;/li&gt;
&lt;li&gt;Are there tests?&lt;/li&gt;
&lt;li&gt;Where are the risks?&lt;/li&gt;
&lt;li&gt;Should documents be read first?&lt;/li&gt;
&lt;li&gt;Can the task be split into smaller steps?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If an Agent starts writing code before thinking through these questions, it can easily produce an implementation that looks finished but deviates from the project structure.&lt;/p&gt;
&lt;p&gt;A plan does not need to be long. A good plan should be short, specific, and executable. Its purpose is not to create documentation, but to give the following implementation clear boundaries.&lt;/p&gt;
&lt;h2 id=&#34;what-to-avoid-in-execution&#34;&gt;What to Avoid in Execution
&lt;/h2&gt;&lt;p&gt;When AI executes coding tasks, several problems appear easily:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Refactoring unrelated code&lt;/li&gt;
&lt;li&gt;Overwriting existing user changes&lt;/li&gt;
&lt;li&gt;Only handling the happy path&lt;/li&gt;
&lt;li&gt;Ignoring error handling&lt;/li&gt;
&lt;li&gt;Not following the existing project style&lt;/li&gt;
&lt;li&gt;Not running necessary verification&lt;/li&gt;
&lt;li&gt;Blindly trying things after errors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A workflow plugin cannot guarantee these problems will disappear, but it can reduce their probability through rules and staged constraints.&lt;/p&gt;
&lt;p&gt;For example, the execution stage can require the Agent to proceed according to the plan. When it discovers something outside the plan, it should explain the risk first. When modifying shared modules, it should add tests or at least run related verification.&lt;/p&gt;
&lt;p&gt;This is especially important in large codebases. The faster AI writes code, the more process is needed to constrain its momentum.&lt;/p&gt;
&lt;h2 id=&#34;why-review-matters&#34;&gt;Why Review Matters
&lt;/h2&gt;&lt;p&gt;Many AI coding failures are not caused by code that cannot run at all. They come from detail problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edge cases are not handled&lt;/li&gt;
&lt;li&gt;State updates are inconsistent&lt;/li&gt;
&lt;li&gt;API contracts are changed quietly&lt;/li&gt;
&lt;li&gt;Tests do not cover key paths&lt;/li&gt;
&lt;li&gt;Error messages are unclear&lt;/li&gt;
&lt;li&gt;Performance or security risks are not mentioned&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The review stage switches the Agent from “author mode” to “reviewer mode.”&lt;/p&gt;
&lt;p&gt;Author mode tends to justify its own implementation. Reviewer mode should actively look for holes, regression risks, and missing tests. Separating these two stages is more reliable than asking the same response to both implement and self-review.&lt;/p&gt;
&lt;p&gt;For users, review output is also more valuable. It helps you quickly judge whether the change is ready to merge or still needs rework.&lt;/p&gt;
&lt;h2 id=&#34;the-meaning-of-learning-and-memory&#34;&gt;The Meaning of Learning and Memory
&lt;/h2&gt;&lt;p&gt;The word “Compound” in the project name suggests an important idea: engineering experience should compound.&lt;/p&gt;
&lt;p&gt;If AI fixes a mistake only for the current task and then repeats the same mistake next time, the productivity gain is limited. A better approach is to preserve useful experience:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Directory conventions in this project&lt;/li&gt;
&lt;li&gt;Debugging methods for a class of errors&lt;/li&gt;
&lt;li&gt;Test commands and notes&lt;/li&gt;
&lt;li&gt;Generated files that should not be touched&lt;/li&gt;
&lt;li&gt;Code style preferences&lt;/li&gt;
&lt;li&gt;Common implementation patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These experiences can become rules, memories, documents, or templates. In later tasks, the Agent reads these accumulated notes before starting work.&lt;/p&gt;
&lt;p&gt;This is the key to moving AI coding from “one-off Q&amp;amp;A” toward “long-term collaboration.”&lt;/p&gt;
&lt;h2 id=&#34;suitable-scenarios&#34;&gt;Suitable Scenarios
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Compound Engineering Plugin&lt;/code&gt; is suitable for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Long-term use of AI Agents for coding&lt;/li&gt;
&lt;li&gt;Projects that receive many rounds of modifications&lt;/li&gt;
&lt;li&gt;Teams that want AI to plan before implementing&lt;/li&gt;
&lt;li&gt;Users who want review thinking after changes&lt;/li&gt;
&lt;li&gt;Teams that want a unified AI coding workflow&lt;/li&gt;
&lt;li&gt;People who use Claude Code, Codex, Cursor, and other tools at the same time&lt;/li&gt;
&lt;li&gt;Teams that want to turn project experience into reusable rules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you only occasionally ask AI to write a small script, the full workflow may feel heavy.&lt;/p&gt;
&lt;p&gt;But if you treat AI coding assistants as daily development partners, the plan, execute, review, learn loop becomes clearly useful.&lt;/p&gt;
&lt;h2 id=&#34;difference-from-normal-prompt-templates&#34;&gt;Difference from Normal Prompt Templates
&lt;/h2&gt;&lt;p&gt;Normal prompt templates usually solve “how to state the task clearly.”&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Please think step by step&lt;/li&gt;
&lt;li&gt;Please read the files first&lt;/li&gt;
&lt;li&gt;Please keep code style consistent&lt;/li&gt;
&lt;li&gt;Please run tests&lt;/li&gt;
&lt;li&gt;Please summarize the changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These prompts are useful, but they still rely on the user using them correctly every time.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Compound Engineering Plugin&lt;/code&gt; operates more at the workflow layer. It organizes these requirements into a repeatable process and adapts them to different Agent tools. You are not writing prompts from scratch every time; you are moving tasks through a workflow.&lt;/p&gt;
&lt;p&gt;Simply put, a prompt template is like a reminder, while a workflow plugin is like a system.&lt;/p&gt;
&lt;h2 id=&#34;notes-for-use&#34;&gt;Notes for Use
&lt;/h2&gt;&lt;p&gt;First, do not let the process become a burden.&lt;/p&gt;
&lt;p&gt;Small tasks do not always need a full plan and long review. A good workflow should adapt to task complexity: handle simple problems quickly and use the full loop for complex ones.&lt;/p&gt;
&lt;p&gt;Second, review cannot replace tests.&lt;/p&gt;
&lt;p&gt;Agent review can find many problems, but it can still miss real runtime errors. Final judgment still depends on tests, type checks, build results, and human review.&lt;/p&gt;
&lt;p&gt;Third, rules need continuous cleanup.&lt;/p&gt;
&lt;p&gt;Preserving experience is important, but rules can become noise as they accumulate. Outdated rules, duplicate rules, and temporary experience that only applied to one task should be cleaned up regularly.&lt;/p&gt;
&lt;p&gt;Fourth, cross-tool consistency does not mean everything is identical.&lt;/p&gt;
&lt;p&gt;Claude Code, Codex, Cursor, Copilot, and other tools have different capabilities and interaction models. What should be unified is the working method, not necessarily every command or configuration detail.&lt;/p&gt;
&lt;h2 id=&#34;suitable-teams&#34;&gt;Suitable Teams
&lt;/h2&gt;&lt;p&gt;If a team already allows AI Agents to modify real code, it is not enough to discuss only “which model is stronger.”&lt;/p&gt;
&lt;p&gt;The more important questions are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does AI understand the task before editing?&lt;/li&gt;
&lt;li&gt;Does AI follow project boundaries during editing?&lt;/li&gt;
&lt;li&gt;Does AI actively review risks after editing?&lt;/li&gt;
&lt;li&gt;Can AI learn from historical mistakes?&lt;/li&gt;
&lt;li&gt;Does the team have unified Agent usage conventions?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where projects such as &lt;code&gt;Compound Engineering Plugin&lt;/code&gt; matter. They move AI coding one step away from personal tricks and toward reusable team workflow.&lt;/p&gt;
&lt;h2 id=&#34;reference&#34;&gt;Reference
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/EveryInc/compound-engineering-plugin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EveryInc/compound-engineering-plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;final-thought&#34;&gt;Final Thought
&lt;/h2&gt;&lt;p&gt;What makes &lt;code&gt;Compound Engineering Plugin&lt;/code&gt; worth watching is not that it adds another AI coding command, but that it organizes AI coding into an engineering workflow that can improve over time.&lt;/p&gt;
&lt;p&gt;When AI Agents start participating in real projects, planning, execution, review, and experience preservation become more important than one-off code generation.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Claude Code Hooks Mastery: An Introduction to 13 Hook Lifecycle Events and Automation Control</title>
        <link>https://knightli.com/en/2026/05/01/claude-code-hooks-mastery-guide/</link>
        <pubDate>Fri, 01 May 2026 03:11:27 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/01/claude-code-hooks-mastery-guide/</guid>
        <description>&lt;p&gt;&lt;code&gt;claude-code-hooks-mastery&lt;/code&gt; is a learning project focused on &lt;code&gt;Claude Code Hooks&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It is not just a collection of scattered scripts. It explains the Claude Code hook lifecycle, configuration methods, script patterns, and common automation scenarios in one place. For people who want Claude Code to be more controllable and more like an engineering assistant, this kind of material is worth reading.&lt;/p&gt;
&lt;p&gt;Claude Code can already read code, edit files, and run commands by default. But if you want it to automatically check permissions, block risky operations, inject project rules, run tests, or remind it of team conventions at specific moments, chat instructions alone are not stable enough. The value of hooks is that they turn “rules I need to remind the AI about every time” into executable workflow.&lt;/p&gt;
&lt;h2 id=&#34;what-problems-hooks-solve&#34;&gt;What Problems Hooks Solve
&lt;/h2&gt;&lt;p&gt;After using Claude Code for a while, common pain points include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every new session needs the same project rules repeated&lt;/li&gt;
&lt;li&gt;You worry that it may run commands it should not run&lt;/li&gt;
&lt;li&gt;You want checks before and after file edits&lt;/li&gt;
&lt;li&gt;You want formatting, tests, or security scans before committing&lt;/li&gt;
&lt;li&gt;You want team conventions as fixed workflow instead of verbal reminders&lt;/li&gt;
&lt;li&gt;You want context before and after tool calls for logging or blocking&lt;/li&gt;
&lt;li&gt;You want complex tasks to trigger subagents or dedicated scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hooks are designed for these “automatic actions at fixed moments.”&lt;/p&gt;
&lt;p&gt;You can think of them as event hooks in the Claude Code workflow. When a session starts, a user submits a prompt, the model is about to call a tool, a tool call finishes, or an agent is about to stop, Claude Code can run the scripts you configured.&lt;/p&gt;
&lt;h2 id=&#34;the-13-hook-lifecycle-events&#34;&gt;The 13 Hook Lifecycle Events
&lt;/h2&gt;&lt;p&gt;One of the main points in the project README is that it systematically covers the 13 Claude Code hook events.&lt;/p&gt;
&lt;p&gt;These events span multiple stages, from session startup to tool calls, and from user input to agent termination. By purpose, they can be roughly grouped as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Session startup: initialize environment and inject project context&lt;/li&gt;
&lt;li&gt;User input: inspect prompts, add rules, and perform auditing&lt;/li&gt;
&lt;li&gt;Before tool calls: permission checks, command blocking, and security validation&lt;/li&gt;
&lt;li&gt;After tool calls: log results, trigger formatting, and run verification&lt;/li&gt;
&lt;li&gt;Task ending: summarize, clean up, notify, or save state&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This lifecycle design means you do not need to put every rule into one very long prompt.&lt;/p&gt;
&lt;p&gt;For example, permission control should happen before tool calls. Formatting checks are better after file edits. Project rule injection is better at session startup or after user input. Putting rules at the right hook point is usually more reliable than stuffing everything into a system prompt.&lt;/p&gt;
&lt;h2 id=&#34;where-configuration-lives&#34;&gt;Where Configuration Lives
&lt;/h2&gt;&lt;p&gt;Claude Code hooks are usually configured through settings files.&lt;/p&gt;
&lt;p&gt;Common locations include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User-level configuration: &lt;code&gt;~/.claude/settings.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Project-level configuration: &lt;code&gt;.claude/settings.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;User-level configuration is good for personal preferences, such as general security rules, command blocking, and log paths.&lt;/p&gt;
&lt;p&gt;Project-level configuration is better for repository-specific rules, such as which tests must run, which directories cannot be edited, how generated files are handled, and which checks are required before commit.&lt;/p&gt;
&lt;p&gt;If you use Claude Code in a team, it is better to put project-level configuration into the repository. That way everyone opens the project with the same AI collaboration constraints instead of relying on personal memory.&lt;/p&gt;
&lt;h2 id=&#34;why-single-file-scripts-matter&#34;&gt;Why Single-File Scripts Matter
&lt;/h2&gt;&lt;p&gt;The project emphasizes &lt;code&gt;UV&lt;/code&gt; single-file scripts.&lt;/p&gt;
&lt;p&gt;The benefit is simple deployment. A single Python file can declare dependencies and run without maintaining a complex environment for one hook. This fits hooks well because many hooks only do one small thing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check whether a command is allowed&lt;/li&gt;
&lt;li&gt;Determine whether a file path is safe&lt;/li&gt;
&lt;li&gt;Read project rules and return them to Claude&lt;/li&gt;
&lt;li&gt;Scan output for sensitive information&lt;/li&gt;
&lt;li&gt;Run formatting or tests after edits&lt;/li&gt;
&lt;li&gt;Write events to logs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The smaller a hook script is, the easier it is to maintain, and the less likely it is to become a new complicated system.&lt;/p&gt;
&lt;h2 id=&#34;what-automation-can-hooks-do&#34;&gt;What Automation Can Hooks Do
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;claude-code-hooks-mastery&lt;/code&gt; shows many directions. In real work, the most common ones are below.&lt;/p&gt;
&lt;h3 id=&#34;1-permission-and-security-control&#34;&gt;1. Permission and Security Control
&lt;/h3&gt;&lt;p&gt;This is the most direct use of hooks.&lt;/p&gt;
&lt;p&gt;Before Claude Code executes a command, a hook can inspect the command content. If it contains high-risk actions such as deletion, reset, cleanup, or overwrite, it can block execution or require manual confirmation.&lt;/p&gt;
&lt;p&gt;Similar rules can apply to file paths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do not modify production configuration&lt;/li&gt;
&lt;li&gt;Do not write to secret files&lt;/li&gt;
&lt;li&gt;Do not delete migration scripts&lt;/li&gt;
&lt;li&gt;Do not touch specific directories&lt;/li&gt;
&lt;li&gt;Do not run unapproved network commands&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Putting this protection before tool calls is more reliable than writing “do not perform dangerous operations” in a prompt.&lt;/p&gt;
&lt;h3 id=&#34;2-context-injection&#34;&gt;2. Context Injection
&lt;/h3&gt;&lt;p&gt;Many projects have fixed background information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tech stack&lt;/li&gt;
&lt;li&gt;Coding conventions&lt;/li&gt;
&lt;li&gt;Test commands&lt;/li&gt;
&lt;li&gt;Branching strategy&lt;/li&gt;
&lt;li&gt;Directory structure&lt;/li&gt;
&lt;li&gt;Prohibited actions&lt;/li&gt;
&lt;li&gt;Rules for generated files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Telling Claude Code this manually every time is annoying and easy to forget. Hooks can automatically inject necessary context at session startup or after the user submits a prompt.&lt;/p&gt;
&lt;p&gt;This is like giving Claude Code a project-level work manual. It does not replace the README or development documentation, but it helps AI enter the correct state before executing a task.&lt;/p&gt;
&lt;h3 id=&#34;3-verification-after-edits&#34;&gt;3. Verification After Edits
&lt;/h3&gt;&lt;p&gt;After Claude Code modifies files, hooks can automatically trigger checks.&lt;/p&gt;
&lt;p&gt;Common actions include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run formatting&lt;/li&gt;
&lt;li&gt;Run lint&lt;/li&gt;
&lt;li&gt;Run unit tests&lt;/li&gt;
&lt;li&gt;Check type errors&lt;/li&gt;
&lt;li&gt;Scan generated files&lt;/li&gt;
&lt;li&gt;Validate Markdown or JSON format&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This helps reduce low-level mistakes. When AI edits multiple files, a lightweight verification pass after modification can reveal problems earlier.&lt;/p&gt;
&lt;p&gt;However, hooks should not run heavy tasks by default. Running the full test suite after every file change can make the experience slow. A better approach is to choose checks based on file type, directory, and task risk.&lt;/p&gt;
&lt;h3 id=&#34;4-team-rule-validation&#34;&gt;4. Team Rule Validation
&lt;/h3&gt;&lt;p&gt;If a team already has clear conventions, some of them can be placed in hooks.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commit message format&lt;/li&gt;
&lt;li&gt;Code style rules&lt;/li&gt;
&lt;li&gt;Do not directly edit certain generated files&lt;/li&gt;
&lt;li&gt;Documentation must be updated together&lt;/li&gt;
&lt;li&gt;API changes must update tests&lt;/li&gt;
&lt;li&gt;Certain directories can only be generated by specific tools&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This makes Claude Code more like part of the team workflow rather than an unconstrained external assistant.&lt;/p&gt;
&lt;p&gt;Of course, hooks should not replace CI. They are better for local reminders and early blocking. Final validation should still belong to CI, review, and test systems.&lt;/p&gt;
&lt;h3 id=&#34;5-subagents-and-dedicated-tasks&#34;&gt;5. Subagents and Dedicated Tasks
&lt;/h3&gt;&lt;p&gt;The README also mentions subagent-related content.&lt;/p&gt;
&lt;p&gt;This type of usage is suitable for sending complex tasks into more specialized workflows. For example, the main conversation can understand the requirement, while a hook or configuration triggers dedicated checking, auditing, summarizing, or documentation tasks.&lt;/p&gt;
&lt;p&gt;For individual users, the first useful step is not complex agent orchestration. It is better to hand repetitive, clear, low-risk actions to hooks first. More complex automation can come after the rules become stable.&lt;/p&gt;
&lt;h2 id=&#34;statusline-and-output-styles&#34;&gt;Statusline and Output Styles
&lt;/h2&gt;&lt;p&gt;The project also covers statusline and output styles.&lt;/p&gt;
&lt;p&gt;This may look like a small experience detail, but it matters for long-term Claude Code usage. A statusline can show current context, task state, environment information, or hints. Output styles can make Claude Code answers fit your working habits better.&lt;/p&gt;
&lt;p&gt;If you collaborate with AI in the same terminal every day, these details affect efficiency. Good status hints reduce mistakes and help you quickly determine whether the current session is in the right project, branch, and environment.&lt;/p&gt;
&lt;h2 id=&#34;do-not-make-hooks-too-heavy&#34;&gt;Do Not Make Hooks Too Heavy
&lt;/h2&gt;&lt;p&gt;Hooks are powerful, but they are not the place to put everything.&lt;/p&gt;
&lt;p&gt;Good rules are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High-frequency actions should be fast&lt;/li&gt;
&lt;li&gt;Security blocking should be clear&lt;/li&gt;
&lt;li&gt;Output should be short&lt;/li&gt;
&lt;li&gt;Failure reasons should be readable&lt;/li&gt;
&lt;li&gt;Scripts should have a single responsibility&lt;/li&gt;
&lt;li&gt;Heavy checks should be explicit commands or CI tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a hook takes more than ten seconds every time, users will soon want to disable it. If a hook has vague blocking rules, both Claude Code and the user will struggle to understand what to do next.&lt;/p&gt;
&lt;p&gt;Hooks are best for tasks with clear boundaries: allow or reject, add context, log events, run lightweight checks, and suggest the next step.&lt;/p&gt;
&lt;h2 id=&#34;who-should-use-it&#34;&gt;Who Should Use It
&lt;/h2&gt;&lt;p&gt;If you only occasionally ask Claude Code to edit a small piece of code, you may not need to study hooks deeply yet.&lt;/p&gt;
&lt;p&gt;But this project is useful if you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use Claude Code frequently&lt;/li&gt;
&lt;li&gt;Often let AI modify real project code&lt;/li&gt;
&lt;li&gt;Worry about AI running dangerous commands&lt;/li&gt;
&lt;li&gt;Want to automatically inject team rules into AI workflows&lt;/li&gt;
&lt;li&gt;Want checks to run automatically after edits&lt;/li&gt;
&lt;li&gt;Want to turn repeated reminders into configuration&lt;/li&gt;
&lt;li&gt;Are building a more stable AI coding workflow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hooks are especially meaningful in collaborative projects. They can turn part of team experience into scripts instead of relying on every person to remind AI manually.&lt;/p&gt;
&lt;h2 id=&#34;notes-for-use&#34;&gt;Notes for Use
&lt;/h2&gt;&lt;p&gt;First, start with security hooks.&lt;/p&gt;
&lt;p&gt;Compared with complex automation, command blocking, path protection, and sensitive file checks are easier to implement and immediately reduce risk.&lt;/p&gt;
&lt;p&gt;Second, commit project-level rules carefully.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt; affects everyone who uses the repository. Before committing rules, make sure they do not over-restrict normal development or depend on paths that only exist on your machine.&lt;/p&gt;
&lt;p&gt;Third, keep hook output concise.&lt;/p&gt;
&lt;p&gt;Claude Code consumes this output. If it is too long, it pollutes the context. If it is too vague, it does not guide the next step. It is best to return only the necessary judgment and next recommendation.&lt;/p&gt;
&lt;p&gt;Fourth, keep hooks debuggable.&lt;/p&gt;
&lt;p&gt;When hooks increase in number, problems can come from configuration, scripts, permissions, paths, dependencies, or Claude Code itself. Clear logs make later debugging much easier.&lt;/p&gt;
&lt;h2 id=&#34;reference&#34;&gt;Reference
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/disler/claude-code-hooks-mastery&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;disler/claude-code-hooks-mastery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;final-thought&#34;&gt;Final Thought
&lt;/h2&gt;&lt;p&gt;The value of &lt;code&gt;Claude Code Hooks&lt;/code&gt; is turning “rules I hope AI remembers every time” into workflows that actually execute.&lt;/p&gt;
&lt;p&gt;If you already use Claude Code in real projects, hooks are a key step from “a coding assistant that can chat” toward “a constrained engineering collaborator.”&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Claude-Mem: Adding Cross-Session Long-Term Memory to Claude Code</title>
        <link>https://knightli.com/en/2026/05/01/claude-mem-persistent-memory-for-claude-code/</link>
        <pubDate>Fri, 01 May 2026 03:01:02 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/01/claude-mem-persistent-memory-for-claude-code/</guid>
        <description>&lt;p&gt;&lt;code&gt;Claude-Mem&lt;/code&gt; is a persistent memory system for &lt;code&gt;Claude Code&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It tries to solve a very specific problem: every time an AI coding assistant starts a new session, it often forgets earlier architecture decisions, past pitfalls, project preferences, and implementation context.&lt;br&gt;
If a project lasts for a long time, repeatedly explaining the same background becomes a waste of time.&lt;/p&gt;
&lt;p&gt;The idea behind &lt;code&gt;Claude-Mem&lt;/code&gt; is to compress Claude Code conversations into memories, store them in a local database and vector store, and then retrieve them later through a search tool.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-does-it-solve&#34;&gt;What Problem Does It Solve?
&lt;/h2&gt;&lt;p&gt;Claude Code is good at code tasks, but session context is still limited.&lt;/p&gt;
&lt;p&gt;Common pain points include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new session does not know what previous sessions did&lt;/li&gt;
&lt;li&gt;Project design decisions need to be explained repeatedly&lt;/li&gt;
&lt;li&gt;Problems that were already debugged are easy to repeat&lt;/li&gt;
&lt;li&gt;Long-running tasks lack continuity&lt;/li&gt;
&lt;li&gt;Project knowledge is hard to accumulate across conversations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Claude-Mem&lt;/code&gt; is designed around these problems.&lt;/p&gt;
&lt;p&gt;It is not simply saving chat logs. Instead, it compresses conversations into memory fragments that are easier to retrieve. When needed later, semantic search can bring the relevant context back.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How It Works
&lt;/h2&gt;&lt;p&gt;From the README design, &lt;code&gt;Claude-Mem&lt;/code&gt; mainly consists of several parts.&lt;/p&gt;
&lt;p&gt;The first part is hooks.&lt;/p&gt;
&lt;p&gt;It integrates with the Claude Code session flow and captures conversation data at the right time.&lt;/p&gt;
&lt;p&gt;The second part is a background worker.&lt;/p&gt;
&lt;p&gt;The worker processes raw conversation content into shorter, more searchable memories.&lt;/p&gt;
&lt;p&gt;The third part is local storage.&lt;/p&gt;
&lt;p&gt;The project uses &lt;code&gt;SQLite&lt;/code&gt; for structured metadata and &lt;code&gt;Chroma&lt;/code&gt; for vector indexing. This preserves basic session information while supporting semantic retrieval.&lt;/p&gt;
&lt;p&gt;The fourth part is &lt;code&gt;mem-search&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is the query entry point for Claude Code. When old context is needed, it can search relevant memories through this tool.&lt;/p&gt;
&lt;p&gt;The overall flow can be understood like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Claude Code sessions generate content&lt;/li&gt;
&lt;li&gt;Hooks capture session data&lt;/li&gt;
&lt;li&gt;The worker asynchronously compresses and organizes it&lt;/li&gt;
&lt;li&gt;Memories are written to SQLite and Chroma&lt;/li&gt;
&lt;li&gt;Later sessions retrieve them through &lt;code&gt;mem-search&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;when-is-it-useful&#34;&gt;When Is It Useful?
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Claude-Mem&lt;/code&gt; is suitable for long-running projects, not one-off small tasks.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A repository is developed over many days&lt;/li&gt;
&lt;li&gt;The code structure is complex and has a lot of background&lt;/li&gt;
&lt;li&gt;Project conventions, naming habits, and architecture choices need to be remembered&lt;/li&gt;
&lt;li&gt;Claude Code is often used for bug fixes, features, and documentation&lt;/li&gt;
&lt;li&gt;You want the AI to remember why something was changed earlier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you only ask Claude Code to make a one-line change, long-term memory is not very meaningful.&lt;br&gt;
But if you treat Claude Code as a long-term collaborator, it becomes useful.&lt;/p&gt;
&lt;h2 id=&#34;installation-and-startup&#34;&gt;Installation and Startup
&lt;/h2&gt;&lt;p&gt;The README gives a direct installation flow:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g claude-mem
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude-mem install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Start it with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude-mem start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Check status:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude-mem status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Stop it when needed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude-mem stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The goal behind these commands is to connect the memory system as a long-running local service to the Claude Code workflow.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-mem-search&#34;&gt;How to Use &lt;code&gt;mem-search&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;mem-search&lt;/code&gt; is the key entry point for retrieving memory.&lt;/p&gt;
&lt;p&gt;It is not meant to replace ordinary search. It lets Claude Code query past conversations by meaning.&lt;/p&gt;
&lt;p&gt;For example, Claude Code can search for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why a module was designed in a certain way&lt;/li&gt;
&lt;li&gt;How a bug was debugged earlier&lt;/li&gt;
&lt;li&gt;Naming rules agreed on in the project&lt;/li&gt;
&lt;li&gt;Technical trade-offs discussed before&lt;/li&gt;
&lt;li&gt;The background behind a refactor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is different from simple keyword search.&lt;br&gt;
If memory compression and vector indexing work well, you can retrieve semantically related content even if you do not remember the exact wording.&lt;/p&gt;
&lt;h2 id=&#34;how-is-it-different-from-project-documentation&#34;&gt;How Is It Different from Project Documentation?
&lt;/h2&gt;&lt;p&gt;Project documentation is good for stable conclusions.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Architecture notes&lt;/li&gt;
&lt;li&gt;Deployment procedures&lt;/li&gt;
&lt;li&gt;API conventions&lt;/li&gt;
&lt;li&gt;Database structure&lt;/li&gt;
&lt;li&gt;Development rules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Claude-Mem&lt;/code&gt; is better for context created during conversations.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why a plan was rejected&lt;/li&gt;
&lt;li&gt;How a temporary issue was worked around&lt;/li&gt;
&lt;li&gt;The discussion behind an implementation&lt;/li&gt;
&lt;li&gt;Project preferences not yet written into docs&lt;/li&gt;
&lt;li&gt;Task background accumulated across multiple conversations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The two are not replacements for each other.&lt;br&gt;
A good workflow is to write stable knowledge into project docs and use the memory system to help retrieve conversational context.&lt;/p&gt;
&lt;h2 id=&#34;things-to-watch-out-for&#34;&gt;Things to Watch Out For
&lt;/h2&gt;&lt;p&gt;First, more long-term memory is not always better.&lt;/p&gt;
&lt;p&gt;If every conversation is saved without distinction, later retrieval can become noisy. The most valuable memories are project decisions, implementation background, debugging history, and long-term preferences.&lt;/p&gt;
&lt;p&gt;Second, memory cannot replace code and documentation.&lt;/p&gt;
&lt;p&gt;Old context found by AI is only a reference. Final judgment still depends on the current code, test results, and latest requirements.&lt;/p&gt;
&lt;p&gt;Third, pay attention to privacy and local data.&lt;/p&gt;
&lt;p&gt;Since it stores conversation content, you should know which projects are suitable for it and which sensitive information should not enter the conversation.&lt;/p&gt;
&lt;p&gt;Fourth, memory systems need maintenance.&lt;/p&gt;
&lt;p&gt;As a project moves forward, old memories may become outdated. If outdated context is reused incorrectly, it can mislead later tasks.&lt;/p&gt;
&lt;h2 id=&#34;why-this-kind-of-tool-matters&#34;&gt;Why This Kind of Tool Matters
&lt;/h2&gt;&lt;p&gt;AI coding tools are moving from one-off Q&amp;amp;A toward long-term collaboration.&lt;/p&gt;
&lt;p&gt;In one-off Q&amp;amp;A, the model only needs to answer the current question.&lt;br&gt;
In long-term collaboration, it needs to know project history, earlier decisions, team preferences, and pitfalls that have already been found.&lt;/p&gt;
&lt;p&gt;This is where tools like &lt;code&gt;Claude-Mem&lt;/code&gt; matter: they turn &amp;ldquo;remembering context&amp;rdquo; from a temporary chat capability into a local system that can be installed, run, and searched.&lt;/p&gt;
&lt;p&gt;For real engineering projects, this is more practical than simply making the model context window longer.&lt;br&gt;
Much information does not need to be stuffed into context all at once; it needs to be retrieved at the right time.&lt;/p&gt;
&lt;h2 id=&#34;who-should-try-it&#34;&gt;Who Should Try It?
&lt;/h2&gt;&lt;p&gt;You may want to try it if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You use Claude Code frequently&lt;/li&gt;
&lt;li&gt;You often work on the same project across multiple days&lt;/li&gt;
&lt;li&gt;The project context is complex&lt;/li&gt;
&lt;li&gt;You repeatedly explain the same background to AI&lt;/li&gt;
&lt;li&gt;You want to preserve experience from conversations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you only use Claude Code occasionally, or the project is small, you may not need this kind of system yet.&lt;/p&gt;
&lt;h2 id=&#34;reference&#34;&gt;Reference
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/thedotmack/claude-mem&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;thedotmack/claude-mem&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;final-thought&#34;&gt;Final Thought
&lt;/h2&gt;&lt;p&gt;The point of &lt;code&gt;Claude-Mem&lt;/code&gt; is not &amp;ldquo;saving chat logs.&amp;rdquo; It is helping Claude Code retrieve useful context in later tasks.&lt;/p&gt;
&lt;p&gt;As AI coding moves from one-off tasks to long-running project collaboration, memory systems will become increasingly important.&lt;br&gt;
They cannot replace documentation and tests, but they can reduce repeated explanations and make the AI feel more like an assistant that understands project history.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Getting Started with Compiling UEFI Programs: From uefi-simple to Your First .EFI</title>
        <link>https://knightli.com/en/2026/04/30/compile-uefi-program-beginner-guide/</link>
        <pubDate>Thu, 30 Apr 2026 19:53:08 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/30/compile-uefi-program-beginner-guide/</guid>
        <description>&lt;p&gt;Compiling your first UEFI program is not exactly effortless. Environment setup can take time, linker errors are common, and a &lt;code&gt;.EFI&lt;/code&gt; program does not have the same direct edit-and-run experience as an ordinary desktop application.&lt;/p&gt;
&lt;p&gt;This article organizes the topic from a beginner&amp;rsquo;s perspective: if you only want to compile your first UEFI program, where should you start, which concepts matter first, and which pitfalls are most likely to appear?&lt;/p&gt;
&lt;h2 id=&#34;what-is-a-uefi-program&#34;&gt;What Is a UEFI Program?
&lt;/h2&gt;&lt;p&gt;A UEFI program is usually a &lt;code&gt;.EFI&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;It is not an ordinary &lt;code&gt;.exe&lt;/code&gt; that you double-click in Windows. It is a PE/COFF executable that runs inside the UEFI firmware environment. Common use cases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Boot managers&lt;/li&gt;
&lt;li&gt;Hardware initialization tools&lt;/li&gt;
&lt;li&gt;Firmware update tools&lt;/li&gt;
&lt;li&gt;Pre-boot diagnostic tools&lt;/li&gt;
&lt;li&gt;Custom boot flows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many functions you see early in the system boot process may be related to UEFI applications, drivers, or firmware services.&lt;/p&gt;
&lt;p&gt;For beginners, there is no need to understand full firmware development immediately. The first goal is simple: compile a &lt;code&gt;.EFI&lt;/code&gt; file that can be loaded by a UEFI Shell or emulator.&lt;/p&gt;
&lt;h2 id=&#34;why-not-start-with-edk-ii&#34;&gt;Why Not Start with EDK II?
&lt;/h2&gt;&lt;p&gt;Real UEFI development often involves EDK II.&lt;/p&gt;
&lt;p&gt;EDK II is complete and closer to real firmware engineering, but it is not very friendly for beginners:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The project structure is complex&lt;/li&gt;
&lt;li&gt;The build system has a learning curve&lt;/li&gt;
&lt;li&gt;Environment variables and toolchain setup involve many details&lt;/li&gt;
&lt;li&gt;Compiler errors are not always easy to understand&lt;/li&gt;
&lt;li&gt;It is easy to get stuck on the environment before writing any code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the goal is simply to get a minimal UEFI program running, a lightweight example is a better starting point.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pbatard/uefi-simple&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pbatard/uefi-simple&lt;/a&gt; is one such project. Its goal is straightforward: provide a simple UEFI Hello World example so you can compile a &lt;code&gt;.EFI&lt;/code&gt; file first.&lt;/p&gt;
&lt;h2 id=&#34;what-is-uefi-simple-good-for&#34;&gt;What Is &lt;code&gt;uefi-simple&lt;/code&gt; Good For?
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;uefi-simple&lt;/code&gt; is a good first stepping stone for UEFI beginners.&lt;/p&gt;
&lt;p&gt;It solves three practical problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It gives you a minimal compilable UEFI application structure&lt;/li&gt;
&lt;li&gt;It avoids the complexity of large firmware projects at the beginning&lt;/li&gt;
&lt;li&gt;It lets you verify that compiling, linking, and running all work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The project supports multiple build methods, including Visual Studio 2022 and MinGW/gcc. It can also be tested with QEMU and OVMF.&lt;/p&gt;
&lt;p&gt;In other words, you do not have to repeatedly reboot a real machine for early experiments. Running the program in an emulator first is much safer.&lt;/p&gt;
&lt;h2 id=&#34;what-to-prepare-before-starting&#34;&gt;What to Prepare Before Starting
&lt;/h2&gt;&lt;p&gt;You need at least a few categories of tools.&lt;/p&gt;
&lt;p&gt;The first category is the compiler toolchain.&lt;/p&gt;
&lt;p&gt;On Windows, you can start with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio 2022&lt;/li&gt;
&lt;li&gt;Or MinGW/gcc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second category is a UEFI runtime environment.&lt;/p&gt;
&lt;p&gt;There are two common options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run the &lt;code&gt;.EFI&lt;/code&gt; file in a real machine&amp;rsquo;s UEFI Shell&lt;/li&gt;
&lt;li&gt;Test it in a virtual environment with QEMU + OVMF&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The third category is an example project.&lt;/p&gt;
&lt;p&gt;Beginners should not start by writing build scripts from an empty directory. Using a minimal example such as &lt;code&gt;uefi-simple&lt;/code&gt; helps avoid many build-system problems.&lt;/p&gt;
&lt;h2 id=&#34;basic-workflow&#34;&gt;Basic Workflow
&lt;/h2&gt;&lt;p&gt;A minimal UEFI program workflow can be understood like this.&lt;/p&gt;
&lt;p&gt;First, get the example project.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pbatard&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;uefi-simple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Second, choose a build toolchain.&lt;/p&gt;
&lt;p&gt;If you use Visual Studio, build with the Visual Studio solution in the project.&lt;br&gt;
If you use MinGW/gcc, follow the Makefile or instructions provided by the project.&lt;/p&gt;
&lt;p&gt;Third, generate the &lt;code&gt;.EFI&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;The key point here is to confirm the target architecture. A common PC is usually &lt;code&gt;x86_64&lt;/code&gt;, meaning a 64-bit UEFI environment.&lt;/p&gt;
&lt;p&gt;Fourth, put the &lt;code&gt;.EFI&lt;/code&gt; file somewhere the UEFI Shell can access.&lt;/p&gt;
&lt;p&gt;On a real machine, this usually means preparing a FAT32 partition or USB drive.&lt;br&gt;
With QEMU, you can mount a directory or disk image.&lt;/p&gt;
&lt;p&gt;Fifth, run it in the UEFI Shell.&lt;/p&gt;
&lt;p&gt;The result is usually a minimal output, such as a Hello World-style message.&lt;/p&gt;
&lt;h2 id=&#34;where-beginners-usually-get-stuck&#34;&gt;Where Beginners Usually Get Stuck
&lt;/h2&gt;&lt;p&gt;The hardest part of compiling a UEFI program is usually not the C language itself, but the environment and linking process.&lt;/p&gt;
&lt;p&gt;Common issues include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wrong compiler architecture&lt;/li&gt;
&lt;li&gt;Wrong target format&lt;/li&gt;
&lt;li&gt;Incomplete linker parameters&lt;/li&gt;
&lt;li&gt;Missing UEFI entry point&lt;/li&gt;
&lt;li&gt;Generating an ordinary executable instead of a UEFI-loadable &lt;code&gt;.EFI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;QEMU or OVMF not configured correctly&lt;/li&gt;
&lt;li&gt;Secure Boot on a real machine blocking an unsigned program&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linker errors are especially easy to misread as code problems.&lt;br&gt;
In many cases, the real issue is the entry function, subsystem, target architecture, or linker script.&lt;/p&gt;
&lt;p&gt;So in the first stage, do not rush into complex logic. Make sure the original example can compile and run, then change the output little by little.&lt;/p&gt;
&lt;h2 id=&#34;why-use-qemu--ovmf-for-testing&#34;&gt;Why Use QEMU + OVMF for Testing?
&lt;/h2&gt;&lt;p&gt;Testing UEFI programs on a real machine is possible, but it is not convenient at the beginner stage.&lt;/p&gt;
&lt;p&gt;You may have to repeat this cycle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compile&lt;/li&gt;
&lt;li&gt;Copy to a USB drive&lt;/li&gt;
&lt;li&gt;Reboot&lt;/li&gt;
&lt;li&gt;Enter the UEFI Shell&lt;/li&gt;
&lt;li&gt;Run the program&lt;/li&gt;
&lt;li&gt;Record the error&lt;/li&gt;
&lt;li&gt;Return to the system and modify the code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That loop is slow.&lt;/p&gt;
&lt;p&gt;QEMU + OVMF lets you simulate a UEFI environment directly inside the operating system. You can verify whether a &lt;code&gt;.EFI&lt;/code&gt; file loads more quickly, and it is less likely to affect your real boot entries.&lt;/p&gt;
&lt;p&gt;Once the program basically works, testing it on a real machine is much more manageable.&lt;/p&gt;
&lt;h2 id=&#34;what-should-beginners-modify-first&#34;&gt;What Should Beginners Modify First?
&lt;/h2&gt;&lt;p&gt;If you have already compiled your first &lt;code&gt;.EFI&lt;/code&gt; with the example project, do not jump into complex features immediately.&lt;/p&gt;
&lt;p&gt;A better order is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Change the output text first to confirm that recompilation really takes effect.&lt;/li&gt;
&lt;li&gt;Try reading simple information provided by UEFI.&lt;/li&gt;
&lt;li&gt;Understand the entry function, output protocol, and basic services.&lt;/li&gt;
&lt;li&gt;Then consider more complex features such as file systems, graphical output, or boot entry management.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This approach makes every step verifiable.&lt;br&gt;
If you change too much at once, it becomes difficult to tell whether the issue is in the code, the build process, or the runtime environment.&lt;/p&gt;
&lt;h2 id=&#34;how-is-it-different-from-an-ordinary-c-program&#34;&gt;How Is It Different from an Ordinary C Program?
&lt;/h2&gt;&lt;p&gt;Although UEFI programs can be written in C, their runtime environment is completely different from ordinary C programs.&lt;/p&gt;
&lt;p&gt;An ordinary C program usually runs inside an operating system and can rely on the standard library, file system, process model, and system calls.&lt;/p&gt;
&lt;p&gt;A UEFI program runs before the operating system boots. It relies on services provided by UEFI firmware. Many things you are used to in normal programs are not automatically available here.&lt;/p&gt;
&lt;p&gt;When writing UEFI programs, you need to adapt to several differences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The entry function is different&lt;/li&gt;
&lt;li&gt;Output works differently&lt;/li&gt;
&lt;li&gt;Available libraries are different&lt;/li&gt;
&lt;li&gt;Memory and file access work differently&lt;/li&gt;
&lt;li&gt;Debugging works differently&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why starting from a minimal example is better than writing code as if it were a normal C program.&lt;/p&gt;
&lt;h2 id=&#34;a-practical-learning-path&#34;&gt;A Practical Learning Path
&lt;/h2&gt;&lt;p&gt;For beginners, a realistic path looks like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Step 1: Compile &lt;code&gt;uefi-simple&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Step 2: Run it with QEMU + OVMF&lt;/li&gt;
&lt;li&gt;Step 3: Modify the Hello World output&lt;/li&gt;
&lt;li&gt;Step 4: Understand how the UEFI Shell loads &lt;code&gt;.EFI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Step 5: Learn the UEFI entry function and basic output protocol&lt;/li&gt;
&lt;li&gt;Step 6: Then read EDK II or more complete UEFI development material&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The point of this path is to build a working feedback loop first.&lt;/p&gt;
&lt;p&gt;Once you can generate a &lt;code&gt;.EFI&lt;/code&gt; from source and see output in a UEFI environment, you have already crossed the hardest first threshold.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pbatard/uefi-simple&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pbatard/uefi-simple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://zhuanlan.zhihu.com/p/643704056&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Zhihu: UEFI program compilation material&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;final-thought&#34;&gt;Final Thought
&lt;/h2&gt;&lt;p&gt;The hard part of compiling your first UEFI program is usually not writing a bit of C code, but connecting the toolchain, link format, and runtime environment.&lt;/p&gt;
&lt;p&gt;Do not rush into complex features.&lt;br&gt;
Start with a minimal example such as &lt;code&gt;uefi-simple&lt;/code&gt;, get a runnable &lt;code&gt;.EFI&lt;/code&gt; first, and then gradually understand UEFI entry points, protocols, and build methods.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Claude.md Is Not Better When It Is Longer: How to Write Global Memory Files for AI Coding</title>
        <link>https://knightli.com/en/2026/04/29/how-to-write-claude-md-for-ai-coding/</link>
        <pubDate>Wed, 29 Apr 2026 21:07:37 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/29/how-to-write-claude-md-for-ai-coding/</guid>
        <description>&lt;p&gt;I recently saw a discussion about global memory files for AI coding: after projects add files such as &lt;code&gt;Claude.md&lt;/code&gt; or &lt;code&gt;AGENTS.md&lt;/code&gt;, the results do not necessarily improve. In some cases, success rates may even drop while reasoning cost rises.&lt;/p&gt;
&lt;p&gt;At first, this feels counterintuitive. We usually assume that if we give AI more project background, more rules, and more explanation, it should write code more accurately.&lt;br&gt;
The real issue is that &lt;code&gt;Claude.md&lt;/code&gt; is not an ordinary document. It is a global memory file that gets injected into the context on every conversation. The more it contains, the more the model has to read every time; the vaguer it is, the more judgment the model has to make; and if it contains workflows that should not always run, the model may trigger unnecessary actions in unrelated tasks.&lt;/p&gt;
&lt;p&gt;So the hard part of writing &lt;code&gt;Claude.md&lt;/code&gt; is not making it complete. It is deciding which pieces of information deserve to occupy context permanently.&lt;/p&gt;
&lt;h2 id=&#34;what-claudemd-is&#34;&gt;What Claude.md Is
&lt;/h2&gt;&lt;p&gt;In AI coding tools, files such as &lt;code&gt;Claude.md&lt;/code&gt; and &lt;code&gt;AGENTS.md&lt;/code&gt; are essentially global memory files.&lt;/p&gt;
&lt;p&gt;Normal conversation enters the context, but context length is limited. Once the conversation becomes long, historical content is compressed and some details are lost. A global memory file fixes important rules in place so the model can see them at the beginning of every task.&lt;/p&gt;
&lt;p&gt;This means two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Content written there is harder to forget&lt;/li&gt;
&lt;li&gt;Content written there also costs something on every task&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is not like a README that is read only when needed. It is more like a long-lived set of working constraints. Once something is placed there, it affects the model&amp;rsquo;s judgment by default.&lt;/p&gt;
&lt;p&gt;Therefore, &lt;code&gt;Claude.md&lt;/code&gt; is not a project introduction, not a collection of tips, and not a place to dump every development process. It should only store rules that the model is likely to violate repeatedly if it does not know them.&lt;/p&gt;
&lt;h2 id=&#34;why-it-can-make-things-worse&#34;&gt;Why It Can Make Things Worse
&lt;/h2&gt;&lt;p&gt;A poorly written global memory file usually causes three kinds of problems.&lt;/p&gt;
&lt;p&gt;First, it consumes context.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;Claude.md&lt;/code&gt; has one thousand lines, those lines stay in the model context for a long time. Code, error messages, and requirements that are actually relevant to the current task may get squeezed. Context is not free space. The larger the global rule file, the easier it is to dilute the current task.&lt;/p&gt;
&lt;p&gt;Second, it can trigger unnecessary behavior.&lt;/p&gt;
&lt;p&gt;For example, a global file might say:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Before every task, fully read the project directory.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;After every change, run a complete end-to-end test.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;These lines look responsible, but in a global memory file they become &amp;ldquo;do this for every task.&amp;rdquo; Even if the task is only changing one line of copy, the model may perform unnecessary exploration and tests because of these rules. The result is slower work, higher cost, and sometimes more interference.&lt;/p&gt;
&lt;p&gt;Third, it increases the burden of judgment.&lt;/p&gt;
&lt;p&gt;Statements like &amp;ldquo;keep code elegant, concise, maintainable, and extensible&amp;rdquo; sound correct, but they are weak constraints. Every time the model generates code, it has to decide what elegant or extensible means, without receiving a clear boundary.&lt;/p&gt;
&lt;p&gt;A better approach is to write concrete prohibitions or counterexamples instead of abstract virtues. For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do not add a generic abstraction for a single call site.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do not change shared parsing logic without test coverage.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do not put temporary scripts in the application source directory.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;These rules are more specific and easier to follow.&lt;/p&gt;
&lt;h2 id=&#34;what-should-go-in&#34;&gt;What Should Go In
&lt;/h2&gt;&lt;p&gt;You can use a simple standard to decide whether something belongs in &lt;code&gt;Claude.md&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;If the AI will repeatedly make the same mistake without it, then it is worth writing down.&lt;/p&gt;
&lt;p&gt;Content suitable for a global memory file usually has these traits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is durable&lt;/li&gt;
&lt;li&gt;It is strongly tied to the current repository&lt;/li&gt;
&lt;li&gt;It cannot be naturally inferred from the code structure&lt;/li&gt;
&lt;li&gt;It clearly changes model behavior&lt;/li&gt;
&lt;li&gt;It is preferably a constraint, prohibition, path rule, or fixed command&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;For all Hugo posts, only edit index.zh-cn.md and do not automatically generate other language versions.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Article front matter must include title/date/draft/tags/categories/slug/description.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do not modify generated artifacts under public/.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;On PowerShell, use scripts/deploy.ps1 for deployment.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;These are not vague suggestions. They are tied to how the repository actually works. If the model does not know them, it may make mistakes; once it knows them, it can avoid real missteps.&lt;/p&gt;
&lt;h2 id=&#34;what-should-stay-out&#34;&gt;What Should Stay Out
&lt;/h2&gt;&lt;p&gt;Many people turn &lt;code&gt;Claude.md&lt;/code&gt; into a project manual. That is usually unnecessary.&lt;/p&gt;
&lt;p&gt;Content that generally does not belong there includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project vision and background&lt;/li&gt;
&lt;li&gt;Large directory structure descriptions&lt;/li&gt;
&lt;li&gt;Temporary task plans&lt;/li&gt;
&lt;li&gt;One-off debugging steps&lt;/li&gt;
&lt;li&gt;Abstract code quality slogans&lt;/li&gt;
&lt;li&gt;Long workflows that are only needed in a few situations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, a description like &amp;ldquo;this is an e-commerce project with product, order, and user modules&amp;rdquo; helps very little with a concrete coding task. During real development, the model should rely on the current requirement, specification, code structure, and tests, not on a rough project introduction in global memory.&lt;/p&gt;
&lt;p&gt;The same applies to directory structure. Unless a directory has a special convention, such as &amp;ldquo;shared components must be imported from this directory,&amp;rdquo; there is no need to write the entire tree into the file. The model can read the project directory itself. A static directory description is easy to become stale.&lt;/p&gt;
&lt;h2 id=&#34;workflows-belong-in-skills-or-commands&#34;&gt;Workflows Belong in Skills or Commands
&lt;/h2&gt;&lt;p&gt;If a section says &amp;ldquo;first do this, then do that, then do the third thing,&amp;rdquo; it may not belong in &lt;code&gt;Claude.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Long-lived workflows can be turned into skills, scripts, or commands. The benefit is that the global memory only needs to keep the name and trigger condition, while the detailed steps are loaded only when needed.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;When the user asks to translate a Hugo post, use the post-translate skill.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;When the user asks to deploy the site, run the hugo-rsync-deploy workflow.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is lighter than putting the full translation and deployment processes into &lt;code&gt;Claude.md&lt;/code&gt;. Global memory stays short, and detailed workflows live in triggerable tools.&lt;/p&gt;
&lt;p&gt;Claude&amp;rsquo;s newer initialization flow is also moving in this direction. It does not only generate a &lt;code&gt;Claude.md&lt;/code&gt;; it also tries to split reusable workflows into skills and fixed events into hooks. The underlying idea is clear: global memory should be an entry point, while details should be loaded on demand.&lt;/p&gt;
&lt;h2 id=&#34;claudemd-needs-iteration&#34;&gt;Claude.md Needs Iteration
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Claude.md&lt;/code&gt; should not be written once and then ignored.&lt;/p&gt;
&lt;p&gt;A better approach is to keep it short at first and let real tasks expose problems. If an error happens once, handle it manually. If the same kind of error appears two or more times, it may deserve to become a global rule.&lt;/p&gt;
&lt;p&gt;This kind of iteration is more useful than writing a huge set of rules at the beginning. Early on, you do not know which rules are truly useful or which lines will become noise. As the project grows, collaboration increases, and the model&amp;rsquo;s behavior becomes clearer, you can gradually add the high-frequency problems.&lt;/p&gt;
&lt;p&gt;There is also an important trend: the stronger the model, the shorter the global memory file should become.&lt;/p&gt;
&lt;p&gt;Many requirements that once had to be written into prompts are now handled naturally by the model. Continuing to put those basic requirements into &lt;code&gt;Claude.md&lt;/code&gt; only increases context load. Global memory should shrink as model capability improves, keeping only what is unique to this repository and cannot be inferred automatically.&lt;/p&gt;
&lt;h2 id=&#34;a-more-practical-way-to-write-it&#34;&gt;A More Practical Way to Write It
&lt;/h2&gt;&lt;p&gt;When writing &lt;code&gt;Claude.md&lt;/code&gt;, think in this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What special conventions does this repository have?&lt;/li&gt;
&lt;li&gt;Which mistakes has the model made more than once?&lt;/li&gt;
&lt;li&gt;Which directories, files, or commands must never be misused?&lt;/li&gt;
&lt;li&gt;Which workflows should become skills, scripts, or commands instead of permanent context?&lt;/li&gt;
&lt;li&gt;Which parts are merely introductions and can be deleted?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The final file may be only a few dozen lines. It does not need to fully explain the project. It needs to constrain behavior precisely.&lt;/p&gt;
&lt;p&gt;A good &lt;code&gt;Claude.md&lt;/code&gt; might look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# Working Rules
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- Only edit files related to the current task.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- Do not modify generated artifact directories such as public/ or resources/.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- Hugo post rewrites only process index.zh-cn.md and do not generate other language versions.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- If deployment is involved, run the Hugo build first, then execute the existing rsync script.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- When there are existing user changes, do not revert them. Continue from the current state.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It is short, but every line affects real behavior. That is the kind of content worth keeping in context permanently.&lt;/p&gt;
&lt;h2 id=&#34;final-thought&#34;&gt;Final Thought
&lt;/h2&gt;&lt;p&gt;The value of &lt;code&gt;Claude.md&lt;/code&gt; is not to make AI &amp;ldquo;know more.&amp;rdquo; It is to make AI &amp;ldquo;avoid fixed mistakes.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It is not a knowledge base or project encyclopedia. It is a long-lived constraint file for AI coding.&lt;br&gt;
The more specific, shorter, and closer to real mistakes it is, the more useful it becomes. The more generic, longer, and more like a project introduction it is, the more likely it is to slow the model down or even make results worse.&lt;/p&gt;
&lt;p&gt;Treat global memory as a scarce resource, not an unlimited scratchpad. That may be the most important principle for writing a good &lt;code&gt;Claude.md&lt;/code&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Codex Is Starting to Control the Computer. What Does That Mean for the Future?</title>
        <link>https://knightli.com/en/2026/04/29/codex-computer-use-update/</link>
        <pubDate>Wed, 29 Apr 2026 11:28:25 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/29/codex-computer-use-update/</guid>
        <description>&lt;p&gt;The most important part of this Codex update is not that it added another ordinary button. It is that Codex is starting to move toward &amp;ldquo;controlling the computer.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;In the past, using AI usually meant asking questions in a chat box, copying, pasting, and then manually operating software.&lt;br&gt;
Now that boundary is expanding: AI does not just answer you. It can operate desktop applications according to your goal.&lt;/p&gt;
&lt;p&gt;In the short term, this is a new feature. In the long term, it may change how many people use computers.&lt;/p&gt;
&lt;h2 id=&#34;what-this-feature-is&#34;&gt;What This Feature Is
&lt;/h2&gt;&lt;p&gt;Simply put, Codex&amp;rsquo;s computer use capability lets it access and operate the desktop environment.&lt;/p&gt;
&lt;p&gt;It can do things such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;select and control an application&lt;/li&gt;
&lt;li&gt;receive tasks in natural language&lt;/li&gt;
&lt;li&gt;open browsers, AI tools, local files, or other software&lt;/li&gt;
&lt;li&gt;enter text, click buttons, and wait for results&lt;/li&gt;
&lt;li&gt;connect multiple steps into one task&lt;/li&gt;
&lt;li&gt;keep running in the background without requiring the user to follow every step manually&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Its role is not just to write a piece of text for you, but to complete an operation flow for you.&lt;/p&gt;
&lt;p&gt;That is the key difference between an Agent and an ordinary chatbot:&lt;br&gt;
a chatbot mainly gives answers; an Agent is closer to &amp;ldquo;receiving a goal and then executing it.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;why-this-matters&#34;&gt;Why This Matters
&lt;/h2&gt;&lt;p&gt;In the past, much automation required you to know how to write scripts.&lt;/p&gt;
&lt;p&gt;For example, suppose you want to complete a cross-software workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;open a web page&lt;/li&gt;
&lt;li&gt;find information&lt;/li&gt;
&lt;li&gt;copy content&lt;/li&gt;
&lt;li&gt;pass it to another AI tool&lt;/li&gt;
&lt;li&gt;save a file&lt;/li&gt;
&lt;li&gt;open the local directory and check the result&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To automate this traditionally, you might need browser scripts, APIs, local programs, and even window automation.&lt;/p&gt;
&lt;p&gt;But many ordinary users do not know how to write these things.&lt;br&gt;
Even if they do, it may not be worth writing a script for a temporary task.&lt;/p&gt;
&lt;p&gt;This is where computer use matters: it pushes &amp;ldquo;script-like capability&amp;rdquo; toward natural language.&lt;/p&gt;
&lt;p&gt;You do not necessarily need to tell it exactly where to click.&lt;br&gt;
You can tell it what result you want and let it try to complete the task.&lt;/p&gt;
&lt;h2 id=&#34;workflows-it-may-change&#34;&gt;Workflows It May Change
&lt;/h2&gt;&lt;p&gt;I think the first workflows to change will not be extremely serious or high-risk work, but the tasks that are annoying, fragmented, repetitive, and not worth writing a dedicated program for.&lt;/p&gt;
&lt;h3 id=&#34;1-moving-information-across-software&#34;&gt;1. Moving Information Across Software
&lt;/h3&gt;&lt;p&gt;The most typical case is moving information between applications.&lt;/p&gt;
&lt;p&gt;Previously, you might switch back and forth between a browser, a document, a chat window, and a local folder.&lt;br&gt;
In the future, you can hand this kind of task to an Agent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;find a certain kind of information&lt;/li&gt;
&lt;li&gt;summarize it into a document&lt;/li&gt;
&lt;li&gt;save it to a specified directory&lt;/li&gt;
&lt;li&gt;open the result for you to review&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This work is not hard, but it consumes attention.&lt;br&gt;
The value of an Agent is that it absorbs these small operations.&lt;/p&gt;
&lt;h3 id=&#34;2-coordination-between-multiple-ai-tools&#34;&gt;2. Coordination Between Multiple AI Tools
&lt;/h3&gt;&lt;p&gt;Many people&amp;rsquo;s real workflow is no longer based on a single AI tool.&lt;/p&gt;
&lt;p&gt;It may look like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;one tool writes code&lt;/li&gt;
&lt;li&gt;one tool researches information&lt;/li&gt;
&lt;li&gt;one tool generates images&lt;/li&gt;
&lt;li&gt;one tool organizes documents&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Previously, these tools were connected by manual copy and paste.&lt;br&gt;
In the future, an Agent can become the middle layer: it opens tools, passes context, waits for output, and organizes results.&lt;/p&gt;
&lt;p&gt;This can turn &amp;ldquo;multiple AI tools working together&amp;rdquo; from a manual process into a semi-automated process.&lt;/p&gt;
&lt;h3 id=&#34;3-office-software-automation&#34;&gt;3. Office Software Automation
&lt;/h3&gt;&lt;p&gt;Spreadsheets, presentations, documents, and email share one trait: they are powerful, but many operations are fragmented.&lt;/p&gt;
&lt;p&gt;If Agents can reliably control this software, the barrier to office automation will drop noticeably.&lt;/p&gt;
&lt;p&gt;You do not need to remember where a menu is or learn complicated shortcuts.&lt;br&gt;
You only need to describe the goal, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;turn this spreadsheet into a monthly report&lt;/li&gt;
&lt;li&gt;make a one-page summary from this document&lt;/li&gt;
&lt;li&gt;combine these materials into a clearly structured explanation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The tedious button operations will gradually be hidden behind natural language.&lt;/p&gt;
&lt;h2 id=&#34;what-it-means-for-ordinary-users&#34;&gt;What It Means for Ordinary Users
&lt;/h2&gt;&lt;p&gt;For ordinary users, this kind of feature may have a more direct impact than &amp;ldquo;the model got a bit smarter.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Because it lowers the operation barrier, not just the knowledge barrier.&lt;/p&gt;
&lt;p&gt;Many people can describe what they want, but they do not know where to click or how to combine features inside software.&lt;br&gt;
If Agents can take over this part, using a computer may become:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;I describe the goal
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Agent operates the software
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;I check the result
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That is closer to real productivity than simple chat.&lt;/p&gt;
&lt;h2 id=&#34;its-impact-on-software&#34;&gt;Its Impact on Software
&lt;/h2&gt;&lt;p&gt;If this kind of Agent capability continues to mature, software itself will also be affected.&lt;/p&gt;
&lt;p&gt;In the past, software design mainly served human clicking.&lt;br&gt;
In the future, software may also need to serve Agent operation.&lt;/p&gt;
&lt;p&gt;This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;interface elements need to be clearer&lt;/li&gt;
&lt;li&gt;operation feedback needs to be more stable&lt;/li&gt;
&lt;li&gt;local permissions need to be more granular&lt;/li&gt;
&lt;li&gt;software may provide interfaces better suited for Agent calls&lt;/li&gt;
&lt;li&gt;users may care more about whether software can be operated smoothly by AI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the long run, the boundaries between applications may become thinner.&lt;br&gt;
Users may care less about &amp;ldquo;which app should I open&amp;rdquo; and more about &amp;ldquo;what task do I want to complete.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;do-not-overhype-it-yet&#34;&gt;Do Not Overhype It Yet
&lt;/h2&gt;&lt;p&gt;Of course, it is not time to fully let go yet.&lt;/p&gt;
&lt;p&gt;This kind of capability still has several clear limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stability still needs observation&lt;/li&gt;
&lt;li&gt;complex tasks may fail in the middle&lt;/li&gt;
&lt;li&gt;permission boundaries must be handled carefully&lt;/li&gt;
&lt;li&gt;account, payment, and file deletion operations should not be delegated casually&lt;/li&gt;
&lt;li&gt;quota consumption is not something you can completely ignore&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So at this stage, the best use case is not letting it take over the whole computer, but letting it handle low-risk, reviewable, step-heavy tasks.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;organizing materials&lt;/li&gt;
&lt;li&gt;generating drafts&lt;/li&gt;
&lt;li&gt;moving content across tools&lt;/li&gt;
&lt;li&gt;opening and checking files&lt;/li&gt;
&lt;li&gt;running semi-automated workflows that can be reviewed by a human&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;one-last-line&#34;&gt;One Last Line
&lt;/h2&gt;&lt;p&gt;The real importance of this Codex update is that it pushes AI from &amp;ldquo;answering questions&amp;rdquo; toward &amp;ldquo;operating the environment.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;In the short term, it is a computer use feature.&lt;br&gt;
In the long term, it may mark a shift in how personal computers are used.&lt;/p&gt;
&lt;p&gt;In the future, we may spend less time remembering buttons, finding menus, and switching windows.&lt;br&gt;
More often, we will describe the goal, let an Agent execute it, and then let humans make the final judgment.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Why Does a Codex Skill Exist in the Directory but Still Not Show Up?</title>
        <link>https://knightli.com/en/2026/04/29/codex-skill-not-loaded-because-of-utf-8-bom/</link>
        <pubDate>Wed, 29 Apr 2026 11:18:00 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/29/codex-skill-not-loaded-because-of-utf-8-bom/</guid>
        <description>&lt;p&gt;This problem was easy to miss: several skills were already placed under &lt;code&gt;~/.codex/skills&lt;/code&gt;, but after opening a new Codex thread, the sidebar still showed only a small subset of them.&lt;/p&gt;
&lt;p&gt;At first, it looked like a cache or indexing issue. The real cause was more specific: several &lt;code&gt;SKILL.md&lt;/code&gt; files started with a UTF-8 BOM. Codex 0.111.0&amp;rsquo;s skill loader did not skip that byte sequence, so it misjudged the files as having no valid YAML front matter.&lt;/p&gt;
&lt;h2 id=&#34;symptom&#34;&gt;Symptom
&lt;/h2&gt;&lt;p&gt;The local directory contained these skills:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.codex/skills/git-commit-push/SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.codex/skills/hugo-rsync-deploy/SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.codex/skills/bilibili-speech-transcriber/SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.codex/skills/product-cutout-normalize/SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;But after opening a new thread, the actually exposed skills were only:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bilibili-speech-transcriber
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;product-cutout-normalize
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In other words, a file existing on disk does not mean the current session can load it successfully. Codex parses the front matter of each &lt;code&gt;SKILL.md&lt;/code&gt; first. If parsing fails, that skill is excluded directly.&lt;/p&gt;
&lt;h2 id=&#34;investigation&#34;&gt;Investigation
&lt;/h2&gt;&lt;p&gt;Starting a fresh session with &lt;code&gt;codex exec&lt;/code&gt; showed a more direct error. In VS Code or other IDEs, these logs may not be visible:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;failed to load skill C:\Users\knightli\.codex\skills\git-commit-push\SKILL.md: missing YAML frontmatter delimited by ---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;failed to load skill C:\Users\knightli\.codex\skills\hugo-rsync-deploy\SKILL.md: missing YAML frontmatter delimited by ---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Visually, these files seemed to have a normal header:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;name: post-rewrite
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;description: ...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The real problem was at the byte level.&lt;/p&gt;
&lt;p&gt;The beginning of a failing file was:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;EF-BB-BF-2D-2D-2D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The beginning of a file that loaded correctly was:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2D-2D-2D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;2D-2D-2D&lt;/code&gt; is &lt;code&gt;---&lt;/code&gt;. The preceding &lt;code&gt;EF-BB-BF&lt;/code&gt; is the UTF-8 BOM.&lt;/p&gt;
&lt;h2 id=&#34;cause&#34;&gt;Cause
&lt;/h2&gt;&lt;p&gt;In Codex 0.111.0, the skill loader expects the first byte of &lt;code&gt;SKILL.md&lt;/code&gt; to be the first &lt;code&gt;-&lt;/code&gt; in &lt;code&gt;---&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If the file starts with a UTF-8 BOM, the actual beginning becomes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;BOM + ---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;So the loader thinks the file does not start with the front matter delimiter and reports:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;missing YAML frontmatter delimited by ---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The skill content was not wrong, and the directory was not wrong either. A small encoding detail prevented the parser from recognizing the file.&lt;/p&gt;
&lt;h2 id=&#34;fix&#34;&gt;Fix
&lt;/h2&gt;&lt;p&gt;Convert the affected &lt;code&gt;SKILL.md&lt;/code&gt; files to UTF-8 without BOM.&lt;/p&gt;
&lt;p&gt;In PowerShell, this can be done like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$paths&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;C:\Users\knightli\.codex\skills\git-commit-push\SKILL.md&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;C:\Users\knightli\.codex\skills\hugo-rsync-deploy\SKILL.md&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$utf8NoBom&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;New-Object&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;Text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;UTF8Encoding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vm&#34;&gt;$false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$p&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;$text&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;IO.File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadAllText&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;Text.Encoding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTF8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;IO.File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteAllText&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$utf8NoBom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After processing, the file header should change from:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;EF-BB-BF-2D-2D-2D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;to:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2D-2D-2D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;verification&#34;&gt;Verification
&lt;/h2&gt;&lt;p&gt;After restarting a Codex session, the visible skills were restored to:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git-commit-push-zh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hugo-rsync-deploy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bilibili-speech-transcriber
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;product-cutout-normalize
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If the sidebar still shows the old list, close the current Codex sidebar or window and reopen the project. The skill list is usually loaded when the session starts, so changes made in the middle of a session may not refresh immediately.&lt;/p&gt;
&lt;h2 id=&#34;one-last-line&#34;&gt;One Last Line
&lt;/h2&gt;&lt;p&gt;This kind of issue is easy to mistake for &amp;ldquo;Codex did not re-index&amp;rdquo; or &amp;ldquo;the skill was not installed correctly.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;When troubleshooting, check these three things first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;whether &lt;code&gt;SKILL.md&lt;/code&gt; is really in the correct directory&lt;/li&gt;
&lt;li&gt;whether the file has valid &lt;code&gt;---&lt;/code&gt; front matter at the top&lt;/li&gt;
&lt;li&gt;whether the file is UTF-8 without BOM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key in this case was the third point: the file looked fine, but its first byte was not &lt;code&gt;-&lt;/code&gt;, so Codex did not treat it as a valid skill.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>What Is the Difference Between ~/.codex/skills and Project .codex/skills in Codex</title>
        <link>https://knightli.com/en/2026/04/29/difference-between-global-and-project-codex-skills/</link>
        <pubDate>Wed, 29 Apr 2026 11:08:00 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/29/difference-between-global-and-project-codex-skills/</guid>
        <description>&lt;p&gt;When organizing Codex skills, people most often get stuck on two questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the difference between &lt;code&gt;~/.codex/skills&lt;/code&gt; and &lt;code&gt;project/.codex/skills&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Why does a skill exist in the directory but not appear in the current session?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is the short version.&lt;/p&gt;
&lt;h2 id=&#34;the-difference&#34;&gt;The Difference
&lt;/h2&gt;&lt;p&gt;The simplest way to remember it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.codex/skills&lt;/code&gt; is your global skill library&lt;/li&gt;
&lt;li&gt;&lt;code&gt;project/.codex/skills&lt;/code&gt; is the local skill library for that repository&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;codexskills&#34;&gt;&lt;code&gt;~/.codex/skills&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Use it for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;skills you personally reuse across projects&lt;/li&gt;
&lt;li&gt;general workflows that are not tied to a specific repository&lt;/li&gt;
&lt;li&gt;workflows that clearly belong to your own habits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;post-rewrite&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;post-translate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git-commit-push&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo-rsync-deploy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bilibili-speech-transcriber&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key trait of this kind of skill is: &lt;strong&gt;it still makes sense outside the current project.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;projectcodexskills&#34;&gt;&lt;code&gt;project/.codex/skills&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Use it for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;workflows that only apply to this repository&lt;/li&gt;
&lt;li&gt;rules tightly coupled to the current project structure, scripts, or templates&lt;/li&gt;
&lt;li&gt;skills that should be shared by the team&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a publishing workflow specific to this repository&lt;/li&gt;
&lt;li&gt;a generation template that only works in this project&lt;/li&gt;
&lt;li&gt;automation steps tightly bound to private project scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key trait of this kind of skill is: &lt;strong&gt;it stops being meaningful once it leaves this repository.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;when-to-use-global-and-when-to-use-project-skills&#34;&gt;When to Use Global and When to Use Project Skills
&lt;/h2&gt;&lt;p&gt;This rule of thumb is enough:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If it is about your personal habits, put it in &lt;code&gt;~/.codex/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If it is about repository rules, put it in &lt;code&gt;project/.codex/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If it can be reused across projects, prefer global&lt;/li&gt;
&lt;li&gt;If it should be shared by multiple people and evolve with the repository, prefer project-level&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-current-repository&#34;&gt;The Current Repository
&lt;/h2&gt;&lt;p&gt;Based on the current state:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;your machine has &lt;code&gt;~/.codex/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;this repository does not have &lt;code&gt;.codex/skills&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So right now, you mainly rely on global skills.&lt;/p&gt;
&lt;p&gt;That means workflows such as &lt;code&gt;post-rewrite&lt;/code&gt;, &lt;code&gt;post-translate&lt;/code&gt;, and &lt;code&gt;git-commit-push&lt;/code&gt; are currently more like part of your personal workflow, not something explicitly bundled with this repository.&lt;/p&gt;
&lt;h2 id=&#34;why-a-skill-exists-on-disk-but-may-not-appear-in-the-current-session&#34;&gt;Why a Skill Exists on Disk but May Not Appear in the Current Session
&lt;/h2&gt;&lt;p&gt;There are two different things here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Existing on disk&lt;/strong&gt;: the skill file exists in a local directory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exposed to the session&lt;/strong&gt;: the current session registered it into the available skill list&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not the same thing.&lt;/p&gt;
&lt;p&gt;So this can happen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a skill already exists under &lt;code&gt;~/.codex/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;but it does not appear in the list after &lt;code&gt;/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This usually does not mean the skill is broken. More often, it means: &lt;strong&gt;the current session has not re-indexed it.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-to-make-a-skill-available-in-the-current-session&#34;&gt;How to Make a Skill Available in the Current Session
&lt;/h2&gt;&lt;p&gt;The practical checklist is short.&lt;/p&gt;
&lt;h3 id=&#34;1-put-it-in-the-right-directory&#34;&gt;1. Put It in the Right Directory
&lt;/h3&gt;&lt;p&gt;Global:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.codex/skills/&amp;lt;skill-name&amp;gt;/SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Project-level:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;project/.codex/skills/&amp;lt;skill-name&amp;gt;/SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-make-the-skillmd-header-recognizable&#34;&gt;2. Make the &lt;code&gt;SKILL.md&lt;/code&gt; Header Recognizable
&lt;/h3&gt;&lt;p&gt;At minimum, it needs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;name: your-skill-name
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;description: What this skill does
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-open-a-new-session-after-creating-or-editing-it&#34;&gt;3. Open a New Session After Creating or Editing It
&lt;/h3&gt;&lt;p&gt;In many cases, a skill does not appear because the current session already fixed its available skill list when it started.&lt;/p&gt;
&lt;p&gt;So if you create a skill in the middle of a session, it may already exist on disk, but this session may not recognize it.&lt;/p&gt;
&lt;p&gt;The most reliable workflow is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Put the skill in place&lt;/li&gt;
&lt;li&gt;End the current session&lt;/li&gt;
&lt;li&gt;Re-enter the project&lt;/li&gt;
&lt;li&gt;Open a new session&lt;/li&gt;
&lt;li&gt;Check whether it appears under &lt;code&gt;/&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;4-put-project-skills-in-place-before-starting&#34;&gt;4. Put Project Skills in Place Before Starting
&lt;/h3&gt;&lt;p&gt;If you want &lt;code&gt;project/.codex/skills&lt;/code&gt; to be recognized more reliably, put those skills into the project before entering the repository and starting the session.&lt;/p&gt;
&lt;h2 id=&#34;one-last-line&#34;&gt;One Last Line
&lt;/h2&gt;&lt;p&gt;The shortest conclusion is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.codex/skills&lt;/code&gt; is your personal skill library&lt;/li&gt;
&lt;li&gt;&lt;code&gt;project/.codex/skills&lt;/code&gt; is the repository&amp;rsquo;s local rule library&lt;/li&gt;
&lt;li&gt;a skill existing in the directory does not mean the current session will always show it&lt;/li&gt;
&lt;li&gt;the most common fix is to put it in the right directory, write a valid &lt;code&gt;SKILL.md&lt;/code&gt;, and then start a new session&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
