Vulkro for enterprise
Answer the security review before it starts.
Your source code never leaves the machines you already own. Vulkro installs and runs inside your perimeter, and there is no service anywhere else doing the analysis, so there is no upload to review, nothing of ours in the path of a release, and nothing to negotiate about where your code lives. This page is written for the three people who decide whether a scanner gets in: the security reviewer, the operator installing it somewhere with no route to the internet, and whoever has to complete the questionnaire.
- No code upload
- Air-gapped install supported
- The same answer every time
$ VULKRO_OFFLINE=1 vulkro scan . offline mode: outbound calls refused CRITICAL SQL injection in invoice lookup services/billing/invoices.py:118 HIGH Missing authorization on export route services/billing/routes.py:41 1,284 files scanned. 0 network calls. exit 1 (findings present)
01 / The architecture
It runs inside your perimeter.
A review reads your files, works out what an attacker could reach, and writes the results back to disk. All of that happens on the machine you started it on. The reason your security review of us is short is that there is no second place for your code to be.
No upload, by construction
Nothing of ours can break your release
The same answer every time
Everything the scan needs stays on your machine: the code it reads, the map it builds of how your product fits together, the findings it writes, and the optional local model it can consult without leaving the machine. One line leaves.
- Stays on this machine
- source code, call graph + taint, findings, account layer, and the local model on 127.0.0.1
- One crossing
- A signed entitlement check and a usage counter, on a debounced cadence.
- Never crosses
- source code, file paths, file names, finding contents, project names, the hardware fingerprint
02 / Air gap
Install it on a machine with no route to the internet.
The offline path is not a degraded mode. Copy the program in, install a signed license file bound to that machine, and refresh vulnerability data from a file you carry across the boundary yourself. What it finds is identical, because everything it needs is already on that disk.
A license that never phones home
Vulnerability data you carry in
One switch that enforces it
Updates on your schedule
$ vulkro activate ./platform-team.lic license installed: machine-bound, offline $ vulkro update --bundle ./vulkro-cve.vkbundle checksum verified, advisories applied locally $ VULKRO_OFFLINE=1 vulkro scan . no outbound call attempted
03 / The estate
Across every repository, not one at a time.
An organization with two hundred services does not have a per-repository problem. It has a portfolio problem: which teams got worse this quarter, which mistake was repeated in eleven places, and which of those eleven is exposed to the internet. Vulkro rolls every repository you point it at into one view, on one machine, with no server in between.
Portfolio rollup
ranked by risk score| Project | Type | Risk | CRIT | HIGH | Findings |
|---|---|---|---|---|---|
| checkout-service | node | 71 | 2 | 9 | 38 |
| billing-api | java | 64 | 1 | 12 | 44 |
| identity-gateway | go | 58 | 0 | 7 | 26 |
| partner-portal | python | 43 | 1 | 4 | 19 |
| notification-worker | node | 22 | 0 | 2 | 11 |
| 209 more projects | sorted by risk score, filterable by team folder | ||||
One view over every repository
An export your own tools can read
Possible links between services
Progress you can show a board
One finding format everywhere
Nothing to stand up first
04 / Evidence
Evidence an auditor can open.
An audit does not accept a dashboard. It accepts files: an inventory of what you ship, a statement about which known vulnerabilities actually apply to you, and a control-by-control record of what was checked and what it was checked against. Vulkro writes all three to disk on your machine.
- cra-readiness.zip/built on this machine
- index.htmlreadiness one-pager
- compliance/soc2-full, 61 controls
- manifest.jsonframework, scan id, control summary
- summary.mdevery control with its status
- findings.csvfinding to control mapping, flat
- soc2-full.htmlper-control evidence table
- controls/one file per control
- CC6.1.jsonPass
- CC6.6.jsonPartial, 2 findings
- CC7.2.jsonFail, 1 finding
- CC8.1.jsonPass
- P4.1.jsonPass
- ...56 more control files
- README.mdwhat each file is, and what it is not
- sbom/
- cyclonedx.jsonCycloneDX 1.6
- spdx.jsonSPDX 2.3
- vex/
- openvex.jsonOpenVEX 0.2.0, per CVE
$ vulkro compliance-pack . --framework soc2-full --output ./compliance/
vulkro cra-bundle runs the same pack and writes it into one zip with the SBOM and VEX documents beside it. Every file is generated locally: nothing is uploaded, and each control file cites the findings and endpoints it was built from.
SBOM in both formats
A statement on every CVE
Per-control compliance evidence
Framework mappings, the profiles available, and what each pack does and does not assert are covered on the regulated industries page.
05 / The wire
What crosses the wire, exactly.
Vulkro needs a verified account, and checking that account is the one thing that touches the network. Here is the whole request. It carries usage counters: there is nowhere in it for a finding to travel, and nowhere a file name could sit. Disconnected installs replace it entirely with a license file on disk.
| Field and example value | What it carries |
|---|---|
| "product": "vulkro", | which binary made the call |
| "install_id": "3f9c1a7e-5b40-4c8d-9a21-7ce4d0b28f16", | a random id minted at install, not a hardware fingerprint |
| "version": "0.21.0", | the build that is running |
| "os": "macos", | operating system family, not a machine name |
| "scans_since_last_heartbeat": 4, | how many scans ran since the last call |
| "timestamp": "2026-08-15T09:41:02Z" | when the call was made |
The software itself is the source of truth for that field list, and it adds a device token once this machine is signed in.
06 / Procurement
The paperwork, and who to send it to.
Most of a security questionnaire asks where the data goes, which is why the architecture above makes this section short. These are the answers reviewers ask for first, in roughly the order they ask them.
- Where does our source code go?
- Nowhere. It is read from the disk of the machine running the review and is never sent anywhere.
- Is there a cloud service that analyses our code?
- No. Everything the review needs, including the vulnerability data, is installed on your machine.
- Does a scan need network access?
- No. A scan on a disconnected build machine produces the same result as one on a laptop.
- Does an AI model see our code?
- Not during a review. The optional AI help talks only to a model running on the same machine, and it can never change what the review found.
- What does leave the machine?
- A license check carrying usage counters and nothing else, and offline mode refuses even that.
- Can we run it with no route to the internet at all?
- Yes. A signed license file bound to that machine replaces the sign-in, and vulnerability data is applied from a file you carry across the boundary.
- Where are findings stored?
- On the machine that ran the review: a local database, plus whatever report file the run was asked to write.
- Who do we send the questionnaire to?
- The address on the contact page. Reports about a vulnerability in Vulkro itself follow the security policy.
Security questionnaire
DPA and processing scope
License request
Reporting a vulnerability in Vulkro itself is a different path: follow the security policy.