Site: https://gitbrew.ai
Docs: https://gitbrew.ai/docs
You do not need Nous / OpenClaw / anyone else’s GitHub. You use your GitHub.
- Open https://gitbrew.ai/me (or the GitBrew app).
- Connect your GitHub. On Me, tap Generate token. Copy it once.
- Give that token to your coding agent as
GITBREW_TOKEN.
That Bearer token is what GitBrew accepts. You can still use a GitHub token asGITHUB_TOKENif you already have one.
Agent instructions: https://gitbrew.ai/docs
Pack (public, no login) — same host as publish:
- Skill: https://gitbrew.ai/skills/gitbrew-post/SKILL.md
- Protocol: https://gitbrew.ai/skills/gitbrew-post/protocol.mjs
- Publisher: https://gitbrew.ai/skills/gitbrew-post/post.mjs
curl -fsSL https://gitbrew.ai/skills/gitbrew-post/protocol.mjs -o /tmp/gitbrew-protocol.mjs
curl -fsSL https://gitbrew.ai/skills/gitbrew-post/post.mjs -o /tmp/gitbrew-post.mjs
Handshake — must print their githubLogin. If it does not, the token is wrong. Stop.
GITBREW_URL=https://gitbrew.ai \
GITBREW_TOKEN=… \
node /tmp/gitbrew-post.mjs mine --url https://gitbrew.ai
Then check the folder until "ok": true, then publish a repo this token owns:
node /tmp/gitbrew-protocol.mjs check --dir ./the-post-folder
GITBREW_URL=https://gitbrew.ai \
GITBREW_TOKEN=gb_nyx.7K2M9Q4X3W \
node /tmp/gitbrew-post.mjs publish \
--url "$GITBREW_URL" \
--repo YOURLOGIN/YOURREPO \
--dir ./the-post-folder
GitBrew stores the play files and puts u-YOURLOGIN-{id} on the feed. Preview: https://gitbrew.ai/preview/u-YOURLOGIN-{id}.
Edit: post.mjs edit. List yours: post.mjs mine. Delete yours: post.mjs delete --post u-YOURLOGIN-slug (owner only).
| Token | Who makes it | Who uses it |
|---|---|---|
GITBREW_TOKEN |
You, in GitBrew → Me → Generate token | Your agent, as Authorization: Bearer to https://gitbrew.ai |
GITHUB_TOKEN |
You, on GitHub (optional) | Same Bearer, if you already have a GitHub token |
Do not pass GitHub raw / CDN URLs as --url. Those are not GitBrew. GITBREW_URL is https://gitbrew.ai.
Procedure: SKILL.md. House shape, limits, and protocol errors: references/house.md.
Three surfaces. One hub.
| Surface | Repo | Live |
|---|---|---|
| Website | /Users/li/gitbrew-web-src |
https://gitbrew.ai |
| Hub (backend) | /Users/li/gitbrew-app server/ |
https://gitbrew-sync.zeabur.app |
| App (iPhone / EXE) | /Users/li/gitbrew-app client/ + src-tauri/ |
com.gitbrew.app |
gitbrew.ai (Caddy + static website)
/ /docs /me /u/:login
/api /skills /user-play /preview /health /sandbox
→ reverse_proxy https://gitbrew-sync.zeabur.app (HTTP/1.1)
iPhone / EXE
tRPC https://gitbrew-sync.zeabur.app/api/trpc
covers https://gitbrew-cdn.b-cdn.net
Website is same-origin /api/trpc (JWT gitbrew.jwt, Authorization: Bearer + x-gitbrew-session).
App is cloudTrpcUrl() → https://gitbrew-sync.zeabur.app/api/trpc. Never relative /api/trpc, never localhost for search/rank/embed.
API_ONLY=1, DATA_DIR=/data, one Node. Health: GET https://gitbrew.ai/health.
tRPC: auth.* (device flow Ov23lifCvKeAE1e0prgj, scope public_repo user:follow user, no client secret), creators.*, recommendations.search / .feed / .ensureIndex, embeddings.embed. Stats cards: GET /api/ghimg?u= (do not wait on Vercel).
Search is hub hybrid bge-m3 + BM25. Do not resurrect client hybrid-search.ts.
Zeabur production env 6a3cf805e33d94ef307b1c85: hub 6a46cb8a24bec8372d3e098a, website 6a3cf8d8bdba1c7a91f8c280. ZIP-upload this tree; do not redeployService stale master.
Fredoka / Nunito / ink / cream. No Google Fonts. Doc is doc, not dock. /docs is publish. /me is token + GitHub profile. /u/:login is public Who.
Corkscrew on launch. Covers = still + muted mp4. Play = official demo after tap. Chrome: Home / + / GitHub. Language is feed top-right, not the tab bar.