GitHub bot and API server for GitSafe. Handles webhook events, parses natural-language commands, and submits transactions to the vault program on Solana.
api-server/ Express 5 API server + GitHub bot webhook handler
db/ PostgreSQL schema (Drizzle ORM)
api-spec/ OpenAPI 3.1 spec (source of truth for API contract)
api-zod/ Generated Zod schemas from OpenAPI spec
scripts/ Utility scripts
- User mentions
@gitsafebotin a GitHub Issue or PR comment - GitHub sends a webhook to
POST /api/webhook - Server verifies HMAC signature
- Claude Haiku parses the natural-language command into structured intent
- Relayer builds and submits the transaction using the user's encrypted execution keypair
- Bot replies to the thread with a plain-English receipt including a Solscan link
GitHub Comment
│
▼ HMAC-SHA256 webhook
API Server (/api/webhook)
│
▼ sender.id (Permanent GitHub User ID)
Claude Haiku ──► JSON intent + confidence score
│
▼ confidence ≥ 0.92
Relayer ──► Solana Program (PDA vault)
│
▼ tx signature
Bot replies to issue thread
- Node.js 20+
- pnpm 10+
- PostgreSQL 15+
- Solana wallet (relayer keypair)
pnpm installCreate .env in api-server/:
# GitHub App
GITHUB_APP_ID=
GITHUB_APP_PEM=
GITHUB_WEBHOOK_SECRET=
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
# Solana
SOLANA_NETWORK=mainnet # mainnet | devnet
SOLANA_RPC_URL= # override default RPC
SOLANA_MAINNET_RPC_URL=https://api.mainnet-beta.solana.com
SOLANA_DEVNET_RPC_URL=https://api.devnet.solana.com
GITSAFE_PROGRAM_ID= # deployed program address
# Relayer
RELAYER_PRIVATE_KEY= # base58 Solana keypair
RELAYER_ENCRYPTION_KEY= # AES-256 key for user keypair encryption
# AI
AI_INTEGRATIONS_ANTHROPIC_API_KEY=
AI_INTEGRATIONS_ANTHROPIC_BASE_URL= # optional override
# Database
DATABASE_URL=postgresql://...
# Session
SESSION_SECRET=
# App
PORT=3000
APP_URL=https://gitsafe.iopnpm dev@gitsafebot help
@gitsafebot balance
@gitsafebot deposit <amount> <token>
@gitsafebot withdraw <amount> <token> to <address>
@gitsafebot swap <amount> <token_in> for <token_out>
@gitsafebot transfer <amount> <token> to @username
@gitsafebot create project "<name>" with <amount> <token> budget
@gitsafebot assign this to @username with <amount> <token> bounty
@gitsafebot project "<name>" status
@gitsafebot cancel task #<id>
| Token | safeToken | Network |
|---|---|---|
| USDC | safeUSDC | Solana Mainnet |
| SOL | safeSOL | Solana Mainnet |
| USDT | safeUSDT | Solana Mainnet |
| JTO | safeJTO | Solana Mainnet |
Apache 2.0