Weekly on Monday · security the same day · email only

A weekly briefing of what changed in the packages and runtimes your repos actually run, and a same-day email when a security fix lands for one of them.

Briff reads lockfiles, version files and Dockerfiles, never your code. It follows the release notes and advisories of what they name and tells you which repo needs which command.

Sign-ups are closed for now. Ask for an account, or run your own: one Docker image and Postgres, configured with environment variables.

What Briff would have sent

2

Two real incidents from October 2026, replayed through Briff's own pipeline: the items the vendors published, with their timestamps, sample repos, and the production email templates. No model is involved in a security email.

SECURITY3 emails, replayed hour by hour

PHP2Shell, October 2026

Two critical PHP remote code execution flaws leaked before their coordinated release.

  1. Published: Upcoming Critical PHP Security Release
    +28 min Briff emails: Briff · urgent: Upcoming Critical PHP Security Release
  2. Published: PHP security advisory: RCE via stale global state (CVE-2026-109619)
    +26 min Briff emails: Briff · urgent: Security advisory: Critical remote code execution vulnerabilities, update now
SECURITY3 emails, replayed hour by hour

Node.js security releases, October 2026

Node.js pre-announced security releases for the 26.x, 24.x and 22.x lines a week ahead, then rewrote the same post on release day with 22.23.4, 24.22.1 and 26.12.1.

  1. Published: Wednesday, October 21, 2026 Security Releases
    +55 min Briff emails: Briff · urgent: Wednesday, October 21, 2026 Security Releases
  2. Published: Wednesday, October 21, 2026 Security Releases
    +52 min Briff emails: Briff · urgent · fix released: Wednesday, October 21, 2026 Security Releases

How it reads your repos

Three ways in, one list of files. Each path parses the same files into package, version and runtime rows with the same code, and never reads source code.

GitHub App

RECOMMENDED

Install it on the repos you pick, from Settings after you sign in. Permissions: contents and metadata, read-only. Briff reads the default branch's list of paths, fetches only the files below, and rescans when a push changes one of them.

GitHub Action

One workflow per repo. The scanner runs in your CI and uploads the rows with a scan token from Settings; nothing else leaves the runner.

Show .github/workflows/briff.yml
.github/workflows/briff.yml
# Briff scan (briff-scan 0.1.1, pinned to @0)
name: briff
on:
  push: { branches: [main] }
  schedule:
    - cron: "0 3 * * 1"   # Mondays 03:00 UTC, before the bulletin
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-node@v5
        with:
          node-version: 22
          check-latest: true   # newest 22.x, not the runner's cached one
          package-manager-cache: false
      - run: npx briff-scan@0
        env:
          BRIFF_API_URL: https://app.briff.dev
          BRIFF_TOKEN: ${{ secrets.BRIFF_TOKEN }}

Local CLI

On a laptop or a build box, in one repo or every repo under a folder. --dry-run prints what would be sent and sends nothing.

npx briff-scan@0 --dry-run

The files it reads

Only these names, at most 6 directories deep, never inside node_modules, dist, build, out, coverage, vendor, target, Pods, DerivedData, venv, site-packages, __pypackages__, __fixtures__, fixtures, testdata, __mocks__ or a directory whose name starts with a dot.

Never read: source code, READMEs, workflows, environment files, issues, pull requests or git history. File contents become rows and are not stored.

  • package-lock.json
  • npm-shrinkwrap.json
  • pnpm-lock.yaml
  • yarn.lock
  • composer.lock
  • poetry.lock
  • uv.lock
  • Pipfile.lock
  • requirements.txt
  • go.mod
  • .nvmrc
  • .node-version
  • package.json
  • .tool-versions
  • mise.toml
  • .mise.toml
  • composer.json
  • .python-version
  • pyproject.toml
  • runtime.txt
  • Pipfile
  • .ruby-version
  • Gemfile.lock
  • pom.xml
  • build.gradle
  • build.gradle.kts
  • .sdkmanrc
  • global.json
  • rust-toolchain
  • rust-toolchain.toml
  • Cargo.toml
  • Dockerfile
  • Containerfile
  • requirements-<x>.txt
  • requirements_<x>.txt
  • *.csproj
  • Dockerfile.<x>
  • Containerfile.<x>
  • *.Dockerfile
  • *.dockerfile
  • compose.yml
  • compose.yaml
  • docker-compose.yml
  • docker-compose.yaml
  • compose.<x>.yml
  • docker-compose.<x>.yml

What a bulletin looks like

The Monday bulletin and the security email from the PHP2Shell replay, for three sample repos, rendered by the same components and templates as the app. In production a model writes the headline, one line per item and the good-to-know list; here the item title stands in.

Weekly bulletin · Mon 26 OctWhere it comes from
2026-W44WeeklyEmailed Mon 26 Oct

1 item needs your attention.

Needs your attention

1
SECURITY

Security advisory: Critical remote code execution vulnerabilities, update now

repo names are clickable
FIX

api: set php 8.4.27 in .tool-versions · garden.example: rebuild to pick up PHP 8.3.36; the php:8.3-fpm tag already points to it · legacy-shop: php 8.1 is end-of-life and will not get this fix; move to 8.2.35 or later

    • api runs php 8.4.26 (.tool-versions) to 8.4.27
    • garden.example runs php 8.3 (Dockerfile) to 8.3.36
    • legacy-shop runs php 8.1.31 (Dockerfile) to 8.2.35

Good to know

0
Nothing else worth your time this week.

New security advisories this week0

No new advisories for this stream's repos this week.

The security email

Sent on the first hourly run after the fix is public: what each repo runs, the fixed versions, one step per repo and every source folded into one block. A repo on an end-of-life line is told to migrate, never handed a command for a major it is not on.

Wed 21 Oct · 14:00 UTC · +26 min

FromBriff
SubjectBriff · urgent: Security advisory: Critical remote code execution vulnerabilities, update now

What leaves your server

Briff keeps repo names and the package, version and runtime rows from your files. These are its only outbound connections; self-hosted, leave the Anthropic key empty and nothing goes there, leave SMTP empty and no email leaves.

api.anthropic.comPublic release notes and advisories, package names and versions, repo aliases (repo-1, repo-2)Never: Repo names, emails, tokens
api.osv.devEcosystem, package name and installed versionNever: Repo names
registry.npmjs.orgA package nameNever: Your versions, repo names
github.comRequests for public release feeds and advisories; with the App, the listed files of the repos you pickedNever: Your other repos or files
Your SMTP relayThe email itselfNever: Tokens, password hashes

The full list, with the code behind each claim