Safeguard
Security Guides•

How do you add a new language without losing dependency control?

A seven step onboarding checklist for adopting another language: lock behavior, integrity, install time code, audit command, SBOM, owner, and CI template.

Safeguard Security Team
4 min read

Before the first service ships in a new language, answer seven questions from its official documentation: how it locks versions, how it checks integrity, whether dependencies run code at install, which audit command exists, how to produce an SBOM, who owns it, and what the CI template is. Write the answers down once and reuse them.

Why do this up front

Adding a language usually starts as a prototype. By the time it is in production, the habits of the prototype are the habits of the service, including an ordinary install step that rewrites the lock and no one watching advisories. Fixing that later means retrofitting a pipeline under pressure.

A one page onboarding record, filled in before launch, costs an hour and spares you most of it.

The seven steps

1. Lock behavior

Find the lock mechanism and the locked install mode. Examples from the official docs: npm has a clean install that errors on drift, Cargo has a locked flag, NuGet has a locked restore mode that needs opting in, and Gradle needs locking activated per configuration. If the ecosystem has no equivalent, record that and choose a compensating control such as exact versions plus an internal mirror.

2. Integrity

Does the installer verify what it downloads? Go does by default against go.sum. pip does only when hashes are present. Record the answer and what you will enable.

3. Install and build time code

Can a dependency run code on a developer laptop or CI agent? npm lifecycle scripts and Cargo build scripts can. Record how to restrict it and which secrets are present in the job.

4. Audit command

Find the native advisory check, and note what it covers. For Go, govulncheck reports whether your code calls the vulnerable function. For npm, the audit command sends your dependency tree to the registry. Decide where it runs and whether it gates.

5. SBOM output

Pick the format, such as CycloneDX or SPDX, and confirm the tool you use can produce it for this language. Do not assume. Test on a real repo.

6. Owner

Name a person or team who answers for updates in that language. Without this, upgrades stall.

7. CI template

Create or extend the shared pipeline template: locked install, audit, SBOM, publish. New services in the language copy it rather than inventing their own.

The record

QuestionAnswer to write down
Lock file and locked install command
Integrity mechanism
Code runs at install or build?
Audit command and gate level
SBOM tool and format
Owner
Template location

When the answers are bad

Sometimes the honest answer to a question is "this ecosystem cannot do that". That does not forbid the language. It means the gap needs a named compensating control and a review date. What you should not do is leave the cell blank.

Safeguard can help here: it scans dependencies and generates SBOMs, applies reachability analysis so you can sort findings by what your code can actually call, and enforces policies and gates on pull requests. You can try a free scan on a repository to see what it finds.

Quick check

How long should onboarding a language take?

Much of it is reading the official docs and writing down answers. A first pass is often an afternoon, and the CI template is the longest part.

What if the language has no lockfile?

Record that, pin exact versions where you can, use an internal mirror, and set a review date for the gap.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.