One container, one terminal. SSH in and Claude is ready.
curl -fsSL https://raw.githubusercontent.com/Piero24/Claude-World/main/install.sh | bash| Service | Image | Purpose |
|---|---|---|
| dev | linuxserver/baseimage-ubuntu:noble |
Web terminal (ttyd) + SSH + all dev tools |
| beszel-agent | henrygd/beszel-agent:latest |
System metrics → your existing Beszel hub |
Pre-installed: nvm + Node LTS, Claude Code, Python 3, Java, Docker CLI, build-essential, tmux, zsh.
flowchart LR
Internet((Internet))
subgraph Host["Docker Host"]
Dev["claude-world:7681\nttyd + SSH :2222"]
Config["/config\n(home: shell, git, nvm, packages)"]
Workplace["/workplace\n(your code)"]
end
Internet --> Dev
Dev --> Config
Dev --> Workplace
One container, everything in one place. /config is your persistent home: shell config, git identity, nvm, Node, Claude Code, all survive container rebuilds. /workplace is your code.
curl -fsSL https://raw.githubusercontent.com/Piero24/Claude-World/main/install.sh | bashThe installer asks where to store data, downloads everything, then prints next steps.
git clone https://github.com/Piero24/Claude-World.git
cd Claude-World
# Create the persistent directories
mkdir -p config workplace
# Edit values in compose.yaml, then:
docker compose up -d| Method | URL / Command | Auth |
|---|---|---|
| Web terminal | http://<server-ip>:7681 |
PASSWORD, Claude auto-launches |
| SSH | ssh abc@<server-ip> -p 2222 |
SUDO_PASSWORD, Claude auto-launches |
- One container for dev: web terminal + SSH. No desktop, no separate VS Code
- Claude auto-launch: connect via SSH or web terminal and Claude is ready in
/workplace. Exit Claude to get a shell prompt - Monitoring: Beszel agent feeds system metrics to your existing hub
- Web terminal (ttyd): full bash shell in your browser, password-protected
- SSH access: connect from local devices like PC, Mac, or iPhone
- Persistent tmux sessions: your work survives disconnects and app switches, especially useful on mobile
- Configurable cleanup:
TMUX_TIMEOUTauto-kills detached sessions after N hours,tmux-keepoverrides it - Persistent packages: everything in
/configsurvives container rebuilds - No Mac required: work entirely from a browser and SSH
| Tool | Installed by | Persists? |
|---|---|---|
| nvm + Node LTS | Init script | ✅ /config/.nvm |
| Claude Code | Init script (npm global) | ✅ /config/.npm-global |
| Python 3 + pip | Init script (apt) | ❌ Reinstalled each boot |
| Java (default-jdk) | Init script (apt) | ❌ Reinstalled each boot |
| Docker CLI | Init script (apt) | ❌ Reinstalled each boot |
| build-essential | Init script (apt) | ❌ Reinstalled each boot |
| Git, curl, zsh, tmux, nano | Init script (apt) | ❌ Reinstalled each boot |
:::tip[The golden rule]
If it lands in /config, it persists forever. If it needs sudo or apt, add it to the init script.
:::
| File | Purpose |
|---|---|
compose.yaml |
Plain Docker Compose (short syntax, relative paths) |
compose-casaos.yaml |
CasaOS Compose (long syntax, x-casaos metadata) |
init.sh |
Container boot script: SSH, ttyd, nvm, Node, Claude Code |
install.sh |
Interactive CasaOS installer |
Full documentation at cloud-dev-docs/:
- Overview & Architecture
- Server Setup: Docker or CasaOS
- Daily Workflow: tmux, persistent sessions, Termius
- Persistence
- Environment Variables: full reference
- Docker + Docker Compose
- That's it
MIT: see LICENSE.
