An open-source background coding agent. Designed to understand, reason about, and contribute to existing codebases. Licensed for open-source use under MIT License
Sets up isolated execution environments for AI agents to work on GitHub repositories with tools to understand code, edit files, and much more.
- GitHub repository integration with branch management
- Pull request generation with AI-authored commits
- Real-time task status tracking and progress updates
- Automatic workspace setup and cleanup on Micro-VMs
- Kata QEMU containers for hardware-level isolation
- Multi-provider LLM support (Anthropic, OpenAI, OpenRouter)
- Streaming chat interface with real-time responses
- Tool execution with file operations, terminal commands, and code search
- Memory system for repository-specific knowledge retention
- Semantic code search, background processing
- Lightweight Shadow Wiki generation for comprehensive codebase documentation
- Custom rules for Shadow code generation
Shadow supports two execution modes through an abstraction layer:
- Direct filesystem execution on the host machine
- Hardware-isolated execution in Kata QEMU containers
- True VM isolation via QEMU hypervisor
- Kubernetes orchestration with bare metal nodes
Mode selection is controlled by NODE_ENV and AGENT_MODE environment variables.
- Frontend (
apps/frontend/) - Next.js application with real-time chat interface, terminal emulator, file explorer, and task management - Server (
apps/server/) - Node.js orchestrator handling LLM integration, WebSocket communication, task initialization, and API endpoints - Sidecar (
apps/sidecar/) - Express.js service providing REST APIs for file operations within isolated containers - Website (
apps/website/) - Marketing and landing page - Database (
packages/db/) - Prisma schema and PostgreSQL client with comprehensive data models - Types (
packages/types/) - Shared TypeScript type definitions for the entire platform - Command Security (
packages/command-security/) - Security utilities for command validation and sanitization - ESLint Config (
packages/eslint-config/) - Shared linting rules - TypeScript Config (
packages/typescript-config/) - Shared TypeScript configurations
- Node.js 22
- PostgreSQL
- Clone the repository and install dependencies:
git clone <repository-url>
cd shadow
npm install- Set up environment variables:
# Copy example environment files
cp apps/server/.env.template apps/server/.env
cp apps/frontend/.env.template apps/frontend/.env
cp packages/db/.env.template packages/db/.env- Configure the database:
# Create local PostgreSQL database
psql -U postgres -c "CREATE DATABASE shadow_dev;"
# Update packages/db/.env with your database URL
DATABASE_URL="postgres://postgres:@127.0.0.1:5432/shadow_dev"
# Generate Prisma client and push schema
npm run generate
npm run db:push- Start development servers:
# Start all services
npm run dev
# Or start specific services
npm run dev --filter=frontend
npm run dev --filter=server
npm run dev --filter=sidecarSet variables in the following files:
- Frontend:
apps/frontend/.env.local - Server:
apps/server/.env - Database:
packages/db/.env
Use a personal GitHub token so the GitHub selector works instantly without installing our app.
- Create a GitHub Personal Access Token with scopes:
repo,read:org. - Add env vars:
An easy way to do this is run the ./setup-script.sh which will take in your input variables and autoset them in the right places for you! If you would like to do it manually, follow the instructions below
apps/server/.env
# Required
DATABASE_URL="postgres://postgres:@127.0.0.1:5432/shadow_dev"
BETTER_AUTH_SECRET="dev-secret"
GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx
# Local mode
NODE_ENV=development
AGENT_MODE=local
# Optional: Pinecone for semantic search
PINECONE_API_KEY="" # TODO: Set this to your Pinecone API key
PINECONE_INDEX_NAME="shadow"
# Workspace directory for local agent:
WORKSPACE_DIR= # TODO: Set this to your local workspace directoryapps/frontend/.env.local
# Point frontend to your server if needed
NEXT_PUBLIC_SERVER_URL=http://localhost:4000
# Marks environment; any value other than "production" enables local behavior
NEXT_PUBLIC_VERCEL_ENV=development
GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
# Optional (only if you want OAuth login locally)
BETTER_AUTH_SECRET=dev-secretpackages/db/.env
DATABASE_URL="postgres://postgres:@127.0.0.1:5432/shadow_dev"
DIRECT_URL="postgres://postgres:@127.0.0.1:5432/shadow_dev"With GITHUB_PERSONAL_ACCESS_TOKEN set on the server and NEXT_PUBLIC_VERCEL_ENV not equal to production, the backend uses your PAT for repo/branch/issue queries. The frontend's GitHub selector works immediately.
# Lint all packages and apps
npm run lint
# Format code with Prettier
npm run format
# Type checking
npm run check-types# Generate Prisma client from schema
npm run generate
# Push schema changes to database (for development)
npm run db:push
# Reset database and push schema (destructive)
npm run db:push:reset
# Open Prisma Studio GUI
npm run db:studio
# Run migrations in development
npm run db:migrate:dev# Build all packages and apps
npm run build
# Build specific app
npm run build --filter=frontend
npm run build --filter=server
npm run build --filter=sidecarShadow provides a comprehensive set of tools for AI agents:
read_file- Read file contents with line range supportedit_file- Write and modify filessearch_replace- Precise string replacementdelete_file- Safe file deletionlist_dir- Directory exploration
grep_search- Pattern matching with regexfile_search- Fuzzy filename searchsemantic_search- AI-powered semantic code search
run_terminal_cmd- Command execution with real-time output- Command validation and security checks
todo_write- Structured task managementadd_memory- Repository-specific knowledge storagelist_memories- Retrieve stored knowledge
- TypeScript throughout with strict type checking
- Shared configurations via packages
- Clean separation between execution modes
- WebSocket event compatibility across frontend/backend
- Command validation in all execution modes
- Path traversal protection
- Workspace boundary enforcement
- Container isolation in remote mode
- Always test both local and remote modes for production features
- Keep initialization steps mode-aware and properly abstracted
- Maintain WebSocket event compatibility across frontend/backend changes
- Remote mode requires Amazon Linux 2023 nodes for Kata Containers compatibility
- Fork the repository
- Create a feature branch
- Make your changes with proper TypeScript types
- Test in both local and remote modes
- Submit a pull request
We're excited to see what you've built with Shadow!
Ishaan Dey — X