<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Feishu on RockB</title><link>https://baeseokjae.github.io/tags/feishu/</link><description>Recent content in Feishu on RockB</description><image><title>RockB</title><url>https://baeseokjae.github.io/images/og-default.png</url><link>https://baeseokjae.github.io/images/og-default.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 30 Aug 2026 13:01:45 +0000</lastBuildDate><atom:link href="https://baeseokjae.github.io/tags/feishu/index.xml" rel="self" type="application/rss+xml"/><item><title>DSH Lark Bridge: Chat with DeepSeek Harness Agents on Feishu/Lark</title><link>https://baeseokjae.github.io/posts/dsh-lark-bridge/</link><pubDate>Sun, 30 Aug 2026 13:01:45 +0000</pubDate><guid>https://baeseokjae.github.io/posts/dsh-lark-bridge/</guid><description>The DSH Lark bridge lets you chat with DeepSeek Harness agents on Feishu/Lark. This guide compares the top plugins and walks through a QR-scan setup with no public network.</description><content:encoded><![CDATA[<p>A DSH Lark bridge is a plugin that connects DeepSeek Harness (DSH) coding agents to Feishu or Lark group chats, so you can send a task from your phone, DM, or a group and the bridge runs it in the correct Harness project and session. You do not need a public IP, domain, webhook, or NAT tunnel: the bridge keeps a WebSocket long connection to the Feishu/Lark Open Platform and relays tool-call approvals, questions, files, and status updates back to a single native card.</p>
<h2 id="what-is-a-dsh-lark-bridge-and-why-use-one">What Is a DSH Lark Bridge (and Why Use One)</h2>
<p>DeepSeek Harness (the <code>deepseek-ai/deepseek-harness</code> repository) is a plugin-architecture coding-agent framework built around the motto &ldquo;Everything is a Plugin.&rdquo; It sits around a ~204k-star ecosystem and sees active development pushes through late August 2026. Because DSH is a local, self-hosted agent harness, it historically lived on your workstation or a private server — reachable only from a terminal.</p>
<p>A DSH Lark bridge changes that. It publishes a lightweight bot into Feishu (China) or Lark (international) and maps the messaging surface onto your harness:</p>
<ul>
<li><strong>A group or topic becomes a task inbox.</strong> Each Feishu/Lark group maps to a Project, and each topic or thread maps to an isolated Session.</li>
<li><strong>A message becomes one DSH Agent task.</strong> Send a request, and the harness picks it up and executes it.</li>
<li><strong>A single native card carries the whole lifecycle.</strong> The bridge updates one card as work progresses, routes tool-call approvals and structured <code>ask_user_question</code> prompts back to the reader, and relays files and images.</li>
</ul>
<p>The practical payoff is that you can drive a serious, long-running coding agent from a phone or a group chat — approve a risky file write, answer a clarifying question, watch intermediate tool calls stream in — without ever opening a terminal. For a solo developer with a laptop, or a small team sharing one harness host, this collapses the distance between &ldquo;I had an idea&rdquo; and &ldquo;the agent did the work.&rdquo;</p>
<h2 id="prerequisites-deepseek-harness-nodejs-api-key-and-a-feishulark-account">Prerequisites: DeepSeek Harness, Node.js, API Key, and a Feishu/Lark Account</h2>
<p>Before you can bridge DSH into Feishu/Lark, you need the pieces the harness and the plugins all assume are already running. The requirements are consistent across the leading bridge plugins:</p>
<table>
  <thead>
      <tr>
          <th>Requirement</th>
          <th>Typical version / note</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>DeepSeek Harness (dsh)</td>
          <td>Tested against 0.1.0-rc.6 (still a developer preview)</td>
      </tr>
      <tr>
          <td>Node.js</td>
          <td>≥ 22 for most plugins; several require ≥ 24</td>
      </tr>
      <tr>
          <td><code>DEEPSEEK_API_KEY</code></td>
          <td>Configured in the dsh harness so agents can call the model</td>
      </tr>
      <tr>
          <td>Feishu / Lark account</td>
          <td>A tenant where you can create a custom app / bot</td>
      </tr>
      <tr>
          <td>Package manager</td>
          <td><code>pnpm</code> for build-from-source projects, <code>npx</code> for registry installs</td>
      </tr>
  </tbody>
</table>
<p>The single most common onboarding blocker is not the model key — it is the networking story. Historically, any bridge that wants to receive events from Feishu needed a public endpoint. The modern generation of DSH–Feishu bridges sidesteps this entirely by using Feishu&rsquo;s WebSocket long-connection API through the official <code>@larksuiteoapi/node-sdk</code>, so <strong>no public IP, domain, webhook, or NAT tunnel is required</strong> — a detail we will unpack in the WebSocket section below.</p>
<h2 id="the-6-leading-dshfeishulark-bridge-plugins-compared">The 6 Leading DSH↔Feishu/Lark Bridge Plugins Compared</h2>
<p>As of August 2026 the ecosystem has produced at least half a dozen serious bridge projects. They differ meaningfully in setup friction, security model, reliability guarantees, and how aggressively they isolate workspaces. Here is the comparison matrix.</p>
<table>
  <thead>
      <tr>
          <th>Plugin</th>
          <th>Setup</th>
          <th>Networking</th>
          <th>Session / isolation</th>
          <th>Security model</th>
          <th>Standout feature</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>imetn/dsh-lark-bridge</code></td>
          <td><code>pnpm dlx ... setup --project &quot;$PWD&quot; --brand larkoffice|lark</code></td>
          <td>WebSocket, no public server</td>
          <td>Group→Project, topic→isolated Session</td>
          <td>Card-button approval, structured question routing</td>
          <td>Bidirectional controller with card detail presets (compact / standard / developer)</td>
      </tr>
      <tr>
          <td><code>bihangchi9-creator/dsh-lark-bridge</code></td>
          <td><code>pnpm setup</code> — <strong>must build first</strong> (lib/ is git-ignored)</td>
          <td>WebSocket</td>
          <td>One group = one folder <code>&lt;workspaceRoot&gt;/&lt;chatId&gt;</code>; per-message <code>.attachments/&lt;messageId&gt;/</code></td>
          <td>QR registration wizard, allowlist /allow /disallow</td>
          <td>Strict file isolation; persistent per-chat sessions survive restarts</td>
      </tr>
      <tr>
          <td><code>chenxin105/dsh-lark-bridge</code></td>
          <td><code>dsh plugin --profile web add github:&lt;user&gt;/dsh-lark-bridge</code></td>
          <td>WebSocket</td>
          <td>Inbound private-chat → in-process agent</td>
          <td>Credential-resolved <code>tenant_access_token</code> with auto-refresh; <code>role('secret')</code> fields</td>
          <td>Model-facing tools: send message, read doc, Bitable read/write, call agent</td>
      </tr>
      <tr>
          <td><code>amlyczz/dsh-lark-link</code></td>
          <td>npm <code>dsh-lark-link</code>; <code>/lark setup</code> scan QR (30s)</td>
          <td>WebSocket</td>
          <td>Per-chat context</td>
          <td>Allowlist <code>open_id</code> control, <code>groupPolicy</code> (open/mention/keywords/reply), denyList</td>
          <td>Zero message loss: outbound Outbox + inbound WAL replay; <code>/doctor</code> diagnostic ZIP</td>
      </tr>
      <tr>
          <td><code>ailoushu666/dsh-feishu-bridge</code></td>
          <td><code>npx @deepseek-ai/dsh plugin --profile web add git+https://...</code></td>
          <td>WebSocket</td>
          <td>Same DSH Session reused per chat, threads independent</td>
          <td>Option-question cards for <code>ask_user_question</code></td>
          <td>Real-time 🔧 tool-call hints via throttle queue</td>
      </tr>
      <tr>
          <td><code>PlutoKeating/dsh-lark-bot</code></td>
          <td><code>npx dsh-lark-bot@latest setup --profile dsh-lark; dsh --profile dsh-lark</code></td>
          <td>WebSocket</td>
          <td>Per-session isolated git worktrees; <code>/session /archive /retention</code></td>
          <td>Multi-bot trusted handoff, /safemode core self-heal</td>
          <td>Crash safety-net: dsh crash still replies in Feishu; <code>/jobs</code> auto-retry queue</td>
      </tr>
  </tbody>
</table>
<p>The registries that validate these installs (dsharness.org, dshfind.com, dshbase.com, dsh-plugin.org) point to a fast-growing plugin ecosystem around DSH↔Feishu bridges in 2026.</p>
<h2 id="choosing-the-right-bridge-for-your-use-case">Choosing the Right Bridge for Your Use Case</h2>
<p>Your pick should hinge on three questions: who will install it, how much isolation you need, and whether you trust the reliability layer.</p>
<ul>
<li><strong>Choose <code>imetn/dsh-lark-bridge</code></strong> when you want a controller-grade bridge with a <code>--brand</code> flag for ByteDance <code>larkoffice.com</code> tenants and polished card presets (compact / standard / developer). It is tested against DSH 0.1.0-rc.6, so expect developer-preview rough edges.</li>
<li><strong>Choose <code>bihangchi9-creator/dsh-lark-bridge</code></strong> when strict file isolation is non-negotiable — each chat gets its own <code>&lt;workspaceRoot&gt;/&lt;chatId&gt;</code> folder and per-message <code>.attachments/</code> storage, so groups never touch each other&rsquo;s files. Remember the critical rule: <strong>build before install</strong>, because <code>lib/</code> is git-ignored.</li>
<li><strong>Choose <code>amlyczz/dsh-lark-link</code></strong> when you need at-least-once delivery guarantees and a real diagnostic path. Its outbound Outbox (JSONL, idempotent) plus inbound WAL replay and <code>/doctor</code> ZIP diagnostics make it the strongest reliability story.</li>
<li><strong>Choose <code>ailoushu666/dsh-feishu-bridge</code></strong> when you want the leanest setup (official dsh plugin add, official <code>@larksuiteoapi/node-sdk</code>) and live tool-call visibility with interactive option questions.</li>
<li><strong>Choose <code>PlutoKeating/dsh-lark-bot</code></strong> when you want parallel multi-task in one group, multi-role agents via <code>/role</code>, and a crash safety-net that keeps replying even if the harness dies.</li>
</ul>
<h2 id="step-by-step-setup-with-a-qr-scan-no-public-network-needed">Step-by-Step Setup with a QR Scan (No Public Network Needed)</h2>
<p>The lowest-friction path is the QR-scan onboarding shared by <code>amlyczz/dsh-lark-link</code> and <code>PlutoKeating/dsh-lark-bot</code>. The &ldquo;30-second setup&rdquo; story works because the bridge creates the Feishu app for you — it auto-subscribes to message events, group mention, and reaction permissions — so there is no portal spelunking.</p>
<ol>
<li>
<p><strong>Install the plugin.</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># amlyczz/dsh-lark-link</span>
</span></span><span style="display:flex;"><span>npx dsh-lark-link setup --project <span style="color:#e6db74">&#34;</span>$PWD<span style="color:#e6db74">&#34;</span>  <span style="color:#75715e"># or the registry install for your repo</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># PlutoKeating/dsh-lark-bot</span>
</span></span><span style="display:flex;"><span>npx dsh-lark-bot@latest setup --profile dsh-lark
</span></span></code></pre></div><p>Both require Node.js ≥ 24 (lark-bot accepts ≥ 22) and <code>@deepseek-ai/dsh</code> installed.</p>
</li>
<li>
<p><strong>Scan the QR to create the Feishu app.</strong> The wizard auto-creates the bot and grants the message-event subscription perms it needs, so you never touch the Feishu Open Platform console for the common path.</p>
</li>
<li>
<p><strong>Start the harness with the bridge profile.</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>dsh --profile dsh-lark
</span></span></code></pre></div></li>
<li>
<p><strong>Add the bot to a group (or DM it) and confirm.</strong> Send <code>/help</code> or <code>/lark</code> to verify the connection, then send a real task.</p>
</li>
<li>
<p><strong>Run <code>/doctor</code> or <code>/where</code> if anything is off</strong> — the lark-link tool bundles a diagnostic ZIP (session log + redacted config) that is far faster to share than a wall of terminal output.</p>
</li>
</ol>
<h2 id="how-the-websocket-connection-eliminates-public-ip-domain-and-tunnels">How the WebSocket Connection Eliminates Public IP, Domain and Tunnels</h2>
<p>The #1 reason self-hosted agent bridges stall is networking: &ldquo;I don&rsquo;t want to expose my box.&rdquo; The DSH bridge ecosystem solved this at the platform level. Feishu&rsquo;s Open Platform supports <strong>WebSocket long connections</strong> for receiving events, and the plugins implement them via the official <code>@larksuiteoapi/node-sdk</code>.</p>
<p>On a WebSocket long-connection model, your client <em>initiates</em> the connection outbound to <code>open.feishu.cn</code> or <code>open.larksuite.com</code> and keeps it alive. Feishu pushes events (messages, mentions, reactions) down that existing connection. Because the connection is outbound, there is:</p>
<ul>
<li><strong>No public IP</strong> — your harness host stays behind your NAT/Firewall.</li>
<li><strong>No domain</strong> — nothing to buy, configure, or renew.</li>
<li><strong>No webhook endpoint</strong> — no ingress route to secure.</li>
<li><strong>No NAT tunnel / ngrok-style relay</strong> — one less moving part and one less attack surface.</li>
</ul>
<p>The bidirectional plugins layer the <em>sending</em> side on the same outbound channel. <code>imetn/dsh-lark-bridge</code>, for example, is explicitly designed as &ldquo;WebSocket long connections, no public webhook server.&rdquo; If your use case is Feishu (China), the base URL is <code>https://open.feishu.cn/open-apis</code>; for Lark (international) it is <code>https://open.larksuite.com/open-apis</code>. ByteDance <code>larkoffice.com</code> tenants instead pass <code>--brand larkoffice</code>, and <code>chenxin105/dsh-lark-bridge</code> exposes a <code>baseURL</code> switch for exactly this split.</p>
<h2 id="managing-sessions-projects-and-workspace-isolation">Managing Sessions, Projects and Workspace Isolation</h2>
<p>How a bridge scopes work determines whether five teammates can share one harness safely. The plugins converge on a few patterns:</p>
<ul>
<li><strong>Group → Project; topic/thread → Session.</strong> <code>imetn/dsh-lark-bridge</code> maps each group to a project and each topic to an isolated session, so parallel conversations do not bleed into each other.</li>
<li><strong>One chat = one project folder.</strong> <code>bihangchi9-creator/dsh-lark-bridge</code> pins each chat id to a stable <code>&lt;workspaceRoot&gt;/&lt;chatId&gt;</code> directory. Groups literally cannot touch each other&rsquo;s files. Files and images land in isolated <code>.attachments/&lt;messageId&gt;/</code> per message, with sane limits (5 attachments, images ≤ 10 MB, other files ≤ 20 MB) and a 7-day sweep.</li>
<li><strong>Session reuse with thread independence.</strong> <code>ailoushu666/dsh-feishu-bridge</code> reuses the same DSH Session across messages in a chat to preserve context, while different threads stay independent.</li>
<li><strong>Per-session git worktrees.</strong> <code>PlutoKeating/dsh-lark-bot</code> isolates each session in its own git worktree, with <code>/session</code>, <code>/archive</code>, and <code>/retention</code> commands to prune old workspaces.</li>
<li><strong>Persistent per-chat sessions.</strong> Sessions in <code>bihangchi9-creator/dsh-lark-bridge</code> survive restarts; a <code>/new</code> command clears the current one. This is the difference between a stateless bot that forgets everything and a durable workspace that resumes mid-task.</li>
</ul>
<p>If you are running parallel, long-lived agent jobs in shared groups, favor the folder-worktree isolation models over a single shared-session bridge.</p>
<h2 id="approving-tool-calls-and-answering-agent-questions-from-cards">Approving Tool Calls and Answering Agent Questions from Cards</h2>
<p>A coding agent without a human-in-the-loop approval gate is a liability. The bridge plugins build that gate into the Feishu/Lark card itself:</p>
<ul>
<li><strong>Card buttons approve or reject tool calls.</strong> <code>imetn/dsh-lark-bridge</code> renders card buttons that let you approve a pending tool invocation (or decline it) without touching a keyboard.</li>
<li><strong>Structured Agent questions resolve in-chat.</strong> When the harness calls <code>ask_user_question</code>, <code>ailoushu666/dsh-feishu-bridge</code> surfaces an interactive option list — reply with the option number or text and the agent proceeds. <code>amlyczz/dsh-lark-link</code> uses intent-confirm cards for the same purpose, so an ambiguous decision is confirmed before any side effect.</li>
<li><strong>Execution is visible.</strong> Real-time tool-call hints (🔧) and intermediate replies stream through a throttle queue so you are not staring at an opaque &ldquo;thinking&hellip;&rdquo; card.</li>
<li><strong>Replies link back to the triggering message</strong> (DM and group <code>@bot</code> by default), keeping the thread readable.</li>
</ul>
<p>The practical rule: choose a plugin whose approval/rejection flow runs on the card. If your agents can write to files or run commands, you want that gate to be one tap in Feishu, not a return trip to a terminal.</p>
<h2 id="security-credentials-permission-tiers-and-allowlists">Security: Credentials, Permission Tiers, and Allowlists</h2>
<p>Feishu/Lark bridge plugins handle two classes of secret: the platform app credential and tool permissions for the agent. The ecosystem&rsquo;s approach varies, so read the security model before choosing.</p>
<ul>
<li><strong>Credential-resolved <code>tenant_access_token</code> with auto-refresh.</strong> <code>chenxin105/dsh-lark-bridge</code> resolves tokens through an auth provider, refreshing automatically, and keeps each tenant&rsquo;s token fresh. App ID/Secret are read from env (<code>FEISHU_APP_ID</code> / <code>FEISHU_APP_SECRET</code>) rather than hard-coded, and the bridge stores them through a credentials domain after a one-time web UI onboarding dialog.</li>
<li><strong><code>role('secret')</code> fields stay out of <code>describe()</code>.</strong> Sensitive config fields carry an explicit <code>secret</code> role so they never leak into a harness <code>describe()</code> response or diagnostics bundle.</li>
<li><strong>Allowlists and permission tiers.</strong> <code>amlyczz/dsh-lark-link</code> exposes an <code>open_id</code> allowlist, a <code>groupPolicy</code> (open / mention / keywords / reply), and a denyList fallback — so a bot only responds to the right people in the right contexts. Several plugins add explicit permission tiers (read / write / full) and owner-only admin commands (<code>/allow</code>, <code>/disallow</code>, <code>/model</code>, <code>/preset</code>).</li>
<li><strong>No public ingress = smaller attack surface.</strong> Because the bridge connects outbound over WebSocket, there is no public webhook URL for attackers to discover or abuse.</li>
</ul>
<p>Before connecting a real repository, set an allowlist, keep the bot&rsquo;s group permissions narrow, and confirm which of your agent&rsquo;s tools require approval.</p>
<h2 id="reliability-outbox-wal-replay-and-connection-self-healing">Reliability: Outbox, WAL Replay, and Connection Self-Healing</h2>
<p>Agent bridges fail in unglamorous ways: a dropped WebSocket, a crashed harness, a reply lost between the model and the card. The strongest plugins engineer around each failure mode.</p>
<ul>
<li><strong>Outbound Outbox (at-least-once, idempotent).</strong> <code>amlyczz/dsh-lark-link</code> appends outbound messages to a JSONL outbox before sending, then de-duplicates on re-delivery — so a crash between &ldquo;I answered&rdquo; and &ldquo;Feishu delivered&rdquo; does not lose the message, and a retry does not double-send it.</li>
<li><strong>Inbound WAL replay.</strong> The same plugin logs inbound events to a write-ahead log and replays on crash, so a task sent right before a restart is not silently dropped.</li>
<li><strong>Connection self-heal with a QuotaGovernor.</strong> Long connections inevitably drop; a QuotaGovernor re-establishes them and paces reconnects so you do not hammer Feishu&rsquo;s rate limits during an outage.</li>
<li><strong>Crash safety-net.</strong> <code>PlutoKeating/dsh-lark-bot</code> keeps replying in Feishu even if <code>dsh</code> itself crashes; <code>/safemode</code> boots a core-only self-healing config, and <code>/jobs</code> auto-retries queued tasks.</li>
<li><strong>Reaction receipts.</strong> Confirmed delivery is surfaced as reaction receipts (received, then DONE ✅), so you see at a glance whether the agent actually accepted the job.</li>
</ul>
<p>For anything production-shaped, prefer a plugin with explicit outbox/WAL guarantees over one that fires a message and hopes.</p>
<h2 id="common-pitfalls-and-quick-troubleshooting-doctor-build-before-install-brand-flags">Common Pitfalls and Quick Troubleshooting (/doctor, build-before-install, brand flags)</h2>
<p>Even the smoothest bridge has a few sharp edges. These are the four that trip up first-time users.</p>
<table>
  <thead>
      <tr>
          <th>Pitfall</th>
          <th>Symptom</th>
          <th>Fix</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Installing before building</td>
          <td>Harness fails to load the plugin</td>
          <td><strong>Build first</strong> — in <code>bihangchi9-creator/dsh-lark-bridge</code> the <code>lib/</code> directory is git-ignored, so <code>pnpm setup</code> (which builds, links, and registers) is mandatory, not optional</td>
      </tr>
      <tr>
          <td>Wrong brand / region</td>
          <td>App can&rsquo;t reach the Open Platform</td>
          <td>Set the right base URL: <code>open.feishu.cn</code> (China), <code>open.larksuite.com</code> (international), or pass <code>--brand larkoffice</code> for ByteDance tenants</td>
      </tr>
      <tr>
          <td>Stale or missing model key</td>
          <td>Agents error on first call</td>
          <td>Confirm <code>DEEPSEEK_API_KEY</code> is configured and hot-updatable in the harness (<code>/config</code> card on lark-bot)</td>
      </tr>
      <tr>
          <td>Mystery failure, no logs</td>
          <td>Slow debugging</td>
          <td>Run <code>/doctor</code> (<code>amlyczz/dsh-lark-link</code>) to export a diagnostic ZIP with session log + redacted config, or <code>/where</code> / <code>/models</code> to verify state</td>
      </tr>
  </tbody>
</table>
<p>Remember that DeepSeek Harness 0.1.0-rc.6 is a <strong>developer preview</strong> — API surfaces move. Pin your plugin and harness versions together.</p>
<h2 id="faq-feishu-vs-lark-costs-and-when-to-self-host-vs-use-a-plugin-registry">FAQ: Feishu vs Lark, Costs, and When to Self-Host vs Use a Plugin Registry</h2>
<p><strong>What is the difference between Feishu and Lark for this bridge?</strong>
Feishu is ByteDance&rsquo;s collaboration app for the China market; Lark is the international build. They share the same Open Platform API but different base URLs: <code>https://open.feishu.cn/open-apis</code> for Feishu and <code>https://open.larksuite.com/open-apis</code> for Lark. ByteDance <code>larkoffice.com</code> tenants use a separate <code>--brand larkoffice</code> flag. Choose your region&rsquo;s platform and match the plugin&rsquo;s brand/baseURL accordingly.</p>
<p><strong>Does the bridge need a public IP, domain, or webhook?</strong>
No. The modern plugins use Feishu&rsquo;s WebSocket long-connection API through <code>@larksuiteoapi/node-sdk</code>. Your harness connects outbound to the Open Platform and receives events over that persistent connection, so no public endpoint, domain, webhook, or NAT tunnel is required.</p>
<p><strong>Does it cost money to run a DSH Lark bridge?</strong>
There is usually a fee to enable Feishu/Lark bot or long-connection capabilities in some open-platform tiers, plus you pay for the model calls your DeepSeek Harness agents make via <code>DEEPSEEK_API_KEY</code>. The bridge software itself is open source; you self-host it on your own Node.js ≥ 22 / ≥ 24 machine.</p>
<p><strong>When should I self-host a branch from source vs install from a plugin registry?</strong>
Use a registry install (<code>dsh plugin add</code>, <code>npx</code>) for convenience and faster updates when the plugin validates on registries like dsharness.org, dshfind.com, dshbase.com, or dsh-plugin.org. Pull and build from source (e.g., with <code>pnpm setup</code>) when you need to patch behavior, need strict build-before-install guarantees, or the plugin has not been packaged.</p>
<p><strong>Which bridge should I pick for first contact?</strong>
For a first install, choose a QR-scan plugin that auto-creates the Feishu app (<code>amlyczz/dsh-lark-link</code> for its reliability and <code>/doctor</code>, or <code>PlutoKeating/dsh-lark-bot</code> for multi-task and crash safety). Both eliminate the Open Platform console work, connect over WebSocket with no public network, and get you to a working &ldquo;chat with an agent&rdquo; in under a few minutes.</p>
]]></content:encoded></item></channel></rss>