Skip to content

Commit b55a2d2

Browse files
committed
v1.1.3
1 parent 726c6f7 commit b55a2d2

10 files changed

Lines changed: 83 additions & 16 deletions

File tree

.github/workflows/docker-publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,5 +96,5 @@ jobs:
9696
username: ${{ secrets.DOCKERHUB_USERNAME }}
9797
password: ${{ secrets.DOCKERHUB_TOKEN }}
9898
repository: coderluii/holyclaude
99-
short-description: "AI coding workstation: Claude Code + web UI + 5 AI CLIs + headless browser + 50+ tools"
99+
short-description: "AI coding workstation: Claude Code + web UI + 7 AI CLIs + headless browser + 50+ tools"
100100
readme-filepath: ./docs/dockerhub-description.md

Dockerfile

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,32 @@ USER claude
146146
RUN curl -fsSL https://cursor.com/install | bash
147147
USER root
148148

149+
# ---------- Junie CLI (full only) ----------
150+
USER claude
151+
RUN if [ "$VARIANT" = "full" ]; then \
152+
curl -fsSL https://junie.jetbrains.com/install.sh | bash; \
153+
fi
154+
USER root
155+
156+
# ---------- OpenCode CLI (full only) ----------
157+
RUN if [ "$VARIANT" = "full" ]; then \
158+
npm i -g opencode-ai; \
159+
fi
160+
149161
# ---------- CloudCLI (web UI for Claude Code) ----------
150162
RUN npm i -g @siteboon/claude-code-ui
151163
RUN touch /usr/local/lib/node_modules/@siteboon/claude-code-ui/.env
152164

165+
# ---------- Patch: preserve WebSocket frame type in plugin proxy (Issue #11) ----------
166+
RUN CLOUDCLI_INDEX="/usr/local/lib/node_modules/@siteboon/claude-code-ui/server/index.js" && \
167+
grep -q "upstream.on('message', (data) =>" "$CLOUDCLI_INDEX" && \
168+
sed -i "s/upstream.on('message', (data) => {/upstream.on('message', (data, isBinary) => {/" "$CLOUDCLI_INDEX" && \
169+
sed -i "s/if (clientWs.readyState === WebSocket.OPEN) clientWs.send(data)/if (clientWs.readyState === WebSocket.OPEN) clientWs.send(data, { binary: isBinary })/" "$CLOUDCLI_INDEX" && \
170+
sed -i "s/clientWs.on('message', (data) => {/clientWs.on('message', (data, isBinary) => {/" "$CLOUDCLI_INDEX" && \
171+
sed -i "s/if (upstream.readyState === WebSocket.OPEN) upstream.send(data)/if (upstream.readyState === WebSocket.OPEN) upstream.send(data, { binary: isBinary })/" "$CLOUDCLI_INDEX" && \
172+
echo "[patch] WebSocket frame type fix applied (both directions)" || \
173+
echo "[patch] WARNING: WebSocket pattern not found in CloudCLI v$(npm show @siteboon/claude-code-ui version), skipping patch"
174+
153175
# ---------- CloudCLI plugins (baked into image) ----------
154176
USER claude
155177
RUN mkdir -p /home/claude/.claude-code-ui/plugins && \

README.md

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
### Stop configuring. Start building.
2222

23-
One command. Full AI development workstation. Claude Code, web UI, headless browser, 5 AI CLIs, 50+ dev tools — containerized and ready.
23+
One command. Full AI development workstation. Claude Code, web UI, headless browser, 7 AI CLIs, 50+ dev tools — containerized and ready.
2424

2525
**You were going to spend 2 hours setting this up manually. Or you could just `docker compose up`.**
2626

@@ -156,7 +156,7 @@ So I made a container that does all of it. And then I hit every possible bug so
156156
| **Claude Code** | Pre-installed, pre-configured, ready | Install, configure, debug installer hanging, fix WORKDIR |
157157
| **Web UI** | CloudCLI included with plugins | Find a web UI, install it, configure it, wire it to Claude |
158158
| **Headless browser** | Chromium + Xvfb + Playwright, configured | Install Chromium, install Xvfb, configure display :99, fix shm, fix sandbox, fix seccomp... |
159-
| **AI CLIs** | 5 providers, one container | Install each one separately across 3 package managers |
159+
| **AI CLIs** | 7 providers, one container | Install each one separately across 3 package managers |
160160
| **Dev tools** | 50+ tools, ready | `apt-get install` / `npm i -g` / `pip install` for the next hour |
161161
| **Process management** | s6-overlay (auto-restart, graceful shutdown) | Write your own supervisord config or hope Docker restart works |
162162
| **Persistence** | Bind mounts, credentials survive everything | Figure out Docker volumes, debug "why is this a directory not a file" |
@@ -197,6 +197,8 @@ HolyClaude runs the **official Claude Code CLI** from Anthropic. Your existing a
197197
| OpenAI Codex | OpenAI API key (`OPENAI_API_KEY`) — separate from ChatGPT subscription |
198198
| Cursor | Cursor API key (`CURSOR_API_KEY`) |
199199
| TaskMaster AI | Uses your AI provider keys (Anthropic, OpenAI, etc.) |
200+
| Junie | JetBrains account (JetBrains AI subscription) |
201+
| OpenCode | Configure via `opencode` TUI (supports multiple providers) |
200202

201203
> **HolyClaude is free and open source.** You only pay your AI providers for usage, same as you already do. We don't proxy, intercept, or touch your credentials. They live in your local bind mount.
202204
@@ -390,10 +392,9 @@ services:
390392
# - NOTIFY_GOTIFY=gotify://hostname/token
391393
# - NOTIFY_URLS= # catch-all: comma-separated Apprise URLs
392394
#
393-
# AI PROVIDER API KEYS (optional)
394-
# These are for the OTHER AI CLIs — not Claude Code itself.
395-
# Claude Code authenticates through the web UI (OAuth or API key).
396-
# Set these if you want to use Gemini, Codex, or Cursor CLIs.
395+
# AI PROVIDER KEYS (optional)
396+
# Claude Code can authenticate via web UI (OAuth) or ANTHROPIC_API_KEY.
397+
# Set these if you want to use additional AI CLIs or API-based auth.
397398
#
398399
# - GEMINI_API_KEY=your_key
399400
# - OPENAI_API_KEY=your_key
@@ -425,7 +426,7 @@ These values are read by Docker Compose on the host. They are not container envi
425426
| **User mapping** | File permissions between container and host | If you get "permission denied" (`id -u` and `id -g` on your host) |
426427
| **SMB/CIFS** | File watcher polling mode | Only if your volumes live on a NAS or network share |
427428
| **Notifications** | Push alerts via Apprise (Discord, Telegram, Slack, Email, 100+ services) | If you want to walk away and know when Claude is done |
428-
| **AI providers** | API keys for Gemini, Codex, Cursor | If you want to use AI CLIs other than Claude |
429+
| **AI providers** | API keys for Gemini, Codex, Cursor, Junie, OpenCode | If you want to use AI CLIs other than Claude |
429430

430431
> **Every single environment variable is optional.** The container runs perfectly with just `TZ=UTC`. Everything else has sensible defaults or is handled through the web UI.
431432
@@ -456,9 +457,15 @@ The complete reference. Every variable, what it defaults to, what it does.
456457
| `NOTIFY_EMAIL` | *(unset)* | Email (SMTP) URL for notifications |
457458
| `NOTIFY_GOTIFY` | *(unset)* | Gotify URL for notifications |
458459
| `NOTIFY_URLS` | *(unset)* | Catch-all — comma-separated [Apprise URLs](https://github.com/caronc/apprise/wiki) |
460+
| `ANTHROPIC_API_KEY` | *(unset)* | Anthropic API key (alternative to web UI OAuth) |
461+
| `ANTHROPIC_AUTH_TOKEN` | *(unset)* | Anthropic auth token (alternative to API key) |
462+
| `ANTHROPIC_BASE_URL` | *(unset)* | Custom Anthropic API endpoint (proxies, private deployments) |
463+
| `CLAUDE_CODE_USE_BEDROCK` | *(unset)* | Set to `1` to use Amazon Bedrock backend |
464+
| `CLAUDE_CODE_USE_VERTEX` | *(unset)* | Set to `1` to use Google Vertex AI backend |
459465
| `GEMINI_API_KEY` | *(unset)* | Google Gemini API key |
460466
| `OPENAI_API_KEY` | *(unset)* | OpenAI API key (for Codex CLI — NOT ChatGPT) |
461467
| `CURSOR_API_KEY` | *(unset)* | Cursor API key |
468+
| `OLLAMA_HOST` | *(unset)* | Ollama endpoint URL (e.g., `http://host.docker.internal:11434`) |
462469

463470
<p align="right">
464471
<a href="#top">↑ back to top</a>
@@ -533,8 +540,10 @@ This is not a minimal container. This is an entire development workstation.
533540
| **OpenAI Codex** | `codex` | OpenAI's coding agent |
534541
| **Cursor** | `cursor` | Cursor's AI agent |
535542
| **TaskMaster AI** | `task-master` | Task planning and orchestration |
543+
| **Junie** | `junie` | JetBrains' AI coding agent |
544+
| **OpenCode** | `opencode` | Open source AI agent (multiple providers) |
536545

537-
Five AI CLIs. One container. Switch between them instantly. No other Docker image does this.
546+
Seven AI CLIs. One container. Switch between them instantly. No other Docker image does this.
538547

539548
</details>
540549

@@ -595,7 +604,7 @@ The full image includes everything above, plus:
595604

596605
## :robot: AI CLI Providers
597606

598-
Five AI CLIs. One container. No other Docker image gives you this.
607+
Seven AI CLIs. One container. No other Docker image gives you this.
599608

600609
| Provider | Command | How to authenticate | Subscription works? |
601610
|----------|---------|--------------------|--------------------|
@@ -604,6 +613,8 @@ Five AI CLIs. One container. No other Docker image gives you this.
604613
| **OpenAI Codex** | `codex` | `OPENAI_API_KEY` env var | API key only — ChatGPT Plus does NOT work |
605614
| **Cursor** | `cursor` | `CURSOR_API_KEY` env var | API key |
606615
| **TaskMaster AI** | `task-master` | Uses existing AI provider keys | Works with configured keys |
616+
| **Junie** | `junie` | JetBrains AI subscription | JetBrains account required |
617+
| **OpenCode** | `opencode` | Configure via TUI | Supports multiple providers |
607618

608619
> Claude Code is the primary CLI. The others are there because sometimes you want a second opinion, or a specific model's strengths, or you're comparing outputs. Having all of them one `Tab` away is the whole point.
609620

config/claude-memory-full.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ The `--break-system-packages` flag is required (no venv in container context).
7676
| **OpenAI Codex** | `codex` | Requires `OPENAI_API_KEY` env var |
7777
| **Cursor** | `cursor` | Requires `CURSOR_API_KEY` env var |
7878
| **TaskMaster AI** | `task-master` | Task planning and management |
79+
| **Junie** | `junie` | JetBrains AI coding agent (requires JetBrains account) |
80+
| **OpenCode** | `opencode` | Open source AI agent (supports multiple providers) |
7981

8082
## System Tools
8183

config/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"permissions": {
3-
"defaultMode": "allowEdits"
3+
"defaultMode": "acceptEdits"
44
},
55
"env": {
66
"DISABLE_AUTOUPDATER": "1"

docker-compose.full.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,15 @@ services:
5252
# - NOTIFY_GOTIFY=gotify://hostname/token
5353
# - NOTIFY_URLS= # catch-all: comma-separated Apprise URLs
5454

55+
# --- Anthropic / Claude Code (optional, can also authenticate via web UI) ---
56+
# - ANTHROPIC_API_KEY=
57+
# - ANTHROPIC_AUTH_TOKEN=
58+
# - ANTHROPIC_BASE_URL= # Custom API endpoint (proxies, private deployments)
59+
# - CLAUDE_CODE_USE_BEDROCK=1 # Use Amazon Bedrock as backend
60+
# - CLAUDE_CODE_USE_VERTEX=1 # Use Google Vertex AI as backend
61+
5562
# --- AI provider API keys (optional — can also set via web UI) ---
5663
# - GEMINI_API_KEY=
5764
# - OPENAI_API_KEY=
5865
# - CURSOR_API_KEY=
66+
# - OLLAMA_HOST=http://host.docker.internal:11434 # External Ollama endpoint

docs/CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,21 @@ All notable changes to HolyClaude will be documented in this file.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/).
66

7+
## [1.1.3] - 03/27/2026
8+
9+
### Added
10+
- Junie CLI (JetBrains AI coding agent) in full variant
11+
- OpenCode CLI (open source AI coding agent) in full variant
12+
- Environment variable passthrough to CloudCLI for AI provider keys, timezone, and display (`ANTHROPIC_API_KEY`, `CLAUDE_CODE_USE_BEDROCK`, `CLAUDE_CODE_USE_VERTEX`, `OLLAMA_HOST`, `TZ`, `DISPLAY`, etc.)
13+
14+
### Fixed
15+
- Web Terminal plugin stuck on "Connecting..." spinner (WebSocket frame type not preserved in plugin proxy, both relay directions patched)
16+
- `NODE_OPTIONS` from Docker Compose now correctly merged with internal flags instead of being silently overridden
17+
- `TZ` and `DISPLAY` environment variables now properly forwarded to CloudCLI process
18+
- Default permission mode corrected from `allowEdits` to `acceptEdits` in settings.json
19+
20+
Thanks to [@RobertWalther](https://github.com/RobertWalther) for the WebSocket fix and [@kewogc](https://github.com/kewogc) for reporting the settings error.
21+
722
## [1.1.2] - 03/26/2026
823

924
### Added

docs/configuration.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,19 @@ Notifications also require the flag file `~/.claude/notify-on` to exist inside t
7979

8080
### AI Provider API Keys
8181

82-
These can also be set through the CloudCLI web UI.
82+
Claude Code can authenticate via web UI (OAuth) or `ANTHROPIC_API_KEY`. Other AI CLI keys can also be set through the web UI.
8383

8484
| Variable | Default | Description |
8585
|----------|---------|-------------|
86+
| `ANTHROPIC_API_KEY` | (unset) | Anthropic API key (alternative to web UI OAuth) |
87+
| `ANTHROPIC_AUTH_TOKEN` | (unset) | Anthropic auth token (alternative to API key) |
88+
| `ANTHROPIC_BASE_URL` | (unset) | Custom Anthropic API endpoint (proxies, private deployments) |
89+
| `CLAUDE_CODE_USE_BEDROCK` | (unset) | Set to `1` to use Amazon Bedrock backend |
90+
| `CLAUDE_CODE_USE_VERTEX` | (unset) | Set to `1` to use Google Vertex AI backend |
8691
| `GEMINI_API_KEY` | (unset) | Google Gemini API key |
8792
| `OPENAI_API_KEY` | (unset) | OpenAI API key |
8893
| `CURSOR_API_KEY` | (unset) | Cursor API key |
94+
| `OLLAMA_HOST` | (unset) | Ollama endpoint URL |
8995

9096
---
9197

docs/dockerhub-description.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
**One command. Full AI development workstation.**
44

5-
Claude Code, CloudCLI web UI, headless browser, 5 AI CLIs, 50+ dev tools — containerized and ready. You were going to spend 2 hours setting this up manually. Or you could just `docker compose up`.
5+
Claude Code, CloudCLI web UI, headless browser, 7 AI CLIs, 50+ dev tools — containerized and ready. You were going to spend 2 hours setting this up manually. Or you could just `docker compose up`.
66

77
[![Docker Pulls](https://img.shields.io/docker/pulls/coderluii/holyclaude?style=flat-square&logo=docker)](https://hub.docker.com/r/coderluii/holyclaude)
88
[![GitHub Stars](https://img.shields.io/github/stars/coderluii/holyclaude?style=flat-square&logo=github)](https://github.com/CoderLuii/HolyClaude)
@@ -40,7 +40,7 @@ That's it. Open your browser, sign in, start building.
4040

4141
## What's Inside
4242

43-
🤖 **5 AI CLIs** — Claude Code, Gemini CLI, OpenAI Codex, Cursor, TaskMaster AI
43+
🤖 **7 AI CLIs** — Claude Code, Gemini CLI, OpenAI Codex, Cursor, TaskMaster AI, Junie, OpenCode
4444

4545
🌐 **CloudCLI Web UI** — Access your AI coding agents from any browser on port 3001
4646

s6-overlay/s6-rc.d/cloudcli/run

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1-
#!/bin/sh
1+
#!/command/with-contenv sh
22
cd /workspace
3-
exec s6-setuidgid claude env HOME=/home/claude NODE_OPTIONS=--no-deprecation WORKSPACES_ROOT=/workspace claude-code-ui --port 3001
3+
export HOME=/home/claude
4+
export WORKSPACES_ROOT=/workspace
5+
export NODE_OPTIONS="${NODE_OPTIONS:+$NODE_OPTIONS }--no-deprecation"
6+
exec s6-setuidgid claude claude-code-ui --port 3001

0 commit comments

Comments
 (0)