One scan. One score. One verdict.
Valqore is an infrastructure governance engine that scans Kubernetes manifests, Terraform configurations, and cloud resources — then returns a score (0-100) and a verdict (PASS, PASS_WITH_MONITORING, or BLOCK).
1,370 built-in rules across security, cost, carbon/sustainability (GreenOps), compliance, and AI governance, organised into 16 compliance packs (including OWASP Top 10 for Agentic Applications 2026, EU AI Act Annex III, CRA, DORA, SOC2, HIPAA, FedRAMP, SR 11-7, and PQC Migration / CNSA 2.0). No configuration needed. Runs anywhere Docker runs.
1. Pull the image (free, public, no signup):
docker pull ghcr.io/valqore/engine:latest2. Scan a file:
docker run --rm -v "$PWD:/work" -w /work \
ghcr.io/valqore/engine:latest valqore evaluate deploy.yaml --score3. Make it short. That docker run … prefix repeats a lot, so alias it once and every command below becomes just valqore <cmd>:
# bash / zsh (macOS, Linux)
alias valqore='docker run --rm -v "$PWD:/work" -w /work ghcr.io/valqore/engine:latest valqore'# PowerShell (Windows)
function valqore { docker run --rm -v "${PWD}:/work" -w /work ghcr.io/valqore/engine:latest valqore @args }Now you can run everything against files in your current directory with clean, relative paths:
valqore evaluate deploy.yaml --score # one file
valqore evaluate ./k8s/ --score # a whole folder
valqore agent-audit ./k8s/ # who governs your AI agents?Every example in this README uses the
valqorealias. Without it, just put thedocker run --rm -v "$PWD:/work" -w /work ghcr.io/valqore/engine:latestprefix back in front.
| Surface | Install | Best for |
|---|---|---|
| CLI / Docker | docker run ghcr.io/valqore/engine:latest valqore evaluate manifest.yaml --score |
Local checks, CI pipelines |
| K8s admission control | helm install the valqore-stack chart |
Cluster-wide enforcement via native ValidatingAdmissionPolicy |
| VS Code extension | valqore-vscode .vsix |
Real-time CodeLens + hover + quick-fix in YAML / Terraform / Helm |
| Freelens K8s IDE | freelens-valqore extension |
Resource-detail panels + cluster overview + right-click policy checks |
| MCP for Claude / Cursor | valqore mcp |
134 governance tools your AI assistant can call |
# Install the operator stack from the public OCI chart (Go controller-runtime,
# ~30 MB image). The CRDs ship with the chart and install automatically.
helm install valqore oci://ghcr.io/valqore/charts/valqore-stack \
--namespace valqore-system --create-namespace \
--set 'policies[0].name=enforce-owasp-agentic' \
--set 'policies[0].pack=owasp_agentic' \
--set 'policies[0].action=Warn'Within 30 seconds, 8 native ValidatingAdmissionPolicy objects materialise on the cluster — the K8s API server enforces them. Valqore is not in the data path.
kubectl get valqorepolicy enforce-owasp-agentic
# NAME PACK ACTION READYVAPS
# enforce-owasp-agentic owasp_agentic Warn 8Flip action: Warn → action: Deny when you're confident, then watch the API server reject unannotated agent workloads at admission time.
Key differentiators:
- GreenOps built-in — CO2e emissions per workload, greener region suggestions, carbon budgets, GPU emissions tracking. 77 cloud regions with grid carbon intensity data.
- AI Scan — one command runs evaluate + drift detection + AI-powered explanation. The AI image includes a fine-tuned model that runs fully offline — your code never leaves the container.
- Interactive chat — ask Valqore questions about your scan results in natural language. Get remediation advice, compliance mapping, and cost optimization tips through a conversational interface.
- AI Governance — detect ungoverned AI/ML workloads, enforce EU AI Act compliance, and gate model promotions to production.
- AI agent fleet governance —
agent-auditdiscovers the AI agents already running in your manifests, cluster, or cloud and scores each one's governance posture across five dimensions, then rolls up to a GOVERNED / PARTIAL / UNGOVERNED fleet verdict and exports it as auditor-ready OSCAL. The answer to "who governs the agents now governing your infra?"
The only requirement is Docker (Linux, macOS, or Windows). No key, no signup for the deterministic core — it's free and runs tokenless. The public image is compiled (native code, no readable source), multi-arch (linux/amd64 + linux/arm64), and cosign-signed with an SBOM.
| Image | Distribution | What's included |
|---|---|---|
ghcr.io/valqore/engine:latest |
Free, public, tokenless | All 1,370 rules, scoring, drift, billing, compliance, MCP, agent-gate |
valqore/engine:1.7.0-ai |
Licensed (request access) | Everything above + embedded offline AI model (AI scan, chat) |
Only the AI features need a license. To activate the AI image, create a persistent volume once, then activate:
docker volume create valqore-data
docker run --rm -v valqore-data:/app/data valqore/engine:1.7.0-ai valqore activate YOUR_LICENSE_KEYEvery published image is cryptographically signed and carries an SPDX SBOM, so you can prove exactly what you're running. Install cosign, then:
Public image (ghcr.io/valqore/engine:1.7.0) — keyless-signed in CI via Sigstore (GitHub OIDC + Rekor):
cosign verify ghcr.io/valqore/engine:1.7.0 \
--certificate-identity-regexp 'https://github.com/valqore/valqore-engine/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
cosign verify-attestation ghcr.io/valqore/engine:1.7.0 --type spdxjson \
--certificate-identity-regexp 'https://github.com/valqore/valqore-engine/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comAI image (valqore/engine:1.7.0-ai) — signed with Valqore's release key (cosign.pub):
cosign verify --key cosign.pub --insecure-ignore-tlog valqore/engine:1.7.0-aiBoth checks confirm the image hasn't been tampered with since publish. The SBOM (SPDX) enumerates every component in the image for vulnerability scanning and audit.
- TRUST.md — how the deterministic engine decides, what Valqore does (and doesn't) do with your data, self-hosted/no-egress posture, supply-chain integrity, and an honest in-place-vs-planned status.
- SECURITY.md — coordinated vulnerability disclosure policy, private reporting channels, response targets, and safe harbor.
- SECURITY-FAQ.md — vendor security & due-diligence FAQ: SIG / CAIQ-style answers on data handling, subprocessors, encryption, supply chain, AI, and compliance posture, for security/procurement reviews.
These use the
valqorealias from Quickstart. Commands that read live cloud accounts also need credentials passed to the container — those are shown in fulldocker runform with the-eflags, since an alias can't carry your environment.
valqore evaluate deploy.yaml --score # a single Kubernetes manifest
valqore evaluate main.tf --score # a Terraform file
valqore evaluate ./ --score # everything in the current folderValqore Score: 84/100 (Grade: B)
Security: 78 | Reliability: 77 | Cost: 90 | Carbon: 97 | Compliance: 100
Cost estimate: $19.53/mo (aws, us-east-1)
Verdict: BLOCK · Total: 495 | Pass: 383 | Warn: 84 | Fail: 28
valqore what-if deploy.yaml --graviton # migrate to ARM/Graviton
valqore what-if deploy.yaml --spot-ratio 70 # move 70% to spot instances=== What-If: Migrate to Graviton (ARM) ===
Cost: $19/mo -> $15/mo (-20%)
Carbon: 0.29 kg -> 0.09 kg (-69.5%)
Who governs the agents now governing your infra?
agent-auditdiscovers every AI agent in your manifests/cluster/cloud and scores its posture across five dimensions;agent-gatestops an agent's proposed change before it touches anything.
valqore agent-audit ./ # score the whole agent fleet=== AI Agent Governance Posture ===
Fleet: 2 agent(s) -- PARTIAL -- 1 governed / 1 with gaps
Agent Score Identity Guardrails Boundary Oversight Supply Chain
ops-agent 95 ok ok ok ok ok
research-agent 46 gap gap -- gap ok
Add --format oscal -o agentgov.json for an auditor-ready evidence pack where each dimension maps to a control.
# Gate a Terraform plan an agent wants to apply — block anything above a blast-radius cap
valqore agent-gate run --tf-plan plan.json --agent sre-bot --max-blast-radius mediumAgent action: BLOCK (BLOCKED)
sre-bot: infrastructure change
source: tf_plan · change: replace · blast radius: high
Blast radius 'high' exceeds max 'medium'.
Exit code 2 on BLOCK. Add --request-approval to mint a signed approval request recorded in the agent-gate journal.
valqore ai-gate ./=== AI Promotion Gates: ml-inference -> production ===
AI Registered: FAIL · Human Oversight: FAIL · EU AI Act: FAIL · Kill Switch: FAIL
Result: BLOCKED -- 4 of 5 gates failing
valqore finops cost-gate ./proposed/ --baseline ./current/ --max-delta 500Exit code 1 when the change adds more than $500/mo over the baseline — cost prevention in the PR, not a dashboard after the bill lands.
valqore image-audit ./ --check-updates redis latest -> -- UNPINNED HIGH
nginx 1.21 -> 1.27.0 OUTDATED HIGH
valqore evidence hipaa -f ./ # add -f oscal for machine-readable NIST OSCALAll 16 packs: hipaa, soc2, pci_dss, gdpr, iso27001, iso_42001, eu_ai_act, nist_csf, nist_ai_rmf, owasp_llm, owasp_agentic, dora, fedramp, sr_11_7, cra, pqc_migration.
Every evaluate --score already includes a carbon estimate:
Carbon: 0.182 kg CO2e/mo (aws:us-east-1)
Valqore tracks CO2e per workload using grid carbon-intensity data across 77 cloud regions, suggests greener regions, enforces carbon budgets, and tracks GPU embodied emissions.
These need read-only credentials, so they're shown in full docker run form (Valqore never writes to your cloud):
Cloud billing & budget gate (AWS):
docker run --rm \
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
-e AWS_DEFAULT_REGION=us-east-1 \
ghcr.io/valqore/engine:latest valqore finops billing --cloud aws --daily --days 30AWS Daily Cost Trend (last 30 days) Total: $3,459.14
$137 | #
$120 |#### ##########
$103 |##### #############
$86 |#############################
+------------------------------
03-17 04-15
Swap the final flag for --fail-if-over 5000 to exit non-zero (CI gate) when monthly spend crosses $5,000. For Azure, pass -e AZURE_CLIENT_ID / AZURE_TENANT_ID / AZURE_CLIENT_SECRET and use --cloud azure --subscription-id <id>.
Detect infrastructure drift (Terraform state vs live cloud):
docker run --rm -v "$PWD:/work" -w /work \
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
-e AWS_DEFAULT_REGION=us-east-1 \
ghcr.io/valqore/engine:latest valqore drift-state terraform.tfstate --cloud aws --attributionShows what changed, when, and who changed it (via CloudTrail). Add --watch --interval 30 --slack <webhook> for continuous monitoring with Slack alerts.
The valqore/engine:1.7.0-ai image bundles a fine-tuned model that runs fully offline — your code never leaves the container. Request a license.
AI scan — evaluate + drift + plain-English explanation in one shot:
docker run --rm -v "$PWD:/work" -w /work -v valqore-data:/app/data \
valqore/engine:1.7.0-ai valqore ai-scan ./ --state terraform.tfstate --cloud awsValqore AI Scan
Step 1/3: Evaluating manifests... Score: 84/100 (B) | Verdict: BLOCK
Step 2/3: Detecting drift... 3 resources drifted
Step 3/3: Generating AI analysis...
## Key findings:
- SP-007: Container running in privileged mode -- full host access
- NET-012: LoadBalancer without NetworkPolicy on backend
## Remediation:
1. Remove privileged: true and add capabilities.drop: ['ALL']
2. Create NetworkPolicy restricting ingress to port 8080
Chat — ask questions about your infrastructure:
docker run --rm -it -v "$PWD:/work" -w /work -v valqore-data:/app/data \
valqore/engine:1.7.0-ai valqore chat deploy.yamlYou: What are the most critical issues?
Valqore: You have 2 CRITICAL findings that must be fixed immediately:
1. SP-007: Container 'api' is running in privileged mode...
2. NET-012: LoadBalancer without NetworkPolicy...
You: Is this HIPAA compliant?
Valqore: Your current configuration fails 1 of 7 HIPAA controls...
Valqore is read-only. It never creates, modifies, or deletes resources.
Pass credentials as environment variables:
-e AWS_ACCESS_KEY_ID=AKIA...
-e AWS_SECRET_ACCESS_KEY=...
-e AWS_DEFAULT_REGION=us-east-1Minimum permissions: ReadOnlyAccess or custom policy with ec2:Describe*, s3:GetBucket*, rds:Describe*, iam:List*, ce:GetCostAndUsage, cloudtrail:LookupEvents.
Pass service principal credentials:
-e AZURE_CLIENT_ID=your-app-id
-e AZURE_TENANT_ID=your-tenant-id
-e AZURE_CLIENT_SECRET=your-secretMinimum roles: Reader + Cost Management Reader.
Mount your kubeconfig:
-v ~/.kube/config:/app/data/.kube/config:ro- name: Valqore Gate
run: |
docker run --rm -v ${{ github.workspace }}:/work -w /work \
ghcr.io/valqore/engine:latest valqore evaluate ./ --score --fail-on blockExit code 1 on BLOCK verdict = PR fails.
- name: Cost Gate
run: |
docker run --rm \
-e AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }} \
-e AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }} \
ghcr.io/valqore/engine:latest valqore finops billing --cloud aws --fail-if-over 5000Clone this repo and scan any folder. Each scenario is realistic infrastructure with intentional misconfigurations — copy a command, see a verdict.
git clone https://github.com/valqore/valqore.git
cd valqore
# (set up the `valqore` alias from Quickstart first, then:)
valqore evaluate examples/ecommerce/ --scoreThe same agent workload, done two ways. Run agent-audit on each and watch the fleet verdict flip:
| File | Verdict | Why |
|---|---|---|
| agent-gate/ungoverned-agent.yaml | UNGOVERNED (45.9) | Shared/default service account, privileged + root, no kill-switch, no rate limit, no blast-radius cap, no audit sink |
| agent-gate/governed-agent.yaml | GOVERNED (94.6) | Dedicated identity, OIDC + signed delegation, step/token/timeout caps, telemetry, escalation, default-deny egress, non-root, pinned by digest |
valqore agent-audit examples/agent-gate/ungoverned-agent.yaml # -> UNGOVERNED
valqore agent-audit examples/agent-gate/governed-agent.yaml # -> GOVERNED
valqore agent-audit examples/agent-gate/ # -> PARTIAL (1 of 2 governed)And stop a risky change an agent proposes, before it lands:
# A Terraform plan that deletes a prod DB and opens 0.0.0.0/0 -> blast radius HIGH -> BLOCK (exit 2)
valqore agent-gate run --tf-plan examples/agent-gate/terraform-plan.json \
--agent sre-bot --max-blast-radius mediumvalqore evaluate examples/supply-chain/unsigned-unpinned.yaml --scoresupply-chain/unsigned-unpinned.yaml ships three classic risks — nginx:latest (mutable tag), redis (no tag), busybox:1.36 (tagged but not digest-pinned) — the way a "known-good" image silently becomes a different, unverified one at deploy time.
| File | Score* | What Valqore catches |
|---|---|---|
| basics/insecure-deploy.yaml | 28 / F · BLOCK | Privileged container, unpinned image, no NetworkPolicy |
| basics/secure-deploy.yaml | 76 / C · PASS† | Hardened + full governance annotations (CRA/DORA/rollback) — zero criticals |
| basics/insecure-terraform.tf | 46 / F · BLOCK | Public RDS, open security group, unencrypted S3 |
| basics/secure-terraform.tf | 70 / C · BLOCK | Encrypted, private, Graviton, DynamoDB locking |
| basics/ai-workload.yaml | AI gate: BLOCK | Ungoverned GPU workload |
| basics/gpu-ml-training.yaml | AI gate: PASS | Proper AI governance annotations |
| basics/microservices-stack.yaml | 10 / F · BLOCK | Hardcoded secrets, no limits, privileged |
*Scores reflect Valqore's strict default policy — most real-world workloads BLOCK until hardened. The point of each pair is the relative improvement.
†PASS under a policy. The default verdict is deliberately strict (it blocks on any finding). Real teams set a risk-appropriate bar in examples/.valqore/policy.yaml — here: block on CRITICAL + require a passing score, treat HIGH as must-fix-soon. Under that policy the hardened workload passes and the insecure one still blocks:
# secure-deploy → PASS (76/100, zero criticals)
valqore env-evaluate examples/basics/secure-deploy.yaml \
-e prod --policy examples/.valqore/policy.yaml
# insecure-deploy → BLOCK (28/100, 3 criticals)
valqore env-evaluate examples/basics/insecure-deploy.yaml \
-e prod --policy examples/.valqore/policy.yaml| Scenario | Path | What's Inside |
|---|---|---|
| E-Commerce | examples/ecommerce/ | Storefront + payment + DB. Hardcoded Stripe keys, privileged payment service, public RDS. |
| SaaS Platform | examples/saas-platform/ | API gateway + auth + workers. JWT secrets in plain text, no tenant isolation. |
| Data Pipeline | examples/data-pipeline/ | Kafka + Spark + Elasticsearch. AWS creds hardcoded, Spark as root, data on emptyDir. |
| Startup MVP | examples/startup-mvp/ | Node.js + MongoDB in one pod. DB password in env, default namespace, NodePort. |
| Fintech Trading | examples/fintech/ | Matching engine + market feed + risk calc. Privileged engine, single-AZ DB, no encryption. |
| Azure Web App | examples/azure/ | App Service + SQL + Storage. TLS 1.0, public SQL, secrets in app settings. |
| GCP GKE | examples/gcp/ | GKE + Cloud SQL + Firewall. Legacy ABAC, public DB, allow-all firewall. |
Compare carbon impact — same workload, different configurations:
| File | What It Shows |
|---|---|
| greenops/high-carbon-deployment.yaml | 10 GPU replicas + 20 batch workers in us-east-1. High carbon footprint, oversized resources. |
| greenops/low-carbon-deployment.yaml | Right-sized, eu-north-1 (hydro/nuclear), carbon budget set, fewer replicas. |
# Compare the two
valqore evaluate examples/greenops/high-carbon-deployment.yaml --score
valqore evaluate examples/greenops/low-carbon-deployment.yaml --scoreFull-stack app with K8s + Terraform — run ai-scan to get evaluate + drift + AI explanation in one shot:
| File | What It Shows |
|---|---|
| ai-scan/multi-tier-app.yaml | Frontend + API + workers + DB + Redis. Hardcoded secrets, root user, AWS keys in env. |
| ai-scan/infra.tf | EKS + RDS + S3 + IAM. Public EKS, unencrypted DB, admin IAM policy, open security group. |
# AI Scan — evaluates everything and explains findings (AI image)
docker run --rm -v "$PWD:/work" -w /work -v valqore-data:/app/data \
valqore/engine:1.7.0-ai valqore ai-scan examples/ai-scan/Scan these files, then start a chat to ask questions — great for compliance-heavy environments:
| File | What It Shows |
|---|---|
| chat/healthcare-api.yaml | Patient API + EHR integration + audit logger. HIPAA-relevant: secrets in env, privileged EHR connector, audit logs on emptyDir. |
| chat/finserv-platform.yaml | Transaction processor + fraud ML + compliance reporter. PCI-DSS relevant: card encryption keys in env, privileged GPU fraud model. |
# Scan first, then chat about findings (AI image)
docker run --rm -it -v "$PWD:/work" -w /work -v valqore-data:/app/data \
valqore/engine:1.7.0-ai valqore chat examples/chat/healthcare-api.yaml
# Try asking:
# "Is this HIPAA compliant?"
# "What are the biggest risks?"
# "How do I fix the secrets?"
# "Generate a compliance report"| Category | What It Does |
|---|---|
| Security | Container hardening, RBAC, encryption, network policies, supply chain, attack path analysis |
| Cost & FinOps | Waste detection, right-sizing, billing analysis (AWS/Azure/GCP), budget gates, cost simulation |
| GreenOps | CO2e per workload, greener region suggestions, carbon budgets, GPU emissions, 77 regions with grid intensity data |
| Compliance | 16 packs: HIPAA, SOC 2, PCI-DSS, GDPR, EU AI Act, ISO 42001, NIST AI RMF, OWASP LLM/Agentic, CIS, DORA, FedRAMP, SR 11-7, CRA, PQC, and more — each exportable as machine-readable NIST OSCAL evidence |
| AI Governance | Shadow AI detection, EU AI Act risk classification, model promotion gates, GPU cost/carbon tracking |
| AI Agent Fleet Governance | agent-audit discovers AI agents across manifests/cluster/cloud and scores each one's posture (identity, guardrails, boundary, oversight, model supply chain) into a GOVERNED / PARTIAL / UNGOVERNED fleet verdict — exportable as OSCAL. Plus a runtime MCP gate for live agent tool calls |
| Drift Detection | Terraform state vs live cloud, CloudTrail attribution, continuous monitoring with Slack alerts |
| AI Scan & Chat | One-command scan with AI explanation, interactive chat for remediation advice — fully offline |
| Multi-Cloud | AWS, Azure, GCP, and any Kubernetes cluster. Read-only — never modifies your infrastructure |
| Dashboard | Web-based dashboard for visualizing scores, trends, and team-wide governance — coming soon |
Technical deep-dives and real-world examples:
- blog/ — code examples from published posts
- blog.valqore.io — full articles
- Website: valqore.io
- Container image:
ghcr.io/valqore/engine - Blog: blog.valqore.io
- Book a demo: calendly.com/tuncvalqore
- Contact: tunc@valqore.io
VALQORE is a pending trademark. All rights reserved. See LICENSE.