README.md

# SAFE - Security Analysis For Erlang
<br>
<picture style="margin-right: 15px; float: left;">
  <source
    media="(prefers-color-scheme: dark)"
    srcset="https://security-audit-logo.s3.eu-central-1.amazonaws.com/image_safe_logo_dark.png"
    width="170px"
    align="left"
  />
  <source
    media="(prefers-color-scheme: light)"
    srcset="https://security-audit-logo.s3.eu-central-1.amazonaws.com/image_safe_logo_light.png"
    width="170px"
    align="left"
  />
  <img
    src="https://security-audit-logo.s3.eu-central-1.amazonaws.com/image_safe_logo_light.png"
    alt="Security Audit For Erlang and Elixir"
    width="170px"
    align="left"
  />
</picture>

A rebar3 plugin that wires [SAFE](https://safe-docs.erlang-solutions.com/)
— Erlang/Elixir security scanner from Erlang Solutions — directly
into your build, so you can run a security check with `rebar3 safe analyse` 
and get results in your terminal.

The plugin takes care of everything: downloads the right version of SAFE
for your machine (with SHA256 verification of course), inspects your project 
structure to build a config, and then hands off to SAFE for the actual analysis. 

## Features 

- A `rebar3 safe` command with `fingerprint`, `analyse`, `download`,
  `version`, and `help` subcommands.
- Automatic binary download and SHA256 checksum verification.
- Project inspection that handles plain apps and umbrella projects.
- Fully offline after the first download — SAFE runs locally and does
  not phone home with your source.

## Installation

Add the plugin to your project's `rebar.config`:

```erlang
{plugins, [
  {rebar_safe, {git, "https://github.com/Erlang-Solutions/rebar_safe.git", {branch, "main"}}}
]}.
```

The first time you invoke `rebar3 safe <task>` the plugin
will fetch the SAFE binary into `_build/safe/` and cache it there.

## Usage

There are two phases. First, fingerprint your project — this generates a
unique, anonymous fingerprint that we (Erlang Solutions) use to issue a
license. Your code never leaves your machine; the fingerprint contains
only structural metadata about your apps and build paths.

```bash
rebar3 safe fingerprint
```

> **SAFE is free for open-source projects.** If you maintain one, please
> reach out at <safe@erlang-solutions.com> and we'll sort out a license.

Once you have a license and it's exported into your environment (see the
[SAFE docs](https://safe-docs.erlang-solutions.com/) for the variable
name and format), run the analysis:

```bash
rebar3 safe analyse
```

The analysis exits non-zero if vulnerabilities are found, so it integrates
cleanly with common CI providers.

### Other tasks

```bash
rebar3 safe download    # Just fetch the binary, don't run anything
rebar3 safe version     # Print plugin and SAFE binary versions
rebar3 safe help        # Show the full task list
```

Set `DEBUG=1` to get verbose output about paths, version resolution, and
the exact command being passed to SAFE — useful when something isn't
behaving and you want to see what the plugin thinks it's doing.




## Development

```bash
rebar3 compile           # Build the plugin
rebar3 eunit             # Unit tests
rebar3 dialyzer          # Type analysis
rebar3 fmt --check       # Formatting

python3 scripts/integration_test.py -v   # End-to-end tests against fixtures
```

The integration tests symlink the local plugin into the `fixtures/`
projects via `_checkouts`, run the real `rebar3 safe` commands, and
assert against the output. They need a network connection on first run
to fetch the SAFE binary; after that they work offline.

### Requirements

- **Erlang/OTP:** 25 or later (CI tests 25, 26, 27, 28)
- **rebar3:** 3.18 or later (CI uses 3.24)
- **OS:** Linux or macOS, x86_64

## Security

The plugin verifies SHA256 checksums on every binary download and uses
TLS with the `certifi` CA bundle for all network operations. 

## License

Apache 2.0 — see [LICENSE](LICENSE).