# The Desk: a virtual Linux desktop that e2e scenarios are FILMED on — one# Xvfb display showing a real terminal window (the chat) and a real headed# Chromium (the browser hop), captured by a single ffmpeg x11grab into one# session.mp4. No splicing: the film is the screen.## The repo is bind-mounted at /repo at runtime; node_modules and caches live# in named volumes (host artifacts are macOS-native and can't be reused).FROM node:22-bookwormRUN apt-get update && apt-get install -y --no-install-recommends \ xvfb openbox xterm ffmpeg xdotool x11-utils x11-xserver-utils \ fonts-dejavu-core fonts-noto-color-emoji \ curl unzip ca-certificates git \ && rm -rf /var/lib/apt/lists/*# Bun — the repo's package manager and script runner.RUN curl -fsSL https://bun.sh/install | bash -s "bun-v1.3.13" \ && ln -s /root/.bun/bin/bun /usr/local/bin/bun \ && ln -s /root/.bun/bin/bun /usr/local/bin/bunx# Chromium + system deps baked into the image, pinned to the repo's# playwright version so the runtime install check is a no-op.ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwrightRUN npx -y playwright@1.60.0 install --with-deps chromium && rm -rf /root/.npmWORKDIR /repoENTRYPOINT ["bash", "e2e/desk/entry.sh"]
# The Desk: a virtual Linux desktop that e2e scenarios are FILMED on — one
# Xvfb display showing a real terminal window (the chat) and a real headed
# Chromium (the browser hop), captured by a single ffmpeg x11grab into one
# session.mp4. No splicing: the film is the screen.
#
# The repo is bind-mounted at /repo at runtime; node_modules and caches live
# in named volumes (host artifacts are macOS-native and can't be reused).
FROM node:22-bookworm
RUN apt-get update && apt-get install -y --no-install-recommends \
xvfb openbox xterm ffmpeg xdotool x11-utils x11-xserver-utils \
fonts-dejavu-core fonts-noto-color-emoji \
curl unzip ca-certificates git \
&& rm -rf /var/lib/apt/lists/*
# Bun — the repo's package manager and script runner.
RUN curl -fsSL https://bun.sh/install | bash -s "bun-v1.3.13" \
&& ln -s /root/.bun/bin/bun /usr/local/bin/bun \
&& ln -s /root/.bun/bin/bun /usr/local/bin/bunx
# Chromium + system deps baked into the image, pinned to the repo's
# playwright version so the runtime install check is a no-op.
ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
RUN npx -y playwright@1.60.0 install --with-deps chromium && rm -rf /root/.npm
WORKDIR /repo
ENTRYPOINT ["bash", "e2e/desk/entry.sh"]