🧭 入口与定位 >>>
Pinokio 把本机变成“Localhost Cloud”,内置运行时、脚本系统、反向代理、终端和 GUI,用 1-click 方式跑本地 AI / Web / CLI 应用。
定位:本地优先的应用启动器与自动化运行平台,不是单纯的包管理器,也不是单一 AI 客户端适合做:安装并运行开源 Web 应用、封装 CLI 工具、把脚本仓库变成可分享的 launcher、让多个 agent 共享同一项目记忆核心入口 Discover Download from URL ~/pinokio/api ~/pinokio/plugin:装别人发布的仓库, 装任意 Git 仓库, 手写自己的 app, 挂载 CLI 插件
一句话判断
- 想把“README + 安装命令 + 启动命令”包装成可点击的本地应用:用 Pinokio
- 想让本地 AI / CLI 能被浏览器、手机和其他 agent 访问:用 Pinokio
- 只想运行单条 shell 命令,不需要 UI、脚本编排和可分享入口:不必上 Pinokio
🗂️ 目录骨架与分工 >>>
先理解 `api / bin / plugin / logs / drive` 的边界,后面写脚本和排错会顺很多。
~/pinokio
├── api/ # 每个应用或脚本仓库的主目录
├── bin/ # 共享安装的全局依赖
├── plugin/ # 可复用 CLI / 桌面插件
├── logs/ # 自动化脚本、CLI agent、shell 交互日志
├── drive/ # 独立持久化数据,适合大模型或长期缓存
└── workspaces/ # 工作区
什么时候放哪
api/<app>:你的 launcher、本地 app、下载下来的 pinokio 仓库plugin/<name>:希望在多个项目里复用的 CLI 网关drive/:不希望随着 app 删除或更新一起消失的数据logs/:给 agent 回看历史、定位错误、跨会话续跑
🚀 最短工作流 >>>
Cookbook 的默认入口不是学完全部 API,而是先跑通一个应用,再回头补脚本结构。
路线 A:直接安装别人发布的仓库
路线 B:自己在 api/ 里做一个 launcher
📦 Recipe:把任意 Git 仓库装进 Pinokio >>>
当别人给你的是 Git URL 而不是已收录应用时,用这个 recipe 最快。
适用场景
- 你已经拿到一个 Pinokio 脚本仓库地址
- 仓库还没进官方目录,但你想先本地试跑
- 你想固定某个分支进行测试
最小操作链
Discover Download from URL- 输入 Git URL,必要时补分支
pinokio.js install.* start.*- 优先跑安装脚本,再跑启动脚本
判断标准
pinokio.js:说明仓库已经准备了 UI 入口pinokio.js:会按默认方式把根目录脚本直接列到菜单- 安装前先看源码:Pinokio 脚本本质上就是可执行自动化脚本
🧱 Recipe:最小 launcher 骨架 >>>
这是自建应用时最常用的骨架,足够覆盖下载、安装、启动和一键入口。
/PINOKIO_HOME/api/downloader
├── icon.png
├── download.json
└── pinokio.js
{
"run": [{
"method": "shell.run",
"params": {
"message": "git clone {{input.url}}"
}
}]
}
module.exports = {
title: "Download Anything",
description: "Download a git repository",
icon: "icon.png",
menu: [{
text: "Start",
href: "download.json",
params: {
url: "https://github.com/cocktailpeanut/dalai"
}
}]
}
迁移到真实项目时要补的东西
install.js/install.json:依赖安装start.js/start.json:启动服务并暴露 URLreset.js:清空坏状态update.js:拉新版本并重装必要依赖
🔌 Recipe:把 CLI 工具变成 1-click 插件 >>>
插件适合把通用 CLI 暴露给多个项目,而不是绑死在单个 app 目录里。
~/pinokio/plugin
└── crush
├── pinokio.js
└── crush.png
module.exports = {
title: "Crush",
icon: "crush.png",
link: "https://github.com/charmbracelet/crush",
run: [{
method: "shell.run",
params: {
message: "npx -y @charmland/crush",
path: "{{args.cwd}}",
input: true
}
}]
}
什么时候选 plugin 而不是 app
plugin:面向多个项目复用,同一个 CLI 到处都要开app:你在包装某个具体仓库,脚本和 UI 都跟仓库强绑定
常见坑
🔁 Recipe:远程脚本编排与资源回收 >>>
当你想按步骤拉起远程仓库、请求服务、再及时释放显存/内存时,用 `script.start` / `script.stop`。
{
"run": [{
"method": "script.start",
"params": {
"uri": "https://github.com/cocktailpeanutlabs/moondream2.git/install.js"
}
}, {
"method": "script.start",
"params": {
"uri": "https://github.com/cocktailpeanutlabs/moondream2.git/start.js"
}
}, {
"method": "script.stop",
"params": {
"uri": "https://github.com/cocktailpeanutlabs/moondream2.git/start.js"
}
}]
}
适用场景
- 需要短暂拉起一个 AI 服务,拿到结果后立刻关闭
- 想把安装、启动、调用、停止串成单个流程
- 机器资源有限,不希望服务一直占着 GPU / RAM
关键判断
script.start:必要时先下载仓库,再执行目标脚本script.stop:显式回收长驻服务,避免下一个任务被吃光资源kernel.script.local(...).url:适合在后续步骤引用已启动脚本暴露的地址
🧠 Recipe:利用日志当 agent 共享记忆 >>>
Pinokio 的记忆不是数据库,而是项目里的日志文件;这非常适合多 agent 协作与跨会话续跑。
/logs/api:安装脚本、启动脚本等自动化日志/logs/dev:Codex CLI、Claude Code、Gemini CLI 等 agent 的对话与执行记录/logs/shell:人工 shell 交互
高频用法
什么时候最有价值
- 你在多端切换,需要跨会话接力
- 你在对比多个 agent 的实现结果
- 你希望项目搬到另一台机器后还能带走上下文
🛠️ 核心脚本心智模型 >>>
真正高频不是记住全部 API,而是先理解 `shell.run + 模板变量 + 脚本编排` 这三件事。
最常用能力
shell.run venv:运行命令、切换目录、启用 、控制是否接受输入script.start / stop / restart:把脚本串成流程,并管理远程或本地子脚本fs.*:写文件、读文件、下载文件、复制链接notify / log / web.open:做反馈、调试和 UI 跳转
模板变量
{{input.xxx}}:从菜单或上游脚本传参{{args.cwd}}:当前工作目录{{port}}:运行期端口{{kernel.*}}:读取脚本状态、路径、运行信息
{
"run": [{
"method": "shell.run",
"params": {
"path": "server",
"venv": "venv",
"message": "uv pip install -r requirements.txt"
}
}]
}
⚠️ 安全边界与决策规则 >>>
Pinokio 提供隔离和审核机制,但脚本依然有执行任意命令的能力,安全判断不能外包。
先看什么
- 脚本来源是否公开、是否能读源码
Discover~/pinokiovenv
文档强调的安全假设
- 脚本可以运行任意命令,所以安装前先看仓库源码
~/pinokio/binpath venv
实战建议
pinokio.jsdrive/install/start/update/reset- 如果只是自己本地实验,优先从最小 launcher 做起,再决定要不要发布