{"id":33376,"date":"2026-08-12T10:00:00","date_gmt":"2026-08-12T08:00:00","guid":{"rendered":"https:\/\/contabo.com\/blog\/?p=33376"},"modified":"2026-08-16T20:56:29","modified_gmt":"2026-08-16T18:56:29","slug":"self-host-open-kritt-vps","status":"publish","type":"post","link":"https:\/\/contabo.com\/blog\/self-host-open-kritt-vps\/","title":{"rendered":"How to Self-Host Open-Kritt: AI Security Scanning on a VPS"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Open-Kritt is an open-source (AGPL-3.0), Docker Compose-based platform that deploys AI agents to actively discover vulnerabilities in your code. It requires a minimum of 8 GB RAM, with 16 GB recommended. Everything runs on your own infrastructure, keeping findings and proprietary code off third-party servers.<\/p>\n\n\n\n<h2 id=\"h-what-open-kritt-does-ai-driven-vulnerability-discovery\" class=\"wp-block-heading\">What Open-Kritt Does: AI-Driven Vulnerability Discovery<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Active agent reasoning, not static rules.<\/strong> AI agents run inside disposable containers, install dependencies, execute code, and build proofs of concept \u2014 going beyond pattern-matching to reason about actual code paths.<\/li>\n\n\n\n<li><strong>Parallel, structured workflows.<\/strong> Scans are broken into focused prompt steps chained into reusable research playbooks. Agents run these in parallel, with each depth level feeding output into the next.<\/li>\n\n\n\n<li><strong>Multiple harness options.<\/strong> Agents operate through Codex or Claude Code as the underlying harness, with support for OpenAI, Anthropic, and OpenRouter API keys.<\/li>\n\n\n\n<li><strong>Validated, ranked findings.<\/strong> Post-scripts validate candidate issues, build proofs of concept, and produce written reports. A severity ranker and automatic deduplication turn raw output into a prioritised findings list.<\/li>\n\n\n\n<li><strong>Export-ready output.<\/strong> Findings, structured data, and reports are packaged into a single archive for storage, sharing, or CI pipeline handoff.<\/li>\n\n\n\n<li><strong>AGPL-3.0 licence.<\/strong> Self-hosting keeps all code and findings on infrastructure you control. Distributing a modified version as a network service still triggers AGPL obligations \u2014 treat the licence as a starting point for compliance review, not a substitute for one.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-prerequisites\" class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A suitable Contabo VPS or VDS<\/strong> with at least 8 GB RAM, 4 vCPU cores, and 50 GB NVMe storage (e.g. our <a href=\"https:\/\/contabo.com\/en\/vps\/cloud-vps-core-6\">VPS Core 6<\/a>); 16 GB RAM is recommended for concurrent scans where our <a href=\"https:\/\/contabo.com\/en\/vps\/cloud-vps-core-8\">Cloud VPS Core 8<\/a> is the best fit.<\/li>\n\n\n\n<li><strong>A supported Linux distribution:<\/strong> Ubuntu 24.04, Debian 12, or Rocky Linux 9 on x86_64 or ARM64.<\/li>\n\n\n\n<li><strong>Docker Engine<\/strong> with the Docker Compose plugin (or Docker Desktop for local testing).<\/li>\n\n\n\n<li><strong>Git<\/strong>, for cloning the repository.<\/li>\n\n\n\n<li><strong>Node.js 20 or newer<\/strong>, required only when using the repository-local CLI; the manual Docker path does not need it.<\/li>\n\n\n\n<li><strong>An LLM API key or model-access credential:<\/strong> one of <code>OPENAI_API_KEY<\/code>, <code>CODEX_API_KEY<\/code>, <code>ANTHROPIC_API_KEY<\/code>, or <code>OPENROUTER_API_KEY<\/code>. OpenRouter can proxy some open-weight models, but there is no built-in local Ollama endpoint.<\/li>\n\n\n\n<li><strong>A <code>GITHUB_TOKEN<\/code><\/strong> (optional) \u2014 only needed when scanning private GitHub repositories or private dependencies.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-step-1-clone-and-configure-open-kritt\" class=\"wp-block-heading\">Step 1: Clone and Configure Open-Kritt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Clone the <a href=\"https:\/\/github.com\/Kritt-ai\/open-kritt\" rel=\"nofollow\">Open-Kritt repository<\/a> and run the interactive setup to create and populate <code>.env<\/code> with your model credentials:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Clone the repository\ngit clone https:\/\/github.com\/Kritt-ai\/open-kritt &amp;&amp; cd open-kritt\n\n# Launch the interactive CLI and select Setup from the menu\n# This creates .env from .env.example and walks through credential configuration\n.\/kritt\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For a manual setup, copy and secure the example environment file, then set your provider key:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cp .env.example .env\nchmod 600 .env\n\n# Set one key inside .env, for example:\n# ANTHROPIC_API_KEY=your-key-here\n\n# Create the credential directory expected by the Codex harness\nmkdir -p .data\/codex\nchmod 700 .data\/codex\n<\/code><\/pre>\n\n\n\n<h2 id=\"h-step-2-start-the-agent-stack\" class=\"wp-block-heading\">Step 2: Start the Agent Stack<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start all five services with the CLI wrapper, which runs <code>docker compose up --build<\/code> and streams logs from every service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/kritt start\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once startup completes, verify the backend is healthy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl http:\/\/127.0.0.1:3002\/api\/health\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Both the frontend (<code>http:\/\/localhost:5173<\/code>) and backend bind to <code>127.0.0.1<\/code> by default. Open-Kritt has no built-in application-level authentication \u2014 access the interface via SSH tunnel or a reverse proxy with its own auth layer before opening any firewall ports.<\/p>\n\n\n\n<h2 id=\"h-step-3-submit-a-repository-for-scanning\" class=\"wp-block-heading\">Step 3: Submit a Repository for Scanning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Via the web UI:<\/strong> open Scans \u2192 New scan, select a workflow, target repository, model\/harness, and severity ranker, then queue the run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Via the API<\/strong> (for automation or headless deployments):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl --fail-with-body \\\n  -X POST http:\/\/127.0.0.1:3002\/api\/scans \\\n  -H 'Content-Type: application\/json' \\\n  --data-binary @- &lt;&lt;'JSON'\n{\n  \"workflowId\": 1,\n  \"postScriptId\": 1,\n  \"repo_kind\": \"remote\",\n  \"repo_full\": \"your-org\/your-repo\",\n  \"commit_sha\": \"HEAD\",\n  \"repo_scope\": \"authentication and untrusted input paths\",\n  \"model\": \"sonnet\",\n  \"model_provider\": \"claude\",\n  \"harness\": \"claude-code\",\n  \"thinking_effort\": \"medium\",\n  \"severity_ranker\": \"Rank exploitable, remotely reachable findings first.\",\n  \"extra\": {}\n}\nJSON\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For local repositories, set <code>\"repo_kind\": \"local\"<\/code> and place the source in <code>.\/local_repos\/&lt;folder-name><\/code> on the host before submitting.<\/p>\n\n\n\n<h2 id=\"h-step-4-review-findings-and-triage\" class=\"wp-block-heading\">Step 4: Review Findings and Triage<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Open the scan<\/strong> from the Overview dashboard or Scans list. A status badge tracks progress through <code>pending \u2192 running \u2192 post_processing \u2192 completed<\/code>.<\/li>\n\n\n\n<li><strong>Review the ranked findings list.<\/strong> Rows are sorted by the severity ranker configured on the scan, each showing a title, affected file location, and post-script chips.<\/li>\n\n\n\n<li><strong>Drill into a finding<\/strong> to see the full vulnerability view: severity rating, <code>file_path<\/code> and line number, the agent&#8217;s reasoning about the attack path, a malicious input example, and, when a post-script ran, a full written report or proof of concept.<\/li>\n\n\n\n<li><strong>Triage collaboratively.<\/strong> Mark findings as interesting or not and leave comments for teammates working the same list.<\/li>\n\n\n\n<li><strong>Export the scan.<\/strong> Packaging produces a single archive of canonical findings, structured data, and reports, suitable for storage or handoff to a CI pipeline.<\/li>\n<\/ol>\n\n\n\n<h2 id=\"h-integrate-open-kritt-with-your-ci-cd-pipeline\" class=\"wp-block-heading\">Integrate Open-Kritt with Your CI\/CD Pipeline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The HTTP API makes it straightforward to trigger a scan from a GitHub Actions workflow on pull request or on a nightly schedule. The example below assumes the Open-Kritt stack is already running on a reachable host:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name: open-kritt-scan\non:\n  workflow_dispatch:\njobs:\n  trigger-scan:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Queue Open-Kritt scan\n        run: |\n          curl --fail-with-body \\\n            -X POST https:\/\/your-vps-host:3002\/api\/scans \\\n            -H 'Content-Type: application\/json' \\\n            --data-binary @- &lt;&lt;'JSON'\n          {\n            \"workflowId\": 1,\n            \"postScriptId\": 1,\n            \"repo_kind\": \"remote\",\n            \"repo_full\": \"${{ github.repository }}\",\n            \"commit_sha\": \"${{ github.sha }}\",\n            \"repo_scope\": \"full repository\",\n            \"model\": \"sonnet\",\n            \"model_provider\": \"claude\",\n            \"harness\": \"claude-code\",\n            \"severity_ranker\": \"Rank exploitable, remotely reachable findings first.\",\n            \"extra\": {}\n          }\n          JSON\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because the backend has no built-in authentication, place this endpoint behind a VPN, SSH tunnel, or authenticating reverse proxy before exposing it to a CI runner over the public internet.<\/p>\n\n\n\n<h2 id=\"h-faq-open-kritt-self-hosted\" class=\"wp-block-heading\">FAQ: Open-Kritt Self-Hosted<\/h2>\n\n\n\n<div class=\"schema-faq wp-block-yoast-faq-block\"><div class=\"schema-faq-section\" id=\"faq-question-1786906141169\"><strong class=\"schema-faq-question\">What is Open-Kritt?<\/strong> <p class=\"schema-faq-answer\">Open-Kritt is an open-source, self-hosted platform (AGPL-3.0) that orchestrates AI agents to research and validate vulnerabilities in a codebase. It breaks a security review into focused parallel tasks, runs them inside disposable containers using a harness such as Codex or Claude Code, and consolidates the results into ranked, deduplicated findings. It runs entirely on Docker Compose.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1786906146123\"><strong class=\"schema-faq-question\">How much RAM does Open-Kritt need?<\/strong> <p class=\"schema-faq-answer\">The project does not publish an official minimum, but five long-running services alongside Docker image builds and parallel agent job containers make 8 GB a realistic floor for light use. Running multiple concurrent scans or targeting large repositories benefits from 16 GB or more, so agent containers are not competing with the core stack for memory.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1786906149281\"><strong class=\"schema-faq-question\">Can Open-Kritt use a local LLM?<\/strong> <p class=\"schema-faq-answer\">Open-Kritt&#8217;s documented model-access options route through Codex, OpenAI, Anthropic, or OpenRouter. There is no built-in Ollama or direct local-inference integration. OpenRouter can proxy certain open-weight models depending on account configuration, but even a fully self-hosted orchestration deployment still relies on an external provider for model inference.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-question-1786906154129\"><strong class=\"schema-faq-question\">Is Open-Kritt free to use?<\/strong> <p class=\"schema-faq-answer\">The platform itself is free to self-host under AGPL-3.0. Running scans carries an indirect cost, since each agent job consumes API credits or subscription usage from the configured model provider. Kritt also offers a separate managed scanning service for teams that prefer not to operate the infrastructure themselves.<\/p> <\/div> <\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>Open-Kritt is an open-source AI agent platform that orchestrates agents to find real vulnerabilities in your code. Learn how to self-host it on a Contabo VPS with Docker.<\/p>\n","protected":false},"author":50,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":"","_members_access_role":[],"_members_access_error":""},"categories":[9],"tags":[],"ppma_author":[1491],"class_list":["post-33376","post","type-post","status-publish","format-standard","hentry","category-company-news"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Tobias Mildenberger","author_link":"https:\/\/contabo.com\/blog\/author\/tobias\/"},"uagb_comment_info":0,"uagb_excerpt":"Open-Kritt is an open-source AI agent platform that orchestrates agents to find real vulnerabilities in your code. Learn how to self-host it on a Contabo VPS with Docker.","authors":[{"term_id":1491,"user_id":50,"is_guest":0,"slug":"tobias","display_name":"Tobias Mildenberger","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/077178d5dce6c3d4c0c0396857a7e544bfdf8adf04145fff5160b33a22e28b1f?s=96&d=mm&r=g","author_category":"","user_url":"https:\/\/contabo.com\/en\/","last_name":"Mildenberger","first_name":"Tobias","job_title":"","description":""}],"_links":{"self":[{"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/posts\/33376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/users\/50"}],"replies":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/comments?post=33376"}],"version-history":[{"count":1,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/posts\/33376\/revisions"}],"predecessor-version":[{"id":33377,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/posts\/33376\/revisions\/33377"}],"wp:attachment":[{"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/media?parent=33376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/categories?post=33376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/tags?post=33376"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/contabo.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=33376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}