Skip to main content

Overview

Vigolium supports project-based data isolation. Every scan record, finding, scope rule, source repo, and OAST interaction is tagged with a project_uuid, so multiple engagements can share the same database without data leaking across boundaries.

Managing Projects from the CLI

The vigolium project subcommand creates and manages projects.

Create a project

List projects

The active project is marked with *.

Set the active project

This exports the VIGOLIUM_PROJECT_UUID environment variable into your shell, so every subsequent command in that shell uses this project.

View the project config path

Manage project access

Delete a project

Deletion removes all scan data scoped to the project (scans, HTTP records, findings, scopes, OAST interactions). By default the project’s config directory (~/.vigolium/projects/<uuid>/) is removed too; --keep-config leaves it in place.
Set VIGOLIUM_PROJECT_READONLY=true to disable all mutating project commands (create, allow, remove-access) from the CLI. Read-only commands (list, use, config) still work. Useful in production or shared environments where projects should only be managed through the REST API.

Scoping Operations to a Project

Several mechanisms select the active project, listed by precedence (highest first): --project-uuid and --project-name are mutually exclusive (--project-name must match exactly one project).

CLI examples

Server API

When using the REST API, set the X-Project-UUID header to scope all operations to a project:
If the header is omitted, the default project is used. All queries (findings, HTTP records, stats, scans) return data scoped to that project.

Config Merge Strategy

Configuration is resolved in layers (later layers override earlier ones):
The project config file uses the same partial-YAML format as scanning profiles — only the fields you specify are overridden:
See Configuration for the full set of config sections.

Access Control

Projects can restrict access by email domain or exact email address using the allowed_domains and allowed_emails fields.

How it works

When a request includes both X-Project-UUID and X-User-Email headers, the server checks access in this order:
  1. If allowed_emails is non-empty → the user’s email must match exactly (case-insensitive).
  2. Otherwise, if allowed_domains is non-empty → the user’s email domain (e.g. @acme.com) must match.
  3. If both lists are empty → the project is open to anyone.
  4. If X-User-Email is not sent → the check is skipped entirely.
Denied requests receive a 403 Forbidden response.

Managing via API

See the Projects API for the full endpoint reference.

Database Isolation

All major data tables carry a project_uuid column and are filtered by the active project across the CLI, server API, and internal pipeline: scans · http_records · findings · scopes · source_repos · oast_interactions · scan_logs Existing databases are migrated automatically — the project_uuid column is added with the default project UUID as its default value, so pre-project data stays accessible under the default project.