How it works¶
Your data stays in GitHub¶
Signed Off stores all checklist state inside the bot's comment on the issue — there is no external database. When you mark an item done, the app updates the comment body. When you read the badge or open the editor, the app reads from that same comment.
This means your checklist data lives entirely within GitHub, under your org's own data residency and access controls. Any repo collaborator with comment-edit access can see the raw state at any time.
Templates live in your repos¶
Templates are Markdown files you commit to your repositories. The app picks the right template when an issue is opened by checking three locations in order:
| Priority | Location | Purpose |
|---|---|---|
| 1 | {issue-repo}/.github/CHECKLIST/{type}.md |
Repo-specific override |
| 2 | {org}/.github-private/.github/CHECKLIST/{type}.md |
Org-wide private default |
| 3 | {org}/.github/.github/CHECKLIST/{type}.md |
Org-wide public default |
The first file found wins. If nothing is found, a built-in minimal checklist is used. This lets you define org-wide defaults once and let individual repos customise them — or lock certain repos out of overriding at all via repoOverrides in your config.
Progress survives type changes¶
If an issue's type is changed after the checklist has been posted, the app re-resolves the template for the new type and merges it with the existing state. Items whose label text matches carry their status forward — done stays done, exceptions stay approved. New items are added as pending; removed items are dropped.
The app posts a summary comment: "3 items added, 1 removed, 5 carried over."
The same merge happens when an issue is transferred to a different repo — the template is re-resolved from the destination repo's context.
One comment, always up to date¶
The app posts exactly one comment per issue and updates it in-place. You won't see a stream of bot comments as the checklist changes — just a single comment that reflects the current state at all times.