Inspiration

When someone leaves a team, changes projects, or goes on long leave, the promises they made, the decisions they took and why, the blockers they hit, and the “only I know where that account lives” knowledge usually live in their head and in scattered Jira comments, Confluence pages, and chat. Handover docs are often written on the last day and miss things. Marketplace apps we looked at focus more on shift handoffs or offboarding checklists than on quietly capturing work context all year and turning it into a sourced handover page. Baton is built for that everyday accumulation → Friday confirm → one-click handover flow.

What it does

Baton is a Forge app for Jira (required) and Confluence (optional but used for handover pages).

  • Capture: Jira comment triggers, Confluence page/comment triggers, and optional Slack Events. Text passes an opt-in check, admin exclusions, and a keyword/date pre-filter (~200 zh/en keywords), then async classification (Google Gemini free tier when configured).
  • Remember this: Jira issue panel, Confluence content action, and the Baton page can save items straight to private Work Memory.
  • Review → Memory: Candidates are confirmed, edited, or deleted. Fridays surface a weekly review with one-click confirm-all when pending items exist.
  • My Week / 本週: Lists completed this week, not yet completed (open + overdue), next week’s dated schedule, and undated items under To be scheduled / 待安排. Completed items are never overdue; generated handover summaries are not tasks.
  • Calendar + today flag: Month view with status-coloured dots; opening Baton can show a flag for overdue / today / tomorrow items.
  • Weekly email: Hourly scheduled trigger; default Friday 16:00 Asia/Taipei (per-user day/time). Settings shows the exact recipient. Primary path: Jira issue notify to the Atlassian account email (no API key). Secondary: Brevo/Resend only for a typed non-Atlassian address. Send test email now button for verification.
  • Send to team board: Opt-in creation of a Jira issue with reason and source link.
  • One-click handover package: Confluence page with WIP, open promises, decisions, blockers, knowledge, responsibilities (each with source), document completeness check, and a first-week list of up to five urgent items.
  • Privacy: Passive capture off by default; EN/中文 UI; admin exclusions; secret-like strings masked before Gemini; Slack DMs never read; app never posts to Slack.

How we built it

  • Forge modules: jira:issuePanel, jira:globalPage, jira:adminPage, confluence:contentAction, product triggers, Slack webtrigger, hourly scheduledTrigger, and an async consumer classify queue.
  • Runtime: Node.js 24 on Forge; UI Kit React frontends; Custom Entity Store (candidate, memory) + KVS for settings / weekly-email index.
  • Classification pipeline: keyword/date pre-filter → queue → masker → Gemini (or needs-review fallback); local date parsing for phrases like “tomorrow 6 pm”, “next Wednesday”, 12/5, and Chinese dates.
  • Handover: Confluence REST to create storage HTML with sections, completeness check, and first-week list.
  • Weekly mail: Jira issue/notify as the app (asApp) so the signed-in user can be a recipient; optional Brevo/Resend via declared Forge egress.
  • Tests: Jest suites covering pure logic, repository (in-memory), Slack, weekly report, and demo seed (151 tests passing).

Challenges we ran into

  • Forge has no API to email arbitrary addresses; Jira notify only emails Atlassian users and needs a viewable issue. Sending notify as the user removes that user from recipients (400 “No recipients were defined”), so notify must run asApp.
  • Reading the account email needs read:email-address:jira and still may return empty under privacy settings; the UI must ask for a manual address and never guess.
  • External egress (generativelanguage.googleapis.com, slack.com, api.brevo.com, api.resend.com) is required for optional Gemini/Slack/external mail, which makes the app ineligible for the “Runs on Atlassian” badge while still allowing Sharing install links.
  • Keeping completed items out of “overdue” and excluding generated handover summaries from task lists required shared task rules used by the weekly report, flags, and handover.

Accomplishments that we're proud of

  • End-to-end Forge product: capture → review → Work Memory → calendar → weekly report/email → board send → Confluence handover, with EN/中文 UI and privacy defaults.
  • Weekly report that mirrors the in-app This week sections and exposes a Settings test send with an explicit recipient line.
  • Automated Jest coverage for the core logic paths (including weekly report).

What we learned

  • Forge distribution for judges requires a production deploy plus Developer Console Sharing (not only a development install on the builder’s site).
  • Product email on Forge usually means composing on top of Jira notify or a declared external provider—not a first-party Forge mail API.
  • Opt-in capture, keyword pre-filter, and masking matter as much as the LLM call for trust.

What's next

  • Harden weekly-email delivery confirmation beyond Jira’s queue response.
  • Optional path toward less egress (e.g. Atlassian-hosted AI) for stronger data-residency positioning.
  • Optional Microsoft Teams capture (called out in the product story as future work).
  • Marketplace listing only if the team chooses that path after the hackathon (separate from Sharing).

Rovo support (optional, requires a Rovo-enabled Atlassian plan)

Already available (shipped in the app): Baton includes a Rovo agent (rovo:agent, “Baton”) with three actions, usable from Rovo Chat on Rovo-enabled sites:

  • Remember an item — save something to your private Work Memory by chat.
  • Search Work Memory — answer from your own memory, with source links.
  • List open items — list your unfinished handover items.

The agent reads only the signed-in user’s own memory. It is not shown in the demo video because the demo site does not have Rovo; free developer sites usually do not show Rovo agents.

Possible extensions with Rovo (planned, not built):

  • Ask Rovo to draft the handover pack summary.
  • Answer a successor’s questions from the handover pack.
  • Suggest due dates and owners for captured promises.
  • Deliver the weekly report in chat.
  • Search decisions across sites.
Share this project:

Updates

Submission history