Skip to content
Crow CI

Standalone Agent Binaries

Crow publishes pre-built agent binaries for macOS, Linux and Windows. They exist for one purpose only: running an agent with the local backend, which executes pipeline commands directly on the host instead of in a container.

The snippets below resolve the newest release through the forge API. Set TAG to something like v6.4.0 instead to pin a specific release, and ARCH to your architecture.

Available for amd64 and arm64.

# resolve the latest release tag
export TAG=$(curl -s https://codefloe.com/api/v1/repos/crowci/crow/releases/latest | jq -r .tag_name)
export ARCH=arm64
curl -LO https://codefloe.com/crowci/crow/releases/download/$TAG/crow-agent_darwin_$ARCH.tar.gz

# Extract the archive
tar -xzf crow-agent_darwin_*.tar.gz

# Move to system path
sudo mv crow-agent /usr/local/bin/
sudo chmod +x /usr/local/bin/crow-agent

# Verify installation
crow-agent --version

Available for amd64 and arm64.

# resolve the latest release tag
export TAG=$(curl -s https://codefloe.com/api/v1/repos/crowci/crow/releases/latest | jq -r .tag_name)
export ARCH=amd64
curl -LO https://codefloe.com/crowci/crow/releases/download/$TAG/crow-agent_linux_$ARCH.tar.gz

# Extract the archive
tar -xzf crow-agent_linux_*.tar.gz

# Move to system path
sudo mv crow-agent /usr/local/bin/
sudo chmod +x /usr/local/bin/crow-agent

# Verify installation
crow-agent --version

crow-agent_windows_amd64.zip is published for the same reasons, plus the autoscaler, which downloads it onto Windows VMs. Windows agents normally run the docker backend rather than the local one: see Windows Agents.

Why no systemd units, .deb or .rpm packages

Section titled “Why no systemd units, .deb or .rpm packages”

Only plain tarballs are published, and that is deliberate.

Packaging the agent for a distribution, or shipping a ready-made systemd unit, presents host installation as an equally supported alternative to the container agent. It is not: everything in the box at the top of this page still applies, and the resulting agent is markedly less capable and less contained than a container one. Users who install from a distribution package reasonably expect the two to be interchangeable, and then hit the missing plugin and isolation guarantees later, in production.

If you need the agent supervised on Linux, wire the binary into whatever service manager you already run. Give it its own unprivileged user, keep that user away from anything the pipelines should not reach, and do not run it as root.

See #1406 for the discussion behind this.

Running the agent as a system service on macOS uses launchd with a Launch Daemon or Launch Agent.

Create the plist file using your preferred text editor:

sudo nano /Library/LaunchDaemons/crowci.agent.plist

Paste the following content (update CROW_SERVER and CROW_AGENT_SECRET with your values):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>crowci.agent</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/crow-agent</string>
    </array>

    <key>EnvironmentVariables</key>
    <dict>
        <key>CROW_SERVER</key>
        <string>grpc.your-server.com:443</string>
        <key>CROW_GRPC_SECURE</key>
        <string>true</string>
        <key>CROW_AGENT_SECRET</key>
        <string>your-secret-token</string>
        <key>CROW_BACKEND</key>
        <string>local</string>
        <key>CROW_BACKEND_LOCAL_SANDBOX_LEVEL</key>
        <string>standard</string>
        <key>CROW_AGENT_CONFIG_FILE</key>
        <string>/usr/local/var/crow-agent/config.yml</string>
    </dict>

    <key>StandardOutPath</key>
    <string>/usr/local/var/log/crow-agent.log</string>

    <key>StandardErrorPath</key>
    <string>/usr/local/var/log/crow-agent-error.log</string>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

    <key>WorkingDirectory</key>
    <string>/usr/local/var/crow-agent</string>
</dict>
</plist>

After saving the file, validate it:

plutil -lint /Library/LaunchDaemons/crowci.agent.plist

Set up and start the service:

# Create working directories
sudo mkdir -p /usr/local/var/crow-agent /usr/local/var/log

# Set proper permissions on the plist file
sudo chown root:wheel /Library/LaunchDaemons/crowci.agent.plist
sudo chmod 644 /Library/LaunchDaemons/crowci.agent.plist

# Load and start the service (bootstrap will start it automatically)
sudo launchctl bootstrap system /Library/LaunchDaemons/crowci.agent.plist

# Verify the service is running
sudo launchctl list | grep crowci

# View logs
tail -f /usr/local/var/log/crow-agent.log
tail -f /usr/local/var/log/crow-agent-error.log
# Stop the service
sudo launchctl kickstart -k system/crowci.agent

# Restart the service
sudo launchctl kickstart -kp system/crowci.agent

# Unload/remove the service
sudo launchctl bootout system /Library/LaunchDaemons/crowci.agent.plist

# Check service status
sudo launchctl print system/crowci.agent

The CROW_BACKEND_LOCAL_SANDBOX_LEVEL environment variable controls process isolation on macOS:

No sandboxing. Workflows run with full system access. Use only in trusted environments.

Balanced security profile suitable for most CI/CD workloads. This profile:

Allowed:

  • ✅ Network access (for package downloads, git operations, API calls)
  • ✅ Reading system libraries, tools, and executables
  • ✅ Full read/write access to workflow directories (/tmp/crow-local-*)
  • ✅ Executing binaries from standard paths (/usr/bin, /usr/local/bin, etc.)
  • ✅ Process management (fork, signal, IPC)
  • ✅ Device file access (/dev/null, /dev/random, etc.)

Denied:

  • ❌ Reading sensitive system files (/etc/passwd, /etc/sudoers, etc.)
  • ❌ Reading macOS user database (/var/db/dslocal/nodes/Default/users/)
  • ❌ Accessing user directories (Documents, Desktop, Pictures, Downloads)
  • ❌ Reading SSH private keys (~/.ssh/id_*)
  • ❌ Privilege escalation (sudo is blocked)
  • ❌ Writing outside workflow directories

This profile allows typical CI/CD operations (building, testing, deploying) while preventing:

  • Credential theft (SSH keys, passwords)
  • Privilege escalation
  • Access to personal files
  • System configuration changes

Maximum security with minimal permissions. Denies network access and restricts file operations to workflow directories only. Use for highly sensitive workloads requiring maximum isolation.