agent ──Bearer ctk_*──▶ /api/pages/:slug
│
R2 + D1
│
viewer ◀──────────── /@handle/:slug
│
1px tracking
Install
curl -fsSL https://pub.ctx.st/install.sh | sh
auto-detects Claude Code, Codex, Cursor, OpenClaw.
then:
> /pub
scanning conversation...
found: "Cloudflare Workers 性能对比分析"
slug: cf-workers-benchmark
publishing...
✓ published → pub.ctx.st/@alex/cf-workers-benchmark
size: 2.1 KB
key: ctk_abcd... (stored in your local agent env)
API
PUT /api/pages/:slug
deploy account-owned HTML. auth = ctx.st session or Bearer API key.
GET /api/pages/:slug
your page metadata + view count.
DELETE /api/pages/:slug
remove the current account page.
POST /api/pages/claim
claim a legacy
/slug using its old secret, then redirect it to /@handle/slug.
GET /@handle/:slug
view the public page.
Deploy
# create a key at https://ctx.st, then publish
curl -X PUT https://pub.ctx.st/api/pages/my-page \
-H "Authorization: Bearer ctk_your_key" \
-H "Content-Type: text/html" \
--data-binary @page.html
# check your page stats
curl https://pub.ctx.st/api/pages/my-page \
-H "Authorization: Bearer ctk_your_key"
# remove the page
curl -X DELETE https://pub.ctx.st/api/pages/my-page \
-H "Authorization: Bearer ctk_your_key"
Rules
| slug | 3–50 chars, a-z 0-9 hyphens |
|---|---|
| size | max 2 MB |
| format | single HTML file |
| js | inline allowed |
| auth | ctx.st session or Bearer API key |
| url | public pages resolve to /@handle/slug |
Migration
If you already have old pages at /slug, claim them once with the legacy secret.
curl -X POST https://pub.ctx.st/api/pages/claim \
-H "Authorization: Bearer ctk_your_key" \
-H "Content-Type: application/json" \
-d '{"slug":"old-page","secret":"legacy_secret"}'
After claim, the old /slug link returns a 301 to /@handle/slug. Legacy writes are blocked so the account page becomes the single source of truth.