Files
zeekay cacc1f4d92 rebrand clawhub → bothub + add self-hosted API backend
Migration from Convex/Vercel to self-hosted infrastructure:

API Backend (api/):
- Hono server with PostgreSQL (Drizzle ORM) + pgvector
- Skills CRUD, search (hybrid vector + lexical), auth (hanzo.id OAuth)
- Upload (MinIO S3), stars, comments, API tokens
- Rate limiting middleware, session management

Frontend Adapter (src/lib/):
- api.ts: REST API client replacing Convex SDK
- hooks.ts: React hooks replacing convex/react useQuery/useMutation
- AuthContext.tsx: Auth provider replacing ConvexAuthProvider

Deployment:
- Dockerfile (multi-stage: API build + web build + production)
- K8s manifests for hub.hanzo.bot on hanzo-k8s
- GitHub Actions CI/CD (build → GHCR → deploy)

Rebrand:
- clawhub/clawdhub/ClawHub → bothub/Bot Hub
- Domain: clawhub.ai → hub.hanzo.bot
- CLI: clawhub → bothub
- Package: @hanzo/bot-hub-api
2026-02-16 19:36:19 -08:00

1.3 KiB

summary, read_when
summary read_when
Discord webhook events/payloads for skill publish + highlight.
Working on webhooks/integrations

Webhooks (Discord)

Bot Hub can post Discord embeds when skills are published or highlighted.

Setup

Set the webhook URL in the Convex environment:

  • DISCORD_WEBHOOK_URL (required): Discord webhook URL.
  • DISCORD_WEBHOOK_HIGHLIGHTED_ONLY (optional): true to only send for highlighted skills.
  • SITE_URL (optional): Base site URL for links (default https://hub.hanzo.bot).

Events

  • skill.publish: fires on every publish (new or updated version).
  • skill.highlighted: fires when a skill is newly highlighted.

Highlight-only filter

When DISCORD_WEBHOOK_HIGHLIGHTED_ONLY=true:

  • skill.publish only sends if the skill is highlighted.
  • skill.highlighted always sends.

Payload (Discord)

Discord receives a JSON payload with a single embed:

{
  "embeds": [
    {
      "title": "Demo Skill",
      "description": "Nice skill",
      "url": "https://hub.hanzo.bot/owner/demo-skill",
      "fields": [
        { "name": "Version", "value": "v1.2.3", "inline": true },
        { "name": "Owner", "value": "@owner", "inline": true },
        { "name": "Tags", "value": "latest, discord", "inline": false }
      ],
      "footer": { "text": "Bot Hub" }
    }
  ]
}