Installation and Configuration
System Requirements
Before installing Safety Firewall, ensure your system meets the following requirements:
Operating Systems:
macOS 10.14 or later
Linux (Ubuntu, Debian, CentOS, RHEL)
Windows 10 or later
Python: Version 3.8 or later
Before You Begin
Create a Safety Account
If you don't already have a Safety account, sign up here.
Get Your Organization Ready
To use Safety Firewall, your organization must have the Firewall feature enabled. If you're unsure whether your organization has access, contact your Safety administrator or reach out to our support team.
1. Installation
1.1 Install Safety CLI
Open your terminal and run the following command:


1.2 Authenticate with Safety
Run the authentication command:
This will open a browser window where you can log in to your Safety account. Once authenticated, your terminal will show a success message.

1.3 Verify Authentication Status
You can check your authentication status at any time with:
This should display your email address and confirm that you're authenticated.
2. Initialization of Safety Firewall
After installing the Safety CLI and authenticating your account, you can initialize Safety Firewall with a single command:
This command starts the interactive setup process for Safety Firewall.
What Happens During Initialization
When you run safety init, the following actions take place:
Safety checks if you're authenticated and asks if you want to setup Safety Firewall.
Safety identifies the package managers on your system (pip, poetry, etc.)
Safety configures secure aliases for each package manager
Safety detects if there is a codebase in your current directory
Safety offers to set up this codebase for ongoing protection

3. Verifying Firewall Installation
After initialization, you can verify that Safety Firewall is correctly installed by checking your package manager aliases:
After initialization, you can verify that Safety Firewall is correctly installed by checking your package manager aliases:
You should see output similar to:
If you don't see this output, your shell environment may need to be reloaded.
After initialization, you can verify that Safety Firewall is correctly installed by checking your package manager aliases:
You should see output similar to:
If you don't see this output, your shell environment may need to be reloaded.
After initialization, you can verify that Safety Firewall is correctly installed by checking your package manager aliases:
You should see output similar to:
If you don't see this output, your shell environment may need to be reloaded.
Understanding Safety Firewall Configuration
How Safety Firewall Intercepts Commands
Safety Firewall intercepts your package manager commands so it can check a package before it installs. The mechanism differs by operating system.
On macOS and Linux, Safety writes shell aliases into ~/.safety/.safety_profile and sources that file from your shell startup files. Running pip install requests matches the pip alias, which routes the command through Safety Firewall.
On Windows, Safety writes .bat shims into %USERPROFILE%\AppData\Local\safety\, adds that directory to your PATH, registers a Command Prompt macro, and adds functions to your PowerShell profile.
Once a command is intercepted, Safety Firewall:
Analyzes the requested package(s) for vulnerabilities and malicious code
Applies your organization's security policies
Either warns, blocks, or allows the installation
Records the installation event in the Safety Platform
Where Command Interception Does Not Reach
Interception applies to the command you type, so three cases fall outside it.
An alias matches only the first word of a command.
python -m pip install requestsruns pip without matching thepipalias.A script or tool that starts pip as a subprocess does not inherit the aliases from your interactive shell.
A container image build has no shell startup files, so no aliases exist. Write
safety pip installexplicitly in aRUNline to keep those installs covered.
Safety Firewall also points your package managers at the Safety index, which is a separate mechanism from interception. That configuration lives in a file, so it applies to any command the package manager runs, whether or not it was intercepted. A command-line flag, an environment variable or a project-level file can still override it. What Can Override Your Configuration covers that surface per package manager.
How Each Package Manager Is Configured
The Safety index proxies the public PyPI and npm registries. safety init writes it into each package manager's index configuration. For pip and npm it replaces the configured index. For uv it is added alongside the existing default index, so PyPI stays configured and uv still resolves from it for any name the Safety index does not carry.
pip
index-url in your user pip.conf
-i <index-url> line added to requirements files
uv
An additional index entry, written with default = false, in your user uv.toml at $XDG_CONFIG_HOME/uv/uv.toml, ~/.config/uv/uv.toml, or %APPDATA%\uv\uv.toml on Windows
An index entry in pyproject.toml
npm
registry in your global .npmrc
registry in the project .npmrc
poetry
Not configured
A safety source added to pyproject.toml
Poetry is the exception. Safety configures Poetry per project, so a Poetry project that Safety has not configured resolves from PyPI directly. Running a Poetry command through safety poetry adds the source to that project before the command runs.
How uv Resolves Indexes
uv flattens every configured index into one ordered list. Under its default first-index strategy it installs from the first index in that list that carries the package name. "First" means highest priority, and priority runs in this order.
--index, or theUV_INDEXenvironment variable where the flag is absent. These are one tier rather than two, because--indexreplaces the environment value instead of ranking above it. The deprecated--extra-index-urlandUV_EXTRA_INDEX_URLmap here.Index entries in configuration files. A project's entries come before your user
uv.tomlentries, because uv concatenates the two arrays instead of replacing one with the other.The default index, always last.
safety initleaves it alone, so it stays as PyPI unless something setsdefault = true,--default-indexorUV_DEFAULT_INDEX.
safety init writes the Safety index into your user uv.toml with default = false.
uv.lock Pins the Index Per Package
uv.lock records source = { registry = ... } for every package resolved from an index, and uv sync --frozen and uv sync --locked install from the recorded registry without re-resolving. A lock file created before safety init therefore keeps resolving from whatever registry it recorded, the same caveat that applies to package-lock.json and npm ci. Re-run uv lock after safety init to move the recorded registries to the Safety index.
Which uv Commands Safety Firewall Audits
The user uv.toml that safety init writes applies to every uv command that reads it. Interception, which is what audits a package before it installs, covers uv add, uv remove, uv sync, uv pip install and uv pip uninstall. uvx is a separate executable with no alias, so it is not intercepted.
What Can Override Your Configuration
Package managers read configuration from more than one location, and the setting closest to the command wins. The overrides below are listed per package manager, because both the flags and the multiple-index behavior differ enough that a rule for one manager is wrong for another.
pip
Three things override the index safety init writes.
A command-line flag.
pip install --index-url <url> requestsreplaces the configured index for that command.The
PIP_INDEX_URLenvironment variable, which overrides your user configuration file.A
pip.confcloser to the command. One inside an active virtual environment overrides your userpip.conf.
pip treats every configured index as equal. It queries all of them and installs the highest version it finds, with no preference between them. Adding a second index with --extra-index-url therefore does not leave the Safety index in charge.
Using the
--extra-index-urloption to search for packages which are not in the main repository (for example, private packages) is unsafe. This is a class of security issue known as dependency confusion.From the pip documentation
Replacing the index with --index-url does not carry this risk, because pip then queries one index only.
uv
uv reads no pip.conf and no PIP_* variable, so a team that standardized on PIP_INDEX_URL for an internal mirror will find uv unaffected by it in both directions. How uv Resolves Indexes covers the priority order these overrides slot into. The list below groups them by kind, because only the first two entries are priority tiers.
--index, orUV_INDEXwhere the flag is absent, which outranks every configured index including the onesafety initwrites.A project
uv.toml, or apyproject.tomlwhere no projectuv.tomlexists, whose index entries come before your useruv.tomlentries.--default-indexorUV_DEFAULT_INDEX, which replaces the lowest-priority default index and leaves the Safety entry in place above it.--index-urland--extra-index-url, both deprecated in uv.--index-urlmaps to the default index and--extra-index-urlmaps to--index.--index-strategyorUV_INDEX_STRATEGY, which changes how uv chooses between the configured indexes.--config-fileorUV_CONFIG_FILE, and--no-configorUV_NO_CONFIG. Both discard every configuration file uv would otherwise read, a projectuv.tomlorpyproject.tomlincluded, not only your useruv.toml.
poetry
poetry searches all primary sources for every package. Adding your own primary source alongside Safety's means both are searched.
npm
npm resolves each package from one registry, chosen by the package's scope, and has no equivalent of --extra-index-url. Lock files are the case to watch. A package-lock.json created while a different custom registry was configured records that registry, and npm ci keeps installing from it after you configure the Safety registry.
Checking Your Configuration
To see which index pip uses and which file set it, run:
The output lists every configuration file pip checked, in precedence order, with the values each one sets. pip config list shows the effective values without showing their source.
For npm, run:
npm config list labels each value with the file or environment variable it came from.
uv has no equivalent of pip config debug, and reading uv.toml alone misses environment variables, command-line flags, project-level entries and UV_NO_CONFIG. Resolve a package with logging instead. In a project, run:
Outside a project, run this from an active virtual environment. command bypasses the Safety alias, which otherwise injects its own index into the environment you are trying to inspect:
Read the Sending fresh GET request for: <index>/<package>/ lines, which appear highest priority first. --refresh matters, because a warm cache logs Found fresh response for: instead and the index never appears in the output. After a lock, uv.lock records the registry each package resolved from.
For Poetry, check the sources in pyproject.toml directly.
Installs run through Safety Firewall set the index for that command only, so these commands show your configuration rather than the index a Safety-intercepted install used.
Configuration Files
Safety Firewall creates several configuration files on your system:
~/.safety/: The main directory for Safety Firewall configuration~/.safety/config.toml: Global configuration file.safety-project.ini: Project-specific configuration (created in each code base directory)
Configuring Your First Codebase
During initialization, Safety may detect a requirements file or Python project in your current directory and offer to configure it as a code base. If you accept, Safety will:
Create a
.safety-project.inifile in the directoryPerform an initial scan of the project's dependencies
Upload the scan results to the Safety Platform
Configure the directory for ongoing monitoring
Manual Codebase Configuration
If you want to set up a codebase after initialization, navigate to the project directory and run:
Follow the prompts to name the code base and set up initial scanning.
Configuration Options
Supported Package Managers
Safety Firewall currently supports the following package managers:
pip: Supported user-wide and per project
uv: Supported user-wide and per project. Safety writes your user
uv.toml, not uv's system file at/etc/uv/uv.tomlor%PROGRAMDATA%\uv\uv.tomlnpm: Supported user-wide and per project
poetry: Supported per project
Safety configures Poetry by adding a source to a project's pyproject.toml, so a Poetry project that Safety has not configured resolves from PyPI directly. See How Each Package Manager Is Configured.
Additional package managers will be added in future updates.
Last updated
Was this helpful?

