<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: CoderLuii</title>
    <description>The latest articles on Forem by CoderLuii (@coderluii).</description>
    <link>https://forem.com/coderluii</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3837927%2Ffe1a6455-18fc-4551-a57c-8f894d8d7d3b.jpeg</url>
      <title>Forem: CoderLuii</title>
      <link>https://forem.com/coderluii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/coderluii"/>
    <language>en</language>
    <item>
      <title>HolyCode: OpenCode in Docker with 30+ Tools, Persistent State, and No API Key Required</title>
      <dc:creator>CoderLuii</dc:creator>
      <pubDate>Tue, 31 Mar 2026 08:25:01 +0000</pubDate>
      <link>https://forem.com/coderluii/holycode-opencode-in-docker-with-30-tools-persistent-state-and-no-api-key-required-42n3</link>
      <guid>https://forem.com/coderluii/holycode-opencode-in-docker-with-30-tools-persistent-state-and-no-api-key-required-42n3</guid>
      <description>&lt;p&gt;You get your dev environment exactly right. Then you switch machines. Or rebuild a container. Or your system decides today is the day it dies.&lt;/p&gt;

&lt;p&gt;Suddenly you're reinstalling tools. Hunting down config files. Re-entering API keys. Wondering why ripgrep isn't on PATH anymore. Figuring out why Chromium won't launch. Then Xvfb isn't configured. Then the UID inside the container doesn't match your host and everything is permission denied.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/coderluii/holycode" rel="noopener noreferrer"&gt;HolyCode&lt;/a&gt; after solving every single one of those problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What HolyCode Is
&lt;/h2&gt;

&lt;p&gt;HolyCode wraps &lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt;, an AI coding agent with a built-in web UI, in a Docker container with everything already wired up. 30+ dev tools, two language runtimes, a headless browser stack, process supervision via s6-overlay, and support for 10+ AI providers. Pull the image, run one compose command, open your browser. That's the whole setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1.&lt;/strong&gt; Create a &lt;code&gt;docker-compose.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;holycode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;coderluii/holycode:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;holycode&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;shm_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2g&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4096:4096"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/opencode:/home/opencode&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./workspace:/workspace&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PUID=1000&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PGID=1000&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ANTHROPIC_API_KEY=your-key-here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2.&lt;/strong&gt; Start it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3.&lt;/strong&gt; Open &lt;a href="http://localhost:4096" rel="noopener noreferrer"&gt;http://localhost:4096&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You're in. OpenCode's web UI is running with all tools available.&lt;/p&gt;

&lt;p&gt;One thing worth calling out: &lt;code&gt;shm_size: 2g&lt;/code&gt; is required. Chromium crashes with Docker's default 64MB. This is a known Docker + Chromium issue and the image handles everything else, but you need to set this in your compose file.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Inside
&lt;/h2&gt;

&lt;p&gt;The image ships with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev tools:&lt;/strong&gt; git, ripgrep, fd, fzf, bat, eza, lazygit, delta, gh (GitHub CLI), htop, tmux, vim, jq, curl, wget, tree, and more. Everything you would install one by one anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language runtimes:&lt;/strong&gt; Node.js 22 (LTS) with npm, Python 3 with pip and venv support. Native npm addon compilation (build-essential, pkg-config) is included.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser stack:&lt;/strong&gt; Chromium, Xvfb, and Playwright. Pre-configured and supervised. Headless browser automation works on first boot. No GPU, no display server to configure, no extra setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Process management:&lt;/strong&gt; s6-overlay v3 supervises OpenCode and Xvfb. Either crashes, s6 restarts it automatically. Your container restart policy stays clean.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persistence
&lt;/h2&gt;

&lt;p&gt;All OpenCode data lives under &lt;code&gt;/home/opencode&lt;/code&gt; inside the container. The compose file maps that to &lt;code&gt;./data/opencode&lt;/code&gt; on your host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/opencode:/home/opencode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one bind mount covers everything: sessions, settings, MCP configs, plugins, tool history, cache. Rebuild the container, update to a new image, or move to a different machine. Your state comes back.&lt;/p&gt;

&lt;p&gt;This is a bind mount, not a named volume. That means you can browse the files directly, back them up, or rsync them to another machine. &lt;code&gt;docker compose down -v&lt;/code&gt; does not touch them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Auth Plugin: Use Your Subscription Instead of an API Key
&lt;/h2&gt;

&lt;p&gt;If you have Claude Max or Pro, you're already paying for Claude access. You don't need to pay for a separate API key on top of that.&lt;/p&gt;

&lt;p&gt;Enable the Claude Auth plugin with one env var:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ENABLE_CLAUDE_AUTH=true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plugin reads credentials from &lt;code&gt;./data/opencode/.claude/.credentials.json&lt;/code&gt;. Log in once, the credentials persist via the bind mount, and the plugin picks them up on every restart. No API key needed, no extra billing.&lt;/p&gt;

&lt;p&gt;Toggle off by removing the env var and restarting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This may be outside what Anthropic's terms of service cover. The README calls this out. Make your own call.&lt;/p&gt;

&lt;h2&gt;
  
  
  oh-my-openagent: Turn OpenCode Into a Multi-Agent System
&lt;/h2&gt;

&lt;p&gt;HolyCode ships with optional support for &lt;a href="https://github.com/coderluii/oh-my-openagent" rel="noopener noreferrer"&gt;oh-my-openagent&lt;/a&gt;, a multi-agent orchestration plugin for OpenCode. Enable it the same way as Claude Auth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ENABLE_OH_MY_OPENAGENT=true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It installs automatically on first boot and activates on restart. No manual setup.&lt;/p&gt;

&lt;p&gt;What it does: parallel execution, specialized agents, background tasks. Instead of a single agent working through your request sequentially, oh-my-openagent coordinates multiple agents running in parallel, each focused on a specific part of the problem.&lt;/p&gt;

&lt;p&gt;Toggle it off by removing the env var and restarting. Everything else in HolyCode stays exactly the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provider Support
&lt;/h2&gt;

&lt;p&gt;OpenCode is not locked to one provider. HolyCode exposes environment variables for every supported provider:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Gemini&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GEMINI_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Groq&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GROQ_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Bedrock&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt;, &lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt;, &lt;code&gt;AWS_REGION&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure OpenAI&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AZURE_OPENAI_ENDPOINT&lt;/code&gt;, &lt;code&gt;AZURE_OPENAI_API_KEY&lt;/code&gt;, &lt;code&gt;AZURE_OPENAI_API_VERSION&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Models&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GITHUB_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Set the keys for the providers you use. Ignore the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  HolyCode Cloud
&lt;/h2&gt;

&lt;p&gt;Don't want Docker? HolyCode Cloud is coming.&lt;/p&gt;

&lt;p&gt;Same tools. Same conversation history. Synced state across any device. Open a browser on your laptop, your tablet, anywhere, and pick up exactly where you left off. No Docker, no compose file, no terminal required.&lt;/p&gt;

&lt;p&gt;Early access is free: &lt;a href="https://holycode.coderluii.dev/cloud" rel="noopener noreferrer"&gt;https://holycode.coderluii.dev/cloud&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/coderluii/holycode" rel="noopener noreferrer"&gt;https://github.com/coderluii/holycode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docker Hub: &lt;a href="https://hub.docker.com/r/coderluii/holycode" rel="noopener noreferrer"&gt;https://hub.docker.com/r/coderluii/holycode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Site: &lt;a href="https://holycode.coderluii.dev" rel="noopener noreferrer"&gt;https://holycode.coderluii.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cloud waitlist: &lt;a href="https://holycode.coderluii.dev/cloud" rel="noopener noreferrer"&gt;https://holycode.coderluii.dev/cloud&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>ai</category>
      <category>devtools</category>
      <category>programming</category>
    </item>
    <item>
      <title>How I Run Claude Code in Docker with a Web UI and Headless Browser</title>
      <dc:creator>CoderLuii</dc:creator>
      <pubDate>Sun, 22 Mar 2026 04:42:44 +0000</pubDate>
      <link>https://forem.com/coderluii/how-i-run-claude-code-in-docker-with-a-web-ui-and-headless-browser-5dko</link>
      <guid>https://forem.com/coderluii/how-i-run-claude-code-in-docker-with-a-web-ui-and-headless-browser-5dko</guid>
      <description>&lt;p&gt;You know the drill. You want Claude Code on a server. In a browser. With Playwright so it can actually interact with web pages. With every AI CLI you might need. With TypeScript, Python, database clients, the works.&lt;/p&gt;

&lt;p&gt;So you start installing things.&lt;/p&gt;

&lt;p&gt;Then Chromium won't launch because Docker's shared memory is 64MB. Then Xvfb isn't configured. Then the UID inside the container doesn't match your host and everything is permission denied. Then Claude Code's installer hangs silently because WORKDIR is root-owned. Then SQLite locks on your NAS mount.&lt;/p&gt;

&lt;p&gt;Two hours later you haven't written a single line of code.&lt;/p&gt;

&lt;p&gt;I got tired of doing this on every new server. So I built a container that handles all of it, and I ran it on my own server daily until every edge case surfaced and got fixed. That container is HolyClaude. It's free and open source, MIT license.&lt;/p&gt;

&lt;h2&gt;
  
  
  getting it running
&lt;/h2&gt;

&lt;p&gt;Create a folder, drop in a compose file, pull, start.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;holyclaude &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;holyclaude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's the compose file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;holyclaude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;coderluii/holyclaude:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;holyclaude&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3001:3001"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/claude:/home/claude/.claude&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./workspace:/workspace&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;TZ=UTC&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;shm_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2g&lt;/span&gt;
    &lt;span class="na"&gt;cap_add&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SYS_ADMIN&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SYS_PTRACE&lt;/span&gt;
    &lt;span class="na"&gt;security_opt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;seccomp=unconfined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:3001&lt;/code&gt;. Create a CloudCLI account (takes about 10 seconds), then sign in with your Anthropic credentials. You're in Claude Code, in your browser, with a headless browser ready to go.&lt;/p&gt;

&lt;p&gt;That &lt;code&gt;shm_size: 2g&lt;/code&gt; line is important. Chromium crashes without it because Docker allocates 64MB of shared memory by default. This is the number one issue people hit and the error messages don't point you anywhere useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  how authentication works
&lt;/h2&gt;

&lt;p&gt;HolyClaude runs the real Claude Code CLI from Anthropic. Not a wrapper, not a proxy. Your existing account works directly.&lt;/p&gt;

&lt;p&gt;If you're on the Max or Pro plan, sign in through CloudCLI. It's the same OAuth flow as desktop Claude Code. Your subscription works as-is. If you prefer API keys, paste your Anthropic API key in the web UI. Pay-per-use, same billing.&lt;/p&gt;

&lt;p&gt;Your credentials live in &lt;code&gt;./data/claude/&lt;/code&gt; on your host. The container doesn't intercept or proxy anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  the headless browser situation
&lt;/h2&gt;

&lt;p&gt;This is the part that takes the most work to get right in Docker. Here's what HolyClaude handles for you:&lt;/p&gt;

&lt;p&gt;Chromium needs more than 64MB of shared memory. It needs a virtual display, so Xvfb has to be configured at :99 and start before Chromium. It needs specific sandbox flags for running in a container. Playwright needs to find the system Chromium instead of trying to download its own copy.&lt;/p&gt;

&lt;p&gt;When you ask Claude to take a screenshot, run Playwright tests, fill out a form, or scrape a site, it works. Because all of this is already configured.&lt;/p&gt;

&lt;h2&gt;
  
  
  process management
&lt;/h2&gt;

&lt;p&gt;The container runs multiple services: Xvfb, the web UI server, file watchers. A shell script loop won't handle restarts cleanly or guarantee startup order.&lt;/p&gt;

&lt;p&gt;I'm using s6-overlay. It gives proper dependency ordering (Xvfb starts before anything that needs a display), auto-restart on crash, and clean shutdown when you run &lt;code&gt;docker compose down&lt;/code&gt;. It's what Linuxserver.io uses in their images, and for good reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  image variants
&lt;/h2&gt;

&lt;p&gt;The full image is about 4GB because it bundles Chromium, Playwright, and a full dev toolchain. If you don't need the browser stuff, the slim tag is about 2GB.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull coderluii/holyclaude:latest
docker pull coderluii/holyclaude:slim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both are multi-arch. AMD64 and ARM64. Works on Linux, macOS with Docker Desktop, Windows with WSL2, and Synology/QNAP NAS.&lt;/p&gt;

&lt;h2&gt;
  
  
  what I actually use it for
&lt;/h2&gt;

&lt;p&gt;Long-running Claude Code sessions on my home server. I close my laptop and come back the next day. Session is still there.&lt;/p&gt;

&lt;p&gt;Browser automation. I ask Claude to screenshot a URL, run tests, interact with a page. Chromium is ready. I don't configure anything.&lt;/p&gt;

&lt;p&gt;Multi-model comparison. Claude, Gemini, and Codex are all in the same environment. Useful when I want to see how each handles a task on the same codebase.&lt;/p&gt;

&lt;p&gt;Everything persists in &lt;code&gt;./data/&lt;/code&gt;. Files, auth, configs, state. Upgrade the container and nothing changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  things it doesn't do
&lt;/h2&gt;

&lt;p&gt;No built-in HTTPS. Put it behind Caddy, Traefik, or nginx if you're exposing it outside localhost. No multi-user access control. CloudCLI is a third-party web UI, not the official Anthropic desktop app.&lt;/p&gt;

&lt;h2&gt;
  
  
  troubleshooting the common stuff
&lt;/h2&gt;

&lt;p&gt;If Chromium crashes, check &lt;code&gt;shm_size: 2g&lt;/code&gt; in your compose file. If file changes aren't detected on a NAS mount, add &lt;code&gt;CHOKIDAR_USEPOLLING=true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;if you try it and hit something, open an issue on GitHub. free and open source, MIT license.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/CoderLuii/HolyClaude" rel="noopener noreferrer"&gt;https://github.com/CoderLuii/HolyClaude&lt;/a&gt;&lt;br&gt;
Docker Hub: &lt;a href="https://hub.docker.com/r/coderluii/holyclaude" rel="noopener noreferrer"&gt;https://hub.docker.com/r/coderluii/holyclaude&lt;/a&gt;&lt;br&gt;
Website: &lt;a href="https://holyclaude.coderluii.dev" rel="noopener noreferrer"&gt;https://holyclaude.coderluii.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>selfhosted</category>
      <category>opensource</category>
      <category>claudeai</category>
    </item>
  </channel>
</rss>
