1. Local inventory
Apache-2.0 open-source CLI. Export CycloneDX 1.6 JSON from installed Linux packages or application manifests. No account, root, network or project execution during collection.
Free · no account
Awarely Scan · API preview
One CLI for local SBOMs, on-demand CVE checks and synchronized inventory in Awarely Monitor. You choose when data leaves the machine.
Linux amd64 / arm64 · Apache-2.0 · No background agent · No root for collection
Apache-2.0 open-source CLI. Export CycloneDX 1.6 JSON from installed Linux packages or application manifests. No account, root, network or project execution during collection.
Free · no account
Explicitly submit inventory and receive JSON with CVE matches, versions, evidence and unevaluated components. Saved inventory stays unchanged and no email is sent.
Monitor Pro · check credential
Update only the authorized source. Shared components deduplicate across applications and other sources remain. Saved inventory supports reports and configured alerts.
Monitor Pro · sync credential
12 / 13 · amd64 / arm64
Inventory + check + sync
22.04 / 24.04 / 26.04 LTS · amd64 / arm64
Inventory + check + sync
8 / 9 / 10 · amd64 / arm64
Inventory + check + sync
8 / 9 / 10 · amd64 / arm64
Inventory + check + sync
2023 · amd64 / arm64
Inventory + check + sync
2 · amd64 / arm64
Inventory + sync; CVEs unevaluated
Checks use distribution identities and versions, including backported revisions. Unsupported packages, vendors or channels remain explicitly unevaluated. Applications: npm lockfiles v2/v3; package.json and requirements.txt produce partial inventories. A CVE match does not prove exploitability.
From a verified binary to a local SBOM, an API check or a saved inventory. All application names, paths, IDs and credentials in examples are fictional. v0.5.0-alpha.1
| Mode | Account / plan | What happens |
|---|---|---|
| Local file | No account; Apache-2.0 CLI | host/app writes CycloneDX 1.6 JSON locally. No network or CVE evaluation. |
| Upload in Assets | Monitor Pro or active Pro trial | Review the SBOM in the browser, apply changes and Save. |
| API check | Pro access + Check only credential | Returns a local JSON report. Does not save inventory or send alerts. |
| API sync | Pro access + Sync only or Check and sync credential | Immediately replaces only the authorized source in saved inventory. |
The release is an API preview. The same Linux binary supports amd64 and arm64 builds across the distributions below. Jenkins integration, containers, AMI/VHD images, Alpine and arbitrary binary scanning are not available. An offline Linux root directory is supported; an image file is not.
Read steps 2–3 first. Choose one distribution in step 4, then either upload (step 7), check (steps 8–9), or sync (steps 8 and 10). For application manifests, use step 6 instead of step 4.
uname -m
cat /etc/os-release
command -v curl tar sha256sum gh
gh attestation verify --helpDebian 12/13 and Ubuntu 22.04/24.04/26.04 — apt:
sudo apt-get update
sudo apt-get install -y ca-certificates curl tar coreutils
(
set -eu
GH_KEY_FILE=$(mktemp)
curl --proto '=https' --tlsv1.2 -fL \
https://cli.github.com/packages/githubcli-archive-keyring.gpg \
-o "$GH_KEY_FILE"
sudo install -d -m 755 /etc/apt/keyrings
sudo install -m 644 "$GH_KEY_FILE" /etc/apt/keyrings/githubcli-archive-keyring.gpg
rm "$GH_KEY_FILE"
printf 'deb [arch=%s signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main\n' "$(dpkg --print-architecture)" \
| sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt-get update
sudo apt-get install -y gh
)Rocky Linux 8/9/10, AlmaLinux 8/9/10 and Amazon Linux 2023 — check dnf --version. For DNF 4 use this block:
command -v curl >/dev/null || sudo dnf install -y curl
sudo dnf install -y ca-certificates tar coreutils 'dnf-command(config-manager)'
sudo dnf config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo dnf install -y ghOnly if dnf --version reports DNF 5, use this alternative instead of the DNF 4 block:
command -v curl >/dev/null || sudo dnf install -y curl
sudo dnf install -y ca-certificates tar coreutils dnf5-plugins
sudo dnf config-manager addrepo --from-repofile=https://cli.github.com/packages/rpm/gh-cli.repo
sudo dnf install -y ghAmazon Linux 2 — yum (inventory/sync only; CVE assessment remains unavailable):
command -v curl >/dev/null || sudo yum install -y curl
sudo yum install -y ca-certificates tar coreutils yum-utils
sudo yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo yum install -y ghIf GitHub CLI requests authentication for downloading/verifying public attestations, run gh auth login and follow its browser flow. This is GitHub authentication, separate from Monitor. Never paste an Awarely token into GitHub. On an offline server, do the download/verification on a trusted workstation and securely transfer the verified files.
gh attestation verify --helpThis pins the published preview release instead of silently downloading a changing latest version. Stop on any download, attestation or checksum failure. The outer checksum list contains both architectures; select only the archive you downloaded. Extraction happens only after verification.
umask 077
SCAN_WORK=$(mktemp -d "$HOME/awarely-scan.XXXXXXXX")
SCAN_BIN="$SCAN_WORK/release/awarely-scan"
(
set -eu
cd "$SCAN_WORK"
SCAN_VERSION=v0.5.0-alpha.1
case "$(uname -m)" in
x86_64) SCAN_ARCH=amd64 ;;
aarch64|arm64) SCAN_ARCH=arm64 ;;
*) echo "Unsupported architecture" >&2; exit 1 ;;
esac
SCAN_ARCHIVE="awarely-scan_${SCAN_VERSION}_linux_${SCAN_ARCH}.tar.gz"
SCAN_RELEASE="https://github.com/awarelyeu/awarely-sbom-scanner/releases/download/${SCAN_VERSION}"
curl --proto '=https' --tlsv1.2 -fL "$SCAN_RELEASE/$SCAN_ARCHIVE" -o "$SCAN_ARCHIVE"
curl --proto '=https' --tlsv1.2 -fL "$SCAN_RELEASE/SHA256SUMS" -o SHA256SUMS
gh attestation verify "$SCAN_ARCHIVE" \
--repo awarelyeu/awarely-sbom-scanner \
--signer-workflow awarelyeu/awarely-sbom-scanner/.github/workflows/release.yml \
--source-ref "refs/tags/$SCAN_VERSION"
awk -v file="$SCAN_ARCHIVE" '$2 == file { print; found=1 } END { if (!found) exit 1 }' SHA256SUMS > selected-SHA256SUMS
sha256sum --check selected-SHA256SUMS
mkdir release
tar -xzf "$SCAN_ARCHIVE" -C release
(cd release && sha256sum --check SHA256SUMS)
"$SCAN_BIN" version
"$SCAN_BIN" help
printf 'Working directory: %s\n' "$SCAN_WORK"
)Keep SCAN_WORK and SCAN_BIN for the next steps. Each output path must be new: the scanner never overwrites an existing report. Choose a new private directory for the next run. A future release is an explicit download and verification, not an automatic update.
If you open a new terminal later, restore the actual directory printed above: SCAN_WORK=/home/your-user/awarely-scan.YOUR_DIRECTORY and SCAN_BIN="$SCAN_WORK/release/awarely-scan". Replace the example path; do not create a new source just because the terminal session changed.
Supported inventory releases: 12, 13; Linux amd64/arm64. Complete steps 2–3 first. The distribution is detected automatically; there is no --distro flag or separate installer.
"$SCAN_BIN" host --name debian-13-web-01 \
--output "$SCAN_WORK/debian-13-web-01.cdx.json"Official Debian advisories use the installed source-package identity and Debian version ordering, including epochs and distribution revisions. Third-party builds and backports repositories need separate assessment.
For local-only use, stop here or upload this .cdx.json in step 7. For remote use, create and protect credentials using step 8, then choose one command below. Both commands require Check and sync permissions; a Check only token permits only the first. Read the full result using step 11.
Check only (no saved-inventory change):
"$SCAN_BIN" check --input "$SCAN_WORK/debian-13-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/debian-13-web-01.check.json"Optional: sync replaces this source in the saved inventory. Run only when that is your intended workflow and your token permits it:
"$SCAN_BIN" sync --input "$SCAN_WORK/debian-13-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/debian-13-web-01.receipt.json"Supported inventory releases: 22.04, 24.04, 26.04 LTS; Linux amd64/arm64. Complete steps 2–3 first. The distribution is detected automatically; there is no --distro flag or separate installer.
"$SCAN_BIN" host --name ubuntu-24-04-web-01 \
--output "$SCAN_WORK/ubuntu-24-04-web-01.cdx.json"Official Ubuntu data is evaluated using source packages and distribution versions. Some fixes require Ubuntu Pro; Awarely does not determine your entitlement. Unresolved assessments remain review candidates. PPAs and specialized channels are outside this assessment.
For local-only use, stop here or upload this .cdx.json in step 7. For remote use, create and protect credentials using step 8, then choose one command below. Both commands require Check and sync permissions; a Check only token permits only the first. Read the full result using step 11.
Check only (no saved-inventory change):
"$SCAN_BIN" check --input "$SCAN_WORK/ubuntu-24-04-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/ubuntu-24-04-web-01.check.json"Optional: sync replaces this source in the saved inventory. Run only when that is your intended workflow and your token permits it:
"$SCAN_BIN" sync --input "$SCAN_WORK/ubuntu-24-04-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/ubuntu-24-04-web-01.receipt.json"Supported inventory releases: 8, 9, 10; Linux amd64/arm64. Complete steps 2–3 first. The distribution is detected automatically; there is no --distro flag or separate installer.
"$SCAN_BIN" host --name rocky-9-web-01 \
--output "$SCAN_WORK/rocky-9-web-01.cdx.json"Official Rocky errata use exact binary package name, architecture, RPM epoch/version/release and module stream where present. EPEL, third-party vendors and packages absent from the catalog remain unevaluated. Published fixes do not cover every unfixed issue.
For local-only use, stop here or upload this .cdx.json in step 7. For remote use, create and protect credentials using step 8, then choose one command below. Both commands require Check and sync permissions; a Check only token permits only the first. Read the full result using step 11.
Check only (no saved-inventory change):
"$SCAN_BIN" check --input "$SCAN_WORK/rocky-9-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/rocky-9-web-01.check.json"Optional: sync replaces this source in the saved inventory. Run only when that is your intended workflow and your token permits it:
"$SCAN_BIN" sync --input "$SCAN_WORK/rocky-9-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/rocky-9-web-01.receipt.json"Supported inventory releases: 8, 9, 10; Linux amd64/arm64. Complete steps 2–3 first. The distribution is detected automatically; there is no --distro flag or separate installer.
"$SCAN_BIN" host --name alma-9-web-01 \
--output "$SCAN_WORK/alma-9-web-01.cdx.json"Official AlmaLinux errata use exact binary package name, architecture, RPM epoch/version/release and module stream where present. A package from another RPM distribution is not treated as AlmaLinux. EPEL and unknown vendors remain unevaluated.
For local-only use, stop here or upload this .cdx.json in step 7. For remote use, create and protect credentials using step 8, then choose one command below. Both commands require Check and sync permissions; a Check only token permits only the first. Read the full result using step 11.
Check only (no saved-inventory change):
"$SCAN_BIN" check --input "$SCAN_WORK/alma-9-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/alma-9-web-01.check.json"Optional: sync replaces this source in the saved inventory. Run only when that is your intended workflow and your token permits it:
"$SCAN_BIN" sync --input "$SCAN_WORK/alma-9-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/alma-9-web-01.receipt.json"Supported inventory releases: 2023; Linux amd64/arm64. Complete steps 2–3 first. The distribution is detected automatically; there is no --distro flag or separate installer.
"$SCAN_BIN" host --name al2023-web-01 \
--output "$SCAN_WORK/al2023-web-01.cdx.json"Official ALAS core-repository advisories are compared with installed RPM versions. NVIDIA, Extras, third-party packages and running livepatch state are outside this assessment. A pinned repository can require selecting a newer release to obtain the reported fixed package.
For local-only use, stop here or upload this .cdx.json in step 7. For remote use, create and protect credentials using step 8, then choose one command below. Both commands require Check and sync permissions; a Check only token permits only the first. Read the full result using step 11.
Check only (no saved-inventory change):
"$SCAN_BIN" check --input "$SCAN_WORK/al2023-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/al2023-web-01.check.json"Optional: sync replaces this source in the saved inventory. Run only when that is your intended workflow and your token permits it:
"$SCAN_BIN" sync --input "$SCAN_WORK/al2023-web-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/al2023-web-01.receipt.json"Supported inventory releases: 2; Linux amd64/arm64. Complete steps 2–3 first. The distribution is detected automatically; there is no --distro flag or separate installer.
"$SCAN_BIN" host --name al2-legacy-01 \
--output "$SCAN_WORK/al2-legacy-01.cdx.json"Inventory and synchronization only: the current release does not assess AL2 packages against AL2 CVE advisories. check returns an explicit end-of-life/unevaluated coverage gap. A zero match count is not a clean security result. Use a separately maintained assessment process and plan migration.
For local-only use, stop here or upload this .cdx.json in step 7. For remote use, create and protect credentials using step 8, then choose one command below. Both commands require Check and sync permissions; a Check only token permits only the first. Read the full result using step 11.
Check only (no saved-inventory change):
"$SCAN_BIN" check --input "$SCAN_WORK/al2-legacy-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/al2-legacy-01.check.json"Optional: sync replaces this source in the saved inventory. Run only when that is your intended workflow and your token permits it:
"$SCAN_BIN" sync --input "$SCAN_WORK/al2-legacy-01.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/al2-legacy-01.receipt.json"The default host profile selects common server software and its installed dependency closure. It does not collect every OS package. For DEB it includes nginx/apache2, OpenSSL, SSH, Node.js, Python, PHP, Java, databases and container runtimes; RPM uses distribution package names such as httpd. Missing optional members of this default profile are acceptable.
"$SCAN_BIN" host --select 'nginx*,openssl,openssh-server' \
--name demo-web --output "$SCAN_WORK/selected.cdx.json"
"$SCAN_BIN" host --all-packages \
--name demo-full --output "$SCAN_WORK/all-packages.cdx.json"
"$SCAN_BIN" host --root /srv/offline-linux-root \
--name demo-offline --output "$SCAN_WORK/offline.cdx.json"Choose one scope; --select and --all-packages cannot be combined. An unmatched custom selector or unresolved dependency makes collection partial (exit 3). Retry after package-manager activity finishes if the database is changing. Do not edit the live RPM/dpkg database or invent metadata to force a result. Offline roots must already be mounted/readable; the CLI does not mount or unpack images.
On any supported Linux host, select the project directory containing npm-shrinkwrap.json or package-lock.json v2/v3. The fallback package.json and requirements.txt are also readable, but always partial. No npm install, pip install or project scripts are executed.
"$SCAN_BIN" app --path /srv/demo-shop --name demo-shop \
--output "$SCAN_WORK/demo-shop.cdx.json"Lockfiles include resolved direct/transitive, development and optional entries; they do not prove deployment or installation. Workspace links are not followed. requirements.txt includes declared versions only; includes, URLs and dependency resolution are not followed. Partial files can be reviewed/uploaded or checked, but sync rejects them. pnpm/yarn/poetry lockfiles and automatic monorepo discovery are not supported.
Example transfer, run on the workstation that downloaded the configuration. Replace the fictional user, host and directory with your host and the exact SCAN_WORK directory printed on it. Skip the transfer when browser and CLI run on the same machine; move the downloaded file into SCAN_WORK instead.
scp ./awarely-credentials.json \
demo-user@demo-host.example.invalid:/home/demo-user/awarely-scan.REPLACE/awarely-credentials.jsonchmod 600 "$SCAN_WORK/awarely-credentials.json"
ls -l "$SCAN_WORK/awarely-credentials.json"The file must be a regular file owned by the account running the CLI, with no group/other permissions. Do not commit it, put the token in command arguments, echo it into logs or paste it into an SBOM. Keep the API origin supplied by Monitor; do not substitute a marketing URL.
Illustration only: this intentionally invalid configuration is not usable. All API addresses and secret values below are dummy placeholders. Use the downloaded configuration for real operations.
{
"schemaVersion": 1,
"apiUrl": "https://scanner-api.example.invalid",
"token": "DUMMY_TOKEN_NOT_VALID",
"applicationId": "DUMMY_APPLICATION_ID",
"sourceId": "DUMMY_SOURCE_ID"
}Use a Check only or Check and sync credential. Replace demo-shop.cdx.json with the file from your distribution section when scanning a host.
"$SCAN_BIN" check --input "$SCAN_WORK/demo-shop.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/demo-shop.check.json"Open the resulting JSON with a local viewer. summary gives totals; matches includes advisory IDs and affected component indexes, versions, precision and distribution evidence. coverage explains what was assessed or left unevaluated. Exit 0 means the request succeeded, even when matches exist. No inventory change or email is triggered. There is no automatic CI vulnerability-failure policy in this release.
Use Sync only or Check and sync. The snapshot must be complete for the selected inputs. check does not run automatically as part of sync.
"$SCAN_BIN" sync --input "$SCAN_WORK/demo-shop.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/demo-shop.receipt.json"Update packages through your normal distribution or application change-management process. Review the advisory’s fixed distribution version and repository availability; do not replace it with an upstream version guess. On AL2023, check the pinned release. This guide does not automatically upgrade your server.
The complete sequence below requires Check and sync permissions. Keep only the operations you intend to perform; sync changes the saved source.
"$SCAN_BIN" host --name demo-web \
--output "$SCAN_WORK/demo-web-after.cdx.json"
"$SCAN_BIN" check --input "$SCAN_WORK/demo-web-after.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/demo-web-after.check.json"
"$SCAN_BIN" sync --input "$SCAN_WORK/demo-web-after.cdx.json" \
--credentials "$SCAN_WORK/awarely-credentials.json" \
--output "$SCAN_WORK/demo-web-after.receipt.json"Use the same source credential and collection scope as before. For applications rerun app with the original --path instead of host. Compare findings and unevaluated coverage, refresh Assets and regenerate the report. Package inventory does not verify that a fixed kernel is running or that a service was restarted.
| Boundary | Limit |
|---|---|
| API request / cerere API | 5,000 components; 2 MiB normalized JSON |
| Organization inventory / inventar organizație | 5,000 unique identities; 50 applications; 2 MiB combined normalized data |
| Sources / surse | 50 per organization |
| Check / verificare | 6 requests/minute per organization and credential |
| Sync | 30 requests/minute per organization and credential; GET counts |
| Concurrent operations / operații simultane | 2 per organization per operation |
| Check response / răspuns verificare | 5 MiB; 2,000 advisory IDs; 10,000 component matches |
| Credential / token | 1–90 days; 100 active credentials |
| Local output / rezultat local | 5,000 components; 5 MiB |
These scanner budgets are separate from the general CVE API monthly allowance. Other gateway limits can return 429. The CLI does not automatically retry 429 or revision conflict 409. Respect Retry-After; spread scheduled work. Oversized results fail explicitly rather than truncate. A stale/corrupt/unavailable catalog fails instead of returning a clean report.
Sync reads a revision and uses an idempotency key. Bounded transport/503 retries reuse that request. On 409, inspect/recollect before retrying; never blindly overwrite another writer. For controlled automation, --expected-revision and --idempotency-key can be supplied explicitly. A missing local receipt after network/output failure is not proof that the remote write failed; inspect the saved source before repeating. See API documentation for the full contract.
| Symptom | Action |
|---|---|
| Exit 0 | Operation completed; inspect matches and coverage. It is not a no-vulnerabilities status. |
| Exit 2 | Check arguments, file format, supported distribution, credentials ownership/permissions and read access. |
| Exit 3 | Partial local inventory was written. Review warnings; upload/check for review, but do not sync. |
| Exit 4 | Use a new output filename in an owned writable directory. Existing files are preserved. |
| Exit 5 | Interrupted or deadline exceeded. Resolve host/network conditions before retrying. |
| Exit 6 | Remote operation failed. Read the API status/code without logging credentials. |
| HTTP 401 / 403 | Expired/revoked/invalid token, wrong scope or changed entitlement. Recreate the correct credential through Assets. |
| HTTP 409 | Another sync changed the source revision or an idempotency key was reused with different content. Inspect current inventory. |
| HTTP 413 / 422 | Reduce an over-limit scope, or resolve a partial/empty snapshot. Do not split snapshots by repeatedly overwriting one source. |
| HTTP 429 / 503 | Respect retry timing; check service availability. Do not remove safety limits or loop aggressively. |
| No package selected | Check actual package names and selector. --all-packages is an explicit alternative within limits. |
| A different host disappeared | Do not share one source between independent hosts. Give each its own source. |
No. Local collection is free and needs no account. Uploading to Assets, API CVE checks and inventory synchronization require Pro access or an active Pro trial.
The service did not assess that component. No match is not proof that it is unaffected. Amazon Linux 2 supports inventory and sync, but CVE assessment is not implemented in the current release.
Yes. Give independently maintained snapshots separate sources. The organization limit is 5,000 unique components and 50 applications; updating one source preserves other associations.
Not yet. The Linux binary, local commands and explicit API operations are available now. AMI/VHD image and container scanning are not offered.