← tanscp

标签:atomic

用 tmux + LaunchAgent + remote-opencode 搭一套常在线 AI 开发环境

· 发表评论

最近我一直在反复折腾自己的开发环境。原因很简单:AI 写代码这件事,已经不是“偶尔用一下”了,而是越来越像一种长期工作方式。问题也随之暴露出来——我们手上的设备越来越多,但 AI 的上下文却还是割裂的。

白天在公司电脑上开着终端,晚上回家换到自己的 Mac;出门在外,手边只有手机或 iPad。设备一切换,前面刚铺好的上下文、刚跑到一半的任务、刚调顺手的工作流,往往也跟着断掉。你会发现,真正拖慢效率的,很多时候不是模型不够强,也不是机器不够快,而是这套环境没有连续性。

所以我这段时间重点解决的,不是“再换一个更强的 AI 工具”,而是想办法把开发环境本身做成一个全天候在线、跨设备可调用的基座。我的目标很明确:不管我人在哪里,只要能发出一条指令,就能接上同一台 Mac、同一个终端会话、同一套知识库、同一份上下文。

这篇文章讲的,就是我目前跑得最顺手的一套方案:Ghostty + tmux + remote-opencode + LaunchAgent。它表面上是在解决远程开发问题,实际上解决的是另一件更重要的事:把你的记忆资产固定在一台始终在线的机器上,而不是分散在不同设备里。


1. 桌面端为什么还是主战场

先说一个很现实的判断:移动端很方便,但真正高强度的开发,主战场依然是桌面端。

原因不复杂。桌面端有更完整的终端能力、更稳定的网络环境、更强的本地性能,也更适合长时间盯着复杂上下文工作。尤其是在 AI 参与越来越深的情况下,终端已经不只是“输入命令的地方”了,它更像一个持续运行的协作现场:模型在里面读代码、改代码、跑命令、等待反馈,你在旁边观察、修正、继续推进。

既然桌面端是主战场,那这套环境首先就得满足两个要求:足够快,以及足够稳

1.1 Ghostty:把“卡顿感”从工作流里拿掉

如果你经常让 AI 一口气输出大段代码、日志或者 diff,就会很容易感受到终端性能的差异。很多终端在普通场景下没问题,但一旦输出量上来,滚动、刷新、分屏切换这些动作就开始拖后腿。它不一定会完全卡死,但就是会让你觉得“不跟手”。

我后来换到 Ghostty,最大的感受不是某个参数多强,而是它整体非常顺。它用 Zig 编写,走 GPU 渲染路线,在大段输出场景里依然能保持很好的反馈速度。这个体验放在 AI 工作流里特别重要,因为你几乎一直在和大量文本打交道:代码、日志、终端输出、补丁结果、测试回显,全部都在争夺你的注意力。

当终端本身足够流畅时,你的注意力就会放在“内容是什么”上,而不是“它怎么还没刷出来”。这件事听起来小,但每天高频发生时,差别非常明显。

1.2 tmux:让长任务真正“有地方住”

但只有快还不够。AI 工作流还有另一个典型问题:任务时长不稳定。

有时候它几秒钟就结束,有时候它会在那儿持续跑很久。可能是在改一批文件,可能是在读一堆上下文,可能是在执行一串串联命令。这个时候,如果终端窗口被你顺手关了,或者网络抖了一下,整个过程就断了。

所以我一直认为,AI 时代的终端环境必须配 tmux。它最大的价值不是“酷”,而是给进程一个稳定的落点。

我的日常用法很简单:

  • Ghostty 负责原生分屏和视觉体验;
  • 每个分屏里,再进入一个 tmux session;
  • 真正关键的任务,都放到 tmux 里跑。

这样一来,Ghostty 是前台界面,tmux 才是后台生命线。就算我把窗口关了、机器短暂断开显示、甚至重新连回来,只要 tmux session 还在,整个上下文就还在。对于 AI 长任务来说,这种“会话不跟窗口同生共死”的能力,几乎是基础设施级别的存在。


2. 真正该被保护的,其实是“记忆资产”

很多人会把这类方案理解成“远程控制自己的电脑”。这当然没错,但如果只看到这里,其实还没抓住重点。

这套流程真正要保护的,不是某一个终端窗口,也不是某一个模型会话,而是你长期积累下来的记忆资产

我所谓的记忆资产,包含几层东西:

  • AI 对你项目代码结构的理解;
  • AI 对你个人习惯、命名方式、表达偏好的适应;
  • 你本地知识库里的笔记、文档、历史记录;
  • 正在进行中的任务链路和上下文状态。

这些东西一旦固定在某一台机器上,并且不断累积,它就会越来越值钱。相反,如果你在公司一套环境、家里一套环境、手机上又临时切到另一个入口,结果就是上下文四分五裂。每次切换设备,AI 都得重新认识你一次。你看起来是在“随时可用”,实际上是在不断重建现场。

这也是我开始认真看待 remote-opencode 的原因。

它最有意思的地方,不只是把本地 OpenCode CLI 暴露到了远程,而是把“统一入口”这件事做得很顺。你不需要在每台设备上都重新维护一套开发环境,也不需要为了移动端临时换一个完全不同的工作方式。你只要把核心环境放在那台最稳定、性能最强、资料最完整的 Mac 上,然后通过 Discord 这样的入口去调用它就行。

换句话说,手机、iPad、甚至别的临时设备,在这个体系里都不再是“新的工作环境”,而只是“同一套环境的远程入口”。这个思路一旦建立起来,整个工作流会一下子清晰很多。


3. remote-opencode 的价值,不只是“远程”

第一次接触 remote-opencode,很多人都会先被它的形式吸引:原来可以直接在 Discord 里给本地 OpenCode 发指令。

这当然很直观。但我自己真正用下来之后,觉得它最有价值的地方,不是“能发指令”,而是它帮我把不同设备之间那条断裂带给补上了。

以前的情况是这样的:

  • 在桌面端,我有完整的本地仓库、终端、脚本、知识库;
  • 到了移动端,这些东西几乎全部消失,只剩一个聊天窗口;
  • 结果就是,移动端只能做很浅的事情,比如发个备忘、看两眼消息,很难真正接入工作流。

而现在,Discord 这个聊天窗口本身,就变成了一个轻量控制台。它背后接的不是一个全新的云端环境,而是我自己那套已经养熟了的本地环境。这里的区别非常大。

因为这意味着:

  • 我在手机上发出去的,不是一个“临时请求”,而是对同一套上下文的继续操作;
  • 我在 iPad 上补的一句话,不会漂在外面,而是能直接回到同一个 Vault、同一个终端、同一个任务链里;
  • 我回到桌面端之后,不需要重新解释一遍刚才做了什么,只要 attach 回 tmux,就能继续。

这才是我最看重的地方:不是跨设备都能做事,而是跨设备做的还是同一件事。


4. 一个非常实用的副产物:Obsidian 移动端快速记录

这套流程还有一个我非常喜欢的副产物——它几乎顺手解决了 Obsidian 移动端快速记录 的问题。

只要长期用 Obsidian,你大概率都遇到过类似情况:人在外面,突然冒出一个想法,想赶紧记下来;你掏出手机,点开 Obsidian,等它加载、同步、进入目标笔记,整个过程并不算慢到不能接受,但就是足够打断思路。

问题不在于它不能记,而在于它不够“即刻”。

而有了这套远程流程之后,记录方式会变得非常自然:

  1. 打开手机上的 Discord;
  2. 直接发一句自然语言,比如:

    • “帮我把这条想法存到收件箱:……”
    • “把这件事记到今日日记里:……”
    • “帮我新建一条关于 xxx 的笔记草稿。”
  3. 远端的 OpenCode 接收到消息之后,直接调用本地的 obsidian CLI;
  4. 内容被写入你 Mac 上那份真正的 Vault;
  5. 等你回到电脑前,一切已经在原来的体系里了。

这件事的妙处在于,它没有要求你在移动端重新搭一个“轻量 Obsidian 工作流”,也没有让你去适应另一套工具。你只是换了一个更快的入口,但背后还是同一个知识库。

我现在很喜欢把它理解成一种“闪念胶囊”:你不需要完整进入系统,只需要把想法扔进去,系统会替你准确落到该落的地方。对于高频记录的人来说,这个体验提升非常明显。


5. 落地配置:让这套服务开机就在线

如果这套方案只是“偶尔手动启动一下”,那它的价值会大打折扣。真正好用的状态,应该是你几乎不用去想它,它自己就在那儿稳定运行。

所以接下来这一步很关键:把 remote-opencode 放进 tmux,再交给 macOS 的 LaunchAgent 处理,让它在登录后自动拉起。

5.1 启动脚本:先保证 session 的存在

我习惯先写一个很小的启动脚本,专门干一件事:检查 tmux session 是否已经存在,如果没有,就创建并启动 remote-opencode

路径~/scripts/auto_opencode.sh

#!/bin/bash

# launchd 环境下 PATH 很干净,必须手动补全,不然找不到 node 和全局包
export PATH="/Users/用户名/.npm-global/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

TMUX_BIN="/opt/homebrew/bin/tmux"
OPENCODE_BIN="/Users/用户名/.npm-global/bin/remote-opencode"

# 检查 session 在不在,不在才启动
$TMUX_BIN has-session -t remote-opencode 2>/dev/null
if [ $? != 0 ]; then
  # 先建一个空 session,再发送启动命令
  # 这样即使启动时报错,也能直接 attach 进去看现场
  $TMUX_BIN new-session -d -s remote-opencode
  sleep 1
  $TMUX_BIN send-keys -t remote-opencode "$OPENCODE_BIN start" C-m
fi

这里有两个细节值得注意。

第一,launchd 运行出来的环境变量非常干净,很多你在交互式 shell 里默认有的 PATH,它其实都不知道,所以这里一定要手动把常用路径补全。

第二,我不建议直接一条命令粗暴启动,而是先建空 session,再 send-keys。因为这样出问题时更容易排查。你只要 tmux attach -t remote-opencode,就能直接看到它到底卡在了哪一步。

脚本写完之后,记得加执行权限:

chmod +x ~/scripts/auto_opencode.sh

5.2 LaunchAgent:交给系统接管启动流程

接下来,用 LaunchAgent 让 macOS 在登录时自动执行这个脚本。

路径~/Library/LaunchAgents/com.用户名.remote-opencode.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.用户名.remote-opencode</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/用户名/scripts/auto_opencode.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
</dict>
</plist>

配好之后,执行:

launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.用户名.remote-opencode.plist

以后机器一登录,这套流程就会自动起来。你想确认它是不是正常运行,也很简单,直接:

tmux attach -t remote-opencode

如果看到 session 已经在,说明整个启动链路是通的。


6. 最后一公里:让 Mac 合盖也别睡

到这里,其实整套系统已经差不多成型了。但如果你真想把这台 Mac 当成一台长期在线的“个人开发服务器”,还有最后一个现实问题:合盖休眠

只要系统睡过去了,远程入口再漂亮也没用。所以这一层保障不能省。

6.1 图形化方案:KeepingYouAwake

如果你更喜欢简单稳定的方式,KeepingYouAwake 基本就是最省心的选择。它是个很轻的小工具,放在菜单栏里,点一下就能阻止系统休眠。

比较实用的设置思路是:

  • 选择长期保持唤醒;
  • 允许显示器休眠;
  • 机器接电使用。

这样做的好处是,屏幕可以黑掉,不影响日常放置和省电,但系统本身仍然在线,后台服务也不会中断。

6.2 命令行方案:caffeinate

如果你不想额外装工具,也可以直接用 macOS 自带的 caffeinate

# 在 tmux 里跑这个,系统就不会进入休眠
caffeinate -i remote-opencode start

再激进一点,也可以直接改电源设置:

sudo pmset -a disablesleep 1

不过这个方案更适合你非常清楚自己在做什么的时候再用。毕竟机器长期不睡,散热、电源、摆放环境这些现实问题都要一起考虑。我的建议很简单:如果你是把它当长期在线节点来跑,最好接着电,并放在一个散热条件稳定的位置。


7. 这套方案改变的,不只是“能不能远程”

我后来越来越确定,这套流程真正改变的,不只是我能不能在外面远程给家里的电脑发命令。

它改变的是我对开发环境的理解。

以前我们总把开发环境理解成“我现在手上这台设备上的一堆工具”。但在 AI 时代,这种理解其实已经有点落后了。因为真正持续积累价值的,不再只是编辑器、终端和命令本身,而是那套不断被喂养、不断长上下文、不断沉淀知识的工作现场。

一旦你把这件事想清楚,就会发现最合理的做法不是“每台设备都尽量配齐”,而是固定一台核心机器,让所有设备都去连接它。

这样一来:

  • 桌面端,负责深度工作;
  • 手机端,负责快速触发和记录;
  • iPad,负责补充查看和轻操作;
  • 而真正的记忆、上下文、任务状态,都稳定地待在同一个地方。

这就是我现在最喜欢的部分:设备边界还在,但工作流边界被抹平了。

你在地铁上想到一个点子,掏出手机发出去;回到桌前,打开 Ghostty,attach 回 tmux,刚才那条思路已经接进了原来的任务链。整个过程没有重启上下文,也没有“我刚才到底记到哪儿了”的额外心智负担。

这种感觉一旦用顺,真的很难再回到过去那种每切一次设备就重新来过的状态。


总结

如果只看表面,这篇文章讲的是 tmux + remote-opencode + LaunchAgent 怎么配。

但如果往里看一层,它其实是在回答一个更现实的问题:在 AI 深度参与开发之后,我们该怎么保住自己的上下文连续性。

我的答案就是,把最完整的环境固定在一台长期在线的 Mac 上,用 Ghostty 提供顺滑体验,用 tmux 保住会话,用 remote-opencode 打通远程入口,再用 LaunchAgent 和防休眠方案把它变成真正稳定的底座。

这样做之后,你获得的不是一个花哨的远程控制玩法,而是一套真正能每天使用、能持续积累、能把不同设备重新串成一条线的工作流。

如果你也在折腾多设备协同、远程开发、或者 Obsidian 移动端快速记录,这套思路值得你自己跑一遍。很多体验,光看文字很难完全感受到,真把它搭起来之后,你会更容易理解什么叫“同一套记忆资产,在不同设备上被持续调用”。

Mac 菜单栏武装计划:10 款免费开源的宝藏 App 推荐

· 发表评论

在高度数字化的企业级办公环境中,macOS 菜单栏(Menu Bar)的功能早已超越了简单的系统状态展示。从首席信息架构师的视角来看,它是系统功能的延伸触点,是提升专业工作流连续性的关键。随着企业对数字化效率与安全合规要求的日益严苛,开源软件(OSS)凭借其透明的代码逻辑、极高的定制化潜力以及显著的成本控制优势,正成为构建现代化工作空间的首选。

本次评估旨在为企业 IT 决策者及高级知识工作者提供一份技术层面的深度审计。我们将通过安全性、系统资源占用(Overhead)、以及企业级合规性三个核心维度,对一系列精选的开源菜单栏应用进行拆解分析。我们的目标不仅是推荐工具,更是通过技术底层的逻辑论证,评估这些工具如何融入受控的生产力环境。
Google Gemini 2026-01-17 08.24.12

1. 系统资源监测与透明化管理:Stats 的颗粒度分析

在企业工作站维护中,一个常见的行业痛点是“监控软件反成资源黑洞”——监控工具因其非原生架构导致的高 CPU 占用,往往会干扰到核心业务进程的性能。

Stats:基于原生 Swift 开发的轻量化监测方案

Stats 是一款在 GitHub 上获得超过万次星标(Stars)的标杆级项目。作为采用 Swift 原生开发的应用,它在后台运行时的资源消耗极低,确保了数据采集与系统稳定性之间的平衡。

其技术优势主要体现在数据的颗粒度上:

  • 硬件级读取: 完美适配 Apple Silicon (M1/M2/M3) 系列芯片,能够精准读取各性能核心与能效核心的频率、负载及温度波动。
  • 进程级能耗审计: 提供实时的进程能耗清单,帮助架构师快速识别异常的后台资源占用。
  • 存储与流量监测: 涵盖磁盘 I/O 状态及网络吞吐量的实时颗粒度显示。

深度分析(So What? 层): 对于资深系统架构师而言,Stats 提供的不仅是数据,更是性能释放的决策依据。在高负载的编译、渲染或大规模数据处理任务中,通过对核心频率和能效比的实时监测,用户可以判断当前硬件状态是否触及热节流(Thermal Throttling)红线。这种颗粒度极细的数据展示,是确保生产力设备处于巅峰状态的基础透明化管理。

2. 硬件交互的无缝集成:MonitorControl 与音视频增强方案

多显示器办公场景下,macOS 原生权限缺失常导致第三方显示器无法通过系统快捷键调节亮度和音量。这不仅是体验缺失,更是对工作流连续性的干扰。

MonitorControl:DDC/CI 协议的底层接管

MonitorControl 通过 DDC/CI (Display Data Channel Command Interface) 协议 直接与外接显示器硬件通信。

  • 架构价值: 它消除了对第三方显示器厂商闭源驱动的依赖,规避了潜在的“驱动腐烂(Driver Rot)”风险。
  • 智能化调度: 支持基于鼠标位置的自动检测,确保键盘指令精准作用于当前活跃屏幕,逻辑高度符合交互直觉。

Background Music:虚拟驱动层面的音频分路

针对 macOS 系统音量控制“一刀切”的局限性,Background Music 通过安装虚拟音频驱动,实现了企业级的音量管理。

维度系统全局音量控制 (原生)Background Music (虚拟驱动分路)
控制颗粒度仅限系统级全局调节针对单一进程/应用独立调节百分比
交互逻辑交互层级深,需进入应用内设置菜单栏即点即调,具备调音台逻辑
项目状态系统级稳定Public Beta (公测阶段,需关注稳定性)
自动化逻辑支持“自动暂停”逻辑(检测新音频源时自动响应)

IINA:专业影音协作终端

在多媒体素材审阅环节,IINA 凭借其 mpv 内核 的强悍解码能力,支持 4K HDR 原盘及几乎所有行业专业格式。其界面完全遵循 macOS 原生设计语言,支持自动字幕下载与在线流媒体协议,是影音工作流中兼顾性能与美学的最佳实践。

3. 网络安全防御核心:LuLu 的白名单机制与流量审计

在企业网络环境中,未经授权的外发连接是隐私泄露与内网渗透的核心入口。对于底层网络权限软件,“安全源于透明”是唯一准则。

LuLu:基于 Network Extension 框架的防火墙

LuLu 由前 NASA 及 NSA 安全专家开发。这种深厚的安全背景为其提供了天然的可信供应链背书。

  • 技术路径: 利用 macOS Network Extension 框架 接管系统流量,而非老旧的内核扩展(Kext),确保了系统的现代安全性。
  • 白名单策略: 默认拦截所有出站请求,强制用户对每个联网行为进行即时审计。

深度分析(So What? 层): LuLu 的实战价值在于其防御“供应链攻击”和“流氓软件隐私上传”的能力。通过源代码开放,它规避了闭源防火墙可能存在的“安全通过模糊(Security through Obscurity)”谬误。对于处理敏感数据、需要防范破解软件异常联网验证的专业环境,LuLu 是构建防御性办公环境的基石。

4. 视觉规范与专业化工作流增强:Pika 与效率组件

视觉无障碍(Accessibility)合规性在现代企业的前端开发与品牌设计中,已从“可选项”上升为“合规性法律要求”。

Pika:无障碍设计的合规引擎

Pika 不仅仅是取色器,其核心竞争力在于对 WCAG (Web Content Accessibility Guidelines) 标准 的实时支持。

  • 对比度审计: 它能自动计算两个颜色的对比度得分,确保 UI 设计符合无障碍法律标准。
  • 开发者友好: 支持 HEX, RGB, HSB 以及 iOS 开发专用的 UIColor 格式一键转换。

Fluor:输入逻辑的自动化映射

Fluor 针对开发者与设计师群体解决了 F1-F12 键位的逻辑冲突。它能根据当前活跃的应用,自动在“媒体模式”与“标准 F 键模式”之间切换。在 IDE 中启用 F11 调试,在浏览器中启用媒体控制,这种无感切换大幅度降低了专业人士的认知负担。

5. 工作环境净化与自动化状态维持

“数字杂乱(Digital Clutter)”是阻碍高净值知识工作者专注力的主要因素。

  • Hidden Bar:收纳与合规边界。 针对 MacBook 刘海屏遮挡图标的物理缺陷,Hidden Bar 提供了简洁的收纳逻辑。值得注意的是,该应用已上架 Mac App Store,这意味着其通过了 Apple 严格的沙盒化(Sandboxing)安全审核,具备极高的企业准入合规性。
  • Itsycal:轻量化调度中心。 不同于重量级的系统日历,Itsycal 专注于“随手可得”的交互。其支持周数(Week Number)显示,这对外企或以周为计划单位的企业环境至关重要。同时支持 iCloud、Google 及 Teams 会议链接的直接跳转,极大地缩短了会议接入路径。
  • KeepingYouAwake:经典的现代复刻。 作为经典应用 Caffeine 的现代开源复刻版,它奉行“如无必要,勿增实体”的极简主义。相比复杂的电源管理套件,它提供了一个纯粹、稳定的系统防休眠开关,确保长耗时任务(如大数据导出或模型训练)的连续性。

6. 结论与部署建议:构建企业级开源软件治理准则

开源菜单栏工具在 Mac 环境下的应用,已不仅是个人偏好,更是企业提升技术透明度、优化硬件效能的战略手段。

管理建议(Chief IT Architect's Advice):

  1. 权限最小化原则: 此类工具(如 MonitorControl, Fluor)涉及系统辅助功能授权。建议企业 IT 部门通过 MDM(移动设备管理)建立合规白名单,指导用户进行受控授权。
  2. 供应链安全审计: 在部署前,应由安全审计员验证 GitHub 项目的活跃度。核心指标包括: 提交记录(Commit)是否在 6 个月内更新、Issue 响应率是否处于活跃状态、以及 GitHub Stars 是否达到社区信任基准(通常建议千星以上)。
  3. 风险与冗余管理: 对于处于 Public Beta 阶段的软件(如 Background Music),应仅限于非生产关键型环境使用。通过 Hidden Bar 等工具定期审查菜单栏负载,在提升效率的同时,确保系统架构的纯净度与响应响应速度。

通过这种“以开源提升透明,以工具强化效能”的策略,企业可以构建一个既硬核又优雅的数字化办公闭环。

链接

  1. Stats(系统监控) 🌟 35.7k
  2. Hidden Bar(菜单栏收纳) 🌟 13.2k
  3. Itsycal(简约日历) 🌟 3.7k
  4. MonitorControl(显示器亮度控制) 🌟 32.1k
  5. LuLu(出站流量监控) 🌟 11.8k
  6. Fluor(Fn 键自动切换) 🌟 2.1k
  7. KeepingYouAwake(电脑保持清醒) 🌟 6.2k
  8. Pika(屏幕取色) 🌟 2.2k
  9. IINA(视频播放器) 🌟 43.3k
  10. Background Music(应用音量控制) 🌟 18.4k