<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Nautilus]]></title><description><![CDATA[My personal inference on AI, productivity and gadgets.]]></description><link>https://www.nemofq.com</link><image><url>https://substackcdn.com/image/fetch/$s_!IhQs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86a608c0-d43c-463c-9b49-e8be600e39fa_500x500.jpeg</url><title>Nautilus</title><link>https://www.nemofq.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 07 May 2026 09:36:36 GMT</lastBuildDate><atom:link href="https://www.nemofq.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Nemo Feng]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[nemofq@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[nemofq@substack.com]]></itunes:email><itunes:name><![CDATA[Nemo Feng]]></itunes:name></itunes:owner><itunes:author><![CDATA[Nemo Feng]]></itunes:author><googleplay:owner><![CDATA[nemofq@substack.com]]></googleplay:owner><googleplay:email><![CDATA[nemofq@substack.com]]></googleplay:email><googleplay:author><![CDATA[Nemo Feng]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Configuration for Better Harness Engineering in OpenClaw: Run External Coding Agents (Codex, Claude Code, etc.) via ACP (Agent Client Protocol)]]></title><description><![CDATA[This guide walks through binding Codex and Claude Code to dedicated Telegram forum topics via OpenClaw's ACP (Agent Client Protocol) runtime.]]></description><link>https://www.nemofq.com/p/configuration-for-better-harness</link><guid isPermaLink="false">https://www.nemofq.com/p/configuration-for-better-harness</guid><dc:creator><![CDATA[Nemo Feng]]></dc:creator><pubDate>Sat, 11 Apr 2026 00:12:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9SZE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="callout-block" data-callout="true"><p>Update: As with everything in AI, things move fast. If you want to control Claude Code remotely, there are now several options beyond the OpenClaw-via-ACP approach discussed below - including this native one I'd recommend: <a href="https://code.claude.com/docs/en/channels">https://code.claude.com/docs/en/channels</a> <em>(currently supports Telegram, Discord, and iMessage)</em></p></div><h2><strong>Why ACP?</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://github.com/openclaw/acpx" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9SZE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png 424w, https://substackcdn.com/image/fetch/$s_!9SZE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png 848w, https://substackcdn.com/image/fetch/$s_!9SZE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png 1272w, https://substackcdn.com/image/fetch/$s_!9SZE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9SZE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png" width="1200" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91756,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://github.com/openclaw/acpx&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.nemofq.com/i/193846486?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9SZE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png 424w, https://substackcdn.com/image/fetch/$s_!9SZE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png 848w, https://substackcdn.com/image/fetch/$s_!9SZE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png 1272w, https://substackcdn.com/image/fetch/$s_!9SZE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde7d4e38-79b6-4044-be16-3d8ebc1d9f7e_1200x600.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Compared to the conventional <a href="https://docs.openclaw.ai/tools/subagents">sub-agent</a> approach, ACP sessions offer three key advantages:</p><ul><li><p><strong>Resilient session lifecycle.</strong> ACP sessions survive OpenClaw gateway restarts - your Codex or Claude Code task picks up where it left off rather than being lost on a crash or redeploy.</p></li><li><p><strong>Dedicated workspaces.</strong> You can assign each coding agent its own working directory, and their conversations are isolated from your main chat - no context bleed between agents or with your primary OpenClaw session.</p></li><li><p><strong>Protocol-level benefits.</strong> As ACP evolves, improvements to streaming, tooling, and multi-agent coordination flow in as the protocol matures.</p></li></ul><div><hr></div><h2><strong>Prerequisites</strong></h2><ul><li><p>OpenClaw &gt;= 2026.3.8 installed</p></li><li><p>A working Telegram bot configured in OpenClaw (Telegram and Discord are the only two supported channels for this setup; this guide uses Telegram as the example)</p></li><li><p>Codex CLI and Claude Code CLI installed and authenticated</p></li></ul><div><hr></div><h2><strong>Step 1: Configure Telegram Bot Privacy</strong></h2><p>Before adding the bot to any group, disable its privacy mode.</p><p>BotFather &#8594; <code>/mybots</code> &#8594; select your bot &#8594; Bot Settings &#8594; Group Privacy &#8594; <strong>Turn off</strong></p><blockquote><p><strong>Important:</strong> Do this before adding the bot to the group. If done after, the bot may miss group messages until it is removed and re-added.</p></blockquote><div><hr></div><h2><strong>Step 2: Create a Telegram Group and Forum Topics</strong></h2><ol><li><p>Create a new Telegram group</p></li><li><p>Add your bot to the group and set it as Admin</p></li><li><p>Group Settings &#8594; Topics &#8594; Enable forum mode</p></li><li><p>Create two topics: <code>#Codex</code> and <code>#Claude</code></p></li></ol><div><hr></div><h2><strong>Step 3: Get Group ID and Topic IDs</strong></h2><p>Send a message in each topic, then query the Bot API:</p><pre><code>curl -s &#8220;https://api.telegram.org/bot&lt;TOKEN&gt;/getUpdates&#8221;</code></pre><p>Replace <code>&lt;TOKEN&gt;</code> with your bot token. Locate <code>chat.id</code> (Group ID) and <code>message_thread_id</code> (Topic ID) in the response, e.g.:</p><ul><li><p><code>chat.id</code>: <code>-1009876543210</code></p></li><li><p><code>message_thread_id</code>: <code>2</code>, <code>3</code></p></li></ul><div><hr></div><h2><strong>Step 4: Install and Configure the acpx Plugin</strong></h2><pre><code># Install the plugin
openclaw plugins install acpx

# Enable it
openclaw config set plugins.entries.acpx.enabled true

# Declare trust (suppresses startup warnings)
openclaw config set plugins.allow &#8216;[&#8221;acpx&#8221;]&#8217;

# ACP sessions have no TTY - auto-approve all file and command operations
openclaw config set plugins.entries.acpx.config.permissionMode approve-all

# Fail on unhandleable permission requests rather than silently skipping
openclaw config set plugins.entries.acpx.config.nonInteractivePermissions fail

# Give the queue owner enough time to acquire the session before it&#8217;s declared dead (Codex/Claude Code have slow startup)
openclaw config set plugins.entries.acpx.config.queueOwnerTtlSeconds 60</code></pre><p>Resulting config:</p><pre><code>&#8220;plugins&#8221;: {
  &#8220;allow&#8221;: [&#8221;acpx&#8221;],
  &#8220;entries&#8221;: {
    &#8220;acpx&#8221;: {
      &#8220;enabled&#8221;: true,
      &#8220;config&#8221;: {
        &#8220;permissionMode&#8221;: &#8220;approve-all&#8221;,
        &#8220;nonInteractivePermissions&#8221;: &#8220;fail&#8221;,
        &#8220;queueOwnerTtlSeconds&#8221;: 60
      }
    }
  }
}</code></pre><div><hr></div><h2><strong>Step 5: Global ACP Configuration</strong></h2><pre><code>openclaw config set acp.enabled true
openclaw config set acp.dispatch.enabled true
openclaw config set acp.backend acpx
openclaw config set acp.allowedAgents &#8216;[&#8221;codex&#8221;, &#8220;claude&#8221;]&#8217;
openclaw config set acp.maxConcurrentSessions 8
openclaw config set acp.stream.coalesceIdleMs 300
openclaw config set acp.stream.maxChunkChars 1200
openclaw config set acp.runtime.ttlMinutes 120</code></pre><p>Resulting config:</p><pre><code>&#8220;acp&#8221;: {
  &#8220;enabled&#8221;: true,
  &#8220;dispatch&#8221;: { &#8220;enabled&#8221;: true },
  &#8220;backend&#8221;: &#8220;acpx&#8221;,
  &#8220;allowedAgents&#8221;: [&#8221;codex&#8221;, &#8220;claude&#8221;],
  &#8220;maxConcurrentSessions&#8221;: 8,
  &#8220;stream&#8221;: {
    &#8220;coalesceIdleMs&#8221;: 300,    // Stream output coalescing interval (ms)
    &#8220;maxChunkChars&#8221;: 1200     // Max characters per push
  },
  &#8220;runtime&#8221;: {
    &#8220;ttlMinutes&#8221;: 120         // Session idle timeout (minutes)
  }
}</code></pre><div><hr></div><h2><strong>Step 6: Enable Thread Binding</strong></h2><pre><code>openclaw config set session.threadBindings.enabled true
openclaw config set session.threadBindings.idleHours 24
openclaw config set channels.telegram.threadBindings.enabled true
openclaw config set channels.telegram.threadBindings.spawnAcpSessions true</code></pre><p>Resulting config:</p><pre><code>&#8220;session&#8221;: {
  &#8220;threadBindings&#8221;: {
    &#8220;enabled&#8221;: true,
    &#8220;idleHours&#8221;: 24
  }
},
&#8220;channels&#8221;: {
  &#8220;telegram&#8221;: {
    &#8220;threadBindings&#8221;: {
      &#8220;enabled&#8221;: true,
      &#8220;spawnAcpSessions&#8221;: true  // Allow dynamic ACP session spawning in any topic or DM thread
    }
  }
}</code></pre><blockquote><p>With <code>spawnAcpSessions: true</code>, you can use <code>/acp spawn --thread auto</code> to create an ACP session in any topic or DM thread, supplementing static bindings.</p></blockquote><div><hr></div><h2><strong>Step 7: Configure Group and Topics</strong></h2><p>Run <code>openclaw config edit</code> and add the following under <code>channels.telegram</code>:</p><pre><code>&#8220;groups&#8221;: {
  &#8220;&lt;GROUP_ID&gt;&#8221;: {
    &#8220;requireMention&#8221;: false,
    &#8220;topics&#8221;: {
      &#8220;&lt;CODEX_TOPIC_ID&gt;&#8221;: { &#8220;requireMention&#8221;: false },
      &#8220;&lt;CLAUDE_TOPIC_ID&gt;&#8221;: { &#8220;requireMention&#8221;: false }
    }
  }
},
&#8220;accounts&#8221;: {
  &#8220;default&#8221;: {
    &#8220;groupPolicy&#8221;: &#8220;allowlist&#8221;,
    &#8220;groupAllowFrom&#8221;: [&#8221;&lt;YOUR_TELEGRAM_USER_ID&gt;&#8221;]
  }
}</code></pre><p><code>groupPolicy</code> and <code>groupAllowFrom</code> go under <code>accounts.default</code>; without both, group messages are silently dropped.</p><p>Replace <code>&lt;GROUP_ID&gt;</code>, <code>&lt;CODEX_TOPIC_ID&gt;</code>, and <code>&lt;CLAUDE_TOPIC_ID&gt;</code> with the values from Step 3.</p><div><hr></div><h2><strong>Step 8: Define Agents</strong></h2><p>Run <code>openclaw config edit</code> and append a <code>list</code> under <code>agents</code> (leave existing <code>defaults</code> intact):</p><pre><code>&#8220;agents&#8221;: {
  &#8220;defaults&#8221;: {
    // ... keep existing config ...
  },
  &#8220;list&#8221;: [
    {
      &#8220;id&#8221;: &#8220;codex&#8221;,
      &#8220;runtime&#8221;: {
        &#8220;type&#8221;: &#8220;acp&#8221;,
        &#8220;acp&#8221;: {
          &#8220;agent&#8221;: &#8220;codex&#8221;,
          &#8220;backend&#8221;: &#8220;acpx&#8221;,
          &#8220;mode&#8221;: &#8220;persistent&#8221;,
          &#8220;cwd&#8221;: &#8220;/your/workspace/path&#8221;
        }
      }
    },
    {
      &#8220;id&#8221;: &#8220;claude&#8221;,
      &#8220;runtime&#8221;: {
        &#8220;type&#8221;: &#8220;acp&#8221;,
        &#8220;acp&#8221;: {
          &#8220;agent&#8221;: &#8220;claude&#8221;,
          &#8220;backend&#8221;: &#8220;acpx&#8221;,
          &#8220;mode&#8221;: &#8220;persistent&#8221;,
          &#8220;cwd&#8221;: &#8220;/your/workspace/path&#8221;
        }
      }
    }
  ]
}</code></pre><div><hr></div><h2><strong>Step 9: Configure Bindings</strong></h2><p>Run <code>openclaw config edit</code> and add a top-level <code>bindings</code> array. Use <code>type: "acp"</code> for automatic session lifecycle management. The <code>peer.id</code> must use the canonical format <code>&lt;GROUP_ID&gt;:topic:&lt;TOPIC_ID&gt;</code>:</p><pre><code>&#8220;bindings&#8221;: [
  {
    &#8220;type&#8221;: &#8220;acp&#8221;,
    &#8220;agentId&#8221;: &#8220;codex&#8221;,
    &#8220;match&#8221;: {
      &#8220;channel&#8221;: &#8220;telegram&#8221;,
      &#8220;accountId&#8221;: &#8220;default&#8221;,
      &#8220;peer&#8221;: {
        &#8220;kind&#8221;: &#8220;group&#8221;,
        &#8220;id&#8221;: &#8220;&lt;GROUP_ID&gt;:topic:&lt;CODEX_TOPIC_ID&gt;&#8221;
      }
    },
    &#8220;acp&#8221;: { &#8220;label&#8221;: &#8220;codex&#8221; }
  },
  {
    &#8220;type&#8221;: &#8220;acp&#8221;,
    &#8220;agentId&#8221;: &#8220;claude&#8221;,
    &#8220;match&#8221;: {
      &#8220;channel&#8221;: &#8220;telegram&#8221;,
      &#8220;accountId&#8221;: &#8220;default&#8221;,
      &#8220;peer&#8221;: {
        &#8220;kind&#8221;: &#8220;group&#8221;,
        &#8220;id&#8221;: &#8220;&lt;GROUP_ID&gt;:topic:&lt;CLAUDE_TOPIC_ID&gt;&#8221;
      }
    },
    &#8220;acp&#8221;: { &#8220;label&#8221;: &#8220;claude&#8221; }
  }
]</code></pre><blockquote><p><code>type: "route"</code> only handles routing - session lifecycle is not managed and you must manually run <code>/acp spawn</code>. <code>type: "acp"</code> ensures the session exists automatically and is recommended for persistent bindings.</p><p><strong>Note:</strong> Telegram group IDs start with <code>-100</code> (e.g. <code>-1009876543210</code>). Make sure to include the full ID with the minus sign.</p></blockquote><div><hr></div><h2><strong>Step 10: Restart Gateway and Verify</strong></h2><pre><code>openclaw gateway</code></pre><p>In each topic, send:</p><pre><code><code>/acp doctor</code></code></pre><p>Expected response: <code>healthy: yes</code> with backend details. Run <code>/acp status</code> to confirm session state, then send <code>Who are you?</code> in each topic to verify the correct agent responds.</p><div><hr></div><h2><strong>Architecture Overview</strong></h2><pre><code><code>Telegram DM &#8594; default account &#8594; main agent (existing behavior unchanged)

Telegram Group
  &#9500;&#9472; Codex topic &#8594; default account &#8594; ACP binding &#8594; codex agent &#8594; acpx &#8594; Codex CLI
  &#9492;&#9472; Claude topic &#8594; default account &#8594; ACP binding &#8594; claude agent &#8594; acpx &#8594; Claude Code CLI</code></code></pre><p>A single bot handles DMs and group topics through independent session paths with no interference.</p><div><hr></div><p>Enjoy harness engineering!</p><h2><strong>References</strong></h2><ul><li><p><a href="https://docs.openclaw.ai/tools/acp-agents">OpenClaw Docs - ACP Agents</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[My 2025 Hardware Pick: Framework]]></title><description><![CDATA[You should be able to fix your stuff.]]></description><link>https://www.nemofq.com/p/my-2025-hardware-pick-framework</link><guid isPermaLink="false">https://www.nemofq.com/p/my-2025-hardware-pick-framework</guid><dc:creator><![CDATA[Nemo Feng]]></dc:creator><pubDate>Thu, 01 Jan 2026 22:24:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Qx6Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As someone who enjoys tinkering with all kinds of hardware, here are my favorite picks of the year - 2025 edition. Also gotta keep this blog from being all AI :)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZZAs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZZAs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZZAs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZZAs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZZAs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZZAs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11799139,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.nemofq.com/i/183177948?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZZAs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZZAs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZZAs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZZAs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f12c160-4cea-4ad1-97d4-857b7e9d946e_6240x4160.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>My pick for this year is <a href="https://frame.work/">Framework</a> - I'm using the Laptop 13, and they also make the Laptop 12, 16, and Desktop variants.</p><p>There are a lot of discussions in the community about &#8220;why you should choose Framework,&#8221; but I find most of them miss the point. With how mature the PC industry is now, you won&#8217;t actually save money or time by being able to fix or upgrade your laptop. For me, buying a Framework comes down to two simple things: </p><ol><li><p>It&#8217;s a damn cool laptop</p></li><li><p>It&#8217;s the best Linux hardware with an active user base</p></li></ol><p>Since many Framework owners are tinkerers who run Linux, you get this rare community where almost any Linux issue you hit can be solved by or discussed with fellow users - whether you&#8217;re on <a href="https://frame.work/linux">officially supported distros</a> like Fedora, Ubuntu, and Bazzite, or others like Arch, Mint, or even more niche ones.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qx6Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qx6Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Qx6Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Qx6Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Qx6Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qx6Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:14944035,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.nemofq.com/i/183177948?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Qx6Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Qx6Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Qx6Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Qx6Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa59aea50-574a-4d1d-8139-03e6b8d4a216_6240x4160.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Pros</h3><ul><li><p>2.8K 3:2 ratio 120Hz matte display - what more could you ask for productivity?</p></li><li><p>One of the best keyboards I&#8217;ve ever used on a laptop</p></li><li><p>Customizable bezel and Expansion Cards (ports) make your laptop unique - I&#8217;m running Translucent Black with a full-size SD card slot</p></li><li><p>Best Linux support you can get</p></li></ul><h3>Cons</h3><ul><li><p>No haptic touchpad</p></li><li><p>Build quality can be hit or miss - I had to RMA and replace the input cover (keyboard), bezel, and display right after it arrived</p></li></ul><h3>A few more things to recommend</h3><ol><li><p><strong><a href="https://dev.bazzite.gg/">Bazzite DX</a></strong> - a developer-focused variant of Bazzite, based on Universal Blue (which is built on immutable Fedora Atomic). It&#8217;s been my daily driver since I got this laptop, and it&#8217;s been perfect for dev work, productivity, and everyday use.</p></li><li><p><strong><a href="https://www.benq.com/en-us/monitor/programming/rd280ua.html">BenQ RD280UA monitor</a></strong> - a 28.2&#8221; 4K display with a 3:2 ratio. Simply the best monitor for programming. <em>(Updated 02/11/2026: BenQ just released an upgraded model <a href="https://www.benq.com/en-us/monitor/programming/rd280ug.html">RD280UG</a> with 120Hz refresh rate, 2000:1 contrast ratio, and thinner bezels, check it out!)</em></p></li><li><p><strong><a href="https://www.apple.com/shop/product/hs9d2zm/a/caldigit-thunderbolt-5-usb%E2%80%91c-pro-cable-05m">CalDigit Thunderbolt (USB-C) Pro Cable (0.5m)</a></strong> - if you want the cleanest connection between your monitor and laptop, this Apple Store-exclusive cable is it. <em>(Updated 02/12/2026: Apple just replaced it with an upgraded TB5 version at the same price.)</em></p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nemofq.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Nautilus! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[An Open-Source, Third-Party Chrome Extension for Pushbullet]]></title><description><![CDATA[Built by me and Claude Code.]]></description><link>https://www.nemofq.com/p/an-open-source-third-party-chrome</link><guid isPermaLink="false">https://www.nemofq.com/p/an-open-source-third-party-chrome</guid><dc:creator><![CDATA[Nemo Feng]]></dc:creator><pubDate>Sat, 26 Jul 2025 20:50:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TuAZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Crossed 10,000 WAU on February 2, 2026</p></blockquote><blockquote><p>End of 2025 update: </p><ul><li><p>7,000+ WAU</p></li><li><p>4.9&#9733; based on 56 ratings</p></li><li><p>32 releases, 190 commits</p></li><li><p>65 GitHub stars</p></li></ul></blockquote><p><strong>Chrome Web Store: </strong><a href="https://chromewebstore.google.com/detail/push-go/dghndapbehjdbhiffbckojkhoennbofg">https://chromewebstore.google.com/detail/push-go/dghndapbehjdbhiffbckojkhoennbofg</a></p><p><strong>GitHub Repo: </strong><a href="https://github.com/nemofq/pushbullet-go">https://github.com/nemofq/pushbullet-go</a></p><p>As a long-time Pushbullet (a great service that allows you to send texts and share files across devices) and ChromeOS user, when the official Chrome extension was removed due to compatibility issues, I had to build one myself, and with the help of AI of course.</p><h2>Claude Code</h2><p>I enjoyed using the combination of <a href="https://www.sublimetext.com/">Sublime</a>, <a href="https://packagecontrol.io/packages/Terminus">Terminus</a> (a terminal plugin in Sublime), and <a href="https://www.anthropic.com/claude-code">Claude Code</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TuAZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TuAZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png 424w, https://substackcdn.com/image/fetch/$s_!TuAZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png 848w, https://substackcdn.com/image/fetch/$s_!TuAZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png 1272w, https://substackcdn.com/image/fetch/$s_!TuAZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TuAZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1006627,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.nemofq.com/i/169326212?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TuAZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png 424w, https://substackcdn.com/image/fetch/$s_!TuAZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png 848w, https://substackcdn.com/image/fetch/$s_!TuAZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png 1272w, https://substackcdn.com/image/fetch/$s_!TuAZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b9f0e7b-1bec-4090-bd93-5d3c77b57fc2_3840x2560.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Compared to Cursor or VS Code w/ Augment plugin, this approach is definitely more "Agentic" - simply because you're assigning more screen space to your agent - yes I do think this tells a lot. In Cursor's default view, even with "Agent" mode, I still feel different. So for simpler projects, I now use these settings more - Claude Code gets most things (code) done while I monitor the changes only and do some critical actions in terminal now and then. </p><p>BTW - a 3:2 ratio monitor like <a href="https://www.benq.com/en-us/monitor/programming/rd280ua.html">the one</a> I'm using helps a lot for this use case, since both windows will have enough height to display code and history with your agent.</p><h2>The Pushbullet Extension</h2><p>This is a lightweight Chrome extension for Pushbullet that enables receiving and sending pushes from browser, including files and images. You can also send the current page's URL or selected text/images directly from the context menu. Furthermore, you can filter the received pushes and control which device to push to in options.</p><p>This extension stores everything locally, and only communicates with the official Pushbullet API.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-DjF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-DjF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!-DjF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!-DjF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!-DjF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-DjF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:153187,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.nemofq.com/i/169326212?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-DjF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!-DjF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!-DjF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!-DjF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa212afe0-d3b0-4e6f-b8c4-f979a4709e0d_1280x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>One More Thing</h2><p>If you&#8217;re still using Pushbullet on iOS like me, you may find following Shortcuts useful: </p><ul><li><p><a href="https://www.icloud.com/shortcuts/5549bbb5b06e4f0a8ccb1b6fd33e853f">Push to Pushbullet</a></p></li><li><p><a href="https://www.icloud.com/shortcuts/1f94913de21b41debe60ef43631afde2">Pushbullet Receiver</a></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nemofq.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Nemo&#8217;s Voice! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Recap of Vibe Coding in May 2025 | How I Built a Full Product with 10k Lines of Code in One Month]]></title><description><![CDATA[What I learned from building the AI podcast tool - deepdialogue.pro with AI.]]></description><link>https://www.nemofq.com/p/recap-of-vibe-coding-in-may-2025</link><guid isPermaLink="false">https://www.nemofq.com/p/recap-of-vibe-coding-in-may-2025</guid><dc:creator><![CDATA[Nemo Feng]]></dc:creator><pubDate>Fri, 30 May 2025 19:18:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!c-Wl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="callout-block" data-callout="true"><p><em>Update: Ignore and forget everything I wrote, just use the latest version of <a href="https://claude.com/product/claude-code">Claude Code</a>.</em></p></div><h2>Context</h2><p>About a month ago, I saw a <a href="https://www.linkedin.com/posts/brendanhumphreys_no-you-wont-be-vibe-coding-your-way-to-activity-7305080254417547264-qidy/">post</a> from Canva's CTO Brendan Humphreys:</p><div class="pullquote"><p><strong>No, you won't be vibe coding your way to production.</strong></p><p><strong>Not if you prioritise quality, safety, security, and long-term maintainability at scale.</strong></p></div><p>This resonated with my observations of vibe coding at that time, but I wanted to know for sure, and if indeed vibe coding wasn't there yet, what was missing and what strategies we could use to fill the gap.</p><p>And there's no better way to find out than by actually building a production-level product with AI.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nemofq.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Nemo&#8217;s Voice! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Result</h2><p>Screenshot of the product I built in one month:<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c-Wl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c-Wl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp 424w, https://substackcdn.com/image/fetch/$s_!c-Wl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp 848w, https://substackcdn.com/image/fetch/$s_!c-Wl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp 1272w, https://substackcdn.com/image/fetch/$s_!c-Wl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c-Wl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp" width="1456" height="925" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/960548bc-72bc-4036-b374-00359942e073_1920x1220.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:925,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:260256,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemofq.substack.com/i/164765925?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c-Wl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp 424w, https://substackcdn.com/image/fetch/$s_!c-Wl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp 848w, https://substackcdn.com/image/fetch/$s_!c-Wl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp 1272w, https://substackcdn.com/image/fetch/$s_!c-Wl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960548bc-72bc-4036-b374-00359942e073_1920x1220.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The idea came from my own pain points when listening to long, conversational podcasts (e.g., <a href="https://podcasts.apple.com/us/podcast/all-in-with-chamath-jason-sacks-friedberg/id1502871393">All-In</a>, <a href="https://podcasts.apple.com/us/podcast/lex-fridman-podcast/id1434243584">Lex Fridman</a>). I wanted something to help me follow conversations effortlessly and allow me to easily navigate through time and different speakers to uncover hidden insights.</p><p>So I built this AI podcast tool called <a href="https://www.deepdialogue.pro/">DeepDialogue</a> that converts audio into clearly speaker-diarized transcripts with handy features like speaker filtering, active highlighting, auto-scroll, and quick navigation. Most importantly, it includes an AI chatbot that has complete understanding of the podcast content to answer any questions&#8212;whether you need summaries or want to extract specific speaker viewpoints. </p><p><strong>Try it</strong>: <a href="https://www.deepdialogue.pro/">https://www.deepdialogue.pro/</a></p><p>This is a substantial project spanning nearly 10,000 lines of code, built with a tech stack including Next.js framework, React for the frontend, and a hybrid Node.js and Python backend.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cm0m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cm0m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png 424w, https://substackcdn.com/image/fetch/$s_!cm0m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png 848w, https://substackcdn.com/image/fetch/$s_!cm0m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png 1272w, https://substackcdn.com/image/fetch/$s_!cm0m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cm0m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png" width="728" height="203.33167082294264" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:224,&quot;width&quot;:802,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:22344,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemofq.substack.com/i/164765925?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da2498a-d298-4488-bf16-50fc1e547592_802x275.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cm0m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png 424w, https://substackcdn.com/image/fetch/$s_!cm0m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png 848w, https://substackcdn.com/image/fetch/$s_!cm0m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png 1272w, https://substackcdn.com/image/fetch/$s_!cm0m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f2ba3fb-415f-4a74-86a3-c3bc6cd4b739_802x224.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>Tactics</h2><p>Here are 6 useful tactics I found in this journey for vibe coders.</p><h3>1. Define your end goal</h3><p>There are actually two types of vibe coding, and people often mix them:</p><ul><li><p>For people who can program: To help them <strong>ship</strong> faster. Typical products include Cursor, Windsurf, and Augment Code.</p></li><li><p>For citizen developers: To help them <strong>create</strong> without learning coding, like Bolt.new and Lovable.</p></li></ul><p>There's some overlap/ambiguity in between. </p><p>For example, if someone wants to build a tool to track the latest stock market movements and news for certain tickers, both Cursor and Lovable could help them get it done. But it's important to define your end goal and identify who you are before choosing the appropriate path, to avoid wasting time and resources on the wrong one. </p><p>If you haven't written code in the past and want to create something for yourself and friends without complex login/payment/database/API interactions, the tools I mentioned for citizen developers would be really amazing. Even universal agent products like Manus and Genspark fit this category in my view, since they essentially turn each task into a "program" as output.</p><p>Personally, I don't have much experience with tools for citizen developers, but I do feel that the current bottleneck is not the LLM (at least not the biggest one anymore), but rather the following two issues:</p><ol><li><p>How to integrate with third-party systems (e.g., databases/storage/auth/payment/APIs)? Traditional providers are overkill here. If someone could define a payment capability that every website can have with a prompt or two, it could be the new Stripe. MCP could be one answer here.</p></li><li><p>How to distribute people's creations? We need a new App Store and Google Play for this. Happy to see new products like <a href="https://www.youware.com/">YouWare</a> appear in this domain.</p></li></ol><p>For coding agents designed for programmers, context window (or effective context window) limitations are the culprit behind many issues.</p><h3>2. Choose the best model</h3><p>Choose the best model, not the tool. Whether it's VS Code derivatives like Cursor or Windsurf, or plugins like Augment Code and Cline, I don't think they make huge differences beyond user preferences and interaction details. For example, in this project, because of the huge amount of token consumption needed, I simply used the customer-facing Claude and Gemini chatbots with Sublime editor. But don't get me wrong here&#8212;they still matter a lot for competition, adoption rates, and accumulating data for better models and products.</p><p>Which LLM is the best for coding might be the easiest question among the community: Gemini 2.5 Pro = Claude (3.5/3.7/4) &gt; All Others.</p><p>From my interactions with these top two models, I do have some comparisons to share:</p><p><strong>Gemini 2.5 Pro:</strong></p><ul><li><p>Pros:</p><ul><li><p>Larger context window, allowing you to follow up on your tasks multiple (typically 10+) times without degraded intelligence</p></li><li><p>Great at logic problems, like debugging business logic issues</p></li></ul></li><li><p>Cons:</p><ul><li><p>Possibilities of losing control over language preference&#8212;you'll see all sorts of languages (e.g. Spanish, German) appear (good news is this doesn't affect the code part)</p></li><li><p>Possibilities of getting stuck at "Show thinking"&#8212;re-sending the message could fix this</p></li><li><p>Not so good at UI, often uses more complex methods to achieve the same design</p></li><li><p>Writes too many and overly long comments in my opinion (internal habit/requirements at Google?)</p></li></ul></li></ul><p><strong>Claude (3.5/3.7/4) :</strong></p><ul><li><p>Pros:</p><ul><li><p>Can write concise and beautiful UI code</p></li><li><p>Faster response (without thinking)</p></li></ul></li><li><p>Cons:</p><ul><li><p>Effective context window is quite small&#8212;you'll notice significantly degraded performance when conversations become long and you're forced to create a new chat</p></li><li><p>For complex logic problems, it will give you multiple options, but more often than not, none of them work, which causes more disappointment if you actually tried every option</p></li></ul></li></ul><p>If you don't know which model to choose? Simple&#8212;just copy and paste your prompt to both of them, get some coffee, and come back to compare which one you prefer :)</p><h3>3. Start from a template</h3><p>If only one piece of advice were allowed, this would be what I give to vibe coders starting a new project.</p><p>The root cause of this issue is still the context window limitation of LLMs. Because of context constraints, once your project is underway and has accumulated some amount of code, it becomes impossible for the LLM to read all the project files and code, identify the connections and data flow between components, and then implement new features or fix bugs. </p><p>The context window would simply be overloaded. </p><p>For instance, I once needed to fix a height inheritance issue in UI code (which is quite common in Tailwind CSS), but it required editing multiple files along the component tree. I gave up after trying to use the model several times and ended up manually fixing it myself.</p><p>To make matters worse, LLMs naturally tend to scatter code everywhere when implementing one feature. All of this could be avoided if you start from a template, which helps establish clear, independent positioning for each module&#8212;resulting in the LLM only needing to work within a single block or file of code.</p><p>It's like hiring a human architect, so I recommend everyone do this. It's worth spending some time to find the best template that suits your case before writing your first line of code, or prompt. Here are two templates I recommend: </p><ul><li><p><a href="https://github.com/nextjs/saas-starter">Next.js SaaS Starter</a> by Vercel</p></li><li><p><a href="https://github.com/ShenSeanChen/launch-mvp-stripe-nextjs-supabase">Next.js + Stripe + Supabase Production-Ready Template</a> from my friend Sean</p></li></ul><h3>4. Code backwards</h3><p><a href="https://www.aboutamazon.com/news/workplace/an-insider-look-at-amazons-culture-and-processes">"Working Backwards"</a> is a well-known product development approach invented by Amazon and later adopted broadly by other big tech companies like Airbnb and ByteDance. The key tenet of this process is to start by defining the customer experience, then iteratively work backwards from that point.</p><p>In vibe coding, we can "code backwards." Just throw every token you have at the problem&#8212;prompt, copy/paste code to see if it works or not, then come back and prompt again, until you have a working version. I call this process "Punch Through."</p><p>Based on the working version, now you can read it to understand how to optimize the code, adjust unnecessary parts, add details, and ultimately achieve code that meets your requirements and is maintainable going forward&#8212;rather than the overly complex, unclear logic that LLMs directly produce.</p><h3>5. Make every shot long and count</h3><p>Because of the nature of how LLM chat manages context&#8212;accumulating with every round of conversation, which means every time you send something you're sending the whole conversation history with your latest prompt&#8212;plus the current context window limitation, you can expect the first couple rounds of conversation to be the most intelligent, or even just the first one to be most effective.</p><p>So instead of sending short messages to waste the context window, just prepare your prompt to be as comprehensive as possible, and don't worry about it being too long. This might be counter-intuitive, but it's actually a more effective prompting approach.</p><p>When working on this project, I frequently wrote prompts of thousands of lines of text, including multiple code files and detailed requirements, desired data flow, etc., and it just works, especially for your first one or two rounds of conversation.</p><h3>6. Use AI-friendly service/SDK</h3><p>My definition of AI-friendly for services/SDKs has two aspects:</p><ol><li><p><strong>Comprehensive, detailed documentation:</strong> This means LLMs could have already learned a lot during pre-training, and you can easily find and send the latest updates if the LLM doesn't have it.</p></li><li><p><strong>Simplified permission management:</strong> This frees LLMs from having to navigate through the hierarchy of traditional permission/authentication management. In my experience, they're really not good at it&#8212;same as human developers.</p></li></ol><p>So here are some choices I would highly recommend you try:</p><ul><li><p><a href="https://vercel.com/">Vercel</a> for hosting</p></li><li><p><a href="https://supabase.com/">Supabase</a> for database and auth</p></li><li><p><a href="https://ai-sdk.dev/">AI SDK</a> by Vercel for integrating LLM-based features like chatbots into your product</p></li></ul><p>Unfortunately, I don't find any billing/payment solution to be super-easy for vibe coding projects, so let me know if you have recommendations here.</p><h2>Recap</h2><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/CtzoO/2/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42ed9fcc-41c2-447b-bec5-999937f9c7d8_1260x660.png&quot;,&quot;thumbnail_url_full&quot;:&quot;&quot;,&quot;height&quot;:400,&quot;title&quot;:&quot;Six Useful Tactics for Vibe Coding&quot;,&quot;description&quot;:&quot;&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/CtzoO/2/" width="730" height="400" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>Apparently, the "context window" is the most important factor in LLMs for vibe coding now. I can't wait to see a model achieve breakthrough here along with improved intelligence.</p><p>And lastly, try the product of my vibe coding journey here: </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.deepdialogue.pro/&quot;,&quot;text&quot;:&quot;Try DeepDialogue - AI Tool for Podcast&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.deepdialogue.pro/"><span>Try DeepDialogue - AI Tool for Podcast</span></a></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Weekends and evenings only - I estimate it was roughly equivalent to 1.5 weeks of full-time work.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[My First Paper]]></title><description><![CDATA[Use LLM to analyze Reddit posts and predict stock price.]]></description><link>https://www.nemofq.com/p/my-first-paper</link><guid isPermaLink="false">https://www.nemofq.com/p/my-first-paper</guid><dc:creator><![CDATA[Nemo Feng]]></dc:creator><pubDate>Thu, 01 May 2025 03:27:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8fcb7e4d-ae1f-4202-8686-20b3602d260c_640x381.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Link to the preprint version: <a href="http://dx.doi.org/10.13140/RG.2.2.18713.33127">http://dx.doi.org/10.13140/RG.2.2.18713.33127</a></p><blockquote><p><strong>Abstract</strong></p><p>We investigate the predictive power of LLM-based sentiment analysis in the 2021 GameStop short squeeze, analyzing 665,275 Reddit posts from r/wallstreetbets and r/GME using Claude 3 Haiku. Logistic regression models were trained on sentiment data to forecast the next trading day's price movement direction using a rolling window approach. The model achieved 60% accuracy, exceeding prior social media-based stock prediction studies. However, trading strategies based on the model underperformed the buy-and-hold benchmark in returns (113.3% vs. 291.5%), despite showing better risk control with lower maximum drawdown (61.0% vs. 84.7%), highlighting the need for further optimization. These findings demonstrate LLM-driven text analysis can effectively capture retail investor sentiment, offering potential applications in trading strategies.</p></blockquote><p>This idea was born shortly after the ChatGPT moment, and most of the research work was actually done quite early (which explains why I used Claude 3, a model that was SOTA then but is now way outdated... LLM development has been incredibly fast). It took quite a long time for me to finish this work due to various reasons, including the fact that this is my first paper, but finally here we are.</p><p>Despite the research focusing on the GameStop short squeeze in 2021&#8212;an extremely unique event that may never happen again (but who knows)&#8212;the journey and conclusions I gained from this study were fascinating and insightful. LLMs are definitely capable of analyzing user-generated content, which can then be used to build effective prediction models and trading strategies. I'm also very excited to see innovative projects like <a href="https://github.com/virattt/ai-hedge-fund">AI Hedge Funds</a> applying LLMs and agents in the financial world.</p><p>One more thing - this is also my first time using LaTeX, which I discovered is actually very similar to frontend languages, and unsurprisingly, LLMs and coding agents can help a lot with writing it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nemofq.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Nemo&#8217;s Voice! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[You Should Distill, Too]]></title><description><![CDATA[When using ChatGPT, Cursor, or other AI products, adopting the philosophy of distillation could help you achieve better results.]]></description><link>https://www.nemofq.com/p/you-should-distill-too</link><guid isPermaLink="false">https://www.nemofq.com/p/you-should-distill-too</guid><dc:creator><![CDATA[Nemo Feng]]></dc:creator><pubDate>Tue, 04 Feb 2025 06:29:39 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a61a080a-d832-4326-b718-15da774149ed_1050x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Intro</h2><p>With recent flooding discussions around DeepSeek, one concept appears in almost every article, news piece, and podcast: Distillation.</p><p>In the LLM training space, distillation is a technique to transfer knowledge from a large "teacher" model into a smaller "student" model, allowing the smaller model to perform better while reducing inference costs.</p><p>For us users, we can and should use the same strategy in our daily interactions with AI products.</p><h2>Why</h2><p>Currently, the models we have at hand can be roughly categorized into two types:</p><ul><li><p>Reasoning models: OpenAI o1/DeepSeek R1</p></li><li><p>General-purpose models: OpenAI GPT-4o/Claude 3.5 Sonnet/DeepSeek V3</p></li></ul><p>While reasoning models outperform general-purpose models in benchmarks, why can't we just use o1 or R1 all the time? There are several reasons:</p><ul><li><p>Cost: Whether accessed via ChatGPT or APIs, reasoning models come at a significantly higher price. For example, Plus plan users get only 50 o1 messages per week on ChatGPT. DeepSeek R1, an o1-equivalent reasoning model, offers ~93% lower inference costs, which definitely could be a game changer - but other factors still matter.</p></li><li><p>Speed: Reasoning models build on their unique and powerful "reason before answer" approach, or Chain-of-Thought, but this introduces significant latency that may be intolerable for certain tasks.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ck0c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ck0c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png 424w, https://substackcdn.com/image/fetch/$s_!Ck0c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png 848w, https://substackcdn.com/image/fetch/$s_!Ck0c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png 1272w, https://substackcdn.com/image/fetch/$s_!Ck0c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ck0c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png" width="1407" height="751" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:751,&quot;width&quot;:1407,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:130459,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ck0c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png 424w, https://substackcdn.com/image/fetch/$s_!Ck0c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png 848w, https://substackcdn.com/image/fetch/$s_!Ck0c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png 1272w, https://substackcdn.com/image/fetch/$s_!Ck0c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0f168e7-082b-4739-831f-a4e5e1bfc36b_1407x751.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Overthinking: Sometimes, reasoning models overthink and generate less-than-ideal responses. In such cases, the extra time spent on reasoning feels even more like a waste.</p></li><li><p>Offline-only: There are cases where you do need up-to-date knowledge.</p></li></ul><h2>How</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ar9v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ar9v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ar9v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ar9v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ar9v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ar9v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg" width="1456" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:993546,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ar9v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ar9v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ar9v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ar9v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56363972-714e-4b77-862a-7b74c13d5a15_4240x1491.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It's simple, just like distillation in model training - for certain (not all) tasks, start by asking a reasoning model to generate a detailed "action plan" for the general-purpose model to follow. This plan should always include:</p><ul><li><p>Your goals</p></li><li><p>High-level strategy</p></li><li><p>Critical context</p></li><li><p>Conversation guidelines (since you&#8217;ll likely have multiple rounds of interaction with the general-purpose model)</p></li><li><p>Feedback rules (when the model should ask for human input)</p></li></ul><p>This method is highly effective in many scenarios and has already become my best practice. Here are two use cases, and I know others are using this technique (or similar ones). If you have additional use cases, feel free to share them in the comments.</p><h3>Case 1 - Coding a New Project</h3><p>I recently wrote a Chrome extension using Cursor. Initially, I started directly with Cursor, and it quickly became chaotic. I encountered problems like message transmission between modules and Chrome&#8217;s module-specific operation restrictions. These issues were beyond Cursor&#8217;s capability to properly fix. After getting a detailed design from o1, I passed it to Cursor to start fresh, and everything went much more smoothly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yip9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yip9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png 424w, https://substackcdn.com/image/fetch/$s_!Yip9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png 848w, https://substackcdn.com/image/fetch/$s_!Yip9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png 1272w, https://substackcdn.com/image/fetch/$s_!Yip9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yip9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png" width="1456" height="774" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:774,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:252190,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Yip9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png 424w, https://substackcdn.com/image/fetch/$s_!Yip9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png 848w, https://substackcdn.com/image/fetch/$s_!Yip9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png 1272w, https://substackcdn.com/image/fetch/$s_!Yip9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbcf78a0-79ce-453a-981b-bfe9383be959_1868x993.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Learning from that experience, I now begin every new project by asking o1/R1 to generate a system design. This includes the code architecture, key contexts (e.g., API documents, known restrictions), and personal preferences (e.g., code style, log rules) based on my goals. Compared to giving instructions directly to Cursor, I find this approach produces much better-structured code with a clearer architecture. It also saves significant time by preventing messy dependencies and ensuring the right approach for implementing features.</p><h3>Case 2 - Reading a Paper</h3><p>With new papers in AI falling like snowflakes, reading has become a daily task. Each reading session is unique - a mix of personal background, the paper&#8217;s topic, and the specific angle you&#8217;re interested in.</p><p>For me, staying in flow state while reading is crucial. To achieve this, I first send my background, a summary of the paper, my key focus areas, and my preferred conversation style to a reasoning model to generate a task brief. I then pass this brief to a general-purpose model. During the actual reading, I simply send copied text from the paper or ask questions as needed, allowing for quick and seamless interactions.</p><p>Speed matters here. I initially tried using a reasoning model directly, but its long thinking process constantly disrupted my flow. For DeepSeek&#8217;s most recent paper, I used the R1/V3 combination with this approach, and it worked exceptionally well.</p><h2>Next</h2><p>Here's what I expect or hope will happen:</p><ul><li><p>AI applications adopting this approach: I&#8217;d love to see Cursor using reasoning models to plan before execution for complex tasks. Currently, Cursor (using Composer mode, which combines Cursor&#8217;s own model with Claude 3.5 Sonnet) is often overconfident and breaks things. This approach would also make it more agentic - like humans, reasoning before acting.</p></li><li><p>Model improvements: If reasoning models become faster, cheaper, and smarter, we might not need this approach at all. OpenAI&#8217;s newest o3-mini family, launched last Friday, is definitely a step in that direction - offering lower costs, improved speed, and multiple reasoning levels to choose from (mitigating overthinking).</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nemofq.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Nemo&#8217;s Voice! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>