SyncUp is a prototype microservice that synchronizes new GitHub issues with ClickUp task lists.
This service acts as a backend intermediary: it receives GitHub webhooks, verifies their authenticity, and automatically creates tasks in ClickUp based on repository configuration.
⚠️ Important: This is not an official service of ClickUp or GitHub. It is a development prototype intended for local testing only.
Currently, it only handles
openedissue events from GitHub and is intended for local development. Automatic installation and production deployment are planned for future versions.
- The user calls the endpoint
/connecton the service. - SyncUp generates a
stateand redirects the user to ClickUp for authorization. - ClickUp redirects to the
/authendpoint of the microservice with acode. - The microservice exchanges the
codefor an access token and stores it internally. - GitHub sends webhooks when a new issue is created (
opened). - SyncUp validates the webhook signature, identifies the ClickUp list associated with the repository, and automatically creates the task.
PORT=1234
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_USERNAME=default
REDIS_PASSWORD=12345
GITHUB_WEBHOOK_SECRET=your_secret
CLICKUP_CLIENT_ID=your_client_id
CLICKUP_CLIENT_SECRET=your_client_secret{
"repos": {
"SammyBytes/CodeLink": {
"list_id": "901112081070"
},
"user/repo2": {
"list_id": "clickup_list_2"
}
}
}Keys must be match GitHub's
repository.full_name.
- BunJS: Runtime to run the microservice.
- Hono: Lightweight HTTP framework for endpoints.
- ioredis: Redis client for storing tokens and temporary states.
- node-fetch / fetch: To call the ClickUp API.
- crypto: Validate GitHub HMAC signatures and generate OAuth
state. - pino: Logging library.
- zod: Data validation and parsing.
- hono-rate-limiter: Middleware for rate limiting using Redis.
"scripts": {
"dev": "bun run --watch src/Server.ts",
"build": "bun build src/Server.ts --outdir dist --target bun",
"start": "bun run dist/Server.js"
}bun install
bun run dev- Server runs at
http://localhost:1234. - Call
/connectto start ClickUp authorization. - Currently, tasks are only created for
openedissues.
To receive GitHub webhooks locally, you need a proxy like Smee.io.
npm install -g smee-clientsmee --url https://smee.io/SSJ71U915lnucEk9 --path /api/v1/webhook/issues --port 1234--url: The public URL provided by Smee to receive GitHub webhooks.--path: Local path where your microservice listens for webhooks (should match/webhook/issues).--port: Local port where the proxy runs (should match your microservicePORT=1234).
Smee forwards GitHub webhooks from the public URL to your local service, enabling you to test the integration without a public server.
-
This project is a development prototype for testing GitHub → ClickUp integration locally.
-
Users only need to call
/connectto authorize their repository in ClickUp. -
ClickUp tokens are stored internally and used automatically when GitHub webhooks arrive.
-
Full installation, configuration, and production deployment are planned for future versions.
-
Finding the
list_idin ClickUp:- In the Sidebar, hover over the desired List and click the ellipsis
...menu. - Select Copy link.
- In the copied URL, locate the number that follows
/list/. This number is thelist_idto use inworkspace-config.json.
- In the Sidebar, hover over the desired List and click the ellipsis
-
Security: Ensure
GITHUB_WEBHOOK_SECRETis set to validate incoming webhooks. -
Rate Limiting: The service includes rate limiting to prevent abuse, allowing a maximum of 10 requests per minute per IP address.