UnityFreak delivers eight repository webhook events, signed with HMAC-SHA256 like GitHub's. The payloads are smaller: the field lists below are exactly what is sent. uf migrate webhook reshapes a delivery into the GitHub layout for the fields that exist.
push◐Partly supported
UnityFreak payload: { event, repoId, pusherUserId, updates: [{ ref, oldSha, newSha }], deliveryId }
One UnityFreak delivery can carry several ref updates; GitHub-shaped output has one object per update. The payload has no commit list, repository name or compare URL; fetch commits with git. Merge-queue candidate branches also produce push deliveries.
push payload fields and where they come from on UnityFreak| GitHub field | Status | From UnityFreak field |
|---|
ref | ✓Supported | updates[].ref |
|---|
before | ✓Supported | updates[].oldSha |
|---|
after | ✓Supported | updates[].newSha |
|---|
created | ◐Partly supported | updates[].oldShaderived: true when oldSha is all zeros |
|---|
deleted | ◐Partly supported | updates[].newShaderived: true when newSha is all zeros |
|---|
forced | ✕Not supported | not reported |
|---|
commits | ✕Not supported | no commit list; run git log oldSha..newSha |
|---|
head_commit | ✕Not supported | not reported |
|---|
compare | ✕Not supported | not reported |
|---|
base_ref | ✕Not supported | not reported |
|---|
pusher.name | ✕Not supported | only the user id is sent |
|---|
pusher.email | ✕Not supported | only the user id is sent |
|---|
sender.id | ◐Partly supported | pusherUserIda UUID string, not a number |
|---|
sender.login | ✕Not supported | only the user id is sent |
|---|
repository.id | ◐Partly supported | repoIda UUID string, not a number |
|---|
repository.full_name | ✕Not supported | the payload does not name the repository; put it in the webhook URL (for example ?repo=owner/slug) or pass it to the converter |
|---|
repository.name | ✕Not supported | see repository.full_name |
|---|
repository.owner.login | ✕Not supported | see repository.full_name |
|---|
jq recipe for the fields that carry over (delivery body on stdin):
jq -c '.updates[] | {ref, before: .oldSha, after: .newSha, created: (.oldSha | test("^0+$")), deleted: (.newSha | test("^0+$"))}'
pull_request◐Partly supported
UnityFreak payload: { event, action, number, title, sourceBranch, targetBranch, authorId, fromFork, sourceRepo?, label?, deliveryId }
UnityFreak sends only the actions opened, synchronize, labeled and unlabeled. Closing, merging, reopening, editing, marking ready, assigning and review requests produce NO webhook: watch the target branch's push event to learn that a merge landed.
GitHub actions that send nothing on UnityFreak: closed, reopened, edited, ready_for_review, converted_to_draft, assigned, unassigned, review_requested, review_request_removed, auto_merge_enabled, auto_merge_disabled, enqueued, dequeued, locked, unlocked, milestoned, demilestoned, stacked.
pull_request payload fields and where they come from on UnityFreak| GitHub field | Status | From UnityFreak field |
|---|
action | ◐Partly supported | actionopened, synchronize, labeled, unlabeled only |
|---|
number | ✓Supported | number |
|---|
pull_request.number | ✓Supported | number |
|---|
pull_request.title | ✓Supported | title |
|---|
pull_request.head.ref | ✓Supported | sourceBranch |
|---|
pull_request.base.ref | ✓Supported | targetBranch |
|---|
pull_request.user.id | ◐Partly supported | authorIda UUID string, not a number |
|---|
pull_request.head.repo.full_name | ◐Partly supported | sourceRepo.owner + '/' + sourceRepo.slugonly for a fork pull request; for a same-repository one the payload does not name the repository |
|---|
pull_request.head.repo.fork | ◐Partly supported | fromForkdifferent meaning: on GitHub the head repository is itself a fork of something; on UnityFreak fromFork says the pull request comes from a fork of THIS repository (the converter sets fork true then, false otherwise) |
|---|
pull_request.draft | ✕Not supported | not in the payload; GET the pull request |
|---|
pull_request.body | ✕Not supported | not in the payload; GET the pull request |
|---|
pull_request.merged | ✕Not supported | no merge event |
|---|
pull_request.head.sha | ✕Not supported | not in the payload; GET the pull request (liveHeadSha) |
|---|
pull_request.base.sha | ✕Not supported | not in the payload |
|---|
pull_request.html_url | ✕Not supported | build it as https://<host>/<owner>/<slug>/pulls/<number> |
|---|
pull_request.labels | ✕Not supported | only the label being added or removed is sent (label) |
|---|
label.id | ◐Partly supported | label.ida UUID string, not a number |
|---|
label.name | ✓Supported | label.name |
|---|
label.color | ✓Supported | label.color |
|---|
repository.full_name | ✕Not supported | the payload does not name the repository; see push |
|---|
sender.login | ✕Not supported | only authorId (the pull request's author) is sent, not who performed the action |
|---|
jq recipe for the fields that carry over (delivery body on stdin):
jq -c '{action, number, pull_request: {number, title, head: {ref: .sourceBranch}, base: {ref: .targetBranch}, user: {id: .authorId}}}'
UnityFreak payload: { event, pullRequestNumber, commentId, authorId, body, deliveryId }
UnityFreak's `comment` event is for pull request comments only and fires on creation only. It maps to GitHub's issue_comment on a pull request; line-anchored review comments (GitHub's pull_request_review_comment) are not told apart. Comments on repository issues send no webhook.
issue_comment payload fields and where they come from on UnityFreak| GitHub field | Status | From UnityFreak field |
|---|
action | ◐Partly supported | always created |
|---|
comment.id | ◐Partly supported | commentIda UUID string, not a number |
|---|
comment.body | ✓Supported | body |
|---|
comment.user.id | ◐Partly supported | authorIda UUID string, not a number |
|---|
issue.number | ✓Supported | pullRequestNumber |
|---|
issue.pull_request | ◐Partly supported | derived: always present, because every comment event is on a pull request |
|---|
comment.user.login | ✕Not supported | only the user id is sent |
|---|
comment.html_url | ✕Not supported | not sent |
|---|
jq recipe for the fields that carry over (delivery body on stdin):
jq -c '{action: "created", issue: {number: .pullRequestNumber, pull_request: {}}, comment: {id: .commentId, body, user: {id: .authorId}}}'
release◐Partly supported
UnityFreak payload: { event, action, releaseId, tagName, name, isDraft, isPrerelease, authorId, deliveryId }
UnityFreak sends `created` (a release created directly as published) and `published` (a draft being published). Draft creation is silent. Edited, deleted, unpublished, prereleased and released produce no webhook.
GitHub actions that send nothing on UnityFreak: edited, deleted, unpublished, prereleased, released.
release payload fields and where they come from on UnityFreak| GitHub field | Status | From UnityFreak field |
|---|
action | ◐Partly supported | actioncreated or published only |
|---|
release.id | ◐Partly supported | releaseIda UUID string, not a number |
|---|
release.tag_name | ✓Supported | tagName |
|---|
release.name | ✓Supported | name |
|---|
release.draft | ✓Supported | isDraft |
|---|
release.prerelease | ✓Supported | isPrerelease |
|---|
release.author.id | ◐Partly supported | authorIda UUID string, not a number |
|---|
release.body | ✕Not supported | not in the payload; GET the release |
|---|
release.assets | ✕Not supported | not in the payload; GET the release |
|---|
release.target_commitish | ✕Not supported | not in the payload |
|---|
jq recipe for the fields that carry over (delivery body on stdin):
jq -c '{action, release: {id: .releaseId, tag_name: .tagName, name, draft: .isDraft, prerelease: .isPrerelease}}'
status✓Supported
UnityFreak payload: { event, sha, context, state, description, targetUrl, creatorId, deliveryId }
Fired for every commit status, including the status mirror of each check run and the platform's own native checks (creatorId null).
status payload fields and where they come from on UnityFreak| GitHub field | Status | From UnityFreak field |
|---|
sha | ✓Supported | sha |
|---|
state | ✓Supported | state |
|---|
context | ✓Supported | context |
|---|
description | ✓Supported | description |
|---|
target_url | ✓Supported | targetUrl |
|---|
name | ✕Not supported | the converter fills it from the repository when given |
|---|
branches | ✕Not supported | not sent |
|---|
commit | ✕Not supported | not sent |
|---|
sender.id | ◐Partly supported | creatorIda UUID string, or null for a native check |
|---|
jq recipe for the fields that carry over (delivery body on stdin):
jq -c '{sha, state, context, description, target_url: .targetUrl}'
create✓Supported
UnityFreak payload: { event, repoId, refType: 'branch'|'tag', ref, pusherUserId, sha, deliveryId }
create payload fields and where they come from on UnityFreak| GitHub field | Status | From UnityFreak field |
|---|
ref | ✓Supported | refthe short name (no refs/heads/ prefix), as on GitHub |
|---|
ref_type | ✓Supported | refType |
|---|
master_branch | ✕Not supported | not sent |
|---|
description | ✕Not supported | not sent |
|---|
pusher_type | ✕Not supported | not sent |
|---|
jq recipe for the fields that carry over (delivery body on stdin):
jq -c '{ref, ref_type: .refType}'
delete✓Supported
UnityFreak payload: { event, repoId, refType, ref, pusherUserId, deliveryId }
delete payload fields and where they come from on UnityFreak| GitHub field | Status | From UnityFreak field |
|---|
ref | ✓Supported | ref |
|---|
ref_type | ✓Supported | refType |
|---|
pusher_type | ✕Not supported | not sent |
|---|
jq recipe for the fields that carry over (delivery body on stdin):
jq -c '{ref, ref_type: .refType}'
member◐Partly supported
UnityFreak payload: { event, action, userId, username, role, previousRole?, deliveryId }
Collaborator added, edited (role change) or removed. Roles are UnityFreak's, not GitHub's permission names.
member payload fields and where they come from on UnityFreak| GitHub field | Status | From UnityFreak field |
|---|
action | ✓Supported | action |
|---|
member.login | ✓Supported | username |
|---|
member.id | ◐Partly supported | userIda UUID string, not a number |
|---|
changes.permission.from | ◐Partly supported | previousRoleUnityFreak role names; edited only |
|---|
role | ◐Partly supported | roleno GitHub equivalent field; UnityFreak role name |
|---|
jq recipe for the fields that carry over (delivery body on stdin):
jq -c '{action, member: {login: .username, id: .userId}}'
ping◐Partly supported
A test delivery is sent when you press Test in the webhook settings. It is not a subscribable event.
ping payload fields and where they come from on UnityFreak| GitHub field | Status | From UnityFreak field |
|---|
zen | ✕Not supported | not sent |
|---|
hook_id | ✕Not supported | not sent |
|---|
check_run (UnityFreak: status)✕Not supported
There is no check_run webhook. A check run is mirrored as a commit status with the same name, so subscribe to `status` and treat context as the check name.
Events with no UnityFreak counterpart✕Not supported
GitHub: issues, pull_request_review, pull_request_review_comment, workflow_run, workflow_job, workflow_dispatch, deployment, deployment_status, fork, watch, star, repository, label, milestone, discussion, gollum, commit_comment, public, team, organization, installation, branch_protection_rule, code_scanning_alert, dependabot_alert, secret_scanning_alert, security_advisory, package, project, merge_group
UnityFreak delivers exactly eight repository webhook events: push, pull_request, comment, release, create, delete, status and member. Nothing else is sent, even for features that exist in the web app (issues, reviews, wiki).