BytesafeDependency Firewall

Migrate from previous-generation Bytesafe

Move from Bytesafe hosted registries, policies, and plugins to the Dependency Firewall, with private packages in a repository manager and policy as rules.

This guide is for teams moving from Bytesafe, the previous generation with hosted registries, to the Dependency Firewall, the new generation. It walks the migration end to end: review what you run today, create firewalls, move private packages to a repository manager, recreate policies and plugins as rules, and test before switching.

Both generations can run at the same time. Nothing here touches your production setup until the switch at the end.

The steps use the dashboard. Everything can also be managed as JSON through the CLI and API; see Config as code if you prefer that route.

Previous-generation Bytesafe is being decommissioned

Decommissioning is planned during 2026. The date will be communicated before anything is switched off. Questions: support@bytesafe.dev.

What changes

Bytesafe combined a firewall with a hosted package registry: packages were stored in your registry, and policies and plugins acted on the stored contents. The Dependency Firewall is a standalone security control. Every request is checked against your rules as it happens, and allowed or blocked on the spot.

That changes where things live:

  • Policy moves from policies and plugins to rules. Rules can do more, and the mapping table below covers every policy and plugin.
  • Private packages move to a repository manager such as Artifactory, Nexus, GitLab, GitHub Packages, Azure Artifacts, or AWS CodeArtifact. If you already run one, you keep it: the firewall integrates with the major repository managers, so the manager keeps storing your packages while the firewall enforces policy.
Previous generation: Bytesafe
Developers and CI
install
Bytesafe registry

stores packages, policies, plugins

fetch
Public registry
Dependency Firewall
Developers and CI
install
Dependency Firewall

rules on every request

fetch
Public registry
fetch
Repository managerstores private packages

Why migrate

The migration is work, so it is worth knowing what you get for it. The differences you notice day to day:

  • Every block is explained. A blocked install names the package, the version, and a request ID that finds the log entry with the matched rule and requester.
  • One rule model instead of a fixed set of policies. A rule combines an execution phase, a selector (name, version range, upstream, or a computed check such as vulnerability, license, or malware data) and an effect. Conditions combine, and any rule can be scoped to one package, one prefix, or one upstream.
  • Policy is reviewable. Exceptions carry a reason and an optional expiry, changes land in an audit log, and the whole configuration is one JSON document that fits in git.
  • New controls. Alongside npm, PyPI, Maven, NuGet, Go, and Conda (beta), there are checks the previous generation had no equivalent for: malware scanning, secrets detection on publish, and trust downgrade detection.

The full feature comparison: what's new in the next generation.

The migration

Review your current Bytesafe setup

The migration goes smoothly when you know what you are replacing, so start with a short inventory. For each Bytesafe registry, note:

  • the ecosystem and what the registry is for,
  • which packages are private or internal,
  • which policies and plugins are enabled, and what each one is meant to achieve,
  • upstreams and who owns their credentials,
  • users, teams, and CI tokens,
  • everywhere clients point at Bytesafe: search for your <workspace>.bytesafe.dev URL in client config files committed to repositories, CI configuration, and build images.

The policies and plugins list becomes your worksheet for the mapping step. Capture the intent behind each one, not just its settings: some are replaced by a different mechanism with the same outcome.

Create your firewalls

A firewall replaces a Bytesafe registry as the thing clients talk to. It holds configuration only, so creating one takes a minute.

Create at least one firewall per ecosystem. Create more when different teams or environments need different rules, for example production and experimentation.

In the dashboard, create a firewall, name it, and pick the ecosystem. The ecosystem's public registry is added as an upstream automatically, so the firewall proxies public packages right away.

For additional firewalls, two fields in the create dialog save repetition:

  • Inherit configuration from keeps the new firewall in sync with a parent: rules, exceptions, and upstreams from the parent apply automatically, also when the parent changes later. See Share configuration across firewalls.
  • Template copies another firewall's upstreams, rules, and exceptions once, as a starting point you then change freely.

Connect your repository manager

The firewall is not a package store, so private packages are served by your repository manager through the firewall. Skip this step if you have no private packages and fetch directly from public sources.

The standard setup keeps the firewall in front: developers and CI talk to the firewall, and the repository manager is one of its upstreams. On the firewall's Upstreams tab, add the manager's repository URL and credentials, then:

  • Enable Internal registry on the upstream if it hosts your internal packages. This replaces the internal flag in Bytesafe: when an internal upstream knows a package name, the firewall serves that name only from internal upstreams, which prevents dependency confusion.
  • Set the upstream as the publish target if developers or CI publish through the firewall.

Details, including per-vendor instructions and other layouts such as keeping the repository manager in front, are in Integrate with repository managers.

Move private packages out of Bytesafe

Your repository manager becomes the home of your private packages, so packages stored only in Bytesafe need to move there. Bytesafe pushes stored packages to a configured upstream directly from the UI, which makes this the easy part.

First add the repository manager's hosted repository as an upstream of the Bytesafe registry, with publish credentials. Then push at whichever level fits:

  • A whole registry: on the registry's Packages tab, select Push all. Pick the target upstream, and enable Push internal packages only to skip public packages, which the firewall can fetch from the public registry anyway.
  • One package: open the package and select Push all versions.
  • One version: open the version and select Push.

Versions that already exist at the target are skipped, so a push is safe to run again. Start with one test package, check that it installs from the repository manager, then push the rest and compare package counts.

Keep the Bytesafe registry as it is for now; it stays your fallback until after the switch.

Recreate policies and plugins as rules

This is the heart of the migration. A rule has three parts: which packages it matches, where it applies (version resolution, download, or publish), and what happens on a match (block, log, or both). When a rule blocks something you need anyway, an exception waives it for that package, with a reason and an optional expiry.

Create rules on the firewall's Rules tab. Each linked guide shows the exact settings. Every Bytesafe policy has a replacement:

Bytesafe policyReplacementNotes
Allow-onlyOne rule that blocks everything, plus an exception per approved packageApprovals become documented exceptions instead of list entries
BlockA rule matching the package name, with a version or a version range, and the block effectNames and exact versions match as written or with one * wildcard. A SemVer range goes in the rule's Version Range field and needs no rewriting on npm; other ecosystems use their own notation
Block downstreamAn install-only firewallA firewall only accepts publishes when a publish target is set. Leave it unset and every publish is rejected, while installs work as normal
Block install scriptsBlock install scripts ruleBlocks in real time instead of holding packages. Covers npm and PyPI
Quarantine newBlocking rules plus exceptionsNothing is held for review. A blocked version stays out until you approve it with an exception, and builds keep using allowed versions meanwhile
Delay upstreamDelay new versions ruleSame protection. The window is a max age in hours, and it can be scoped to specific packages or upstreams like any other rule
FreezeBlock publishing; pin installs with an allow-only setup if neededThe firewall hosts no packages, so there is nothing to freeze. Retention lives in the repository manager
Immutable versionsA repository manager settingOverwrite protection belongs to the system that stores packages

Plugins map the same way. Most become rules with a selector function: they match what is known about a package rather than its name:

Bytesafe pluginReplacementNotes
Vulnerability scannerBlock vulnerable packages ruleBlocks the download itself, with CVSS and EPSS thresholds. Each request uses current advisory data
License ComplianceEnforce license policy ruleBlocks or logs by license list instead of opening issues
Deprecated packagesBlock deprecated packages ruleCovers npm deprecations, PyPI yanked releases, and NuGet deprecations
ForwardThe firewall's publish targetA publish that passes the rules is forwarded to the target upstream
Version auto incrementYour CI or release workflowThe firewall never changes a package

The mapping above only covers what Bytesafe could do. While you are here, also look at the controls that are new: malware blocking, secrets scanning on publish, and trust downgrade detection for npm releases published with weaker provenance than earlier versions, the pattern of an account takeover. And everything is visible: every rule decision lands in the firewall log with the package, rule, and requester, every configuration change in the audit log, and webhooks push both to your own systems.

Move developers and CI

Clients authenticate to the firewall with access tokens, and each install is logged under the identity behind the token. Create Personal Access Tokens for developers and Service Access Tokens for CI systems, one per system so logs stay attributable. GitHub Actions can skip long-lived tokens with Trusted Builders.

Then point each client at the firewall endpoint, shown on the firewall's Setup tab, in the form https://eu-sov-1.bytesafecloud.eu/v1/<namespace-id>/npm/<firewall-id>/ for npm. The ecosystem guides walk the exact configuration per package manager.

Sweep your repositories, CI configuration, and build images for old Bytesafe registry URLs so nothing keeps installing around the firewall.

Test before switching

Run a pilot team or a copy of a real CI pipeline against the new firewall while production still runs on Bytesafe.

When you are unsure what a rule will hit, create it with only Log enabled and Block off. It records every match in the firewall log without failing a single build. Review the matches, add exceptions where needed, then enable Block.

Check that:

  • a public package installs through the firewall, and a private one installs from the repository manager,
  • each migrated rule fires once and the log entry names the rule, package, and requester,
  • a blocked install shows an error with a request ID,
  • an exception lets through exactly its package and nothing else.

Switch over

Push any packages added to Bytesafe since your first migration run, then switch developer and CI configuration to the firewall endpoints. Watch the firewall log and your builds for the first days: missing packages and authentication errors show up immediately and are usually a credential or URL detail.

Keep the Bytesafe registry untouched for an agreed period as a fallback. Once the new setup has proven itself, retire the old endpoints and tokens. Do not leave the fallback in place indefinitely: the previous generation is being decommissioned during 2026.

Frequently asked questions

Work through the review queue before migrating: release what should be released, discard the rest. The Dependency Firewall holds no packages for review, so there is no queue to carry over. The same workflow becomes a blocking rule plus an exception added after review, and builds keep using approved versions while a new one waits.

Only if you have private packages. Teams that only consume public registries point their clients at the firewall and are done.

Rule selectors have a Version Range field that takes them directly. On npm firewalls the syntax is the same SemVer grammar the Block policy used, so a definition such as 0.0.1 - 0.0.3 || >2.0.1 carries over unchanged.

To recreate one Block policy:

  1. Open the firewall, go to Rules, and select Add Rule.
  2. Set Package to the package name, exactly as the registry spells it.
  3. Put the range in Version Range and leave Version empty. Setting both narrows the rule to versions that satisfy each one.
  4. Choose the execution phase: versions filters the matching versions out of what clients can resolve, download stops the fetch outright. Then set the effect to block and log.

Other ecosystems keep their own notation: Maven uses [1.0,2.0), PyPI uses PEP 440 specifiers like >=1.0,<2.0, and NuGet takes SemVer ranges rather than its own bracket intervals. conda has no range support, so the field is not shown there. Version ranges lists the notation per ecosystem. The range is checked when you save, so a range the ecosystem cannot parse is rejected then and there.

Two cases are still better expressed without a range. A whole major version reads more clearly as the version wildcard 1.*, and a policy guarding against releases that are too new belongs in a delay rule, which matches on publish date and keeps working as new versions appear.

They were registry features, and the firewall hosts no packages. After migration your repository manager owns stored packages and their lifecycle. Publishing through the firewall forwards to the publish target once the rules pass; releasing a package under a new version, what promote did, belongs in your CI release workflow.

Get help

We are here to help. If you have questions or want advice on any part of your migration, contact support@bytesafe.dev.

On this page