Skip to content

Linked accounts and inbox delivery

Work reaches hangar from GitHub (issue labels, /hangar comments), Slack, and Jira intake. Each sender is an account there, not a hangar person, until an admin links them. This page links them, says what a link changes, and how the inbox reaches a person. The rest of the setup is on team setup.

hangar person link alice github alice-gh           # a GitHub login, stored as its numeric user id
hangar person link alice slack T0123ABCD/U012AB3CD # workspace/user id (profile → ⋯ → Copy member ID)
hangar person link alice jira 5b10ac8d82e05b22cc7d4ef5   # an Atlassian account id (Data Center: the user key)
hangar person link alice email alice@acme.com      # a Jira user known only by email
hangar person link owner github sean               # you, too: the owner exists without being added
hangar person unlink alice github alice-gh

Ids that don't change hands

Links use ids that don't change hands. A GitHub login is looked up once, when you link it, with the control plane's GitHub token (https://api.github.com/users/<login>). It is stored as the account's numeric id: a login can be renamed, and whoever registers the old one is not your teammate. Without a GitHub token, link by the id itself.

A Slack user id is unique only within its workspace, so a link names both (T…/U…). In a Slack Connect channel the poster's own workspace counts.

Only admins link, and hangar doesn't check that the account is the person's: you vouch for it. Link an account you've seen the person use, for example by asking them to comment from it.

A job from a linked account runs for that person:

  • it uses their own login when they have one, else the team's (whose login a job uses);
  • it counts against their caps (running jobs, sessions, sandboxes) and their daily budget (HANGAR_PERSON_MAX_USD_PER_DAY), not a separate bucket per account;
  • it is theirs to see and act on over MCP (list_jobs, get_job, follow_up_job, cancel_job), as their own work is.

A job from an account linked to nobody runs for the team: team credentials, no person's caps, visible to admins only. hangar doctor names the senders who start jobs often but are linked to nobody. Who may start and continue work is on who is trusted.

Inbox delivery: DMs and the digest

What needs someone (the inbox) reaches them in Slack through their linked Slack account. They get a DM for each new agent question or approval, and a digest at 10:15 and 16:00 on weekdays.

Someone without a linked Slack account gets nothing, and hangar doctor lists them under "inbox not delivered". The Slack app needs the im:write scope (inbox DMs).

hangar person set alice --dm questions          # the default: her own agents' questions and approvals, at once
hangar person set alice --dm off                # no DMs and no digest (the inbox itself is unchanged)
hangar person set sean --dm all                 # an admin who also wants the team's (GitHub, Slack, webhook jobs)
hangar person set alice --tz Europe/Berlin --digest 09:30,16:00   # local times; --digest "" turns it off
hangar person set alice --digest-weekends       # the digest on Saturdays and Sundays too
hangar person set alice --quiet 20:00-08:00     # hold DMs in this window of her day; --quiet "" clears it
Setting Default
--dm questions off, questions (their own work), or all (admins: also the work nobody in particular owns, so not every admin is paged for every team question)
--tz America/New_York IANA time zone for the digest and the quiet window
--digest 10:15,16:00 Local digest times (up to 6); empty for none
--digest-weekends off Weekends are skipped unless set
--quiet none HH:MM-HH:MM in their time zone. DMs wait until it ends, except an approval that would expire first

Anyone may change their own settings; admins anyone's (PUT /api/people/{id}/delivery).