<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Automation on KnightLi Blog</title>
        <link>https://knightli.com/en/tags/automation/</link>
        <description>Recent content in Automation on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Wed, 27 May 2026 08:21:18 +0800</lastBuildDate><atom:link href="https://knightli.com/en/tags/automation/index.xml" rel="self" type="application/rss+xml" /><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>ai-goofish-monitor: An Open-Source AI Monitoring System for Goofish Listings</title>
        <link>https://knightli.com/en/2026/05/17/ai-goofish-monitor/</link>
        <pubDate>Sun, 17 May 2026 17:24:03 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/17/ai-goofish-monitor/</guid>
        <description>&lt;p&gt;ai-goofish-monitor is an open-source Goofish product monitoring system from Usagi-org.&lt;/p&gt;
&lt;p&gt;Its goal is clear: automate Goofish search, filtering, product analysis, result logging, and notifications, so users can find matching second-hand listings faster. The project uses Playwright for browser automation and connects to image-capable AI models to judge product information more intelligently.&lt;/p&gt;
&lt;p&gt;Project link: &lt;a class=&#34;link&#34; href=&#34;https://github.com/Usagi-org/ai-goofish-monitor&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Usagi-org/ai-goofish-monitor&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;the-short-version&#34;&gt;The Short Version
&lt;/h2&gt;&lt;p&gt;ai-goofish-monitor is closer to a &amp;ldquo;Goofish purchasing intelligence dashboard&amp;rdquo; than a simple keyword alert script.&lt;/p&gt;
&lt;p&gt;It has several notable traits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A complete web admin UI for managing tasks, accounts, AI criteria, logs, and results.&lt;/li&gt;
&lt;li&gt;Concurrent multi-task monitoring, where each task can define keywords, price range, filters, and AI Prompt.&lt;/li&gt;
&lt;li&gt;Playwright-based page automation, useful for scenarios that require login state and page interaction.&lt;/li&gt;
&lt;li&gt;AI-based product judgment, not just keyword matching.&lt;/li&gt;
&lt;li&gt;Notifications through ntfy.sh, WeCom, Bark, Telegram, Webhook, and other channels.&lt;/li&gt;
&lt;li&gt;Cron scheduling, multi-account management, proxy rotation, retry handling, and Docker deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It fits users who often search Goofish for specific items, such as second-hand electronics, cameras, GPUs, hard drives, game consoles, musical instruments, appliances, and collectibles. But it is not an &amp;ldquo;automatic bargain hunter.&amp;rdquo; Goofish search results change, login states may expire, and platform risk controls can affect automation stability. Treat it as an assisted filtering tool, not a replacement for human judgment.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-it-solves&#34;&gt;What Problem It Solves
&lt;/h2&gt;&lt;p&gt;Finding second-hand products on Goofish often has several pain points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There are too many listings to browse manually.&lt;/li&gt;
&lt;li&gt;Titles and descriptions are inconsistent, so keywords can miss or misclassify listings.&lt;/li&gt;
&lt;li&gt;Good prices appear briefly and may be gone by the time you see them.&lt;/li&gt;
&lt;li&gt;The same product may differ by region, price, condition, and seller.&lt;/li&gt;
&lt;li&gt;Low-priced listings can include accessories, damaged goods, refurbished items, or misleading titles.&lt;/li&gt;
&lt;li&gt;Watching multiple keywords continuously is hard to sustain manually.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basic keyword alerts solve only part of this. Searching for &amp;ldquo;ThinkPad X1&amp;rdquo; may mix in accessories, broken screens, empty boxes, or disassembled parts. Searching for &amp;ldquo;Sony A7C&amp;rdquo; may return lens bundles, rentals, clickbait titles, or abnormal prices.&lt;/p&gt;
&lt;p&gt;ai-goofish-monitor&amp;rsquo;s idea is to use automation to collect candidate listings, then let AI apply your criteria, and finally push the results worth attention.&lt;/p&gt;
&lt;h2 id=&#34;core-features&#34;&gt;Core Features
&lt;/h2&gt;&lt;p&gt;The project README lists a fairly complete feature set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visual web management: task management, account management, AI criteria editing, run logs, and result browsing.&lt;/li&gt;
&lt;li&gt;AI-driven workflow: create tasks with natural language and analyze products with multimodal models.&lt;/li&gt;
&lt;li&gt;Concurrent tasks: each task can define keywords, prices, filters, and AI Prompt independently.&lt;/li&gt;
&lt;li&gt;Advanced filters: free shipping, newly listed time range, and province / city / district filtering.&lt;/li&gt;
&lt;li&gt;Instant notifications: ntfy.sh, WeCom, Bark, Telegram, Webhook, and more.&lt;/li&gt;
&lt;li&gt;Scheduled execution: Cron-based periodic tasks.&lt;/li&gt;
&lt;li&gt;Account and proxy rotation: multi-account management, task-account binding, proxy pool rotation, and retry handling.&lt;/li&gt;
&lt;li&gt;Docker deployment: containerized deployment support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Together, these cover the full chain from creating a monitoring task to receiving a matching alert.&lt;/p&gt;
&lt;h2 id=&#34;workflow&#34;&gt;Workflow
&lt;/h2&gt;&lt;p&gt;A typical workflow looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Deploy the service and open the Web UI.&lt;/li&gt;
&lt;li&gt;Import Goofish account login state.&lt;/li&gt;
&lt;li&gt;Create a monitoring task.&lt;/li&gt;
&lt;li&gt;Set keywords, price range, region, newly listed window, and other filters.&lt;/li&gt;
&lt;li&gt;Write criteria or let AI generate them.&lt;/li&gt;
&lt;li&gt;Run the task in real-time or on a schedule.&lt;/li&gt;
&lt;li&gt;Playwright opens pages and extracts product information.&lt;/li&gt;
&lt;li&gt;AI checks title, description, images, and Prompt against your needs.&lt;/li&gt;
&lt;li&gt;Matching results are written to SQLite.&lt;/li&gt;
&lt;li&gt;The system sends notifications through configured channels.&lt;/li&gt;
&lt;li&gt;You review results, logs, and price history in the Web UI.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AI matters most at step 8. It can understand natural language criteria like &amp;ldquo;good condition, reasonable price, no accessories, no repaired units, preferably local pickup,&amp;rdquo; which is more flexible than simple keyword rules.&lt;/p&gt;
&lt;h2 id=&#34;docker-deployment&#34;&gt;Docker Deployment
&lt;/h2&gt;&lt;p&gt;The project recommends Docker 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;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;git clone https://github.com/Usagi-org/ai-goofish-monitor &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ai-goofish-monitor
&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;vim .env
&lt;/span&gt;&lt;/span&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 app
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose 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;The default Web UI address 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;http://127.0.0.1:8000
&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 image 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;ghcr.io/usagi-org/ai-goofish: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;If the image pulls slowly, the README also gives an accelerated mirror 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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker pull ghcr.nju.edu.cn/usagi-org/ai-goofish:latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker tag ghcr.nju.edu.cn/usagi-org/ai-goofish:latest ghcr.io/usagi-org/ai-goofish:latest
&lt;/span&gt;&lt;/span&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The Docker image includes Chromium, so the host does not need an extra browser. Default persistent directories include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;data/&lt;/code&gt;: main SQLite storage for tasks, results, and price history.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;state/&lt;/code&gt;: login-state cookie files.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/&lt;/code&gt;: task prompts.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logs/&lt;/code&gt;: runtime logs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;images/&lt;/code&gt;: product images and temporary task image folders.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you change &lt;code&gt;SERVER_PORT&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt;, also update the port mapping in &lt;code&gt;docker-compose.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;minimum-configuration&#34;&gt;Minimum Configuration
&lt;/h2&gt;&lt;p&gt;The minimum configuration mainly covers the AI model and Web UI login:&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-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;OPENAI_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;your_api_key
&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;OPENAI_BASE_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;your_openai_compatible_base_url
&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;OPENAI_MODEL_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;your_multimodal_model
&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;WEB_USERNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;admin
&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;WEB_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;change_me
&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 first three are required for AI model access:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;: model API key.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPENAI_BASE_URL&lt;/code&gt;: OpenAI-compatible endpoint.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPENAI_MODEL_NAME&lt;/code&gt;: model name that supports image input.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;WEB_USERNAME&lt;/code&gt; and &lt;code&gt;WEB_PASSWORD&lt;/code&gt; are used for Web UI login. The README mentions the default credentials &lt;code&gt;admin/admin123&lt;/code&gt;; change them in production.&lt;/p&gt;
&lt;h2 id=&#34;first-use&#34;&gt;First Use
&lt;/h2&gt;&lt;p&gt;The first-use flow is roughly:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Log in to the Web UI.&lt;/li&gt;
&lt;li&gt;Go to Goofish account management.&lt;/li&gt;
&lt;li&gt;Use the provided Chrome extension to export Goofish login-state JSON.&lt;/li&gt;
&lt;li&gt;Paste the login state into the system.&lt;/li&gt;
&lt;li&gt;The state file is saved to &lt;code&gt;state/&lt;/code&gt;, for example &lt;code&gt;state/acc_1.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Return to task management, create a task, and bind an account.&lt;/li&gt;
&lt;li&gt;Run the task and check results.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The key part is login state. Goofish does not provide a standard open API for arbitrary third-party scraping, so the project uses browser login state to simulate normal page access. Expired login state, risk controls, captchas, and account anomalies can all affect task execution.&lt;/p&gt;
&lt;h2 id=&#34;ai-tasks-and-keyword-tasks&#34;&gt;AI Tasks and Keyword Tasks
&lt;/h2&gt;&lt;p&gt;The project supports two task creation modes.&lt;/p&gt;
&lt;p&gt;The first is &lt;code&gt;AI判断&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can enter detailed requirements, and the system asynchronously generates analysis criteria. This fits complex needs, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only the main unit, no accessories.&lt;/li&gt;
&lt;li&gt;Alert only when the price is clearly below market.&lt;/li&gt;
&lt;li&gt;Good condition, with no water damage, repair, or hidden defects in the description.&lt;/li&gt;
&lt;li&gt;Prefer local listings and face-to-face pickup.&lt;/li&gt;
&lt;li&gt;Images should show serial number, packaging, or key accessories.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second is &lt;code&gt;关键词判断&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is closer to traditional rule-based monitoring: create tasks directly from keywords, prices, regions, and other conditions without AI generation. It fits simple rules where some false positives are acceptable.&lt;/p&gt;
&lt;p&gt;In practice, you can mix both: keywords handle initial filtering, AI reduces false positives.&lt;/p&gt;
&lt;h2 id=&#34;what-the-web-ui-does&#34;&gt;What the Web UI Does
&lt;/h2&gt;&lt;p&gt;The Web UI is a major difference between this project and ordinary scripts.&lt;/p&gt;
&lt;p&gt;The task management page can configure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI-created tasks.&lt;/li&gt;
&lt;li&gt;Keyword rules.&lt;/li&gt;
&lt;li&gt;Price ranges.&lt;/li&gt;
&lt;li&gt;Newly listed windows.&lt;/li&gt;
&lt;li&gt;Region filters.&lt;/li&gt;
&lt;li&gt;Account binding.&lt;/li&gt;
&lt;li&gt;Scheduling rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The account management page can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Import Goofish account login state.&lt;/li&gt;
&lt;li&gt;Update login state.&lt;/li&gt;
&lt;li&gt;Delete accounts.&lt;/li&gt;
&lt;li&gt;Assign accounts to tasks.&lt;/li&gt;
&lt;li&gt;Let the system choose accounts automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Results and logs pages can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View matching products.&lt;/li&gt;
&lt;li&gt;Export results.&lt;/li&gt;
&lt;li&gt;Search history.&lt;/li&gt;
&lt;li&gt;Inspect task execution.&lt;/li&gt;
&lt;li&gt;Troubleshoot login expiration, risk controls, and AI call issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The system settings page can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View system status.&lt;/li&gt;
&lt;li&gt;Edit Prompt.&lt;/li&gt;
&lt;li&gt;Adjust proxy and rotation configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For long-term monitoring, the Web UI is important. Without it, many tasks quickly make configuration, logs, results, and notifications hard to maintain.&lt;/p&gt;
&lt;h2 id=&#34;data-storage&#34;&gt;Data Storage
&lt;/h2&gt;&lt;p&gt;The current online primary storage is SQLite, with the default 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;/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;data/app.sqlite3
&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 mounts the SQLite main database by default:&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;./data:/app/data
&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 startup, the app creates tables automatically and tries to import historical data once from old &lt;code&gt;config.json&lt;/code&gt;, &lt;code&gt;jsonl/&lt;/code&gt;, and &lt;code&gt;price_history/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note that &lt;code&gt;state/&lt;/code&gt;, &lt;code&gt;prompts/&lt;/code&gt;, &lt;code&gt;logs/&lt;/code&gt;, and &lt;code&gt;images/&lt;/code&gt; remain filesystem directories and are not stored in SQLite. Product images are temporarily saved to directories like:&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;images/task_images_&amp;lt;task_name&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;They are cleaned up by default after the task ends.&lt;/p&gt;
&lt;p&gt;This structure fits personal or small-team deployments: SQLite is lightweight and easy to migrate, while files keep login state, images, and logs easy to inspect.&lt;/p&gt;
&lt;h2 id=&#34;notification-channels&#34;&gt;Notification Channels
&lt;/h2&gt;&lt;p&gt;The project supports multiple notification channels. Common configuration items include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;NTFY_TOPIC_URL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GOTIFY_URL&lt;/code&gt; / &lt;code&gt;GOTIFY_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BARK_URL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WX_BOT_URL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TELEGRAM_BOT_TOKEN&lt;/code&gt; / &lt;code&gt;TELEGRAM_CHAT_ID&lt;/code&gt; / &lt;code&gt;TELEGRAM_API_BASE_URL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WEBHOOK_*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notifications are central to the experience. If a monitor only writes results to a backend, users still need to keep checking the page. With push notifications, matching listings reach the user immediately.&lt;/p&gt;
&lt;p&gt;A practical setup is to tier notifications by item value:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Normal keyword hits are written only to the backend.&lt;/li&gt;
&lt;li&gt;High-confidence AI results are pushed to the phone.&lt;/li&gt;
&lt;li&gt;High-value items are pushed to WeCom or Telegram.&lt;/li&gt;
&lt;li&gt;Enable more logs during debugging, then reduce noise after stabilization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;developer-run&#34;&gt;Developer Run
&lt;/h2&gt;&lt;p&gt;Without Docker, local development requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;Node.js + npm&lt;/li&gt;
&lt;li&gt;Playwright CLI&lt;/li&gt;
&lt;li&gt;Chromium or Chrome / Edge browser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basic 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;/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/Usagi-org/ai-goofish-monitor
&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; ai-goofish-monitor
&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;One-command startup:&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;chmod +x start.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./start.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;&lt;code&gt;start.sh&lt;/code&gt; checks Playwright CLI and browser conditions, installs dependencies, builds the frontend, copies build artifacts, and starts the backend.&lt;/p&gt;
&lt;p&gt;Start the backend 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;python -m src.app
&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;uvicorn src.app:app --host 0.0.0.0 --port &lt;span class=&#34;m&#34;&gt;8000&lt;/span&gt; --reload
&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;Frontend development:&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;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; web-ui
&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;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;Testing and build:&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;PYTEST_DISABLE_PLUGIN_AUTOLOAD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; pytest
&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; web-ui &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build
&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;who-it-fits&#34;&gt;Who It Fits
&lt;/h2&gt;&lt;p&gt;ai-goofish-monitor fits users who:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frequently watch Goofish for specific models.&lt;/li&gt;
&lt;li&gt;Want to monitor second-hand electronics, cameras, game devices, hardware parts, and similar goods.&lt;/li&gt;
&lt;li&gt;Want to automate &amp;ldquo;keyword search + manual screening.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Have an OpenAI-compatible model API and accept AI judgment costs.&lt;/li&gt;
&lt;li&gt;Are comfortable with Docker or basic command-line deployment.&lt;/li&gt;
&lt;li&gt;Need matching results pushed to phone, WeCom, or Telegram.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is less suitable if you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Know nothing about deployment and only want a ready-to-use app.&lt;/li&gt;
&lt;li&gt;Do not want to handle login state, captchas, or account risk controls.&lt;/li&gt;
&lt;li&gt;Need official authorization and strongly compliant data APIs.&lt;/li&gt;
&lt;li&gt;Want large-scale high-frequency platform scraping.&lt;/li&gt;
&lt;li&gt;Expect AI to automatically judge trading risk and place orders for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;risks-and-boundaries&#34;&gt;Risks and Boundaries
&lt;/h2&gt;&lt;p&gt;Tools like this need clear boundaries.&lt;/p&gt;
&lt;p&gt;First, follow platform rules.&lt;/p&gt;
&lt;p&gt;Goofish has its own terms, risk controls, and account security mechanisms. Automation may trigger restrictions. Do not scrape at high frequency, bypass risk controls, harass sellers, bulk-collect private information, or disrupt platform order.&lt;/p&gt;
&lt;p&gt;Second, protect account login state.&lt;/p&gt;
&lt;p&gt;Files in &lt;code&gt;state/&lt;/code&gt; are login-state cookie files. They are effectively account access credentials. Do not commit them to Git, and do not put them on untrusted servers. If the server is exposed to the public internet, change the default Web UI password and place it behind a VPN, reverse-proxy authentication, or an internal network.&lt;/p&gt;
&lt;p&gt;Third, AI judgment is not a factual guarantee.&lt;/p&gt;
&lt;p&gt;AI can reduce false positives, but it cannot guarantee product authenticity, seller trustworthiness, reasonable pricing, or transaction safety. You still need to review product details, seller reputation, chat history, shipping method, and payment process.&lt;/p&gt;
&lt;p&gt;Fourth, watch cost.&lt;/p&gt;
&lt;p&gt;If every candidate listing is analyzed by a multimodal model, costs can rise quickly. Use keyword, price, and region filters first, then send a smaller candidate set to AI.&lt;/p&gt;
&lt;p&gt;Fifth, protect privacy.&lt;/p&gt;
&lt;p&gt;Product screenshots, chat-related content, account state, and notification content may all contain sensitive information. Protect notification Webhooks, log directories, and databases carefully.&lt;/p&gt;
&lt;h2 id=&#34;difference-from-ordinary-scripts&#34;&gt;Difference from Ordinary Scripts
&lt;/h2&gt;&lt;p&gt;Ordinary Goofish monitoring scripts usually do three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Search keywords.&lt;/li&gt;
&lt;li&gt;Check prices.&lt;/li&gt;
&lt;li&gt;Send notifications.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ai-goofish-monitor goes further:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manage tasks and accounts through Web UI.&lt;/li&gt;
&lt;li&gt;Express complex buying criteria with AI Prompt.&lt;/li&gt;
&lt;li&gt;Use multimodal models to inspect product images and descriptions.&lt;/li&gt;
&lt;li&gt;Store results and price history in SQLite.&lt;/li&gt;
&lt;li&gt;Use log pages to diagnose task failures.&lt;/li&gt;
&lt;li&gt;Improve stability through proxy rotation and multi-account mechanisms.&lt;/li&gt;
&lt;li&gt;Support long-running schedules with Cron.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because it does more, it also costs more to deploy and maintain. For normal users, Docker is the easiest path. For developers, the Web UI, FastAPI, Playwright, and SQLite structure is also friendly for secondary development.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-it&#34;&gt;How to Use It
&lt;/h2&gt;&lt;p&gt;A practical approach is to start with small tasks.&lt;/p&gt;
&lt;p&gt;For example, if you want a second-hand camera, create a task like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keywords: &lt;code&gt;A7C&lt;/code&gt;, &lt;code&gt;索尼 A7C&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Price range: set an upper limit based on market price&lt;/li&gt;
&lt;li&gt;Region: prefer same province or local city&lt;/li&gt;
&lt;li&gt;Newly listed window: last day or last few hours&lt;/li&gt;
&lt;li&gt;AI criteria: exclude lens-only listings, repaired units, obvious accessories; pay attention to shutter count and condition&lt;/li&gt;
&lt;li&gt;Notification: push only results that pass AI judgment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After it runs stably, gradually add more tasks. Do not start with dozens of keywords, multiple accounts, and high-frequency Cron. First check login stability, false-positive rate, AI cost, and notification noise, then tune parameters.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;ai-goofish-monitor moves Goofish monitoring from a &amp;ldquo;keyword script&amp;rdquo; to a manageable AI monitoring system. It uses Playwright for page automation, AI for complex judgment, Web UI for tasks and results, SQLite for storage, and multiple notification channels for delivery.&lt;/p&gt;
&lt;p&gt;It is best for individuals or small teams monitoring specific products, especially second-hand electronics, hardware, and cameras where prices fluctuate, timing matters, and descriptions are noisy.&lt;/p&gt;
&lt;p&gt;But it must be used carefully: protect login state, change default passwords, keep scraping frequency restrained, review AI results manually, and respect platform rules and privacy boundaries. As an assisted filtering tool, it can be valuable. As a fully automated trading system, it is easy to overestimate.&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/Usagi-org/ai-goofish-monitor&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Usagi-org/ai-goofish-monitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/Usagi-org/ai-goofish-monitor/blob/master/README_EN.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Project English README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/Usagi-org/ai-goofish-monitor/blob/master/DISCLAIMER.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Project disclaimer&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>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>
        
    </channel>
</rss>
