# Deploy from Windows

You have three options to run Algo on Windows:

1. **PowerShell Script** (Recommended) - Automated WSL wrapper for easy use
2. **Windows Subsystem for Linux (WSL)** - Direct Linux environment access
3. **Git Bash/MSYS2** - Unix-like shell environment (limited compatibility)

## Option 1: PowerShell Script (Recommended)

The PowerShell script provides the easiest Windows experience by automatically using WSL when needed:

```powershell
git clone https://github.com/trailofbits/algo
cd algo
.\algo.ps1
```

**How it works:**
- Detects if you're already in WSL and uses the standard Unix approach
- On native Windows, automatically runs Algo via WSL (since Ansible requires Unix)
- Provides clear guidance if WSL isn't installed

**Requirements:**
- Windows Subsystem for Linux (WSL) with Ubuntu 22.04
- If WSL isn't installed, the script will guide you through installation

## Option 2: Windows Subsystem for Linux (WSL)

For users who prefer a full Linux environment or need advanced features:

### Prerequisites
* 64-bit Windows 10/11 (Anniversary update or later)

### Setup WSL
1. Install WSL from PowerShell (as Administrator):
```powershell
wsl --install -d Ubuntu-22.04
```

2. After restart, open Ubuntu and create your user account

### Install Algo in WSL
```bash
cd ~
git clone https://github.com/trailofbits/algo
cd algo
./algo
```

**Important**: Don't install Algo in `/mnt/c` directory due to file permission issues.

### WSL Configuration (if needed)

You may encounter permission issues if you clone Algo to a Windows drive (like `/mnt/c/`). Symptoms include:

- **Git errors**: "fatal: could not set 'core.filemode' to 'false'"
- **Ansible errors**: "ERROR! Skipping, '/mnt/c/.../ansible.cfg' as it is not safe to use as a configuration file"
- **SSH key errors**: "WARNING: UNPROTECTED PRIVATE KEY FILE!" or "Permissions 0777 for key are too open"

If you see these errors, configure WSL:

1. Edit `/etc/wsl.conf` to allow metadata:
```ini
[automount]
options = "metadata"
```

2. Restart WSL completely:
```powershell
wsl --shutdown
```

3. Fix directory permissions for Ansible:
```bash
chmod 744 .
```

**Why this happens**: Windows filesystems mounted in WSL (`/mnt/c/`) don't support Unix file permissions by default. Git can't set executable bits, and Ansible refuses to load configs from "world-writable" directories for security.

After deployment, copy configs to Windows:
```bash
cp -r configs /mnt/c/Users/$USER/
```

## Option 3: Git Bash/MSYS2

If you have Git for Windows installed, you can use the included Git Bash terminal:

```bash
git clone https://github.com/trailofbits/algo
cd algo
./algo
```

**Pros**:
- Uses the standard Unix `./algo` script
- No WSL setup required
- Familiar Unix-like environment

**Cons**:
- **Limited compatibility**: Ansible may not work properly due to Windows/Unix differences
- **Not officially supported**: May encounter unpredictable issues
- Less robust than WSL or PowerShell options
- Requires Git for Windows installation

**Note**: This approach is not recommended due to Ansible's Unix requirements. Use WSL-based options instead.
