the universal sandbox runtime for agents and humans.
pocketenv.io
sandbox
openclaw
agent
claude-code
vercel-sandbox
deno-sandbox
cloudflare-sandbox
atproto
sprites
daytona
1FROM node:lts-trixie-slim
2
3SHELL ["/bin/bash", "-c"]
4
5ARG TARGETARCH
6
7ENV LC_ALL=en_US.UTF-8
8ENV LANG=en_US.UTF-8
9ENV LANGUAGE=en_US.UTF-8
10
11RUN apt-get update && apt-get install -y --no-install-recommends \
12 openssh-client \
13 git \
14 curl \
15 ca-certificates \
16 gnupg \
17 unzip \
18 python3 \
19 build-essential \
20 tmux \
21 gawk \
22 sed \
23 procps \
24 wget \
25 locales-all \
26 s3fs \
27 fontconfig \
28 sudo \
29 squashfs-tools \
30 squashfuse \
31 fuse \
32 fuse-overlayfs \
33 && useradd -m -s /bin/bash modal \
34 && echo "modal ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/modal
35
36USER root
37RUN ARCH=$(uname -m) && \
38 if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; fi && \
39 if [ "$ARCH" = "aarch64" ]; then ARCH="arm64"; fi && \
40 VERSION=v1.2.1 && \
41 curl -L "https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz" -o /tmp/tigrisfs.tar.gz && \
42 tar -xzf /tmp/tigrisfs.tar.gz -C /usr/local/bin/ && \
43 rm /tmp/tigrisfs.tar.gz && \
44 chmod +x /usr/local/bin/tigrisfs
45USER modal
46
47RUN curl -fsSL https://tailscale.com/install.sh | sh
48
49RUN mkdir -p /home/modal/.npm-global && npm config set prefix "/home/modal/.npm-global"
50
51ENV PATH="/home/modal/.local/bin:/home/modal/.npm-global/bin:${PATH}"
52
53RUN npm install -g \
54 opencode-ai \
55 pm2
56
57USER root
58
59RUN curl -L https://github.com/tsirysndr/pty-tunnel-server/releases/download/v0.0.2/pty-server-linux-x86_64.tar.gz | tar xz -C /tmp && \
60 mv /tmp/pty-tunnel-server /usr/bin && \
61 chmod +x /usr/bin/pty-tunnel-server
62
63RUN mkdir -p /home/modal/.local/share/fonts && chown -R modal:modal /home/modal/.local
64USER modal
65
66WORKDIR /home/modal
67
68RUN curl -fsSL https://code-server.dev/install.sh | sh && \
69 code-server --install-extension bastndev.lynx-theme --force && \
70 curl -fsSL https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/CascadiaMono.zip -o /tmp/CascadiaMono.zip && \
71 unzip -o /tmp/CascadiaMono.zip -d /home/modal/.local/share/fonts/CascadiaMono && \
72 fc-cache -fv && \
73 touch /home/modal/.vscode-setup-done
74
75RUN curl -fsSL https://github.com/ajeetdsouza/zoxide/releases/download/v0.9.9/zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz -o /tmp/zoxide.tar.gz && \
76 mkdir -p ~/.local/bin && \
77 tar -xzf /tmp/zoxide.tar.gz -C ~/.local/bin zoxide && \
78 chmod +x ~/.local/bin/zoxide && \
79 rm /tmp/zoxide.tar.gz && \
80 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && \
81 echo 'eval "$(zoxide init bash)"' >> ~/.bashrc
82
83RUN curl -fsSL https://zerobrew.rs/install | bash
84
85RUN curl -s https://ohmyposh.dev/install.sh | bash -s && \
86 curl -s https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/refs/heads/main/themes/tokyonight_storm.omp.json | tee ~/.tokyonight_storm.omp.json >/dev/null && \
87 echo 'eval "$(oh-my-posh init bash --config ~/.tokyonight_storm.omp.json)"' >> ~/.bashrc
88
89RUN git clone --recursive --depth 1 --shallow-submodules https://github.com/akinomyoga/ble.sh.git && \
90 mkdir -p ~/.local && \
91 make -C ble.sh install PREFIX=$HOME/.local && \
92 rm -rf ble.sh && \
93 echo 'export LANG=en_US.UTF-8' >> ~/.bashrc && \
94 echo 'source -- ~/.local/share/blesh/ble.sh' >> ~/.bashrc
95
96RUN curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh && \
97 echo 'export PATH=$PATH:$HOME/.atuin/bin' >> ~/.bashrc && \
98 echo 'eval "$(atuin init bash)"' >> ~/.bashrc || true
99
100RUN case "${TARGETARCH}" in \
101 amd64) EZA_ARCH="x86_64-unknown-linux-musl" ;; \
102 arm64) EZA_ARCH="aarch64-unknown-linux-musl" ;; \
103 *) echo "Unsupported arch: ${TARGETARCH}" && exit 1 ;; \
104 esac && \
105 wget -qO /tmp/eza.tar.gz "https://github.com/eza-community/eza/releases/latest/download/eza_${EZA_ARCH}.tar.gz" && \
106 tar -xzf /tmp/eza.tar.gz -C ~/.local/bin && \
107 chmod +x ~/.local/bin/eza && \
108 rm /tmp/eza.tar.gz && \
109 echo 'alias ls="eza -l"' >> ~/.bashrc