← All case studies

Case Study

OneNote-to-Jira Migration Pipeline (Python + Forge)

A Python parser and a companion Forge app I built end-to-end that turned messy OneNote case histories into clean JSON, then into properly formatted Jira issues — without hitting Forge's 25-second timeout.

  • Forge
  • Python
  • Jira
  • Data Migration
  • No Forge timeouts on large case files Reliability
  • Full row-level case histories preserved as Jira comments Fidelity
  • One JSON schema reused across migration batches Reusability

Problem

  • OneNote case histories were unstructured — summary, case number, and dated activity rows were laid out visually, not as data.
  • Manual re-entry into Jira would have taken weeks and lost the row-level history.
  • A naive "create issue + add all comments in one call" Forge resolver hit the 25-second timeout on larger files.

What I built

  • Two-step resolver workflow — create tasks first, add comments second — to stay under Forge's 25-second timeout.
  • Configurable target project, issue type, and optional custom-field mapping for case numbers.
  • Per-row formatted comments with date prefixes and emoji-tagged communication types.

Stack

  • Python (OneNote → JSON parser)
  • Atlassian Forge (Node.js resolvers + Custom UI React)
  • Jira REST API (issues, attachments, custom fields)
  • JSON as the interchange format

My role

  • Sole engineer — Python parser, schema design, Forge backend, and Forge UI
  • Wrote the Python script that parsed OneNote exports into a normalized JSON schema
  • Designed the section / case-number / rows data model used by both sides
  • Built the Forge app — Node.js resolvers, React Custom UI, two-step workflow

Security

  • Runs on Atlassian infrastructure (Forge)
  • Scoped Jira permissions — read attachments, read/write work items, read projects and users
  • Source data stays inside Atlassian Cloud once imported

Client details withheld under NDA. Built end-to-end while employed at a former Atlassian consultancy; IP belongs to that company.

Want something like this for your team?

Book a call →