自托管的个人 Codex 宿主机系统,让 Mac mini / 云主机成为长期在线的 AI 工作站。
HappyCodex 是基于 HappyClaw 改造的 Codex 宿主机版本。它把官方 Codex CLI 封装成一个可远程访问的个人工作站:Codex 登录态、会话历史、skills、memory、工作区文件和任务状态都保存在同一台宿主机上,手机、公司电脑、Web/PWA 和 IM 入口只负责远程调用。
v1 的目标很明确:个人单主机,不做复杂多租户;宿主机是唯一真源,其他设备都是入口。
这适合这样的场景:
- 家里的 Mac mini 长期开机,负责真正运行 Codex。
- 工作电脑或手机只通过 Web/PWA 访问,不迁移隐私文件和登录态。
- 所有历史对话、生成文件、skills 和 memory 都沉淀在宿主机。
- 隔离机器上需要长期无人值守执行,减少反复确认造成的中断。
HappyCodex 默认调用官方 Codex CLI,不自建 token,也不抓取私有凭据。
- 使用
codex login --device-auth、--with-api-key或--with-access-token完成官方登录。 - 每个 HappyCodex 对话绑定 Codex session,后续消息通过 resume 延续上下文。
- 默认使用独立
CODEX_HOME=data/codex-home/owner,避免污染日常~/.codex。 - 设置页提供 Codex 登录状态、doctor 检查、默认模型和工作区根目录配置。
面向隔离 Mac mini / 云主机,v1 默认启用无人值守策略:
HAPPYCODEX_UNATTENDED=true
CODEX_APPROVAL_MODE=never
CODEX_SANDBOX=danger-full-access运行时会使用 Codex 的高权限无人值守参数:
codex exec --json \
--dangerously-bypass-approvals-and-sandbox \
--skip-git-repo-check如果关闭无人值守模式,HappyCodex 会回落到普通 --ask-for-approval 和 --sandbox 参数。建议只在隔离宿主机上启用默认高权限配置。
HappyCodex 复用 HappyClaw 的 Web/PWA 框架,并适配 Codex 运行方式:
- 多对话标签页。
- WebSocket 实时消息。
- Markdown、代码块、表格和 Mermaid 渲染。
- 图片、SVG、HTML、文本文件预览。
- 生成图片自动落到工作区,并在对话区内直接预览。
- 文件链接点击后打开右侧工作区并定位到文件预览。
- 移动端 PWA 可作为手机入口使用。
对话输入框内提供 Codex 风格的模型选择器:
- 速度档:低 / 中 / 高 / 超高。
- 模型档:默认、GPT-5.5 等可配置模型。
- 每条消息可带上当前选择的模型和推理强度。
- 默认值可通过环境变量或设置页配置。
Codex 已经有原生 skills 能力,HappyCodex 不再复制一套冲突框架,而是把 Web 做成控制面:
- 用户 skills 写入
CODEX_HOME/skills/{name}/SKILL.md。 - 系统 skills 和插件贡献的 skills 只读展示。
- Web 可查看、安装、导入、编辑、删除用户 skills。
- 文件 watcher + SQLite 索引保持 Web 与宿主机文件同步。
- Web 编辑使用 hash/version 检查,冲突时生成 conflict draft,不静默覆盖。
v1 不直接写 Codex 私有 native memory 文件。HappyCodex 提供独立 memory store:
- SQLite 表
memory_items为主存储。 - Markdown mirror 写到
data/memory/happycodex,方便备份、查看和迁移。 - Web/PWA 可以编辑 memory。
- HappyCodex MCP server 提供
memory_search、memory_append、memory_update、memory_list。 - Runner 每次执行前注入精简 context pack:全局记忆、项目记忆、当前会话摘要。
注册 memory MCP:
CODEX_HOME="$PWD/data/codex-home/owner" codex mcp add happycodex-memory -- \
node "$PWD/dist/happycodex-mcp-server.js"设置页也提供注册按钮。
右侧工作区文件管理器支持:
- 上传、下载、删除、创建目录。
- 图片预览和下载。
- SVG 直接预览。
- HTML 安全预览,并提供“去浏览器查看”按钮。
- 文本和 Markdown 在线查看。
- 对话中的工作区文件链接会直接打开右侧预览,不再跳无意义的新页签。
HappyCodex 保留 HappyClaw 的多入口和调度能力作为远程入口层:
- Web/PWA 是 v1 主入口。
- 飞书、Telegram、QQ、钉钉、微信等 IM 通道沿用原框架,作为后续适配入口。
- 定时任务、脚本任务、文件管理、终端和 SQLite 数据层继续复用。
git clone https://github.com/customerjin/Codex-Lumen.git
cd Codex-Lumen
git switch happycodex/codex-host-v1如果该分支已经被设为默认分支,可以直接:
git clone https://github.com/customerjin/Codex-Lumen.git
cd Codex-Lumen项目包含 scripts/npm-shim.sh,会优先使用系统 Node/npm,必要时使用仓库内的工具链:
./scripts/npm-shim.sh install
./scripts/npm-shim.sh --prefix web install
./scripts/npm-shim.sh run build
./scripts/npm-shim.sh --prefix web run buildCODEX_HOME="$PWD/data/codex-home/owner" \
HAPPYCODEX_WORKSPACE_ROOT="$PWD/data/groups" \
HAPPYCODEX_AGENT_PROVIDER=codex \
HAPPYCODEX_UNATTENDED=true \
CODEX_APPROVAL_MODE=never \
CODEX_SANDBOX=danger-full-access \
./scripts/npm-shim.sh start打开:
http://localhost:3000
首次进入会创建管理员账号。
HappyCodex 使用独立 CODEX_HOME,需要为这个宿主机 profile 单独登录:
CODEX_HOME="$PWD/data/codex-home/owner" codex login --device-auth如果 Codex CLI 不在 PATH,可以设置:
export CODEX_BIN="/Applications/Codex.app/Contents/Resources/codex"./scripts/npm-shim.sh run doctor:happycodex./scripts/npm-shim.sh run package:macos产物位置:
dist-package/HappyCodex-macos-arm64.tar.gz
./scripts/install-macos.sh安装脚本会:
- 创建
data/codex-home/owner。 - 创建
$HOME/HappyCodex/workspaces。 - 构建后端和前端。
- 安装
~/Library/LaunchAgents/com.happycodex.server.plist。 - 使用
caffeinate -dimsu防止插电 Mac mini 睡眠中断任务。 - 默认在
http://localhost:3000启动服务。
查看日志:
tail -f data/logs/launchd.out.log
tail -f data/logs/launchd.err.log卸载可以先停止 LaunchAgent:
launchctl unload "$HOME/Library/LaunchAgents/com.happycodex.server.plist"推荐把宿主机放在家庭或云端,通过私有网络访问:
- Tailscale:推荐默认方案,手机和公司电脑加入同一 Tailnet 后访问
http://宿主机IP:3000。 - Cloudflare Tunnel:适合需要公网域名但不想暴露端口的场景。
- Nginx 反代:适合已有服务器和证书管理经验的部署。
不要把无人值守高权限服务裸露到公网。
| 环境变量 | 默认值 | 说明 |
|---|---|---|
ASSISTANT_NAME |
HappyCodex |
Web 中显示的助手名称 |
CODEX_BIN |
自动检测 | Codex CLI 路径 |
CODEX_HOME |
data/codex-home/owner |
独立 Codex profile |
HAPPYCODEX_AGENT_PROVIDER |
codex |
Agent provider |
HAPPYCODEX_WORKSPACE_ROOT |
data/groups / $HOME/HappyCodex/workspaces |
工作区根目录 |
HAPPYCODEX_UNATTENDED |
true |
是否启用无人值守模式 |
CODEX_APPROVAL_MODE |
never |
非 bypass 模式下的 approval policy |
CODEX_SANDBOX |
danger-full-access |
非 bypass 模式下的 sandbox |
CODEX_MODEL |
空 | 默认模型 |
WEB_PORT |
3000 |
Web 端口 |
flowchart LR
Client["Web / PWA / IM"] --> Web["HappyCodex Web Server"]
Web --> DB[("SQLite")]
Web --> Files["Workspace Files"]
Web --> Runner["CodexRunner"]
Runner --> CLI["Official Codex CLI"]
CLI --> CodexHome["CODEX_HOME"]
CodexHome --> Skills["skills"]
CodexHome --> Sessions["sessions"]
Web --> Memory["HappyCodex Memory Store"]
CLI -. MCP .-> Memory
核心模块:
src/codex-runner.ts:Codex CLI 执行、resume、模型和无人值守参数适配。src/codex-config.ts:Codex 路径、模型、sandbox、approval、workspace 配置。src/codex-artifacts.ts:生成图片和工作区 artifact 归档。src/happycodex-memory.ts:HappyCodex memory store。src/happycodex-mcp-server.ts:给 Codex 调用的 memory MCP server。src/routes/codex.ts:Web 设置页中的 Codex 状态和操作接口。web/src/components/chat/CodexModelSelector.tsx:对话框模型选择器。web/src/components/settings/CodexSection.tsx:Codex 设置页。
运行时数据默认不提交到 Git:
data/
codex-home/owner/ # 独立 Codex 登录态、sessions、skills
groups/ # 工作区
memory/happycodex/ # memory Markdown mirror
logs/ # launchd 日志
HappyCodex 复用了 HappyClaw 的 Web、PWA、IM、消息队列、任务调度、文件管理、终端和 SQLite 数据层。核心变化是把原上游 runner/auth/memory 框架替换为 Codex 适配:
- Agent 执行切换为官方 Codex CLI。
- 登录切换为 Codex 官方登录。
- Skills 以 Codex 原生 skills 目录为真源。
- Memory 使用 HappyCodex store + MCP,不直接写 Codex 私有 native memory。
- v1 默认个人单主机,不追求商业多租户。
无人值守模式是为了隔离宿主机设计的。它会允许 Codex 在工作区内执行高权限操作,适合干净 Mac mini、云主机或专门隔离的本地机器。
不要在包含私人文件、公司敏感资料、浏览器主力登录态的钱包环境里直接启用高权限无人值守模式。
MIT。详见 LICENSE。