Skip to content

Commit 8b94329

Browse files
committed
v1.2.0
1 parent 6590720 commit 8b94329

14 files changed

Lines changed: 1095 additions & 215 deletions

.github/SECURITY.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ The container has unrestricted outbound network access. This is required for:
3939
- Git operations (clone, push, pull)
4040
- Any web requests Claude Code makes during development tasks
4141

42+
## Exposing HolyClaude to the Internet
43+
44+
**Do not port-forward HolyClaude to the public internet.** CloudCLI exposes a full shell and holds your AI provider credentials. A simple password is not sufficient protection — basic auth gets brute-forced, and one compromise means an attacker has arbitrary code execution, access to your workspace, and a paid Claude Code instance running on your credentials.
45+
46+
If you need to reach HolyClaude from outside your local network, use:
47+
48+
- **[Tailscale](https://tailscale.com)** — WireGuard mesh VPN, zero open ports, identity-based auth. Recommended for personal and small-team use.
49+
- **[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)** — Outbound-only tunnel to Cloudflare's edge, optional Cloudflare Access SSO in front. Recommended when you need a public hostname or shared access.
50+
51+
Both options are free for personal use, encrypt the connection end-to-end, and never require opening a port on your router. See the [Remote Access & Exposure](../README.md#shield-remote-access--exposure) section of the README for full details.
52+
4253
## Reporting a Vulnerability
4354

4455
If you discover a security vulnerability in HolyClaude:

README.md

Lines changed: 81 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ Your existing Anthropic account works directly:
7878
| :file_folder: | [Project Structure](#file_folder-project-structure) |
7979
| :floppy_disk: | [Data & Persistence](#floppy_disk-data--persistence) |
8080
| :lock: | [Permissions](#lock-permissions) |
81+
| :shield: | [Remote Access & Exposure](#shield-remote-access--exposure) |
8182
| :bell: | [Notifications](#bell-notifications) |
8283
| :arrows_counterclockwise: | [Upgrading](#arrows_counterclockwise-upgrading) |
8384
| :construction: | [Troubleshooting](#construction-troubleshooting) |
@@ -125,6 +126,8 @@ http://localhost:3001
125126

126127
> No `.env` files. No pre-configuration. No reading 40 pages of docs before you can start. It just runs.
127128
129+
> **Want to reach it from outside your network?** Don't port-forward it. See [Remote Access & Exposure](#shield-remote-access--exposure) — use Tailscale or Cloudflare Tunnel instead.
130+
128131
<p align="right">
129132
<a href="#top">↑ back to top</a>
130133
</p>
@@ -734,18 +737,19 @@ holyclaude/
734737
| What | Where (container) | Where (host) | Survives rebuild? |
735738
|------|-------------------|-------------|-------------------|
736739
| Settings, credentials, API keys | `/home/claude/.claude` | `./data/claude` | **Yes** |
740+
| Claude Code session (OAuth, onboarding) | `/home/claude/.claude.json` | `./data/claude/.claude.json.persist` | **Yes** |
737741
| Your code and projects | `/workspace` | `./workspace` | **Yes** |
738-
| CloudCLI account | `/home/claude/.cloudcli` | *(container only)* | No |
739-
| Onboarding state | `/home/claude/.claude.json` | *(container only)* | No |
742+
| CloudCLI account | `/home/claude/.cloudcli` | *(container only by default — see below)* | No (opt-in available) |
740743

741744
### What survives `docker compose down && docker compose up`:
742745
- Your Anthropic authentication and API keys
743-
- Claude Code settings and memory (`CLAUDE.md`)
746+
- Claude Code settings, memory (`CLAUDE.md`), and OAuth session (no re-login)
744747
- All your code in `./workspace`
745748
- Git configuration
749+
- Codex, Gemini, and Cursor CLI auth (since v1.1.7)
746750

747751
### What you'll redo (10 seconds):
748-
- CloudCLI web account — quick signup, that's it
752+
- CloudCLI web account — quick signup, that's it (unless you opt into persistence below)
749753

750754
### Re-triggering first-boot setup:
751755
```bash
@@ -756,6 +760,28 @@ docker compose restart holyclaude
756760

757761
> **Never delete `./data/claude/` entirely.** That's where your credentials live. Delete the sentinel file if you want a fresh bootstrap. Delete specific config files if you want to reset settings. But never nuke the whole folder.
758762
763+
### Persisting the CloudCLI account (optional, local storage only)
764+
765+
By default, the CloudCLI account database (`~/.cloudcli`) is container-local and gets wiped on rebuild. Re-creating the account takes 10 seconds, so most people leave it as-is.
766+
767+
If you want it to survive rebuilds, add a **named Docker volume** to your compose file:
768+
769+
```yaml
770+
services:
771+
holyclaude:
772+
volumes:
773+
- ./data/claude:/home/claude/.claude
774+
- ./workspace:/workspace
775+
- cloudcli-data:/home/claude/.cloudcli # add this line
776+
777+
volumes:
778+
cloudcli-data: # and this block
779+
```
780+
781+
> **Do NOT bind-mount `./data/cloudcli` on a network share (NAS, SMB/CIFS, NFS).** CloudCLI stores its account in SQLite, and SQLite's file locking breaks on network mounts. You'll hit `database is locked` errors constantly. Named volumes live on the Docker engine's local filesystem, which is why this works — bind mounts pointing at a NAS will not.
782+
783+
A bind mount to a local SSD path is fine too, just keep it off any network share.
784+
759785
<p align="right">
760786
<a href="#top">↑ back to top</a>
761787
</p>
@@ -793,6 +819,57 @@ This is how I personally run it. Edit `./data/claude/settings.json` on your host
793819

794820
---
795821

822+
## :shield: Remote Access & Exposure
823+
824+
HolyClaude binds CloudCLI to port `3001`. By default that's local-only — fine for running on your laptop or a home server you SSH into.
825+
826+
**The moment you want to reach it from outside your network, read this section.**
827+
828+
### Don't port-forward it to the public internet
829+
830+
I'll say it flat out: do not punch a hole in your router and expose `3001` to the open internet. Not even with a password. Here's why:
831+
832+
- CloudCLI exposes a full shell through the web terminal plugin
833+
- It can run arbitrary code, install packages, and read/write your entire `/workspace`
834+
- It holds your Anthropic OAuth tokens and API keys
835+
- Basic auth / app-level passwords get brute-forced, credential-stuffed, and scraped out of logs
836+
- One leaked password = someone else has a paid Claude Code instance running on your box with your money
837+
838+
A password is a speed bump, not a door. Treat HolyClaude like you'd treat an SSH session: never on the open internet without a proper tunnel in front of it.
839+
840+
### Use a proper tunnel instead
841+
842+
These are the two options I actually recommend:
843+
844+
| Option | Who it's for | Why |
845+
|--------|-------------|-----|
846+
| **[Tailscale](https://tailscale.com)** | Personal use, small teams | WireGuard mesh VPN. Install Tailscale on your server + your laptop/phone, and you reach `http://holyclaude:3001` from anywhere as if you were on the LAN. No ports opened, no DNS, no certs. Free for personal use. |
847+
| **[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)** | Sharing with others, public hostname | Cloudflare proxies the connection, so port `3001` stays closed. You get a real domain with HTTPS, and you can put Cloudflare Access (Google/GitHub SSO) in front of it. Free tier covers most personal use. |
848+
849+
Both give you:
850+
- Zero open ports on your router
851+
- Encrypted transport end to end
852+
- Real identity-based auth (not a shared password)
853+
- Audit logs
854+
855+
### If you insist on exposing it directly (please don't)
856+
857+
If you absolutely have to skip the tunnel (self-hosting tutorial, isolated lab network, whatever), at the very minimum:
858+
859+
1. **Put a reverse proxy in front of it** (Caddy, nginx, Traefik) with real TLS
860+
2. **Add IP allowlisting** at the firewall or proxy level — only your known IPs
861+
3. **Enable `bypassPermissions: false`** (the default) so shell commands still prompt
862+
4. **Rotate your Anthropic credentials** if anything looks off
863+
5. **Run behind Cloudflare Access or similar SSO**, not basic auth
864+
865+
Even with all that, the risk surface is huge. Use Tailscale or Cloudflare Tunnel. They're free, they take five minutes to set up, and they're what I personally use.
866+
867+
<p align="right">
868+
<a href="#top">↑ back to top</a>
869+
</p>
870+
871+
---
872+
796873
## :bell: Notifications
797874

798875
Walk away from your computer and know when your AI agents are done. Claude Code, Codex, and Gemini CLI all send notifications when a task completes. Uses [Apprise](https://github.com/caronc/apprise) — supports 100+ services including Discord, Telegram, Slack, Email, Pushover, Gotify, and more.

docs/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@ 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.2.0] - 04/09/2026
8+
9+
### Added
10+
- Remote access security guidance recommending Tailscale or Cloudflare Tunnel instead of exposing HolyClaude directly to the public internet
11+
- Optional CloudCLI account persistence documentation using a named Docker volume for local storage users
12+
13+
### Fixed
14+
- Corrected persistence docs to reflect that Claude Code OAuth session (`~/.claude.json`) already survives container rebuilds
15+
- Synced translated READMEs and troubleshooting docs with the current persistence behavior
16+
717
## [1.1.9] - 04/04/2026
818

919
### Fixed

docs/translations/README.de.md

Lines changed: 81 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ Dein bestehendes Anthropic-Konto funktioniert direkt:
7878
| :file_folder: | [Projektstruktur](#file_folder-project-structure) |
7979
| :floppy_disk: | [Daten & Persistenz](#floppy_disk-data--persistence) |
8080
| :lock: | [Berechtigungen](#lock-permissions) |
81+
| :shield: | [Fernzugriff & Exposition](#shield-remote-access--exposure) |
8182
| :bell: | [Benachrichtigungen](#bell-notifications) |
8283
| :arrows_counterclockwise: | [Aktualisieren](#arrows_counterclockwise-upgrading) |
8384
| :construction: | [Fehlerbehebung](#construction-troubleshooting) |
@@ -125,6 +126,8 @@ http://localhost:3001
125126

126127
> Keine `.env`-Dateien. Keine Vorkonfiguration. Kein Lesen von 40 Seiten Dokumentation, bevor du anfangen kannst. Es läuft einfach.
127128
129+
> **Willst du von außerhalb deines Netzwerks darauf zugreifen?** Kein Port-Forwarding. Sieh [Fernzugriff & Exposition](#shield-remote-access--exposure) — nutze stattdessen Tailscale oder Cloudflare Tunnel.
130+
128131
<p align="right">
129132
<a href="#top">↑ nach oben</a>
130133
</p>
@@ -734,18 +737,19 @@ holyclaude/
734737
| Was | Wo (Container) | Wo (Host) | Überlebt Rebuild? |
735738
|------|-------------------|-------------|-------------------|
736739
| Einstellungen, Zugangsdaten, API-Keys | `/home/claude/.claude` | `./data/claude` | **Ja** |
740+
| Claude Code Session (OAuth, Onboarding) | `/home/claude/.claude.json` | `./data/claude/.claude.json.persist` | **Ja** |
737741
| Dein Code und deine Projekte | `/workspace` | `./workspace` | **Ja** |
738-
| CloudCLI-Konto | `/home/claude/.cloudcli` | *(nur Container)* | Nein |
739-
| Onboarding-Status | `/home/claude/.claude.json` | *(nur Container)* | Nein |
742+
| CloudCLI-Konto | `/home/claude/.cloudcli` | *(standardmäßig nur Container — siehe unten)* | Nein (Opt-in verfügbar) |
740743

741744
### Was `docker compose down && docker compose up` überlebt:
742745
- Deine Anthropic-Authentifizierung und API-Keys
743-
- Claude Code-Einstellungen und Memory (`CLAUDE.md`)
746+
- Claude Code-Einstellungen, Memory (`CLAUDE.md`) und OAuth-Session (kein erneutes Login)
744747
- Dein gesamter Code in `./workspace`
745748
- Git-Konfiguration
749+
- Codex-, Gemini- und Cursor-CLI-Auth (seit v1.1.7)
746750

747751
### Was du wiederholen musst (10 Sekunden):
748-
- CloudCLI-Web-Konto — schnelle Anmeldung, das war's
752+
- CloudCLI-Web-Konto — schnelle Anmeldung, das war's (außer du aktivierst die Persistenz unten)
749753

750754
### Ersten-Start-Setup erneut auslösen:
751755
```bash
@@ -756,6 +760,28 @@ docker compose restart holyclaude
756760

757761
> **Lösche niemals `./data/claude/` vollständig.** Dort leben deine Zugangsdaten. Lösche die Sentinel-Datei, wenn du einen frischen Bootstrap willst. Lösche bestimmte Konfigurationsdateien, wenn du Einstellungen zurücksetzen möchtest. Aber vernichte niemals den gesamten Ordner.
758762
763+
### CloudCLI-Konto persistieren (optional, nur lokaler Speicher)
764+
765+
Standardmäßig ist die CloudCLI-Kontodatenbank (`~/.cloudcli`) container-lokal und wird beim Rebuild gelöscht. Das Konto neu zu erstellen dauert 10 Sekunden, also lassen die meisten Leute es so.
766+
767+
Wenn du willst, dass es Rebuilds überlebt, füge ein **named Docker volume** zu deiner compose-Datei hinzu:
768+
769+
```yaml
770+
services:
771+
holyclaude:
772+
volumes:
773+
- ./data/claude:/home/claude/.claude
774+
- ./workspace:/workspace
775+
- cloudcli-data:/home/claude/.cloudcli # add this line
776+
777+
volumes:
778+
cloudcli-data: # and this block
779+
```
780+
781+
> **Mache KEIN Bind-Mount von `./data/cloudcli` auf einem Netzwerk-Share (NAS, SMB/CIFS, NFS).** CloudCLI speichert sein Konto in SQLite, und SQLites File-Locking funktioniert auf Netzwerk-Mounts nicht. Du wirst ständig `database is locked`-Fehler bekommen. Named Volumes leben auf dem lokalen Dateisystem des Docker-Engines, deshalb funktioniert das — Bind-Mounts auf ein NAS werden nicht funktionieren.
782+
783+
Ein Bind-Mount zu einem lokalen SSD-Pfad ist auch in Ordnung, halte ihn nur von jedem Netzwerk-Share fern.
784+
759785
<p align="right">
760786
<a href="#top">↑ nach oben</a>
761787
</p>
@@ -793,6 +819,57 @@ So betreibe ich es persönlich. Bearbeite `./data/claude/settings.json` auf dein
793819

794820
---
795821

822+
## :shield: Fernzugriff & Exposition
823+
824+
HolyClaude bindet CloudCLI an Port `3001`. Standardmäßig ist das nur lokal — gut für den Betrieb auf deinem Laptop oder einem Heimserver, auf den du per SSH zugreifst.
825+
826+
**In dem Moment, in dem du von außerhalb deines Netzwerks darauf zugreifen willst, lies diesen Abschnitt.**
827+
828+
### Kein Port-Forwarding ins öffentliche Internet
829+
830+
Ich sage es direkt: Schlag kein Loch in deinen Router und exponiere `3001` nicht ins offene Internet. Nicht mal mit einem Passwort. Warum:
831+
832+
- CloudCLI exponiert eine vollständige Shell über das Web-Terminal-Plugin
833+
- Es kann beliebigen Code ausführen, Pakete installieren und dein gesamtes `/workspace` lesen/schreiben
834+
- Es hält deine Anthropic-OAuth-Tokens und API-Keys
835+
- Basic-Auth-Passwörter werden gebrute-forced, credential-gestuffed und aus Logs extrahiert
836+
- Ein geleaktes Passwort = jemand anderes hat eine bezahlte Claude-Code-Instanz auf deiner Maschine mit deinem Geld
837+
838+
Ein Passwort ist eine Bodenschwelle, keine Tür. Behandle HolyClaude wie eine SSH-Session: niemals im offenen Internet ohne einen ordentlichen Tunnel davor.
839+
840+
### Nutze stattdessen einen ordentlichen Tunnel
841+
842+
Das sind die zwei Optionen, die ich wirklich empfehle:
843+
844+
| Option | Für wen | Warum |
845+
|--------|-------------|-----|
846+
| **[Tailscale](https://tailscale.com)** | Persönliche Nutzung, kleine Teams | WireGuard-Mesh-VPN. Installiere Tailscale auf deinem Server + Laptop/Telefon, und du erreichst `http://holyclaude:3001` von überall, als wärst du im LAN. Keine offenen Ports, kein DNS, keine Zertifikate. Kostenlos für persönliche Nutzung. |
847+
| **[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)** | Teilen mit anderen, öffentlicher Hostname | Cloudflare proxied die Verbindung, sodass Port `3001` geschlossen bleibt. Du bekommst eine echte Domain mit HTTPS, und kannst Cloudflare Access (Google/GitHub SSO) davor schalten. Das kostenlose Tier deckt die meiste persönliche Nutzung ab. |
848+
849+
Beide geben dir:
850+
- Null offene Ports an deinem Router
851+
- Verschlüsselter Transport von Ende zu Ende
852+
- Echte identitätsbasierte Auth (kein geteiltes Passwort)
853+
- Audit-Logs
854+
855+
### Wenn du darauf bestehst, es direkt zu exponieren (bitte nicht)
856+
857+
Wenn du den Tunnel absolut überspringen musst (Self-Hosting-Tutorial, isoliertes Lab-Netzwerk, was auch immer), mindestens:
858+
859+
1. **Stelle einen Reverse Proxy davor** (Caddy, nginx, Traefik) mit echtem TLS
860+
2. **Füge IP-Allowlisting** auf Firewall- oder Proxy-Ebene hinzu — nur deine bekannten IPs
861+
3. **Aktiviere `bypassPermissions: false`** (der Standard), damit Shell-Befehle noch nachfragen
862+
4. **Rotiere deine Anthropic-Zugangsdaten**, wenn etwas seltsam aussieht
863+
5. **Betreibe hinter Cloudflare Access oder ähnlichem SSO**, nicht Basic Auth
864+
865+
Selbst mit all dem ist die Angriffsfläche riesig. Nutze Tailscale oder Cloudflare Tunnel. Sie sind kostenlos, brauchen fünf Minuten zum Einrichten, und das ist, was ich persönlich nutze.
866+
867+
<p align="right">
868+
<a href="#top">↑ nach oben</a>
869+
</p>
870+
871+
---
872+
796873
## :bell: Notifications
797874

798875
Geh von deinem Computer weg und erfahre, wenn Claude fertig ist. Verwendet [Apprise](https://github.com/caronc/apprise) für Benachrichtigungen — unterstützt 100+ Dienste einschließlich Discord, Telegram, Slack, E-Mail, Pushover, Gotify und mehr.

0 commit comments

Comments
 (0)