<?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>DEV Community: CoderLuii</title>
    <description>The latest articles on DEV Community by CoderLuii (@coderluii).</description>
    <link>https://dev.to/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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3837927%2Ffe1a6455-18fc-4551-a57c-8f894d8d7d3b.jpeg</url>
      <title>DEV Community: CoderLuii</title>
      <link>https://dev.to/coderluii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/coderluii"/>
    <language>en</language>
    <item>
      <title>i started holyclaude back in march. 2.4k stars later i'm building the hosted version of it</title>
      <dc:creator>CoderLuii</dc:creator>
      <pubDate>Thu, 13 Aug 2026 14:24:17 +0000</pubDate>
      <link>https://dev.to/coderluii/i-started-holyclaude-back-in-march-24k-stars-later-im-building-the-hosted-version-of-it-28cc</link>
      <guid>https://dev.to/coderluii/i-started-holyclaude-back-in-march-24k-stars-later-im-building-the-hosted-version-of-it-28cc</guid>
      <description>&lt;p&gt;i started holyclaude in march. a web ui for running claude on your own machine, built because i wanted one and the options at the time didn't fit how i worked. it's mit. i pushed it, used it every day, and mostly forgot it was public.&lt;/p&gt;

&lt;p&gt;it's now at 2,478 stars and 257 forks. between it and my other project, holycode, there's roughly 132k docker pulls. people install it daily without me doing anything at all, which is still the strangest part of this whole thing.&lt;/p&gt;

&lt;p&gt;this is what i've been building since, and why.&lt;/p&gt;




&lt;h2&gt;
  
  
  the thing my own tool couldn't fix
&lt;/h2&gt;

&lt;p&gt;holyclaude runs on the machine it's installed on. that's the entire design and for a long time it was fine.&lt;/p&gt;

&lt;p&gt;then i started leaving agents on longer tasks. builds, test suites, a refactor that touches forty files, anything that sits waiting on an api. and every one of those is a stretch of time where the sensible thing is to walk away from the computer.&lt;/p&gt;

&lt;p&gt;so i'd start something, close the laptop, and come back to nothing. changing the sleep settings fixes the sleeping. it doesn't fix the work only ever existing on the machine in my bag.&lt;/p&gt;




&lt;h2&gt;
  
  
  people were already solving it by hand
&lt;/h2&gt;

&lt;p&gt;there's a discussion open on the repo right now from a team running holyclaude on a shared vps. one container per developer, separate volumes, a shared git remote, access control handled entirely by tailscale.&lt;/p&gt;

&lt;p&gt;that works. i want to be clear about that, because it's the honest answer for a lot of people and it costs nothing.&lt;/p&gt;

&lt;p&gt;it's also a server somebody has to keep alive. patched, backed up, disk not full, certificates not expired, and awake at 3am when it stops answering. that maintenance is what i ended up building a product around, not the software.&lt;/p&gt;




&lt;h2&gt;
  
  
  what the hosted version actually is
&lt;/h2&gt;

&lt;p&gt;a linux box that stays yours and stays on.&lt;/p&gt;

&lt;p&gt;one firecracker vm and one persistent volume per person, running on fly. six agent clis already installed, claude code, codex, opencode, gemini, cursor and pi, plus around 60 dev tools so the box is useful the second it boots rather than after an afternoon of apt. root, ssh, and a browser terminal, so you can start something on a desktop and pick it up on a phone with the session still running.&lt;/p&gt;

&lt;p&gt;your own api key. i don't proxy calls and i don't mark up tokens, which also means i never see what you're doing.&lt;/p&gt;

&lt;p&gt;one detail that shaped the architecture more than anything else: holyclaude doesn't own its web ui. it ships cloudcli, which i package rather than wrote. so a feature like multi user login, which needs an auth layer inside the ui, means forking someone else's project and maintaining that fork forever. the hosted version runs a ui i wrote, with sso already in front of every box. that's why some things land there first. it's a dependency question rather than a commercial one, and i'd rather say that plainly than let people assume the free version is being starved.&lt;/p&gt;




&lt;h2&gt;
  
  
  what running it has taught me so far
&lt;/h2&gt;

&lt;p&gt;selling infrastructure is not selling software. every user is a real vm that costs me about $13 a month whether they log in or not, so there is no free tier to grow into. that deletes half the standard playbook before you start.&lt;/p&gt;

&lt;p&gt;the cost model has three lines, not two. the box is fixed. the model spend is variable. and retries are variable with no ceiling at all, which somebody pointed out in the comments of my last article and which i'd left out entirely. an agent stuck retrying the same failure overnight can outspend the machine it's running on without ever looking like it's failing.&lt;/p&gt;

&lt;p&gt;fly refuses images over about 8gb, which i discovered by shipping a 13.6gb one. the deploy reported success, flyctl exited 0, and 95 seconds later the machine had quietly reverted to the previous image. the only trace was one line in the machine's own event list. exit code 0 means the api accepted your request, not that your machine is running your code.&lt;/p&gt;

&lt;p&gt;and free stars don't convert. 132k pulls is flattering and it is not a funnel. the overlap between people who will install an mit project and people who will pay monthly for a hosted one is far smaller than a star count makes it feel.&lt;/p&gt;




&lt;h2&gt;
  
  
  what's honest about the state of it
&lt;/h2&gt;

&lt;p&gt;sessions survive you disconnecting and survive me redeploying the box. they do not survive a hard restart, where you get a fresh shell. that one isn't solved.&lt;/p&gt;

&lt;p&gt;every box sits behind an sso gate, so a stranger hitting a port gets a 401 rather than your terminal. proper cross tenant network isolation is on the list rather than done.&lt;/p&gt;

&lt;p&gt;the 2gb entry tier will oom under a real build with a test suite next to it. 4gb is the first size that stopped annoying me.&lt;/p&gt;

&lt;p&gt;and underneath all of it, it is a vps with the setup already done. if you enjoy running your own server, you genuinely don't need me.&lt;/p&gt;

&lt;p&gt;the free one, forever: &lt;a href="https://github.com/CoderLuii/HolyClaude" rel="noopener noreferrer"&gt;https://github.com/CoderLuii/HolyClaude&lt;/a&gt;&lt;br&gt;
the hosted one, 3 days free: &lt;a href="https://app.holycode.cloud/billing?code=TRY3DAYS" rel="noopener noreferrer"&gt;https://app.holycode.cloud/billing?code=TRY3DAYS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;if you've taken a popular free project and put a paid version next to it, i'd like to know how you handled the line between them. that's the part i'm least sure i'm getting right.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>startup</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>priced out what running agents 24/7 actually costs &amp; wrote it up

the machine is the cheapest thing in the whole setup. everyone optimises the small fixed number &amp; lets the big variable one run

full diy walkthrough included, you don't need to buy anything</title>
      <dc:creator>CoderLuii</dc:creator>
      <pubDate>Tue, 11 Aug 2026 17:37:34 +0000</pubDate>
      <link>https://dev.to/coderluii/priced-out-what-running-agents-247-actually-costs-wrote-it-up-the-machine-is-the-cheapest-3mlg</link>
      <guid>https://dev.to/coderluii/priced-out-what-running-agents-247-actually-costs-wrote-it-up-the-machine-is-the-cheapest-3mlg</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/coderluii/how-to-run-coding-agents-247-for-about-19-a-month-c8a" class="crayons-story__hidden-navigation-link"&gt;how to run coding agents 24/7 for about $19 a month...&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/coderluii" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3837927%2Ffe1a6455-18fc-4551-a57c-8f894d8d7d3b.jpeg" alt="coderluii profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/coderluii" class="crayons-story__secondary fw-medium m:hidden"&gt;
              CoderLuii
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                CoderLuii
                
              
              &lt;div id="story-author-preview-content-4371493" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/coderluii" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3837927%2Ffe1a6455-18fc-4551-a57c-8f894d8d7d3b.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;CoderLuii&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/coderluii/how-to-run-coding-agents-247-for-about-19-a-month-c8a" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 11&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/coderluii/how-to-run-coding-agents-247-for-about-19-a-month-c8a" id="article-link-4371493"&gt;
          how to run coding agents 24/7 for about $19 a month...
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/coderluii/how-to-run-coding-agents-247-for-about-19-a-month-c8a" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/coderluii/how-to-run-coding-agents-247-for-about-19-a-month-c8a#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              2&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>how to run coding agents 24/7 for about $19 a month...</title>
      <dc:creator>CoderLuii</dc:creator>
      <pubDate>Tue, 11 Aug 2026 17:34:10 +0000</pubDate>
      <link>https://dev.to/coderluii/how-to-run-coding-agents-247-for-about-19-a-month-c8a</link>
      <guid>https://dev.to/coderluii/how-to-run-coding-agents-247-for-about-19-a-month-c8a</guid>
      <description>&lt;p&gt;the consensus is that running agents around the clock is expensive, so people don't. they give an agent a task, sit and watch it, and close the laptop when they're done.&lt;/p&gt;

&lt;p&gt;i think that's backwards. the machine is the cheapest thing in this entire setup &amp;amp; almost nobody prices it out.&lt;/p&gt;




&lt;h2&gt;
  
  
  the number people get wrong
&lt;/h2&gt;

&lt;p&gt;a small linux box, running constantly, is somewhere between $5 and $25 a month depending on where you put it &amp;amp; how much ram you give it. that's the whole cost of the compute.&lt;/p&gt;

&lt;p&gt;now go look at what you spent on tokens last week.&lt;/p&gt;

&lt;p&gt;for most people running agents on real work, the model bill is the larger number by a wide margin &amp;amp; it isn't close. one long session can cost more than the machine costs for the month.&lt;/p&gt;

&lt;p&gt;so the thing people optimise is the fixed, small, predictable number. and the variable, large, unpredictable one just runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  why it feels expensive when it isn't
&lt;/h2&gt;

&lt;p&gt;because "always on" sounds like "always billing" &amp;amp; on most providers it is. you rent a box, it runs whether you're using it or not, and you pay for every idle hour at the same rate as every working hour.&lt;/p&gt;

&lt;p&gt;that's the part worth fixing, and it's a solved problem. a machine that suspends when nothing is happening &amp;amp; resumes when you come back costs you for the working hours and pennies for the rest.&lt;/p&gt;

&lt;p&gt;mine resumes in about a second. that number matters more than it sounds, because a resume that takes thirty seconds is one you start avoiding, and a setup you avoid isn't a setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  the diy version, in full
&lt;/h2&gt;

&lt;p&gt;you do not need to buy anything to do this. here's the whole thing.&lt;/p&gt;

&lt;p&gt;1) get a vps. any provider. what you want is a real vm with a disk that persists across reboots, and no idle reaper. what you do NOT want is a container platform that reclaims your box when nobody types for twenty minutes, because that's exactly what an unattended agent looks like from the outside.&lt;/p&gt;

&lt;p&gt;2) ram is your constraint, not cpu. agents spend most of their wall clock waiting on api calls. but a headless browser or a test suite will take 2gb without asking.&lt;/p&gt;

&lt;p&gt;3) run the agent under tmux:&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;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;tmux
tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  start your agent here
&lt;/h4&gt;

&lt;h4&gt;
  
  
  ctrl-b then d to detach
&lt;/h4&gt;

&lt;p&gt;now close your laptop. tmux attach -t agent when you're back, and the scrollback is still there including everything it printed while you were gone.&lt;br&gt;
this is the part people skip &amp;amp; it's the part that matters. if the agent is a child of your ssh session, a dropped connection is a kill signal. under tmux it isn't.&lt;/p&gt;

&lt;p&gt;4) preinstall what it's going to reach for. postgres, playwright with its system deps actually resolved, ffmpeg, pandoc, ripgrep. half a bad agent session is the agent discovering the machine is empty &amp;amp; installing its way out, on your tokens.&lt;/p&gt;

&lt;p&gt;5) keys in the environment, never in the prompt. a key pasted into a prompt ends up in the scrollback, in whatever the agent writes to disk, and in the session transcript on disk. put it in .bashrc &amp;amp; let the cli read it.&lt;/p&gt;

&lt;p&gt;one gotcha that cost me a day: playwright caches browsers under $HOME. if you mount a volume over $HOME, the build passes, the browser is genuinely there at build time, and every chromium.launch() fails for the user. set PLAYWRIGHT_BROWSERS_PATH=/opt/ms-playwright before you install.&lt;/p&gt;




&lt;h2&gt;
  
  
  what the diy version actually costs
&lt;/h2&gt;

&lt;p&gt;not money. time.&lt;/p&gt;

&lt;p&gt;you now own a server. patching, backups, the security of the thing, and the afternoon you spend on playwright's system dependencies before you write a line of your own code. that afternoon is the real price &amp;amp; nobody quotes it.&lt;/p&gt;

&lt;p&gt;i ran it that way for a long time and it was fine. i stopped because i was spending maintenance time on infrastructure that had nothing to do with what i was building.&lt;/p&gt;




&lt;h2&gt;
  
  
  what i ended up building
&lt;/h2&gt;

&lt;p&gt;HolyCode Cloud is that setup, on a machine i maintain instead of you.&lt;/p&gt;

&lt;p&gt;$19/mo gets 1 vcpu, 2gb ram and 12gb disk. that's enough for one agent doing real work. the ladder goes to $199 for 8 vcpu and 16gb, and every feature is on every tier — you're paying for horsepower, not to unlock things.&lt;/p&gt;

&lt;p&gt;six agent clis are already on PATH: claude code, codex, gemini, opencode, cursor, pi. so is postgres, playwright with its deps resolved, ffmpeg, pandoc, gh, ripgrep, tmux. the disk persists. the process survives you disconnecting.&lt;/p&gt;

&lt;p&gt;you bring your own anthropic or openai key &amp;amp; they bill you directly. i don't mark up tokens and i don't want to be in that business. the machine costs what the machine costs.&lt;/p&gt;

&lt;p&gt;it suspends when you're not using it &amp;amp; wakes in about a second, so always-on isn't always-billing.&lt;/p&gt;




&lt;h2&gt;
  
  
  the honest edges
&lt;/h2&gt;

&lt;p&gt;leave a box idle for several days and the wake is closer to a minute than a second, while the host pulls the image again. nothing is lost, you just wait.&lt;/p&gt;

&lt;p&gt;a hard crash gives you a fresh shell. files and the volume survive. &lt;/p&gt;

&lt;p&gt;scrollback doesn't. i can restart the machine in seconds and still can't hand you back what was on the screen.&lt;/p&gt;

&lt;p&gt;there's no free tier. every account is a real vm that costs me money from the first minute, so instead there's a 7-day refund: no form, no call, you email me.&lt;/p&gt;

&lt;p&gt;and everything in the diy section above works without me. if you enjoy owning the box, own the box.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://holycode.com" rel="noopener noreferrer"&gt;holycode.cloud&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the thing i'd actually like to know: for those of you running agents on real work, what's your split? machine cost against model cost, roughly. i suspect most people have never put the two numbers next to each other.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <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://dev.to/coderluii/holycode-opencode-in-docker-with-30-tools-persistent-state-and-no-api-key-required-42n3</link>
      <guid>https://dev.to/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://dev.to/coderluii/how-i-run-claude-code-in-docker-with-a-web-ui-and-headless-browser-5dko</link>
      <guid>https://dev.to/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>
