holyclaude-ai-workstation

Deploy a full AI coding workstation with Claude Code, web UI, headless browser, and 5 AI CLIs in a single Docker container

INSTALLATION
npx skills add https://github.com/aradotso/trending-skills --skill holyclaude-ai-workstation
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

HolyClaude AI Workstation

Skill by ara.so — Daily 2026 Skills collection.

HolyClaude is a containerized AI development workstation that bundles Claude Code CLI, a CloudCLI web UI, Chromium headless browser with Playwright, 5 AI CLIs (Claude, Gemini, OpenAI Codex, Cursor, TaskMaster AI), and 50+ dev tools into a single Docker image. One docker compose up replaces hours of manual setup.

Installation

Prerequisites

  • Docker + Docker Compose installed
  • Existing Anthropic account (Max/Pro subscription or API key)

Quick Start

mkdir holyclaude && cd holyclaude

Create docker-compose.yaml:

services:

  holyclaude:

    image: CoderLuii/HolyClaude:latest

    container_name: holyclaude

    hostname: holyclaude

    restart: unless-stopped

    shm_size: 2g

    ports:

      - "3001:3001"

    volumes:

      - ./data/claude:/root/.claude

      - ./data/config:/root/.config

      - ./projects:/workspace

    environment:

      - PUID=1000

      - PGID=1000
docker compose up -d

# Open http://localhost:3001

Image Variants

# Full image — all tools pre-installed (recommended)

docker pull CoderLuii/HolyClaude:latest

# Slim image — smaller download, tools installed on demand

docker pull CoderLuii/HolyClaude:slim

# Pinned version for production stability

docker pull CoderLuii/HolyClaude:1.2.3

docker pull CoderLuii/HolyClaude:1.2.3-slim

Full Docker Compose Configuration

services:

  holyclaude:

    image: CoderLuii/HolyClaude:latest

    container_name: holyclaude

    hostname: holyclaude

    restart: unless-stopped

    shm_size: 2g                          # Required for Chromium

    ports:

      - "3001:3001"                       # CloudCLI web UI

    volumes:

      - ./data/claude:/root/.claude       # Claude credentials & config (persisted)

      - ./data/config:/root/.config       # App config (persisted)

      - ./projects:/workspace             # Your project files

    environment:

      # User/group IDs (match host user to avoid permission issues)

      - PUID=1000

      - PGID=1000

      # AI provider API keys (optional — can also set via web UI)

      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}

      - GEMINI_API_KEY=${GEMINI_API_KEY}

      - OPENAI_API_KEY=${OPENAI_API_KEY}

      - CURSOR_API_KEY=${CURSOR_API_KEY}

      # NAS/SMB mount polling (enable if using Synology/QNAP)

      - CHOKIDAR_USEPOLLING=true

      # Notification webhooks (optional)

      - DISCORD_WEBHOOK_URL=${DISCORD_WEBHOOK_URL}

      - SLACK_WEBHOOK_URL=${SLACK_WEBHOOK_URL}

    security_opt:

      - seccomp:unconfined               # Required for Chromium sandbox

Environment Variable Reference

Variable

Required

Description

PUID

Recommended

Host user ID (run id -u to find yours)

PGID

Recommended

Host group ID (run id -g to find yours)

ANTHROPIC_API_KEY

Optional

Anthropic API key (alternative to OAuth login)

GEMINI_API_KEY

Optional

Google AI API key for Gemini CLI

OPENAI_API_KEY

Optional

OpenAI API key for Codex CLI

CURSOR_API_KEY

Optional

Cursor API key

CHOKIDAR_USEPOLLING

NAS only

Set true for SMB/NFS mounts

DISCORD_WEBHOOK_URL

Optional

Discord notifications

SLACK_WEBHOOK_URL

Optional

Slack notifications

Authentication

Method 1: OAuth (Claude Max/Pro Subscription)

  • Open http://localhost:3001
  • Create a CloudCLI account (10 seconds)
  • Sign in with your Anthropic account via OAuth
  • No API key needed — uses your existing subscription

Method 2: API Key

environment:

  - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}

Or paste the key directly in the CloudCLI web UI settings.

Credential Persistence

Credentials are stored in the bind-mounted volume:

./data/claude/     →  /root/.claude/

./data/config/     →  /root/.config/

Credentials survive container restarts, updates, and recreation.

Platform-Specific Configuration

Linux (amd64/arm64) — Default

# No extra config needed

shm_size: 2g

macOS (Docker Desktop)

# Works out of the box with Docker Desktop

shm_size: 2g

Windows (WSL2 + Docker Desktop)

# Requires WSL2 backend enabled in Docker Desktop

shm_size: 2g

Synology / QNAP NAS

environment:

  - CHOKIDAR_USEPOLLING=true    # Fixes file watching on SMB mounts

volumes:

  - /volume1/docker/holyclaude/data/claude:/root/.claude

  - /volume1/docker/holyclaude/projects:/workspace

Kubernetes (ARM64 / Oracle Cloud Graviton)

# arm64 image is published alongside amd64

image: CoderLuii/HolyClaude:latest   # multi-arch manifest auto-selects correct arch

What's Inside the Container

AI CLIs

CLI

Invocation

Key Provider

Claude Code

claude

Anthropic (ANTHROPIC_API_KEY or OAuth)

Gemini CLI

gemini

Google (GEMINI_API_KEY)

OpenAI Codex

codex

OpenAI (OPENAI_API_KEY)

Cursor

cursor

Cursor (CURSOR_API_KEY)

TaskMaster AI

task-master

Uses configured AI provider keys

Headless Browser Stack

  • Chromium — pre-installed and configured
  • Xvfb — virtual display on :99
  • Playwright — configured and ready
  • Shared memoryshm_size: 2g pre-configured (fixes the 64MB Docker default)

Dev Tools (50+)

  • Languages: Node.js, Python 3, TypeScript, Bun, Deno
  • Package managers: npm, yarn, pnpm, pip, cargo
  • Database clients: PostgreSQL, MySQL, SQLite, Redis CLI
  • Cloud CLIs: AWS CLI, Google Cloud SDK, Azure CLI
  • Dev tools: GitHub CLI (gh), Git, curl, jq, ripgrep, fd
  • Process manager: s6-overlay (auto-restart, graceful shutdown)

Working with Projects

Mount your project directory

volumes:

  - ./projects:/workspace

  # Or mount a specific project:

  - /path/to/my-app:/workspace/my-app

Inside the container

# Access the container shell

docker exec -it holyclaude bash

# Navigate to workspace

cd /workspace

# Run Claude Code directly

claude

# Run other AI CLIs

gemini

codex

Playwright / Headless Browser Usage

Playwright is pre-configured. Use it from Claude Code tasks or directly:

// playwright.config.ts — already works inside the container

import { defineConfig } from '@playwright/test';

export default defineConfig({

  use: {

    // Chromium is pre-installed, no download needed

    browserName: 'chromium',

    launchOptions: {

      args: [

        '--no-sandbox',

        '--disable-setuid-sandbox',

        '--disable-dev-shm-usage',  // Use /tmp instead of /dev/shm

      ],

    },

  },

});
// Direct Playwright usage inside container

import { chromium } from 'playwright';

const browser = await chromium.launch({

  args: [

    '--no-sandbox',

    '--disable-setuid-sandbox',

    '--disable-dev-shm-usage',

  ],

});

const page = await browser.newPage();

await page.goto('https://example.com');

const screenshot = await page.screenshot({ path: '/workspace/screenshot.png' });

await browser.close();
# Run Playwright tests inside container

docker exec -it holyclaude bash -c "cd /workspace && npx playwright test"

# Run with headed mode via Xvfb

docker exec -it holyclaude bash -c "DISPLAY=:99 npx playwright test --headed"

Updating HolyClaude

# Pull latest image

docker compose pull

# Recreate container with new image (zero data loss — data is in bind mounts)

docker compose up -d

# Or explicit recreation

docker compose down && docker compose up -d

Pinned Version Strategy

# For production: pin to a specific version

image: CoderLuii/HolyClaude:1.2.3

# Update by changing the tag and running:

docker compose up -d

Data & Persistence

holyclaude/

├── docker-compose.yaml

├── data/

│   ├── claude/          # Claude credentials, .claude.json, history

│   └── config/          # CloudCLI and app configuration

└── projects/            # Your workspace (mount your code here)

All credentials and config survive:

  • Container restarts
  • docker compose down && up
  • Image updates via docker compose pull
  • Container recreation

Common Patterns

Pattern: Multiple Projects

volumes:

  - ./data/claude:/root/.claude

  - ./data/config:/root/.config

  - ~/code/project-a:/workspace/project-a

  - ~/code/project-b:/workspace/project-b

  - ~/code/project-c:/workspace/project-c

Pattern: Read-only API Keys via .env file

# .env (never commit this)

ANTHROPIC_API_KEY=sk-ant-...

GEMINI_API_KEY=AIza...

OPENAI_API_KEY=sk-...
# docker-compose.yaml

services:

  holyclaude:

    env_file: .env

Pattern: Custom Port

ports:

  - "8080:3001"    # Access via http://localhost:8080

Pattern: Remote Server Access

ports:

  - "0.0.0.0:3001:3001"    # Accessible from network

# Then access via http://your-server-ip:3001

# Recommend putting behind nginx/Caddy with HTTPS for production

Pattern: Nginx Reverse Proxy

services:

  holyclaude:

    image: CoderLuii/HolyClaude:latest

    # Don't expose ports directly — nginx handles it

    expose:

      - "3001"

    networks:

      - web

  nginx:

    image: nginx:alpine

    ports:

      - "443:443"

    volumes:

      - ./nginx.conf:/etc/nginx/conf.d/default.conf

      - ./certs:/etc/nginx/certs

    networks:

      - web

networks:

  web:

Troubleshooting

Container won't start

# Check logs

docker compose logs holyclaude

# Check if port 3001 is already in use

lsof -i :3001

Chromium crashes / headless browser fails

# Ensure shm_size is set (CRITICAL)

shm_size: 2g

# Ensure seccomp is unconfined

security_opt:

  - seccomp:unconfined
# Verify display is available inside container

docker exec holyclaude bash -c "echo $DISPLAY"

# Should output: :99

Permission denied errors on bind mounts

environment:

  - PUID=1000    # Must match your host user: `id -u`

  - PGID=1000    # Must match your host group: `id -g`
# Fix existing permissions on host

sudo chown -R 1000:1000 ./data ./projects

File watching broken on NAS / SMB mounts

environment:

  - CHOKIDAR_USEPOLLING=true

Claude Code installer hangs

This is pre-solved in HolyClaude — the container sets the correct WORKDIR ownership. If you're building a custom image on top:

# Ensure WORKDIR is not root-owned before running Claude Code installer

RUN chown -R node:node /app

WORKDIR /app

SQLite locks on NAS mount

volumes:

  # Move SQLite databases to a local volume, not NAS mount

  - holyclaude-db:/root/.local/share/holyclaude

  - /nas/mount:/workspace    # NAS mount only for project files

volumes:

  holyclaude-db:

Claude Code authentication lost after restart

# Ensure this volume is mounted (credentials live here)

volumes:

  - ./data/claude:/root/.claude

Process keeps dying / not restarting

HolyClaude uses s6-overlay for process supervision. Check service status:

docker exec holyclaude s6-svstat /run/service/cloudcli

docker exec holyclaude s6-svstat /run/service/xvfb

Building Locally

git clone https://github.com/CoderLuii/HolyClaude.git

cd HolyClaude

# Build full image

docker build -t holyclaude:local .

# Build slim image

docker build -t holyclaude:local-slim --target slim .

# Build for specific platform

docker buildx build --platform linux/arm64 -t holyclaude:arm64 .

# Run your local build

docker run -d \

  --name holyclaude \

  --shm-size=2g \

  -p 3001:3001 \

  -v $(pwd)/data/claude:/root/.claude \

  holyclaude:local

Quick Reference

# Start

docker compose up -d

# Stop

docker compose down

# View logs (live)

docker compose logs -f holyclaude

# Shell access

docker exec -it holyclaude bash

# Update to latest

docker compose pull && docker compose up -d

# Restart only the container

docker compose restart holyclaude

# Check resource usage

docker stats holyclaude
BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card