概述
here.now 是免费的即时 Web 托管服务,专为 Agent 设计。发布任何文件或文件夹,获得 live URL:<slug>.here.now
安装
安装 here.now skill,让 Agent 自动发布:
$ npx skills add heredotnow/skill --skill here-now -g
对于项目本地安装,运行时不加 -g。
如果失败,使用备用安装器:
$ curl -fsSL https://here.now/install.sh | bash
快速开始
三步发布站点,无需账户:
创建站点
$ curl -sS https://here.now/api/v1/publish \ -H "X-HereNow-Client: cursor/direct-api" \ -H "content-type: application/json" \ -d '{ "files": [ { "path": "index.html", "size": 1234, "contentType": "text/html; charset=utf-8" } ] }'
上传文件
$ curl -X PUT "<upload.uploads[0].url>" \ -H "Content-Type: text/html; charset=utf-8" \ --data-binary @index.html
完成发布
$ curl -sS -X POST "<finalizeUrl>" \ -H "content-type: application/json" \ -d '{ "versionId": "<versionId>" }'
siteUrl、预签名上传 URL 和 finalizeUrl。匿名站点 24 小时过期,包含 claimUrl 以便永久保留站点。
认证
包含 Authorization: Bearer <API_KEY>,站点永久保留,更高限额。
省略 header,站点 24 小时过期,限额较低。
可选归属:包含 X-HereNow-Client: <agent>/<tool>,以便 here.now 按客户端调试可靠性。
获取 API 密钥
方式 A:Agent 辅助注册
通过邮箱请求一次性代码:
$ curl -sS https://here.now/api/auth/agent/request-code \ -H "content-type: application/json" \ -d '{"email": "user@example.com"}'
验证代码以获取 API 密钥:
$ curl -sS https://here.now/api/auth/agent/verify-code \ -H "content-type: application/json" \ -d '{"email":"user@example.com","code":"ABCD-2345"}'
如果是新邮箱,账户会自动创建。
方式 B:Dashboard 注册
在 here.now 登录,从 dashboard 复制 API 密钥。
存储 API 密钥
保存到凭证文件:
$ mkdir -p ~/.herenow && echo "<API_KEY>" > ~/.herenow/credentials && chmod 600 ~/.herenow/credentials
读取优先级(首次匹配获胜):
--api-key 标志(仅 CI/脚本)
$HERENOW_API_KEY 环境变量
~/.herenow/credentials 文件(推荐)
创建站点
/api/v1/publish
别名:/api/v1/artifact
请求体
{
"files": [
{ "path": "index.html", "size": 1234, "contentType": "text/html; charset=utf-8", "hash": "a1b2c3d4..." }
],
"ttlSeconds": null,
"viewer": {
"title": "My site",
"description": "Published by an agent",
"ogImagePath": "assets/cover.png"
}
}
参数说明
| 参数 | 必需 | 说明 |
|---|---|---|
files | ✅ | { path, size, contentType, hash } 数组。路径相对于站点根目录。 |
hash | — | SHA-256 hex 摘要。更新时匹配的文件跳过上传。 |
ttlSeconds | — | 过期时间(秒)。匿名站点忽略。 |
viewer | — | 自动 viewer 页面的元数据(仅无 index.html 时适用)。 |
认证用户响应
{
"slug": "bright-canvas-a7k2",
"siteUrl": "https://bright-canvas-a7k2.here.now/",
"upload": {
"versionId": "01J...",
"uploads": [
{ "path": "index.html", "method": "PUT", "url": "https://<presigned-url>" }
],
"skipped": ["assets/app.js"],
"finalizeUrl": "https://here.now/api/v1/publish/bright-canvas-a7k2/finalize",
"expiresInSeconds": 3600
}
}
匿名响应额外字段
{
"claimToken": "abc123...",
"claimUrl": "https://here.now/claim?slug=bright-canvas-a7k2&token=abc123...",
"expiresAt": "2026-02-19T01:00:00.000Z",
"anonymous": true
}
claimToken 和 claimUrl 仅返回一次,无法恢复。务必保存并分享给用户,以便永久保留站点。
上传文件
对 upload.uploads[] 中的每个条目,PUT 文件到预签名 URL:
$ curl -X PUT "<presigned-url>" \ -H "Content-Type: <content-type>" \ --data-binary @<local-file>
上传可以并行运行。预签名 URL 有效期为 1 小时。
完成发布
/api/v1/publish/:slug/finalize
{ "versionId": "01J..." }
拥有站点需要 Authorization: Bearer。匿名站点无需 auth 即可 finalize。
响应
{
"success": true,
"slug": "bright-canvas-a7k2",
"siteUrl": "https://bright-canvas-a7k2.here.now/",
"currentVersionId": "01J..."
}
更新现有站点
/api/v1/publish/:slug
请求体与创建相同。返回新的预签名上传 URL 和新的 finalizeUrl。
Authorization: Bearer <API_KEY>claimToken,更新不会延长过期时间hash(SHA-256 hex),匹配文件跳过上传认领匿名站点
/api/v1/publish/:slug/claim
需要 Authorization: Bearer <API_KEY>。
{ "claimToken": "abc123..." }
转移所有权,移除过期时间。用户也可以访问 claimUrl 并登录来认领。
密码保护
为任何站点添加密码,服务器端强制 — 密码验证前内容不会发送到浏览器。
{"password": "secret"}
{"password": null}
通过 PATCH /api/v1/publish/:slug/metadata 设置。密码保护在重新部署后依然存在。需要认证站点。
复制站点
/api/v1/publish/:slug/duplicate
服务器端创建完整副本,无需客户端上传。需要 Authorization 且拥有源站点。
$ curl -sS -X POST https://here.now/api/v1/publish/{slug}/duplicate \ -H "Authorization: Bearer {API_KEY}" \ -H "Content-Type: application/json" \ -d '{}'
复制所有文件和 viewer 元数据。不复制密码保护、handle/域名链接或 TTL。
更新元数据
/api/v1/publish/:slug/metadata
{
"ttlSeconds": 604800,
"viewer": {
"title": "Updated title",
"description": "New description"
},
"password": "secret123"
}
所有字段可选。需要 Authorization: Bearer <API_KEY>。
删除站点
/api/v1/publish/:slug
需要 Authorization: Bearer <API_KEY>。硬删除站点和所有存储文件。
列出站点
/api/v1/publishes
需要 Authorization。返回认证用户拥有的所有站点。
{
"publishes": [
{
"slug": "bright-canvas-a7k2",
"siteUrl": "https://bright-canvas-a7k2.here.now/",
"status": "active",
"currentVersionId": "01J..."
}
]
}
获取站点详情
/api/v1/publish/:slug
返回当前 live 版本的元数据和完整文件清单 manifest。
{
"slug": "bright-canvas-a7k2",
"manifest": [
{ "path": "index.html", "size": 1234 },
{ "path": "assets/app.js", "size": 999 }
]
}
刷新上传 URL
/api/v1/publish/:slug/uploads/refresh
返回待处理上传的新鲜预签名 URL(相同版本)。用于 URL 在上传中途过期时。
Handle
Handle 提供稳定的子域名如 yourname.here.now,将位置路由到你的站点。认领 handle 需要付费计划(Hobby 或以上)。
| 操作 | 端点 |
|---|---|
| 创建 | POST /api/v1/handle |
| 获取 | GET /api/v1/handle |
| 更新 | PATCH /api/v1/handle |
| 删除 | DELETE /api/v1/handle |
格式:小写字母/数字/连字符,2-30 字符,无前导/尾随连字符。
自定义域名
使用自己的域名托管站点。Free 计划:1 个域名。Hobby 计划:最多 5 个。
如 docs.example.com,添加 CNAME 记录指向 fallback.here.now
如 example.com,添加 ALIAS 记录 + TXT 验证记录
$ curl -sS https://here.now/api/v1/domains \ -H "Authorization: Bearer <API_KEY>" \ -H "Content-Type: application/json" \ -d '{"domain": "example.com"}'
DNS 验证后自动配置 SSL。状态从 pending 变为 active。
链接
链接将站点连接到 handle 或自定义域名上的位置。
{
"location": "docs",
"slug": "bright-canvas-a7k2"
}
{
"location": "",
"slug": "bright-canvas-a7k2",
"domain": "example.com"
}
根位置使用 "location": ""。路径参数中用 __root__ 表示根位置。链接更新全球传播最多 60 秒。
服务规则
index.html,直接提供
index.html,提供找到的第一个
直接文件路径始终有效:https://<slug>.here.now/report.pdf
限制
| 匿名 | 认证 | |
|---|---|---|
| 最大文件大小 | 250 MB | 5 GB |
| 过期时间 | 24 小时 | 永久(或自定义 TTL) |
| 站点数量 | — | 500 免费 / Hobby 无限 |
| 存储空间 | — | 10 GB 免费 / 100 GB Hobby |
| 速率限制 | 5 次/小时/IP | 60 次/小时免费 / 200 次/小时 Hobby |
| 需要账户 | 否 | 是 |