Skip to content
ClearedStack

Tools · CLIN 0005 Tactical & DevSecOps

Offline Manifest Inspector

Planned

Read container manifests, package lockfiles and SBOMs with no network connection.

This tool is planned. There is nothing to open yet. What follows is the plan, and it can change before the tool ships. The guide below covers the same job by hand in the meantime. Jump to the full specification.

What it will do

Open a container image manifest, a package lockfile or a software bill of materials and read what is inside with no network connection: the components, their versions, their checksums and where each was resolved from. It is meant for reviewing what is about to be carried onto a closed network.

You bring

  • A container image manifest, a package lockfile or an SBOM

You get

  • The components, with their versions and checksums
  • The packages resolved from a public registry, which would need a mirror inside

Built from

Only material the government has officially released to the public. Where the rules live shows how to find and cite each one.

Do it by hand today

  • Working on disconnected networks · LockfilesThe checks you run by hand when nothing can phone home: checksums, transfer manifests, certificates, lockfiles and image digests.
  • STIGs, OSCAL and SBOMs · What an SBOM isThree machine-readable formats that security compliance work runs on: what each one is, what is inside the file and how to check one.

True of every tool

Free and open source.
No paid tier, no ads, and the code is public.
Runs in your browser.
What you type or open is not sent anywhere.
No tracking.
No accounts, cookies or analytics.
Shows its sources.
Each result names the rule it rests on, so you can check it.
Says what it does not do.
It is an aid for your own work, not professional advice.

What happens to what you type shows how to confirm this yourself, and Check a tool’s answer is the method for verifying a result.

Want it sooner?

Requests decide what is built first. Say what you would use it for, and what you do by hand today.

Issues are public. Leave out real contract data, real rates and anything controlled. How to write a useful request.

Specification · draft

How it is meant to work, in detail

The inputs, the logic, the checks the tool has to pass and the worked examples it is tested against. It is a draft, and the tool is built from it, so it can change until the tool ships.

4 min readLast revised November 2026Source of this specification

Overview & Role#

Offline Manifest Inspector (slug: offline-manifest-inspector, CLIN 0005 — Tactical & DevSecOps) is a client-side static inspection tool in the ClearedStack catalog. On disconnected or air-gapped networks, package managers (npm), container runtimes (containerd), and security scanners cannot reach public registries, OSV/NVD feeds, or remote metadata endpoints. Engineers must inspect what is inside a container image manifest, a dependency lockfile, or a Software Bill of Materials (SBOM) locally before importing artifacts into an enclave.

The tool runs entirely in the visitor's browser with zero backend dependencies, making it available in both the Full Enclave Stack (Conn + Lazarette) and Snapshot Mode (frozen static bundle). Consistent with ClearedStack's architecture, it assumes containerd and OCI archives with zero Docker anywhere.

Governing Standards & Sources#

Every parser rule, field label, and digest check in Offline Manifest Inspector is grounded in public specifications:

Artifact TypeGoverning StandardKey Fields & Rules Checked
Container Manifests & IndexesOpen Container Initiative (OCI) Image Specification v1.0 / v1.1 (application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, oci-layout)schemaVersion, mediaType, config.digest, layers[].digest and size, multi-arch manifests[].platform, and pinned @sha256: digests vs. mutable tags.
Package Lockfilesnpm package-lock.json specification (lockfileVersion 2 and 3)packages entries, exact version, integrity (Subresource Integrity sha512- / sha256-), and resolved URLs (flagging external public registries that must be mirrored inside the enclave).
SPDX SBOMsSPDX Specification v2.2 / v2.3 / v3.0 (ISO/IEC 5962:2021, JSON encoding)spdxVersion, SPDXID, packages[].name, versionInfo, licenseConcluded / licenseDeclared, checksums[], and externalRefs (PURL/CPE).
CycloneDX SBOMsCycloneDX Specification v1.4 / v1.5 / v1.6 (ECMA-424, JSON encoding)bomFormat: "CycloneDX", specVersion, metadata.component, components[].name, version, purl, hashes[], and licenses[].
Cryptographic HashingNIST FIPS 180-4 (Secure Hash Standard)SHA-256 file fingerprinting via the browser Web Crypto API (crypto.subtle.digest("SHA-256", ...)).

Scope limits: Offline Manifest Inspector performs structural parsing, digest computation, and local policy checks (such as flagging unpinned container tags, external resolved URLs, or components missing cryptographic hashes). It does not query remote vulnerability databases (CVE/NVD/OSV), pull container layers over a network, or make accreditation decisions.

Inputs, Processing Logic & Outputs#

Inputs

  • Primary artifact: Drag-and-drop file, local file picker (File.arrayBuffer()), or pasted JSON text for an OCI manifest/index (manifest.json, index.json), package-lock.json, SPDX JSON, or CycloneDX JSON.
  • Optional expected digest: A sha256:<64-hex> string (for example, recorded outside the air gap from ctr -n k8s.io images ls or Lazarette) to compare against the uploaded file's computed SHA-256.
  • Optional format override: Auto-detection is default; the user may force a specific parser (oci, npm-lock, spdx, cyclonedx).

Deterministic Browser-Only Processing Logic

  1. Byte-level SHA-256 fingerprint: Computes crypto.subtle.digest("SHA-256", rawBytes) immediately in memory and formats the result as sha256:<lowercase-64-hex>. If an expected digest was supplied, performs a constant-format lowercase comparison and reports MATCH or MISMATCH.
  2. Deterministic format detection: Inspects top-level JSON keys without heuristics or AI:
    • bomFormat === "CycloneDX" → CycloneDX JSON parser.
    • spdxVersion present → SPDX JSON parser.
    • lockfileVersion present (2 or 3) and packages object → npm lockfile parser.
    • schemaVersion === 2 with OCI/Docker mediaType or manifests / layers arrays → OCI Image Manifest / Index parser.
  3. Structured extraction & enclave checks:
    • OCI: Extracts config digest/size, layer digests/sizes, total compressed layer byte sum, and platform descriptors. Flags any image reference using a mutable tag without an @sha256: digest.
    • Lockfile: Enumerates all packages, counts sha512 vs. sha256 vs. missing integrity hashes, and inspects every resolved URL—flagging any non-internal host (such as registry.npmjs.org) that must be mirrored before an offline npm ci build.
    • SBOM: Normalizes packages/components into a unified record (name, version, purl, license, hashes) and counts missing hashes and missing/NOASSERTION licenses.
  4. Fail-closed error handling: Malformed JSON, unsupported lockfileVersion, or unrecognized schemas halt parsing with an explicit E_PARSE diagnostic rather than guessing missing fields.

Outputs

  • Summary header: Detected format and spec version, computed sha256: file digest, expected-digest match badge, total item/layer count, and warning count.
  • Interactive inspection table: Filterable and sortable list of layers, packages, or SBOM components with copyable digests and PURLs.
  • Exportable report: Deterministic JSON or Markdown summary generated via a local Blob URL (URL.createObjectURL) for inclusion in enclave transfer paperwork.

Clean-Room & 5-Condition QA Requirements#

To pass Shakedown and move from planned to live in src/data/catalog.ts, Offline Manifest Inspector must satisfy all five universal QA conditions and ClearedStack's clean-room rules:

RequirementVerification Criterion
1. Browser-only & offlineZero server endpoints; all JSON parsing, schema checks, and SHA-256 hashing run locally via standard Web APIs and Web Crypto (crypto.subtle) in both Full Enclave Stack and Snapshot Mode.
2. Strict CSPEnforces default-src 'self', connect-src 'self', and form-action 'none'; zero outbound fetch, XMLHttpRequest, WebSocket, or external font/script requests.
3. Zero tracking or accountsNo sign-in walls, cookies, analytics, or telemetry beacons; any optional UI preference stored in localStorage is disclosed with a one-click clear control.
4. Worked examplesBundles synthetic test fixtures (OCI manifest, package-lock.json snippet, SPDX JSON, CycloneDX JSON) with deterministic expected outputs verified in automated tests.
5. Citations, scope & MITDisplays governing standard citations, explicit scope exclusions, non-advice notice, and an MIT LICENSE file.

Clean-room boundary: The tool is authored from scratch in Moldloft using only the structured JSON specification from Waybill, never copying source code, CSS, or DOM layouts from third-party web inspectors.

Worked Example & Verification#

Synthetic Verification Case 1: package-lock.json Enclave Readiness Check

Given the synthetic lockfile entry from Working on disconnected networks:

{
  "name": "example-enclave-app",
  "lockfileVersion": 3,
  "packages": {
    "node_modules/react": {
      "version": "19.3.0",
      "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz",
      "integrity": "sha512-syntheticExampleHashValue=="
    }
  }
}
  • Detected format: npm package-lock.json (lockfileVersion 3)
  • Extracted packages: 1 (node_modules/react, version 19.3.0, integrity algorithm sha512)
  • Enclave check: Flags 1 external resolved host (registry.npmjs.org) requiring internal mirroring before running npm ci inside the disconnected network.

Synthetic Verification Case 2: OCI Image Manifest

Given a synthetic application/vnd.oci.image.manifest.v1+json with schemaVersion: 2, one config descriptor (1420 bytes), and two layers (12582912 bytes and 4194304 bytes):

  • Detected format: OCI Image Manifest v1 (schemaVersion 2)
  • Total layer bytes: 16777216 bytes (16.0 MiB) across 2 layers
  • Digest integrity: Every descriptor carries a valid sha256:<64-hex> digest; file-level sha256: matches the operator-supplied digest from Lazarette.