Skip to main content
This guide moves a team from the standalone SCANOSS toolchain to Earnie. It replaces:
  • the scanoss/pre-commit-hooks pre-commit hook
  • local scanoss-py scans and their .scanoss/results.json output
  • triage in Code Compare, written into scanoss.json
  • the scanoss/actions-scan GitHub Action and its three policy checks
  • Dependency-Track as the place your policies, violations, and exceptions live
In Earnie, one product covers what that chain did: projects, scans, triage, organisation-wide policies, a merge gate, pull-request feedback, approvals, audit, and SBOM export. There’s no side-by-side mode. Earnie doesn’t run in parallel with the old chain to compare verdicts. Phases 1 to 3 leave your existing gate in force. Phase 4 switches it over in one pull request per repository.

What replaces what

Earnie also gives the same policies to coding agents over MCP. The legacy chain has no equivalent. See Earnie MCP.

The five phases

Each phase ends with one exit criterion. Don’t start the next phase until you meet it.

Phase 1: Connect and scan

Set up your organisation, then connect your Git provider and import the repositories you want to govern. Earnie connects to GitHub, including GitHub Enterprise Server, through the Earnie GitHub App. It connects to GitLab, on gitlab.com or self-managed, with an access token. Import all repositories on Settings → Integrations imports a whole organisation or group in one action. See Workspace setup and Connecting a repository. Exit criterion: every project in scope has one completed full-coverage scan of its default branch, and every connection on Settings → Integrations reads Healthy.
Expect a backlog on the first full scan. If you ran the GitHub Action in delta mode only, nothing has ever assessed your whole repository. The first full scan reports findings the legacy chain never showed you. That’s not a regression. Plan time to triage it.

Phase 2: Bring over your identifications

Earnie reads each repository’s committed scanoss.json on every scan. You don’t need to import it. Earnie records each settled finding in its audit trail and names the scanoss.json file as the source of the decision. See Component overrides. Watch the difference between declaring and accepting. In Code Compare, Include declared a component, and that satisfied the undeclared-component check. In Earnie, Confirm match records that the match is real, and the finding still counts towards your policies. A copyleft policy still catches a confirmed GPL component. Only Mark original removes a finding from the gate, and it means “this is our own code”, not “we accept this component”. To accept a real component that a policy flags, use a Policy Approval, covered in phase 3. Triage what remains in the Review Workspace. In Components mode, Bulk decide settles every open file of a component at once. Exit criterion: no project shows findings your team considers already decided, and your reviewers agree that what’s left open is real work.

Phase 3: Rebuild your policies

Rebuild your Dependency-Track policies as Earnie policies, using the equivalence table below. There’s no automatic Dependency-Track importer, because the fields, operators, and expression languages all differ. Start from Earnie’s built-in templates where you can. They cover the rules most teams gate on, and they’re quicker to review than a hand-written rule: Where your organisation has cryptography or AI provenance enabled, more templates are available. See Cryptography and AI provenance.
One copyleft policy becomes two. Dependency-Track ships one Copyleft licence group. Earnie separates strong copyleft from weak copyleft, and the two templates act differently. Strong copyleft gets Require approval, and weak copyleft gets Warn. If you enable only the first, Earnie stops gating every weak-copyleft licence you used to gate on, without any warning. Enable both, or write one policy on Copyleft if you want them treated alike.
A policy belongs to your organisation, and you attach it to the projects it should gate. A per-repository rule becomes a per-project attachment. You can’t override a policy for one project. To vary the rule itself, clone it. See Where a policy applies. Exit criterion: for each project, Earnie’s gate agrees with the Dependency-Track verdict on the same code, or your policy owner has written down and accepted every difference. To compare, use the read-only policy commands. They change nothing and never re-evaluate:

Phase 4: Switch the gate

In one pull request per repository:
  1. Add Earnie as a required status check.
  2. Remove the three Policy Check: * required checks.
  3. Delete the GitHub Action workflow and its Dependency-Track upload step.
Do all three in the same pull request. Branch protection names the legacy checks literally. A required check whose workflow you deleted never reports, and every pull request then waits for it forever. If both sets stay required, every pull request is gated twice. The Earnie check reports the gate like this: On a pull request, the findings the pull request introduced decide the check. The summary comment lists findings the default branch already carried, but they don’t hold the pull request. A neutral check means “not comparable”, not “pass”. It appears when Earnie has no completed scan of the default branch to compare against (No baseline to compare against; result is not conclusive), or when the default branch has moved since the pull request was scanned (Base branch moved; result is not conclusive). Push a commit, or re-run the scan, to get a real answer. See When the branch you’re merging into moves. An approval updates the pull request without a push. When an Admin grants a Policy Approval, Earnie updates that scan’s check and comments straight away. Earnie doesn’t re-scan anything, so the check turns green only if the approval cleared every violation holding the gate. Revoking an approval works the same way in reverse.
A skipped pull request gets no check at all. A project can skip draft pull requests, bot-authored pull requests, or pull requests outside chosen base branches or paths. Earnie never scans a skipped pull request, so a required Earnie check never arrives. Either leave those controls off where Earnie is required, or agree that those pull requests merge without an Earnie gate. See Choosing which pull requests Earnie checks.
On GitLab, Earnie can enforce a block only where your group’s plan allows it. See Merge blocking depends on your GitLab plan. Exit criterion: in each repository, one pull request has merged with Earnie as the only required policy check, no workflow still runs scanoss/actions-scan, and you have checked any pull-request filters against the repositories where Earnie is required.

Phase 5: Move developer tooling

Install the CLI wherever developers or pipelines need it:
Sign in once with earnie auth login. See Earnie CLI. Replace the pre-commit hook. If your repositories use the pre-commit framework, replace the scanoss/pre-commit-hooks entry in .pre-commit-config.yaml:
Then run pre-commit install --install-hooks and pre-commit run earnie once, so the framework downloads and verifies the pinned CLI before the first commit. Without the framework, run earnie hook install in each checkout instead. Either way, the hook runs earnie scan staged --format hook. It checks what you’ve staged in Git, not your working files, and creates a Self-check. A Self-check never adds findings or changes a project’s posture. By default, the hook reports a technical failure but lets the commit through. Technical failures include a network or authentication error and hitting the 60-second time limit. An Operator or Admin can make a technical failure stop the commit instead, at Project → Scan Configuration → Pre-commit technical failures. See When the check can’t run. Optionally, connect coding agents. earnie mcp setup connects Claude Code, Cursor, VS Code, or Codex to Earnie, so agents follow your policies while they write code. See Connecting an AI client. Finally, uninstall Code Compare. Exit criterion: no repository’s developer instructions still mention scanoss/pre-commit-hooks, Code Compare, or scanoss-py, and a test commit in each repository produces a Self-check in Earnie.

Dependency-Track to Earnie policies

This table covers the fifteen condition subjects of Dependency-Track’s classic policy model. It isn’t a complete account of every way a Dependency-Track instance can express a policy. In particular, Dependency-Track 5.0 adds expression-based policies, which no row below covers. Read each one and rewrite it. Earnie policies also use CEL, but the two object models differ, so you can rarely copy an expression across unchanged. List the policies in your own Dependency-Track instance first, and note its version. Use this table to translate what you find, not to decide what exists. Earnie also has fields that Dependency-Track lacks, which you may want to use in the rebuild: Dual Licensed, Patent Clauses, License Data Source, Component Status, Match Percentage, the finding’s State and Domain, and the whole cryptography and AI provenance field groups where enabled. earnie policy show <policy-slug> prints the exact expression a policy runs.

Violation states and exceptions

Start from what your pipeline does today. The legacy GitHub Action failed on any Dependency-Track violation, whatever its state. INFO, WARN, and FAIL all turned the check red, so in that pipeline every violation blocks. If your CI read Dependency-Track’s API or project badge directly instead, it could tell the states apart and gate on FAIL alone. Check which setup you’re replacing before you map anything. No rule translates one into the other. Choosing an Earnie action decides how your gate behaves, so make the choice with your policy owner: Whichever you choose, write down the mapping and the reason for it. Your build behaviour changes either way, and you’ll need the reason when the first unexpected green check appears. A Policy Approval records a justification category from CISA’s VEX categories, a written justification, the approver, an optional expiry, and any later revocation. Requesting an approval never changes the verdict. Only an Admin’s decision does. Each approval covers one finding. See Request an approval. Every scan also records the exact revision of each policy that judged it, so you can still see why a check failed months later.

What changes for your team

  • One check, not three. Branch protection names Earnie instead of the three Policy Check: * entries.
  • Decisions carry a name, a time, and a reason. A scanoss.json entry recorded none of those. Earnie records all three for every triage decision and Policy Approval, in the finding’s audit trail. See Audit log. earnie scan audit <scan-id> prints a scan’s own trail: its submission, its gate, approvals that moved it, and its publications to the pull request.
  • You fix findings in Earnie, not in files. Instead of pasting a scanoss.json snippet and pushing, you decide the finding or request an approval in Earnie, and the pull request updates without a push. A fix to the code itself still needs a push before Earnie can scan it.
  • No local results file. Earnie doesn’t write .scanoss/results.json. The hook prints a short summary and a link, and the results are in Earnie. Remove .scanoss/ from the repository and from .gitignore.
  • No upload to Dependency-Track. If other tools also feed Dependency-Track and you want to keep it, upload Earnie’s SBOM yourself. Run earnie export --bom-format cyclonedx --output sbom.json in a pipeline step, then upload the file with your own step. Dependency-Track’s project versions have no equivalent. One Earnie project is one codebase for its whole life.
  • Code Compare is retired as a scanner. The CLI sends source to your Earnie environment, and scanning and policy evaluation run there. By design, there’s no offline mode and no local policy evaluation.
  • Inline comments are limited. Earnie comments only on lines the pull request added, from Medium severity up, and at most ten per review by default. Findings it can’t place on a line go in the summary comment. See Inline comments on the changed lines.
  • Publishing is separate from the verdict. If GitHub or GitLab rejects Earnie’s write, the scan’s verdict still stands and the scan page offers Retry publication. Retrying never re-runs the scan.
  • Feedback appears on the pull request and in Earnie. Earnie doesn’t send policy-violation notifications by email or chat. If you relied on Dependency-Track’s notifications, plan a replacement.

Before you start

Check these against your setup before phase 1:
  • CWE policies can’t be rebuilt yet. See the table.
  • Policy migration is manual. There’s no Dependency-Track policy importer.
  • Approvals are per finding. A component matched in many files needs an approval for each finding a policy flags.
  • No sub-path or dependency-scope setting. In a monorepo, narrow a project’s scope with skip patterns.
  • bom.ignore isn’t applied. Repositories that rely on it will see those matches as findings to decide.

What’s next

Start phase 1 with Workspace setup, then connect your repositories.