Skip to main content

StayAwakeBot

Supply-chain worm hunting for developer machines and CI.

PyPI Python versions License


A single compromised dependency is how one package becomes an organisation-wide incident. Self-propagating packages spread through installs, builds and merges — arriving with code you asked for, and running before you ever read it.

saw hunts them where they land: repositories, lockfiles, installed packages, and the machine's start-up surface. It runs offline, out of the box. It removes what it confirms, opens the fix as a pull request, hardens the host and gates the merge.

Detect saw scan — repositories, lockfiles and installed dependency trees; read-only. saw hook — each clone, pull, switch, rebase and push. saw audit — this machine and a repository's branch protection, ending with a rotation-safety verdict.
Remediate saw fix — clears a confirmed infection from your checkout and prepares the cleanup branch; --pr opens it as a pull request. saw fix amend replaces past commits that still carry the payload. saw discard undoes the branch.
Prevent saw harden — protections on this machine, each checked once it is written. saw guard — the CI gate that blocks an infected merge.
Advisories saw db — the offline advisory corpus for CVE and malicious-package matching.

Quick start

Prerequisites: Python 3.11+ — see Your first scan.

pip install stayawakebot

Or the latest from source:

pip install "stayawakebot @ git+https://github.com/Ndevu12/stayAwakeBot@main"

Then hunt. Each of these stands alone:

Scan every repository under your home folder:

saw scan

Or only the folder you are in:

saw scan .

Or sweep every repository under a path:

saw scan ~/dev

Scan with your own allowlist, rather than the packaged defaults:

saw scan --config config/security.yml

Check the machine itself, not a repository — credential hygiene and start-up entries:

saw audit

New here? saw intro is a 60-second tour, and saw search "…" finds the command you want.

The distribution is published as stayawakebot; the security CLI is the terse saw command (see the CLI reference).

Gate the merge

saw guard writes the CI gate, keeps it pinned, and proves branch protection requires it.

Every repository you own should refuse an infected merge. saw guard writes that GitHub Actions workflow, keeps it pinned, and proves it is enforced — for one repository or a whole organisation. Each command below stands alone; reach for the one you need.

Set it up. Writes the gate here, for you to review and commit:

saw guard setup

Or raise it as a pull request:

saw guard setup --pr

Check that a repository is actually guarded — present, SHA-pinned, current, and required:

saw guard check

Check a whole organisation, failing if any repository lacks a required gate:

saw guard check --org your-org -f

saw guard setup surgically pin-bumps a gate that already exists rather than replacing it, and never clobbers a workflow installed by some other means. saw guard check goes further than "is the file there" — it verifies branch protection actually requires the check, because a gate that is not required is decoration.

Both sweep many repositories at once (--remote / --user / --org), like saw scan and saw fix. See the CLI reference.

The workflow, by hand

A minimal equivalent, if you would rather write it yourself than run saw guard setup. The installed file is not identical — it also carries a weekly pin-drift job and prefers a GH_SECURITY_TOKEN secret — so run saw guard setup --dry-run to see exactly what it would write:

# .github/workflows/worm-scan.yml
name: Worm scan

on:
  push:
    branches: [main]
  pull_request:

# The scan only reads. `saw guard setup` writes a second job for remediation,
# so that write access exists only on a run that already found something —
# see the CLI reference for the shape it installs.
permissions:
  contents: read
  pull-requests: write
  security-events: write

jobs:
  saw-guard:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1   # v7.0.1
        with:
          fetch-depth: 0        # full history is required

      - uses: Ndevu12/SAW_GUARD@93fe465d7b0266c6010778999b73b591ae082f3e  # v0.1.4
        with:
          version: '0.6.0'      # pin the scanner too; blank tracks latest
          pr-comment: true      # say what was found, on the PR
          upload-sarif: true    # and in the Security tab

About the pins

Ndevu12/SAW_GUARD ("SAW Guard") is the public Action — a thin wrapper that installs the published stayawakebot scanner from PyPI.

Pin every action by commit SHA, including this one: a tag can be moved to point at different code after you have reviewed it, a SHA cannot. The trailing comment records which release the SHA corresponds to, so the pin stays readable. In production pin version: as well — it selects the stayawakebot release from PyPI and otherwise tracks whatever is latest at run time.

Other inputs: config-file to supply your own allowlist, fail-on to choose the verdict that fails the build (default infected), and upload-sarif to send findings to code scanning. See Harden a repository.

Run via Docker

Scan a mounted repository from the published image:

docker run --rm -v "$PWD:/repo:ro" ghcr.io/ndevu12/stayawakebot \
  saw scan /repo

To keep the report file too, mount a writable dir and run as your own user so the bind-mount is writable:

docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/repo" \
  ghcr.io/ndevu12/stayawakebot \
  saw scan /repo --reports-dir /repo/reports

Tags: :latest, :X.Y.Z, :X.Y, and :sha-<commit>. The image runs as a non-root user, is built from the same wheel published to PyPI, and ships SLSA provenance + SBOM attestations.

Also in the package

stayawakebot additionally ships a health sentinel — a URL/uptime availability monitor (HTTP status, latency, TLS and keyword checks) run with stayawake-health-check. It is independent of saw and shares only the packaging. See Configuration.

stayawake-health-check --config config/urls.yml

Documentation

saw-docs.ndevuspace.com — the full documentation, searchable and versioned.

Sponsor

saw is open source. To sponsor the work, email saw@ndevuspace.com — the same address handles commercial licensing.

License

stayAwakeBot is dual-licensed:

  • AGPL-3.0-or-later — free and open source. You must preserve attribution, and if you modify it and convey it or offer it over a network (e.g. as a hosted service), you must release your corresponding source under the AGPL too.
  • Commercial license — a paid, proprietary-use option for closed-source or proprietary-SaaS use without the AGPL's source-disclosure obligations. For terms, contact saw@ndevuspace.com.

Metadata

Release files for stayawakebot 0.12.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for stayawakebot 0.12.2
File Size Uploaded Provenance
stayawakebot-0.12.2.tar.gz 1.5 MB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for stayawakebot 0.12.2
File Interpreter ABI Platform
stayawakebot-0.12.2-py3-none-any.whl Python 3 none any Details

Total release size: 3.1 MB

Release files / stayawakebot-0.12.2.tar.gz

Download URL stayawakebot-0.12.2.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
527130d594ebf143cf77829ca0888482e5c102712e0ebe04b7910025633f1555
BLAKE2b-256 checksum
How to use checksums
eff78edc96996282972ef87fc668b336268d59b8f5a9835079a0ed06ae4d0d1a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Release files / stayawakebot-0.12.2-py3-none-any.whl

Download URL stayawakebot-0.12.2-py3-none-any.whl
Size 1.6 MB
Tags Python 3
SHA-256 checksum
How to use checksums
f5e155afe056d3270db3aa1565a54cee8ba8f42f9f05216d5691a166fe68466c
BLAKE2b-256 checksum
How to use checksums
5d8db8ce3087130039b1cec6d8733d51e8b47918b725a5313c2a419e72067c82
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

Security for stayawakebot 0.12.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for stayawakebot-0.12.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.12.2 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page