Multi-Agent · AI-Powered · Full-Stack

VULNSCAN

Automated Vulnerability Scanner

5-agent AI pipeline — Recon → Static → Dynamic → Validation → Report. Gemini-backed intelligence. Full-stack Docker orchestration. End-to-end scan in <60 seconds.

PythonFastAPI Gemini AINmap OWASP ZAPDocker PostgreSQLRedis ReactTelegram Bot
5
Agents
21
Python Files
<60s
Full Scan
0
Errors
System Architecture

5-Agent Pipeline

Each agent is a specialized microservice. The orchestrator coordinates the pipeline. Gemini AI backs the intelligence layer.

AGENT 01
Recon Agent
Network discovery, port scanning, subdomain enumeration, Shodan queries.
NmapnucleihttpxsubfinderShodan
AGENT 02
Static Agent
Code & config static analysis. Detects misconfigs and known vuln patterns.
semgrepbandittrivycheckov
AGENT 03
Dynamic Agent
Active web application testing. Crawling, fuzzing, and injection attempts.
OWASP ZAPffuf
AGENT 04
Validation Agent
EPSS scoring, deduplication, CVSS mapping, compliance framework alignment.
EPSSCVSSdedupcompliance
AGENT 05
Report Agent
Generates structured PDF reports, creates Jira tickets, sends Telegram alerts.
PDFJiraTelegram
ENTRY POINT
FastAPI
main_v2.py · /docs
COORDINATOR
Orchestrator
orchestrator_v2.py
DASHBOARD
React UI
App.jsx · :3000
INTERFACE
Telegram Bot
telegram_bot.py · /start
Interactive Demo

Live Scan Simulation

Enter a target (or use a preset) to simulate a full vulnerability scan pipeline.

VULNSCAN // LIVE PIPELINE // v2.0
VulnScan v2.0 — Multi-Agent AI Security Scanner
Powered by Gemini · FastAPI · Docker
─────────────────────────────────────────
Awaiting target... Enter IP/domain and press SCAN
Scan Results
Run a scan to see vulnerability findings here.
Technology Stack

Full Stack

Backend
PythonFastAPIRedisPostgreSQLDockerGrafana
AI Intelligence
Google GeminiLLM Prompt EngineeringEPSS Scoring
Security Tools
NmapnucleiOWASP ZAPffufsemgrepbandittrivyShodan
Frontend & Output
ReactApp.jsxPDF ReportsJiraTelegram Bot
QUICK START
# 1. Configure environment
cp .env.template .env
# Add: GOOGLE_API_KEY · TELEGRAM_BOT_TOKEN · API_KEY

# 2. Launch full stack
docker compose up -d

# 3. Access
Dashboard:  http://localhost:3000
API Docs:   http://localhost:8000/docs
Telegram:   /start → /scan <target>
/* NEON RIBBON */ (function(){ const canvas=document.getElementById('ribbon-canvas'); if(!canvas)return; const ctx=canvas.getContext('2d'); const CFG={SPEED_X:.14,SPEED_Y:.14,MAX_LENGTH:90,RS:.018,GS:.013,BS:.022,SPREAD:16}; let anim=0,W=0,H=0; const pts=[],mouse={x:0,y:0},prev={x:0,y:0},cs={r:0,g:200,b:255,sz:0}; function resize(){W=canvas.width=innerWidth;H=canvas.height=innerHeight} resize();window.addEventListener('resize',resize,{passive:true}); document.addEventListener('mousemove',e=>{mouse.x=e.clientX;mouse.y=e.clientY},{passive:true}); mouse.x=prev.x=innerWidth/2;mouse.y=prev.y=innerHeight/2; function sp(p){p.x+=p.dx;p.y+=p.dy} function dl(){ const n=pts.length;if(n<3)return; for(let i=n-1;i>1;i--){ const p0=pts[i],p1=pts[i-1],p2=pts[i-2]; ctx.beginPath();ctx.strokeStyle=p0.color;ctx.lineWidth=p0.sz;ctx.globalAlpha=i/n; ctx.moveTo((p1.x+p0.x)/2,(p1.y+p0.y)/2); ctx.quadraticCurveTo(p1.x,p1.y,(p1.x+p2.x)/2,(p1.y+p2.y)/2);ctx.stroke();sp(p0); } if(pts[0])sp(pts[0]);if(pts[n-1])sp(pts[n-1]); } function draw(){ let dx=Math.max(-CFG.SPREAD,Math.min(CFG.SPREAD,(mouse.x-prev.x)*CFG.SPEED_X)); let dy=Math.max(-CFG.SPREAD,Math.min(CFG.SPREAD,(mouse.y-prev.y)*CFG.SPEED_Y)); prev.x=mouse.x;prev.y=mouse.y;cs.sz+=.12;cs.r+=CFG.RS;cs.g+=CFG.GS;cs.b+=CFG.BS; const sz=Math.abs(Math.sin(cs.sz)*8)+1; const r=Math.floor(Math.sin(cs.r)*128+128),g=Math.floor(Math.sin(cs.g)*128+128),b=Math.floor(Math.sin(cs.b)*128+128); pts.push({x:mouse.x,y:mouse.y,dx,dy,sz,color:`rgb(${r},${g},${b})`}); if(pts.length>CFG.MAX_LENGTH)pts.shift(); ctx.globalCompositeOperation='source-over';ctx.globalAlpha=1; ctx.fillStyle='rgba(0,0,0,.05)';ctx.fillRect(0,0,W,H); ctx.globalCompositeOperation='lighter';dl();dl();dl(); anim=requestAnimationFrame(draw); } draw(); document.addEventListener('visibilitychange',()=>{if(document.hidden)cancelAnimationFrame(anim);else draw()}); })(); /* 3D TILT on cards */ document.querySelectorAll('.spec-card,.feature-card,.stat-card,.phase-card,.card,.metric-card,.tech-card,.detail-card,.comp-card,.step-card,.challenge-card').forEach(card=>{ card.style.transition='transform .32s ease,box-shadow .32s'; card.addEventListener('mousemove',e=>{ const r=card.getBoundingClientRect(); const x=(e.clientX-r.left)/r.width-.5,y=(e.clientY-r.top)/r.height-.5; card.style.transform=`perspective(820px) rotateX(${-y*8}deg) rotateY(${x*10}deg) scale3d(1.015,1.015,1.015)`; },{passive:true}); card.addEventListener('mouseleave',()=>{card.style.transform='perspective(820px) rotateX(0) rotateY(0) scale3d(1,1,1)'}); }); /* CIPHER TEXT on section headings */ (function(){ const CHARS='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#@!%'; function cipher(el,target,delay){ setTimeout(()=>{ let frame=0;const total=Math.floor(1000/30); const id=setInterval(()=>{ const prog=frame/total;let out=''; for(let i=0;i(i/target.length)?target[i]:CHARS[Math.floor(Math.random()*CHARS.length)]; el.textContent=out; if(frame>=total){clearInterval(id);el.textContent=target} frame++; },30); },delay); } const ro=new IntersectionObserver(entries=>{ entries.forEach(e=>{ if(e.isIntersecting){ const el=e.target; const orig=el.dataset.cipherText||el.textContent; el.dataset.cipherText=orig; cipher(el,orig,0); ro.unobserve(el); } }); },{threshold:.3}); document.querySelectorAll('h2,h3').forEach(h=>{ if(h.textContent.trim().length<60)ro.observe(h); }); })();