keelapps

keelapps/Signoff/Documentation

Documentation

Signoff adds one concept to Confluence: a page-version approval. Everything else — policies, expiry, the inbox, the audit trail — exists to create those approvals honestly and keep them honest afterwards.

Requesting sign-off

Open the page and click the Signoff badge in the byline, then Request approval. The form offers:

The request pins the page's current version number. That number is what the eventual approval covers — not “the page”, but “the page as it stood”.

Deciding

Approvers act from the page byline or the approvals inbox: Approve or Request changes, optionally with a comment. Only listed approvers can decide, each decides once, and the requester may cancel an open request at any time. Every action is recorded in the page's history.

The status ladder

The badge is computed fresh on every render by comparing the stored approval with the live page — status is never written down, so it can never go stale:

BadgeMeaning
Not submittedNo approval has ever been requested.
In reviewA request is open and waiting on approvers.
Approved · vNThe live version equals the approved version.
Approved · page changedThe page has moved past the approved version.
Re-approval dueThe approval's validity has run out.
Changes requestedThe last request was declined.

Editing a page never deletes an approval record — the badge simply reports that approval is behind, and offers re-approval in one click.

Policies

A policy names approvers, a mode, and how long an approval stays valid. Site admins define policies once under Settings → Signoff; space admins bind their space to one under Space settings → Signoff — or do nothing and inherit the site default. Binding is a pointer, never a copy: editing a policy changes every bound space at once.

An enforced policy locks approvers and mode — requesters cannot change them. Use it for the spaces where the approver list is the point.

Expiry and re-approval

A policy can give approvals a validity of 3, 6, 12 or 24 months. Expiry is part of the computed status, so it takes effect the moment the clock passes — and a daily scan additionally maintains a site-wide “due for re-approval” list for admins, plus a personal slice in each signer's inbox.

The approvals inbox

Apps → Approvals shows three strictly personal lists: requests waiting on you (decide right there), requests you opened, and approvals you signed that have since expired. Site-wide views live with site admins, not here.

Notifications

When approval is requested or decided, Signoff posts a footer comment on the page @-mentioning the people who need to know. The mention is what reaches them — through Confluence's own bell and email, honouring each person's notification settings. The comment doubles as a visible approval trail on the page itself. Site admins can switch the comments off; the inbox then carries the load alone.

The audit export

Settings → Signoff → Audit export generates a CSV of every request, decision and cancellation across the site: timestamp, event, page, space, page version, actor, comment. Paste it into the auditor's spreadsheet and be done.

Permissions and scopes

The app requests four scopes, and the one write is deliberate:

Signoff never edits page content, never creates page versions, never changes permissions, and declares no external network access.

Questions we expect

Does approving lock the page?
No. Signoff records truth; it does not restrict editing. If someone edits an approved page, the badge says so — which in practice is the enforcement most teams actually want.
What happens if an approver leaves the company?
Their name stays on past approvals (stored alongside the account id). Open requests they never decided can be cancelled by the requester and re-issued to someone else.
Can I approve my own page?
You can be an approver of your own request, but never the only one.
Does it work with page restrictions?
Yes. Signoff reads pages with its own app permission and stores only titles and version numbers; who can see the page itself remains entirely Confluence's decision.