内容
<h1 align="center">制品</h1>
<p align="center">
<strong>自我托管,类似Claude的制品发布</strong>
</p>
<p align="center">
发布HTML、React组件、Markdown或压缩的静态站点 — 获取您自己域上的不可猜测的URL。
</p>
<p align="center">
<a href="https://github.com/kuyazee/artifacts/actions/workflows/ci.yml"><img src="https://github.com/kuyazee/artifacts/actions/workflows/ci.yml/badge.svg" alt="持续集成"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="许可证:MIT"></a>
<a href="package.json"><img src="https://img.shields.io/badge/node-%E2%89%A522-brightgreen.svg" alt="Node.js 版本 >= 22"></a>
</p>
<p align="center">
<a href="#快速开始">快速开始</a> ·
<a href="docs/deploy.md">部署</a> ·
<a href="docs/api.md">API</a> ·
<a href="docs/cli.md">命令行界面</a> ·
<a href="docs/mcp.md">MCP</a> ·
<a href="SECURITY.md">安全</a>
</p>

## 关于
AI助手会生成许多可分享的输出 — 仪表盘、原型、报告、小应用。Claude的托管制品效果很好,但URL位于别人的基础设施上。这是自托管版本,约1100行代码:您发布内容,它在您控制的域上提供渲染结果,URL不可猜测。
它作为一个容器运行,带有单个管理员账户,默认情况下没有数据库 — 每个制品只是 `/data` 下的普通文件目录,因此备份该目录即可备份所有内容。在重启时清除本地磁盘的主机上,将其指向持久的外部存储 — S3兼容存储桶、git远程仓库或Postgres — 通过设置 `STORAGE_BACKEND`(参见 [部署](docs/deploy.md#存储后端))。
## 功能
- **四种内容类型。** HTML、JSX/TSX(单个React组件,无构建步骤)、Markdown和压缩的静态站点。
- **代理原生,人性化。** 内置MCP服务器允许Claude Code、Codex或任何MCP客户端通过一次工具调用发布。人类在 `/`(在管理员登录后)获得一个拖放式Web UI和 [命令行界面](docs/cli.md)。
- **两层身份验证。** 管理员使用密码登录仪表盘;命令行界面和MCP携带范围限定、可撤销的 [API密钥](docs/auth.md)(`read` / `publish` / `full`),具有可选的过期时间 — 不再共享一个主密钥。
- **默认私有。** 不可猜测的斜杠,`noindex` everywhere, bearer-key writes,具有可选的过期时间。
- **每个制品的可见性。** 每个制品都是公开的(任何拥有链接的人),私有的(仅操作员,受到管理员密码的保护),或受密码保护的(您分发的共享密码) — 参见 [可见性](docs/api.md#可见性)。
- **可选的查看器框架。** 一个精简的顶部工具栏(标题、复制链接、隐藏)类似于Claude/Gemini/ChatGPT制品 — 在设置中全局切换或每个制品切换;`?raw=1` 始终提供纯内容。
- **按项目组织。** 将为同一项目构建的制品分组到可折叠的部分中,并在项目/标题/斜杠/标签中搜索。标签保留用于交叉标签。
- **生命周期控制。** 自定义斜杠、重命名、标签、禁用而不删除、自动过期、删除。
- **防滥用。** 登录和解锁端点按客户端IP限制速率(仅限失败);密码哈希在事件循环之外运行,因此突发猜测会降低这两个路由的性能而不是阻塞服务器。带有 `TRUST_PROXY` 的代理感知客户端IP,用于Cloudflare或反向代理后面的部署 — 参见 [部署](docs/deploy.md#速率限制和边缘)。
## 快速开始
克隆、配置、启动:
```bash
git clone https://github.com/kuyazee/artifacts && cd artifacts
cp .env.example .env # 设置 ARTIFACTS_API_KEY (openssl rand -hex 32)和 BASE_URL
docker compose up -d
```
发布内容:
```bash
curl -s -X POST https://artifacts.example.com/api/artifacts \
-H "Authorization: Bearer $ARTIFACTS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content": "<h1>hello</h1>", "type": "html", "slug": "hello", "tags": ["demo"]}'
# {"slug":"hello","url":"https://artifacts.example.com/a/hello"}
```
让Claude Code为您发布:
```bash
claude mcp add --transport http artifacts https://artifacts.example.com/mcp \
--header "Authorization: Bearer ${ARTIFACTS_API_KEY}" --scope user
```
## 文档
| 我想… | 阅读 |
|---|---|
| 部署它(Docker,compose,Coolify,裸节点,环境变量) | [docs/deploy.md](docs/deploy.md) |
| 使用REST API(包括zip站点和标签) | [docs/api.md](docs/api.md) |
| 从终端发布 | [docs/cli.md](docs/cli.md) |
| 连接Claude Code / Codex / 任何代理 | [docs/mcp.md](docs/mcp.md) |
| 设置登录 + 范围限定API密钥 | [docs/auth.md](docs/auth.md) |
| 了解JSX/TSX渲染 + zip验证 | [docs/formats.md](docs/formats.md) |
## 开发
无构建步骤。Node.js ≥ 22。
```bash
npm install
cp .env.example .env # 任意ARTIFACTS_API_KEY在本地有效,例如 "test"
npm run dev
# UI 在 http://localhost:3000
```
整个测试套件是一个shell脚本:
```bash
bash .github/workflows/smoke.sh http://localhost:3000 <your-key>
```
欢迎PR — 参见 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 三行安全总结
上传的HTML会执行 — 这就是产品 — 因此请在托管此内容的源上提供制品,确保它们与仪表板的会话cookie隔离。写入需要范围限定的API密钥(bearer);管理员仪表板使用HttpOnly,SameSite=Strict会话。读取是公开的,但由不可猜测的、非索引的斜杠控制 — 不要发布机密。凭证路由(登录、解锁)限制速率并在事件循环外哈希密码;在前面运行CDN/边缘限制器以进行容量保护。完整模型参见 [SECURITY.md](SECURITY.md)。
## 致谢
本项目建立在其他人的开源项目之上。以下所有项目均采用MIT许可证。
**运行时**
- [express](https://github.com/expressjs/express) — HTTP服务器
- [marked](https://github.com/markedjs/marked) — Markdown渲染
- [nanoid](https://github.com/ai/nanoid) — 不可猜测的斜杠生成
- [adm-zip](https://github.com/cthackers/adm-zip) — zip站点提取
- [zod](https://github.com/colinhacks/zod) — 请求验证
- [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) — 内置MCP服务器
**可选存储后端** (仅在选择时加载)
- [aws4fetch](https://github.com/mhart/aws4fetch) — S3兼容签名
- [isomorphic-git](https://github.com/isomorphic-git/isomorphic-git) — git后端
- [pg](https://github.com/brianc/node-postgres) — Postgres后端
SQLite后端使用Node.js内置的 `node:sqlite`(无依赖)。
**Web UI**
- [Tabler Icons](https://tabler.io/icons) — 应用程序栏图标(搜索、新建、设置、锁定),内联为SVG
## 许可证
[MIT](LICENSE) © 2026 Zonily Jame
<p align="center">
<sub>一个容器。默认情况下为普通文件;可插拔的S3 / git / Postgres / SQLite存储。</sub>
</p>