yourwebs
Use when the user wants to publish, host, or share a self-contained HTML page or artifact on yourweb (yourwebs.cc) — getting a public URL — or to list, fetch, update, or delete their hosted pages via the yourweb REST API.
Works with
---
name: yourwebs
description: Use when the user wants to publish, host, or share a self-contained HTML page or artifact on yourweb (yourwebs.cc) — getting a public URL — or to list, fetch, update, or delete their hosted pages via the yourweb REST API.
license: MIT
---
# Publish HTML to yourweb
Host a single self-contained HTML file on [yourweb](https://yourwebs.cc) and get a
public, full-screen URL. The REST API lets an agent publish a page, then list,
fetch, update, and delete the pages it owns.
Two domains, by design:
- **`yourwebs.cc`** — the dashboard and the REST API (`https://yourwebs.cc/api/v1`).
- **`yourwebs.app`** — where published pages are served. A page with subdomain
`my-page` is served at `https://my-page.yourwebs.app`.
## Authentication
Every call except anonymous publish needs a bearer token (`ywb_...`), generated by
the user in the yourweb dashboard.
**Read the token from the `YOURWEBS_API_TOKEN` environment variable. Never hardcode
it, never write it into a file, never echo it back.**
If `YOURWEBS_API_TOKEN` is unset, stop and ask the user to set it:
```bash
export YOURWEBS_API_TOKEN="ywb_..." # get it from the yourweb dashboard
```
Only if the user explicitly prefers to paste the token inline, use it for this
session — and warn them it will appear in the chat transcript, so the env var is
preferred. If a project keeps it in a `.env` file, make sure `.env` is gitignored.
## Publish a page (the main task)
1. Write a single, self-contained HTML file (inline CSS/JS, no external build).
It must be UTF-8, contain `<!doctype html>` or `<html>`, and be ≤ 1 MB.
2. Wrap it in a JSON body and POST it. Use `jq` to build the JSON so the HTML is
escaped correctly — never hand-concatenate HTML into a JSON string.
3. Return the `url` from the response to the user.
```bash
# index.html holds your self-contained page
jq -n --rawfile html index.html \
'{html: $html, title: "My Page", subdomain: "my-page"}' \
| curl -sS -X POST https://yourwebs.cc/api/v1/pages \
-H "Authorization: Bearer $YOURWEBS_API_TOKEN" \
-H "Content-Type: application/json" \
--data-binary @-
```
Response (HTTP 201) is a page object — hand `url` back to the user:
```json
{ "id": "01J0...", "subdomain": "my-page", "url": "https://my-page.yourwebs.app",
"title": "My Page", "size_bytes": 4096, "total_views": 0, "status": "active",
"created_at": 1747900800000, "updated_at": 1747900800000 }
```
`title` and `subdomain` are optional. The page is served at
`https://<subdomain>.yourwebs.app`. `subdomain` only takes effect with a token
(anonymous publishes get a random subdomain) and must be 3–32 chars, lowercase
`a-z 0-9 -`, no leading/trailing or doubled hyphen, not a reserved word. Omit it to
get a random subdomain.
## Manage existing pages
All of these require the token.
```bash
# List your pages -> { "pages": [ ... ] }
curl -sS https://yourwebs.cc/api/v1/pages \
-H "Authorization: Bearer $YOURWEBS_API_TOKEN"
# Get one page
curl -sS https://yourwebs.cc/api/v1/pages/PAGE_ID \
-H "Authorization: Bearer $YOURWEBS_API_TOKEN"
# Replace a page's HTML (body: { html })
jq -n --rawfile html index.html '{html: $html}' \
| curl -sS -X PUT https://yourwebs.cc/api/v1/pages/PAGE_ID \
-H "Authorization: Bearer $YOURWEBS_API_TOKEN" \
-H "Content-Type: application/json" --data-binary @-
# Delete a page -> { "deleted": true }
curl -sS -X DELETE https://yourwebs.cc/api/v1/pages/PAGE_ID \
-H "Authorization: Bearer $YOURWEBS_API_TOKEN"
```
## Quick reference
| Method | Path | Body | Token | Success |
|---|---|---|---|---|
| POST | `/pages` | `{ html, title?, subdomain? }` | optional | 201 page |
| GET | `/pages` | — | required | 200 `{ pages: [...] }` |
| GET | `/pages/:id` | — | required | 200 page |
| PUT | `/pages/:id` | `{ html }` | required | 200 page |
| DELETE | `/pages/:id` | — | required | 200 `{ deleted: true }` |
## Constraints & errors
- HTML: UTF-8, contains `<!doctype html>`/`<html>`, ≤ 1 MB (the raw HTML byte size,
matching `size_bytes`, not the JSON body). Else `400 invalid_html` — fix the HTML,
don't retry unchanged.
- `400 subdomain_invalid`: the subdomain breaks the format rules — fix it, don't
blindly retry. `409 subdomain_taken`: it's valid but in use — pick another or omit.
- Rate limits: 30 publishes/hour, 60 updates/hour. On `429 rate_limited`, wait and
retry later rather than hammering — the window is hourly.
- Errors are `{ "error": { "code": "...", "message": "..." } }`. Common codes:
`bad_request` (400), `invalid_html` (400), `subdomain_invalid` (400),
`unauthorized` / `invalid_token` (401), `not_found` (404),
`subdomain_taken` (409), `rate_limited` (429), `no_subdomain_available` (503).
- Anonymous pages (no token) auto-delete after 30 days and can't be claimed later;
publish with a token for anything you want to keep.
Full contract: see [reference/api.md](reference/api.md).More API Design skills
lark-event
larksuite/cli
Lark/Feishu real-time event listening / subscribing / consuming: stream events as NDJSON via `lark-cli event consume <EventKey>` (covers IM messages/reactions/chat changes, Approval status changes, Task updates, VC meeting started/joined/ended, Minutes generated, Whiteboard updated, etc.). Use for Lark bots, real-time message processing, long-running subscribers, streaming webhook/push handlers. Supports `--max-events` / `--timeout` bounded runs and a stderr ready-marker contract — designed for AI agents running as subprocesses.
lark-contact
larksuite/cli
飞书 / Lark 通讯录:按姓名 / 邮箱解析成 open_id,或按 open_id 反查姓名 / 部门 / 邮箱 / 联系方式 / 个人状态 / 签名,以及按关键词搜索当前用户可见的机器人 / 智能体(agent)。当用户提到一个名字要下一步发消息 / 排日程,或拿到 open_id 想查具体信息时使用。不负责部门树遍历、按部门列员工、组织架构图,这类需求走原生 OpenAPI。
lark-openapi-explorer
larksuite/cli
飞书/Lark 原生 OpenAPI 探索:从官方文档库中挖掘未经 CLI 封装的原生 OpenAPI 接口。当用户的需求无法被现有 lark-* skill 或 lark-cli 已注册命令满足,需要查找并调用原生飞书 OpenAPI 时使用。

