Skip to content

Documentation

GitHub

Sponsors, issues and stars, each on the person it is about.

Three things happen on GitHub that are really things happening to a person: somebody starts sponsoring you, opens an issue, or stars your repository. Kicklace takes all three through one address.

  • A sponsor becomes a purchase on their record and moves them to Paying, the same as a payment from your own servers, so a sequence at Paying on your Lifecycle map thanks a sponsor too.
  • An issue becomes a message from the person who opened it, so you can write back from their record.
  • A star is recorded only if you switch it on, because a star isn't consent to anything.

There's no code to write. Kicklace changes nothing in GitHub, reads no code, and never reads the words inside an issue.

Signing in with GitHub is not a GitHub App with access to your repositories. A GitHub App with that access is a separate, optional install, for one thing: preparing a pull request when you set Kicklace up (How data gets in).

It's under Connections → GitHub, and only an owner or an admin can change it.

Connecting with your GitHub account

If your Kicklace shows Continue with GitHub on its sign-in card, that's the short way: sign in with GitHub, or connect your GitHub account from Connections, and Kicklace adds each webhook for you.

What Kicklace asks GitHub for, and nothing else:

Permission What it's for
read:user your profile, so GitHub knows whose account it is
read:org the repositories an organization you belong to owns
admin:repo_hook adding and removing webhooks on a repository you administer

repo isn't on that list, on purpose: it's the whole of a repository, and all Kicklace wants is a webhook. So a private repository is never listed. To watch one, add its webhook by hand (below).

Choosing the repositories

Under Repositories to watch are the ones you administer. Tick the ones you want and press Save: for each, Kicklace makes one webhook for Issues and Stars. Untick one and Kicklace takes its webhook away. A webhook you added yourself is never touched.

Reading your history

A webhook only hears what happens next. Read the history reads what's already there: everybody sponsoring you now, every stargazer (only if stars are switched on), and every issue already opened. Pull requests are skipped, and an issue's body is never read. Everything is dated by GitHub's own clock, nothing is sent for any of it, and it's safe to press twice.

Nobody is put on a list. Sponsoring you, opening an issue and starring a repository are none of them permission to email anybody.

The one webhook Kicklace can't make

Sponsorships arrive at a webhook on your account, not a repository, and GitHub's API has no way to make that one. So it's a by-hand step, below.

Setting it up by hand

This works everywhere, and it's the only way to add the sponsors webhook or a private repository's.

1. Make the address. Connections → GitHub → Connect GitHub gives you an address like https://<your Kicklace>/api/webhooks/github/<token>.

2. Add it in GitHub.

What you want Where the webhook goes
Sponsors Your sponsors → Dashboard → Webhooks → Add webhook
Issues and stars The repository's Settings → Webhooks → Add webhook

Paste the address as the Payload URL, set Content type to application/json, and choose Let me select individual events → Sponsorships, Issues, Stars. One address takes all three.

3. Use the same secret in both places. GitHub doesn't make a secret for you: the Secret box on that form is one you fill in. Type a long random secret there and paste the same one into Kicklace. It's locked away and never shown back. Until it's in, nothing is taken.

GitHub signs with X-Hub-Signature-256, an HMAC-SHA256 of the raw body. Kicklace refuses anything else, including the older SHA-1 X-Hub-Signature. There's one secret for the whole workspace; replacing it puts the new one on every webhook Kicklace made.

What lands

What GitHub sends What it becomes
sponsorship.created, monthly a purchase for the tier's amount, and a subscription started
sponsorship.created, one-time a purchase for the tier's amount
sponsorship.tier_changed the subscription renewed, at the new amount
sponsorship.cancelled the sponsorship ending, on their timeline
issues.opened a message: the title and a link
star.created nothing, unless stars are switched on

Everything else is answered 200 and ignored. A sponsorship is recorded in US dollars, because GitHub Sponsors is priced in dollars. Anything GitHub marks as a bot is skipped. Nothing lands twice.

Who it lands on

By their public email, when GitHub gives one, which is rarely. By their handle otherwise: a sponsor with no visible email is still written down, named after their handle.

The two become one when an email turns up. A sponsor who later signs up on your website is one person, not two. Two people who both have emails are never merged by themselves.

What's never read

An issue's body never reaches Kicklace, from a private repository or a public one. It can be long and carry a stack trace with a key in it. The title and the link are what land.

What a release changed

Where Vercel is connected too, Kicklace reads GitHub's compare of each production deploy against the one before, with the same grant: the commits, the pull requests they name, and the files they touched. It asks for no permission of its own for that.

Stars

Off by default. Record a star as a visit records that somebody was here and nothing more: no list, no move on your map, and no email because of it. Unstarring isn't recorded.

When something doesn't arrive

Every post GitHub makes shows on Connections → Your website → Your website's heartbeat, in plain words. The usual three:

  • No webhook secret is set for that endpoint yet: step 3 isn't done.
  • The signature did not hold: the secret in GitHub and the one in Kicklace aren't the same.
  • Not something Kicklace records: a ping, an issue being closed, a star with the switch off.

GitHub keeps its own log under Recent Deliveries on the webhook's page. Redelivering from there is safe.

Disconnecting stops the address answering and takes away every webhook Kicklace made. Everything already recorded stays.