libcascade

Docker image

GHCR image tags, multi-arch matrix, OCI labels, cosign signatures, provenance, and SBOM.

The maintainer-distributed Docker image lets consumers run custom-trimmed wasm builds without setting up emsdk, libclang, and Python locally.

You do not pull or run this image by hand. libcascade build resolves the digest its toolchain version pinned, pulls it, verifies the digest, and runs it with the right mounts and UID mapping for your platform. This page documents the image itself — its tags, labels, and stages — for auditing and for building it from source. See CLI reference and Driver environment for the consumer path.

Pulling

docker pull ghcr.io/taucad/opencascade.js:single-threaded

Tags

TagPoints to
:single-threadedLatest release, single-threaded warm cache (default for browser CAD UIs)
:multi-threadedLatest release, multi-threaded warm cache (requires COOP/COEP on consumer pages)
:bindgen-baseLatest release, post-PCH/generate but pre-compile (custom-bindings starting point)
:{{version}}-single-threaded
:{{version}}-multi-threaded
Pinned release (e.g. :3.0.0-single-threaded); manifest list of linux/amd64+arm64
:{{version}}-bindgen-basePinned release, bindgen-base
:{{version}}-<stage> when {{version}} is a canaryImmutable manually dispatched canary (e.g. :3.0.0-canary.a1b2c3d4-single-threaded), retained for seven days
:branch-main[-<full-sha>]Current or immutable main, single-threaded
:multi-threaded-branch-main[-<full-sha>]Current or immutable main, multi-threaded
:bindgen-base-branch-main[-<full-sha>]Current or immutable main, bindgen-base
@sha256:<digest>Immutable pin — use in CI

Pin by digest in production. The bare-name tags (:single-threaded, :multi-threaded, :bindgen-base) are mutable and roll forward with every release. The toolchain does this for you: each published version embeds the resolved digests in generated/images.json and verifies them after pulling. See Reproducible CI.

The legacy :beta, :rolling, and :latest tags are not published by this project. Use a version-pinned tag (e.g. :3.0.0-single-threaded) or the manifest-list digest for explicit version control.

Entrypoint

The driver invokes the image as <engine> run … <image> link <yml>, with the config directory mounted at /src and a scratch directory mounted at /out via OCJS_OUTPUT_DIR. The invocation below is what it constructs — reproduce it by hand only when debugging the image itself:

docker run --rm \
  -v "$(pwd):/src" \
  -v "$(pwd)/out:/out" \
  -e OCJS_OUTPUT_DIR=/out \
  ghcr.io/taucad/opencascade.js@sha256:<digest> \
  link mybuild.yml

The entrypoint dispatches subcommands through npx nx run ocjs:<target> so runs benefit from Nx's content-addressed cache:

SubcommandWhat it does
link <yaml>End-to-end build. Nx caches the canonical link-core, then always materializes its exact inventory into the requested output directory before validation and provenance.
compile-bindings, compile-sources, pch, …Run an individual Nx target
validate <yaml>Validate YAML without building
nx <args…>Pass-through to npx nx (escape hatch)

Outputs land in /src next to your YAML (OCJS_OUTPUT_DIR=/src default).

Override the entrypoint

docker run --rm -it -v "$(pwd):/src" --entrypoint bash \
  ghcr.io/taucad/opencascade.js:single-threaded

…drops you into a shell with emsdk, libclang, and Python on the PATH.

Multi-arch matrix

EventResultBuilt on
Pull request targeting mainThree-stage validation, no tagsubuntu-latest (amd64)
main, release, or dispatchlinux/amd64 + linux/arm64ubuntu-latest (amd64) + ubuntu-24.04-arm (arm64), GitHub Actions native runners

main, release, and manually dispatched canary runs ship full manifest lists so Apple Silicon and ARM Linux hosts pull the native architecture transparently. CI links and smokes each image natively and requires every native stage to pass before promotion. The amd64 outputs are the canonical npm package inputs; host-specific compiler output is not compared byte-for-byte across architectures.

OCI labels

Inspect via docker inspect ghcr.io/taucad/opencascade.js:single-threaded:

LabelPurpose
org.opencontainers.image.titleStage-specific title (single-threaded, multi-threaded, …)
org.opencontainers.image.descriptionThreading model and consumer prerequisites
org.opencontainers.image.sourcehttps://github.com/taucad/opencascade.js
org.opencontainers.image.urlSame as source
org.opencontainers.image.revisionGit commit the image was built from
org.opencontainers.image.versionSemver tag
org.opencontainers.image.licensesLGPL-2.1-only
org.opencontainers.image.vendortaucad

Cosign signatures

Every published image is signed with cosign via OIDC keyless signing — no rotating private keys, signatures published to the Sigstore Rekor transparency log. Release tags carry one signature on the manifest-list digest that verifies regardless of which arch the consumer pulls.

cosign verify ghcr.io/taucad/opencascade.js:single-threaded \
  --certificate-identity-regexp 'https://github.com/taucad/opencascade\.js/\.github/workflows/docker\.yml@.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

A successful verification confirms the image was built by the taucad/opencascade.js GitHub Actions docker.yml workflow and has not been tampered with since publication.

Provenance

cosign verify-attestation \
  --type slsaprovenance \
  --certificate-identity-regexp 'https://github\.com/taucad/opencascade\.js/\.github/workflows/docker\.yml@.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  ghcr.io/taucad/opencascade.js:single-threaded

The attestation records the source commit, the workflow, and the runner that produced the image.

SBOM

docker buildx imagetools inspect \
  --format '{{ json .SBOM }}' \
  ghcr.io/taucad/opencascade.js:single-threaded

Diff the SBOM across image digests in CI to flag unexpected dep bumps.

Image stages

The Dockerfile is multi-stage with five logical stages, three of which are published:

StagePublished asContents
deps-base(not published)emsdk + apt + Node 24 + uv + Python + OCCT/rapidjson/freetype + LLVM 17 headers
bindgen-base:bindgen-basedeps + npm ci + patches + PCH + .d.ts.json index
compiled-single-threaded(not published)bindgen + compiled .o files + OCCT .a (single-threaded)
compiled-multi-threaded(not published)bindgen + compiled .o files + OCCT .a (multi-threaded)
final-single:single-threadedcompiled-single + OCI labels + entrypoint
final-multi:multi-threadedcompiled-multi + OCI labels + entrypoint

Each stage is independently rebuildable via docker buildx build --target <stage>. See Bindgen pipeline for how the stages compose with the build pipeline.

On this page