From 28d5cb17413933b1364b014088e87bf0c38aa0c5 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Mon, 22 Sep 2025 18:40:19 +0200 Subject: [PATCH] Update screenshot in README --- README.md | 50 ++++++++++++++++++++++++++--- docs/safe-package-manager-demo.png | Bin 0 -> 18054 bytes 2 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 docs/safe-package-manager-demo.png diff --git a/README.md b/README.md index 45317a0..872e409 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ The Aikido Safe Chain **prevents developers from installing malware** on their w The Aikido Safe Chain wraps around the [npm cli](https://github.com/npm/cli), [npx](https://github.com/npm/cli/blob/latest/docs/content/commands/npx.md), [yarn](https://yarnpkg.com/), [pnpm](https://pnpm.io/), and [pnpx](https://pnpm.io/cli/dlx) to provide extra checks before installing new packages. This tool will detect when a package contains malware and prompt you to exit, preventing npm, npx, yarn, pnpm or pnpx from downloading or running the malware. -![demo](https://aikido-production-staticfiles-public.s3.eu-west-1.amazonaws.com/safe-pkg.gif) +![demo](./docs/safe-package-manager-demo.png) Aikido Safe Chain works on Node.js version 18 and above and supports the following package managers: @@ -57,6 +57,50 @@ The Aikido Safe Chain integrates with your shell to provide a seamless experienc More information about the shell integration can be found in the [shell integration documentation](docs/shell-integration.md). +## Usage in CI/CD + +[Learn more about Safe Chain CI/CD integration in the Aikido docs.](https://help.aikido.dev/code-scanning/aikido-malware-scanning/malware-scanning-with-safe-chain-in-ci-cd-environments) + +## Usage in Docker + +To use the Aikido Safe Chain in a Docker container, you can follow these steps: + +1. **Install the Aikido Safe Chain package** in your Dockerfile: + + ```dockerfile + RUN npm install -g @aikidosec/safe-chain + ``` + +2. **Setup the shell integration** by running: + + ```dockerfile + RUN safe-chain setup-ci + ``` + +3. **Add the shims directory to your PATH** to ensure the aliases are available in your Docker container: + + ```dockerfile + ENV PATH="~/.safe-chain/shims:${PATH}" + ``` + +4. **Verify the installation** by running: + ```dockerfile + RUN npm install safe-chain-test + ``` + +Example Dockerfile: + +```dockerfile +FROM node:24 +RUN npm install -g @aikidosec/safe-chain +RUN safe-chain setup-ci +ENV PATH="~/.safe-chain/shims:${PATH}" +WORKDIR /app + +RUN npm init -y +RUN npm install safe-chain-test +``` + ## Uninstallation To uninstall the Aikido Safe Chain, you can run the following command: @@ -85,7 +129,3 @@ Example usage: ```shell npm install suspicious-package --safe-chain-malware-action=prompt ``` - -# Usage in CI/CD - -[Learn more about Safe Chain CI/CD integration in the Aikido docs.](https://help.aikido.dev/code-scanning/aikido-malware-scanning/malware-scanning-with-safe-chain-in-ci-cd-environments) diff --git a/docs/safe-package-manager-demo.png b/docs/safe-package-manager-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..b8997cc2118ae9d659475377bc7c774585fa2631 GIT binary patch literal 18054 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 Cbtl*W literal 0 HcmV?d00001