
AI red-team platform. Autonomous LLM agents run a penetration test end to end inside a Kali container and write the report. LangGraph plan/act engine, provider-agnostic models via LiteLLM, PDF/JSON/SARIF output. FastAPI + React.
REDCELL runs a team of LLM agents through a pentest. An orchestrator plans the engagement and hands objectives to executor agents, which run real tools inside a Kali container and report back. You watch and steer the run from an operator console: a chat that drives the orchestrator, a live agent graph and activity feed, a live view of the browser the agent drives, a terminal on any reverse shell the agent catches, and a report to hand over when the work is done.
Models are pluggable through LiteLLM, so you can point it at OpenAI, Anthropic, Google, GLM, DeepSeek, Kimi, a local Ollama, or anything else it supports. Every run checkpoints as it goes, so a crash or a restart picks up where it left off.
run_command covers anything without a dedicated tool.docker exec. Pick localhost or a saved server per session; a remote server runs the same container over SSH with host networking.flowchart LR
UI["Operator console<br/>React + Vite"] -->|REST + WebSocket| API["FastAPI"]
API --> PG[(PostgreSQL)]
API --> RS[(Redis<br/>pub/sub + queue)]
API --> S3[(MinIO<br/>files & reports)]
RS --> W["Worker (arq)"]
W --> ENG["Engine<br/>LangGraph + LiteLLM"]
ENG -->|docker exec| KALI["Kali container<br/>local or remote over SSH"]
KALI --> TGT["Targets"]
W -->|events / chat / shell| RS
RS -->|stream| APIThe API does not run agents. It queues a run, the worker executes it, and the worker publishes output onto Redis channels that the API relays to the browser over WebSockets.
Python 3.12, FastAPI, async SQLAlchemy + asyncpg, Alembic, arq, LangGraph, LiteLLM, ReportLab, PostgreSQL, Redis, MinIO, asyncssh. Frontend: React 18, Vite, TypeScript, Tailwind, TanStack Query, xterm. Tooling: uv for Python, bun for the frontend.
# 1. infrastructure (Postgres, Redis, MinIO)
docker compose -f docker-compose.dev.yml up -d
# 2. Python deps, database, and seed data
uv sync --group live
uv run rc db upgrade
uv run rc seed # admin user, provider catalog, buckets
# 3. copy the env template
cp .env.example .env
# 4. run the three processes (separate terminals)
cd apps/api && uv run uvicorn app.main:app --host 127.0.0.1 --port 8080
cd apps/worker && uv run arq worker.settings.WorkerSettings
cd apps/web && bun install && bun run dev
Or start all three at once with a process manager (they are declared in the
Procfile): pipx install honcho then honcho start.
Open http://localhost:5183 and sign in with admin / admin.
Runs execute real tools by default. Add a provider API key in Settings and make sure Docker can pull the Kali image (martian56/kali:latest). To dry-run against canned output instead, set REDCELL_RUN_MODE=sim in .env.
Intentionally vulnerable apps to aim REDCELL at, all local:
docker compose -f docker-compose.targets.yml up -d
# DVWA http://localhost:8081 · Juice Shop http://localhost:3000 · WebGoat http://localhost:8082
Run REDCELL on a server with the published images behind a Caddy reverse proxy, so the web app and API share one origin (no CORS) and HTTPS is handled for you. On a fresh server:
git clone https://github.com/martian56/redcell.git
cd redcell
./deploy.sh
The script installs Docker if it is missing, then asks how REDCELL will be reached:
https://your-domain.It writes your answers to .env, pulls the images, and starts the stack. Read the generated admin password with docker compose logs init-secrets, then sign in as admin and change it. To change how it is reached later, just re-run ./deploy.sh and pick a different option.
Only ports 80 and 443 are published; Postgres, Redis, MinIO, the API, and the web app stay on the internal network. Stored files are streamed through the API, so object storage is never exposed. See docs/DEPLOY.md for the details of each mode.
Backend config is one root .env (see .env.example), read by both the API and the worker. The ones worth knowing:
REDCELL_RUN_MODE: live (default) or sim.REDCELL_DATABASE_URL, REDCELL_REDIS_URL, REDCELL_S3_*: infrastructure.REDCELL_SECRET_KEY: Fernet key for encrypting stored credentials. Set a real one before you go to production.Provider API keys, the execution image, scope guardrails, and report branding live in the Settings page and are stored in the database, encrypted where they need to be.
apps/
api/ FastAPI: routers, WebSocket streams, auth
worker/ arq worker: runs engagements and report generation
web/ React operator console
packages/
core/redcell_core/ engine, models, repositories, storage, bus, reporting
api-client/ the single typed client the UI talks to (mock + HTTP)
docker/ Kali execution image, web/api images, Caddy config
docker-compose.yml full stack behind a Caddy reverse proxy (self-host)
docker-compose.dev.yml Postgres + Redis + MinIO
docker-compose.targets.yml local vulnerable targets
deploy.sh interactive self-host deploy
Contributions are welcome. See CONTRIBUTING.md for setup, tests, and conventions, and the Code of Conduct. Report security issues privately through SECURITY.md, not public issues.
This is defensive and authorized-offensive tooling for security professionals, CTFs, and your own labs. Do not use it against systems you have no written permission to test. The maintainers are not responsible for misuse.