<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ayush Khandelwal</title>
    <description>The latest articles on DEV Community by Ayush Khandelwal (@ayush_khandelwal_b8bbd1fc).</description>
    <link>https://dev.to/ayush_khandelwal_b8bbd1fc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4193094%2F9cfcdc7e-3a77-4e87-9793-984d2679684b.png</url>
      <title>DEV Community: Ayush Khandelwal</title>
      <link>https://dev.to/ayush_khandelwal_b8bbd1fc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ayush_khandelwal_b8bbd1fc"/>
    <language>en</language>
    <item>
      <title>How I Used FalkorDB to Trace Software Security Risks in Warden</title>
      <dc:creator>Ayush Khandelwal</dc:creator>
      <pubDate>Mon, 19 Oct 2026 02:29:55 +0000</pubDate>
      <link>https://dev.to/ayush_khandelwal_b8bbd1fc/how-i-used-falkordb-to-trace-software-security-risks-in-warden-2jn2</link>
      <guid>https://dev.to/ayush_khandelwal_b8bbd1fc/how-i-used-falkordb-to-trace-software-security-risks-in-warden-2jn2</guid>
      <description>&lt;p&gt;You’re right—you want the &lt;strong&gt;article body&lt;/strong&gt;, based on the actual README. Use the title separately, then paste everything under &lt;strong&gt;Post content&lt;/strong&gt; into Dev.to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; Warden: Graph-Based Security Analysis with FalkorDB&lt;/p&gt;




&lt;p&gt;Warden helps software teams investigate security risks in a repository by connecting services, dependencies, vulnerabilities, ownership, and change history in a graph.&lt;/p&gt;

&lt;p&gt;Instead of looking at vulnerability findings in isolation, engineers can explore how a package relates to a service, how services are modeled as communicating, and what sensitive data may be connected downstream. Warden uses those relationships to show evidence paths, help prioritize investigation, and rehearse possible dependency fixes before a person approves a change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt; &lt;a href="https://github.com/ayushKhandelwal07/warden" rel="noopener noreferrer"&gt;Warden on GitHub&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://warden-bice.vercel.app/" rel="noopener noreferrer"&gt;warden-bice.vercel.app&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Demo video:&lt;/strong&gt; &lt;a href="https://www.youtube.com/watch?v=k0hGW56RJNo" rel="noopener noreferrer"&gt;Watch the demo&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem Warden explores
&lt;/h2&gt;

&lt;p&gt;A vulnerability scanner can identify a package with a known advisory. But a finding by itself may leave important questions unanswered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which service uses the package?&lt;/li&gt;
&lt;li&gt;Is that service connected to an internet-facing entry point?&lt;/li&gt;
&lt;li&gt;What other services or data are connected to it?&lt;/li&gt;
&lt;li&gt;Who owns the service?&lt;/li&gt;
&lt;li&gt;What could change if we upgrade the package?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Warden brings repository structure and security information together so a team can explore these questions with graph queries and visible evidence.&lt;/p&gt;

&lt;p&gt;A graph path is evidence of &lt;strong&gt;modeled reachability&lt;/strong&gt;. It does not prove that vulnerable code is called or that an application is exploitable. Warden does not currently perform runtime traffic analysis or function-level vulnerability reachability.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why FalkorDB?
&lt;/h2&gt;

&lt;p&gt;The relationships between services, dependencies, vulnerabilities, and data are central to Warden’s workflow. FalkorDB provides the graph store Warden uses to represent and query those connections.&lt;/p&gt;

&lt;p&gt;Warden loads normalized repository and security information into FalkorDB, then uses graph queries to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find vulnerability findings connected to modeled exposure.&lt;/li&gt;
&lt;li&gt;Explore paths between services and other graph entities.&lt;/li&gt;
&lt;li&gt;Calculate blast radius, rankings, and potential choke points.&lt;/li&gt;
&lt;li&gt;Show evidence nodes, edges, sources, and query details.&lt;/li&gt;
&lt;li&gt;Compare the modeled graph before and after a candidate dependency upgrade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For fix planning, Warden rehearses proposed upgrades against a temporary copy of the graph. It reruns exposure analysis and safety checks, then presents the plan and gate result for review. A successful graph rehearsal demonstrates modeled graph impact; it does not guarantee that an upgrade preserves application behavior. The target project’s own tests and CI still need to be reviewed.&lt;/p&gt;
&lt;h2&gt;
  
  
  From a repository to a graph
&lt;/h2&gt;

&lt;p&gt;When a project is built, Warden reads the selected repository and branch or tag into a project-specific checkout. It discovers services and topology from Kubernetes manifests, Docker Compose files, or supported code and dependency layouts.&lt;/p&gt;

&lt;p&gt;It parses supported dependency files into package nodes and dependency relationships, looks up package advisories through OSV, and enriches findings with CISA Known Exploited Vulnerabilities (KEV) and FIRST EPSS data. Optional NVD lookups can provide CVSS information. Where available, Warden also reads Git history and adds curated owner, policy, incident, and data-sensitivity context for the shared sample project.&lt;/p&gt;

&lt;p&gt;The ingest pipeline records provenance so users can see whether information came from a repository or feed, was inferred from configuration, or was curated for the sample project.&lt;/p&gt;

&lt;p&gt;Supported dependency inputs include npm lockfiles, Python requirements and common Poetry/uv/Pipenv locks, &lt;code&gt;go.mod&lt;/code&gt;, NuGet &lt;code&gt;.csproj&lt;/code&gt;, Maven POM and Gradle files, Cargo, Ruby Bundler, and Composer lockfiles. The importer supports common repository layouts, not every possible project structure. Results depend on the files and configuration present.&lt;/p&gt;
&lt;h2&gt;
  
  
  What you can do in Warden
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Explore the attack surface
&lt;/h3&gt;

&lt;p&gt;The Home screen shows an attack-surface map and exposure summaries. Select a service to inspect its modeled connections to callers, dependencies, and sensitive data.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Secure [service]&lt;/strong&gt; interaction is a visual counterfactual. It highlights which currently modeled internet-to-sensitive-data routes would be cut if a service were secured. It does not modify the repository or graph.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ask questions and inspect evidence
&lt;/h3&gt;

&lt;p&gt;The Ask screen lets you ask graph-backed questions, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“What should we fix first?”&lt;/li&gt;
&lt;li&gt;“Show the path for CVE-2023-44487.”&lt;/li&gt;
&lt;li&gt;“Is paymentservice reachable from the internet? Show the evidence.”&lt;/li&gt;
&lt;li&gt;“What does this service read, and who owns it?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent selects graph tools through MCP and drafts an answer using their results. The interface can show the tool trace, evidence path, source, Cypher query, and parameters. A deterministic verifier checks important claims against the tools’ results for that turn.&lt;/p&gt;

&lt;p&gt;Model-backed answers require an OpenAI-compatible LLM endpoint. Graph tools and non-LLM views can still be used without an LLM key.&lt;/p&gt;
&lt;h3&gt;
  
  
  Compare and propose fixes
&lt;/h3&gt;

&lt;p&gt;The plan builder can compare candidate dependency upgrade strategies. You can set a maximum number of upgrades, specify frozen services, and disallow major-version upgrades. Warden rehearses candidates on graph copies and displays changes, risk removed, new advisories, residual KEV, and gate results.&lt;/p&gt;

&lt;p&gt;A blocked plan cannot be filed. A passing plan can be filed for approval. Filing creates a pending approval; it does not immediately make a GitHub change.&lt;/p&gt;
&lt;h3&gt;
  
  
  Review pull requests and approvals
&lt;/h3&gt;

&lt;p&gt;The PR impact screen analyzes affected services, graph blast radius, owners, related history, policies, and suggested review feedback.&lt;/p&gt;

&lt;p&gt;Plans and PR analyses can be sent to the Approvals screen for human review. Warden does not automatically merge pull requests. With GitHub configured, approved actions can operate on the selected repository target. Review the proposed changes and the pull request’s CI results before merging.&lt;/p&gt;

&lt;p&gt;The Watcher also has a clearly labeled demo simulation that can commit a one-line topology change to its configured repository. Use a disposable fork for that demonstration.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use tools, sync, watch, and evaluate
&lt;/h3&gt;

&lt;p&gt;The Tools screen runs graph tools directly and displays summaries, rows, evidence paths, source details, queries, parameters, and duration. The graph tools are read-only; GitHub write actions use separate approval workflows.&lt;/p&gt;

&lt;p&gt;Sync re-reads the configured repository and reports graph changes. The Watcher can poll for branch changes and create pending proposals when it detects new modeled exposure. The Evaluation screen runs designed scenarios against the tools and reports whether their expected outcomes match. These scenarios are a regression suite, not an independent benchmark across arbitrary repositories.&lt;/p&gt;

&lt;p&gt;Warden also exposes its graph tool registry through an MCP server for use by Warden’s agent and compatible external MCP clients.&lt;/p&gt;
&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;Warden uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; for the backend API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React, TypeScript, and Vite&lt;/strong&gt; for the frontend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FalkorDB&lt;/strong&gt; for repository and security graph data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; for application records such as accounts, sessions, teams, projects, and conversations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cytoscape.js&lt;/strong&gt; for graph visualizations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; to expose graph tools to the agent and compatible clients.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The backend contains the API, authentication, repository ingestion, graph access, security and topology tools, agent, evaluation, planning, approvals, sync, watcher, and MCP server. The frontend contains screens for Home, Ask, PR impact, Approvals, Tools, Sync, Evaluation, Settings, authentication, and the public landing page.&lt;/p&gt;

&lt;p&gt;The basic request path is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The browser sends an authenticated request to the FastAPI backend.&lt;/li&gt;
&lt;li&gt;The API resolves the user’s current project.&lt;/li&gt;
&lt;li&gt;The agent or screen calls project-scoped graph tools.&lt;/li&gt;
&lt;li&gt;The tools query FalkorDB and return rows and, where available, evidence paths.&lt;/li&gt;
&lt;li&gt;The interface displays results and supporting details.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PostgreSQL stores application data; FalkorDB stores repository and security relationships.&lt;/p&gt;
&lt;h2&gt;
  
  
  Run Warden locally
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;p&gt;You’ll need Docker Desktop or Docker Engine with Compose, Python 3.11 or newer, Node.js 20 or newer with npm, Git, and internet access for the first repository build and vulnerability-feed requests.&lt;/p&gt;
&lt;h3&gt;
  
  
  Quick start
&lt;/h3&gt;

&lt;p&gt;Clone the repository, open a terminal in the project directory, and copy the environment template:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows PowerShell:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Copy-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;example&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;macOS or Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit &lt;code&gt;.env&lt;/code&gt; if needed. The backend reads this file from the repository root. Never commit your &lt;code&gt;.env&lt;/code&gt; file or put backend secrets in frontend variables.&lt;/p&gt;

&lt;p&gt;Then run the project launcher:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\start.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;macOS/Linux/Git Bash:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./start.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The launcher starts FalkorDB and PostgreSQL, prepares the Python environment, installs dependencies if needed, initializes the sample graph if it is empty, and starts the API and Vite development server. The first ingest can take several minutes.&lt;/p&gt;

&lt;p&gt;The local addresses are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI: &lt;code&gt;http://localhost:5173&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;API: &lt;code&gt;http://localhost:8000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;API docs: &lt;code&gt;http://localhost:8000/docs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;FalkorDB Browser: &lt;code&gt;http://localhost:3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;FalkorDB graph port: &lt;code&gt;localhost:6380&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL: &lt;code&gt;localhost:5433&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sign up at &lt;code&gt;/signup&lt;/code&gt;. New users can access the shared sample project. You can create another project to build a graph from a GitHub repository and selected branch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Manual development setup
&lt;/h3&gt;

&lt;p&gt;If you prefer to run the services in separate terminals, start the graph and database from the repository root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; falkordb postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install and initialize the backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;backend&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;venv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;venv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\.venv\Scripts\Activate.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;requirements.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;warden.ingest.bootstrap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;uvicorn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;warden.api.app:app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;127.0.0.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;8000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On macOS/Linux, activate the environment with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In another terminal, start the frontend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vite proxies &lt;code&gt;/api&lt;/code&gt; to &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;. Set &lt;code&gt;WARDEN_API&lt;/code&gt; if the backend is running on a different local port.&lt;/p&gt;

&lt;h3&gt;
  
  
  Environment variables
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;.env.example&lt;/code&gt; file documents the available settings. The main ones are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FalkorDB:&lt;/strong&gt; &lt;code&gt;FALKORDB_HOST&lt;/code&gt;, &lt;code&gt;FALKORDB_PORT&lt;/code&gt;, and optional username, password, and TLS settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL:&lt;/strong&gt; &lt;code&gt;DATABASE_URL&lt;/code&gt; for user, team, project, session, and conversation data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository ingestion:&lt;/strong&gt; &lt;code&gt;DEMO_REPO_URL&lt;/code&gt;, &lt;code&gt;DEMO_REF&lt;/code&gt;, &lt;code&gt;HISTORY_SINCE&lt;/code&gt;, and optional &lt;code&gt;WARDEN_NVD&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM:&lt;/strong&gt; &lt;code&gt;LLM_BASE_URL&lt;/code&gt;, &lt;code&gt;LLM_API_KEY&lt;/code&gt;, and &lt;code&gt;LLM_MODEL&lt;/code&gt; for model-backed Ask answers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, &lt;code&gt;GITHUB_OWNER&lt;/code&gt;, &lt;code&gt;GITHUB_REPO&lt;/code&gt;, and &lt;code&gt;GITHUB_BASE&lt;/code&gt; for repository access and approved actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessions and deployment:&lt;/strong&gt; &lt;code&gt;SESSION_SECRET&lt;/code&gt;, &lt;code&gt;COOKIE_SAMESITE&lt;/code&gt;, &lt;code&gt;COOKIE_SECURE&lt;/code&gt;, &lt;code&gt;CORS_ORIGINS&lt;/code&gt;, &lt;code&gt;WARDEN_URL&lt;/code&gt;, and &lt;code&gt;VITE_API_URL&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The local defaults in &lt;code&gt;.env.example&lt;/code&gt; are for development. Before exposing an API publicly, use a long random &lt;code&gt;SESSION_SECRET&lt;/code&gt;, HTTPS, secure cookies, exact CORS origins, and appropriately scoped credentials. Keep GitHub tokens on the backend.&lt;/p&gt;

&lt;p&gt;Without GitHub credentials, the sample graph and many read-only views remain available, but private repository access and GitHub actions are unavailable. Without an LLM key, graph-backed pages and tools remain usable, but Ask cannot generate model answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub integration and human approval
&lt;/h2&gt;

&lt;p&gt;A fine-grained GitHub token enables private repository access, GitHub history and pull request metadata, and approved repository actions. Grant only the permissions needed for the target repository, configure the project’s repository in Settings, and verify the target shown on the Approvals screen.&lt;/p&gt;

&lt;p&gt;Warden does not automatically merge pull requests. Plans and PR analyses wait for human approval before GitHub writes. Use a fork or dedicated test repository when trying write actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data, privacy, and limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The shared sample project uses Google’s Online Boutique repository.&lt;/li&gt;
&lt;li&gt;Vulnerability data comes from OSV, CISA KEV, and FIRST EPSS; optional NVD lookups can be enabled. Feed data is cached locally.&lt;/li&gt;
&lt;li&gt;Sample ownership, incidents, policies, and data sensitivity are curated demo context, not facts about an actual company.&lt;/li&gt;
&lt;li&gt;Repository clones and feed caches are runtime data stored under &lt;code&gt;backend/data/raw/&lt;/code&gt; and ignored by Git.&lt;/li&gt;
&lt;li&gt;LLM prompts include the user’s question and the tool data needed to answer it. Check your model provider’s data-handling terms before using private repository data.&lt;/li&gt;
&lt;li&gt;Service calls can be inferred from manifests, environment variables, or Compose files. The interface labels inferred and curated evidence.&lt;/li&gt;
&lt;li&gt;EPSS and KEV data are time-sensitive and should be refreshed for operational decisions.&lt;/li&gt;
&lt;li&gt;A graph path is not proof of exploitability, and a fix-plan rehearsal is not a replacement for application tests.&lt;/li&gt;
&lt;li&gt;Repository discovery supports common formats and layouts, not every possible repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing and production deployment
&lt;/h2&gt;

&lt;p&gt;Run the backend tests from &lt;code&gt;backend/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pytest &lt;span class="nt"&gt;-q&lt;/span&gt; tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build and type-check the frontend from &lt;code&gt;frontend/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For production, deploy the API, FalkorDB, and Caddy on a server with HTTPS, then deploy the &lt;code&gt;frontend/&lt;/code&gt; directory to Vercel as a static site. Set &lt;code&gt;VITE_API_URL&lt;/code&gt; to the API’s HTTPS origin in Vercel. Configure the backend’s &lt;code&gt;WARDEN_URL&lt;/code&gt; and &lt;code&gt;CORS_ORIGINS&lt;/code&gt; to match the frontend origin. Store secrets in the hosting provider, not in committed files. Redeploy the frontend after changing &lt;code&gt;VITE_API_URL&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Warden is built with FastAPI, React, Vite, TypeScript, Cytoscape.js, FalkorDB, PostgreSQL, and MCP. It uses public vulnerability information from &lt;a href="https://osv.dev" rel="noopener noreferrer"&gt;OSV&lt;/a&gt;, &lt;a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog" rel="noopener noreferrer"&gt;CISA KEV&lt;/a&gt;, and &lt;a href="https://www.first.org/epss" rel="noopener noreferrer"&gt;FIRST EPSS&lt;/a&gt;. The sample service repository is &lt;a href="https://github.com/GoogleCloudPlatform/microservices-demo" rel="noopener noreferrer"&gt;Google Online demo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>database</category>
      <category>security</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
