objdiff & GitHub App

Projects using objdiff can send its report.json as it is, the same file decomp.dev used.

Sending objdiff reports

POST the report to the progress API like any other report. It's detected automatically (or force it with ?format=objdiff). objdiff reports don't include a commit or a version, so pass them in the URL: ?commit=…&version=us. With every function in it the report can be several megabytes, so send it gzip-compressed:

- name: Generate progress report
  run: objdiff-cli report generate -o report.json

- name: Send progress to decompilati.onl
  if: github.ref == 'refs/heads/main'
  run: |
    gzip -kf report.json
    curl --fail -sS -X POST "$BASE/api/v1/progress?commit=$GITHUB_SHA" \
      -H "Authorization: Bearer ${{ secrets.DECOMP_API_KEY }}" \
      -H "Content-Encoding: gzip" \
      --data-binary @report.json.gz
  env:
    BASE: https://decompilati.onl

How the numbers are read

objdiffdecompilati.onl
matched codematching code
fuzzy match beyond matched codepartially matching code (an estimate: objdiff has no exact figure for it)
matched datadata
matched / total functionsfunctions
progress_categoriesareas, with their units inside

Only JSON reports are supported, not binary protobuf ones.

The GitHub App

Instead of sending reports, you can let the site fetch them: install the GitHub App on the repository and upload the report as a GitHub Actions artifact named <version>_report. No API key is needed.

- name: Upload progress report
  uses: actions/upload-artifact@v4
  with:
    name: us_report
    path: report.json

When a workflow run on the default branch finishes successfully, every <version>_report artifact in it is imported as that version (an artifact named just report goes to the unnamed version), with the run's commit.

Importing past runs

With the app installed, the project's dashboard page has an "Import history from GitHub Actions" button. It imports the report artifacts of past successful runs on the default branch, oldest first, each at the time of its run. GitHub deletes artifacts after their retention period (90 days by default); for older history, backfill through the API.