Shipmark / Guides

How to generate an SBOM for a Flutter app

Updated 6 November 2026 · 7 min read

In short

  • Your pubspec.lock already lists every Dart and Flutter package in the app, with exact versions.
  • Turn it into a CycloneDX SBOM, then add the native side: ios/Podfile.lock and the Android Gradle dependencies.
  • Generate a new SBOM for every release and keep it with the app's technical documentation.

Why a Flutter app needs an SBOM now

The EU Cyber Resilience Act (Regulation (EU) 2024/2847) applies to software placed on the EU market as part of a commercial activity. That includes most mobile apps published by companies, even free ones.

Annex I, Part II asks manufacturers to identify and document the components of their product, including by drawing up a software bill of materials (SBOM) in a commonly used, machine-readable format, covering at least the top-level dependencies. The full requirements apply from 11 December 2027. Since 11 September 2026, actively exploited vulnerabilities must already be reported to ENISA within 24 hours, and an SBOM is how you find out quickly whether one affects your app.

Step 1. Find and read pubspec.lock

Every Flutter project has a pubspec.lock in its root, created by flutter pub get. For applications, Dart recommends committing it to version control, so it also tells you exactly what shipped in each release.

packages:
  http:
    dependency: "direct main"
    description:
      name: http
      url: "https://pub.dev"
    source: hosted
    version: "1.2.2"
  collection:
    dependency: transitive
    source: hosted
    version: "1.18.0"

Three fields matter for the SBOM:

FieldWhat it tells you
versionThe exact version resolved for the build.
dependencydirect main are your top-level dependencies, transitive are pulled in by others, and direct dev are build tools that do not ship in the app.
sourcehosted means pub.dev. git and path packages need extra care, because public vulnerability databases cannot match them by version.

Step 2. Turn it into a CycloneDX SBOM

Option A: in your browser, in seconds

Drop the file on the Shipmark free scanner. It reads pubspec.lock locally, builds a CycloneDX 1.6 SBOM with a package URL (pkg:pub/…) for every component, marks development-only packages as excluded and checks each version against OSV.dev. The file never leaves your browser.

Option B: in the terminal or in CI

To check the lockfile for known vulnerabilities from the command line, Google's OSV-Scanner reads it directly:

osv-scanner scan -L pubspec.lock

General-purpose SBOM generators such as cdxgen and Syft can also produce CycloneDX files. Check their documentation for the Dart ecosystem before relying on them in CI.

Step 3. Do not forget the native side

This is the part most Flutter SBOMs miss. Plugins such as camera, maps, payments or analytics bring native libraries with them, and those are not in pubspec.lock.

The Shipmark scanner accepts all three files, so you can produce one SBOM per platform and keep them together.

Step 4. Make it part of every release

Common questions

Do I have to publish the SBOM?

No. It belongs to the technical documentation and must be made available to market surveillance authorities on request. Sharing it with users is optional.

We are an agency. Is this our job or the client's?

Legally, the obligations sit with the manufacturer, usually the company that publishes the app under its own name. In practice, the team that maintains the code is the one that can produce the SBOM, so clients will ask their agency.

Does the Flutter SDK itself belong in the SBOM?

The Flutter and Dart SDKs appear in pubspec.lock only as source: sdk, without a usable version. Record the Flutter version you built with (from flutter --version) alongside the SBOM.

Generate your first Flutter SBOM in seconds. No account, and the file stays in your browser.

Open the free scanner

Also see: How to generate an SBOM for a React Native app. This guide summarises Regulation (EU) 2024/2847 for practical use. It is not legal advice.