Articulate.

Dispatching Blender to the Studio.

Every number on this page is wall-clock from a run made on 16 August 2026. Two estimates made earlier the same day were wrong — one by more than double, one by fourteen times — and both are kept here, because the way they were wrong is the useful part.

1 · The route that doesn't work

Canon said the Cowork sandbox could SSH to the Studio through skills/sandbox-bootstrap/. In a cloud session it cannot, and the reason is not the tunnel. Sandbox bash is killed at roughly two seconds of wall clock.

commandresult
sleep 1returns
sleep 3killed, exit 143
sleep 12, sleep 20, backgrounded nohupkilled, exit 143

bootstrap.sh needs about ten seconds to bring up tailscaled and a SOCKS5 proxy. It can never finish inside a two-second ceiling. Three attempts died before printing one line, and the failure surfaces as “timed out after 0s” — which reads like a hang but means the process was reaped before it started.

The desktop bridge is no better: device_bash has no network access at all. ssh: connect to host 192.168.1.246 — Network is unreachable.

The wasted hour here was spent debugging the tunnel. The tunnel was never the problem. Probe the substrate before the symptom.

2 · The route that does

The Blender MCP bridge runs arbitrary Python inside Blender on the MacPro, and that Python has full OS access — including subprocess. The MacPro is on the tailnet. So the MacPro becomes the jump host, and the sandbox never needs to reach anything.

subprocess.run(["ssh", "-o", "BatchMode=yes", "anthonybooth@100.82.41.69",
                f"bash -lc {shlex.quote(cmd)}"], capture_output=True, text=True)

Two traps, both of which cost a run:

  1. Quote the remote command. ssh host bash -lc cmd lets the remote shell re-split the arguments, so mkdir -p /some/path arrives as mkdir with no arguments at all. Wrap it in shlex.quote.
  2. The bridge caps a single call at about 60 seconds. Split long remote work across calls, or detach it.

And the fault that had been sitting there all along: the Studio's LAN address is dead.

addressresult
192.168.1.246 — LANNo route to host
100.82.41.69 — tailnetworks

~/.ssh/config on the MacPro pointed Host studio at the dead LAN address, so every ssh studio failed. Repointed to the tailnet; the LAN entry is kept as studio-lan. Backup at ~/.ssh/config.bak-day3-studio.

3 · The Studio, measured

modelMac16,9 — Mac Studio M4 Max
GPU32 cores, Metal, confirmed enabled and selected
RAM36 GB
Blender5.1.2
ffmpeg/opt/homebrew/bin/ffmpeg
free disk54 Gi

4 · Speed, and two wrong estimates

Single-frame renders mislead badly. Each one pays full Blender startup plus shader compilation. An animation run pays that once, at the start, and then never again.

Single frame, 1920×1080

machineEEVEECycles
MacPro — M3 Pro, 14 GPU cores11.9 s19.3 s
Studio — M4 Max, 32 GPU cores11.6 s16.3 s

Animation run on the Studio, EEVEE, 40 frames

8.64 sframe 1 — shader compilation
0.84 sframes 2+, mean (min 0.73, max 0.91)
4.3 minprojected, 300 frames

The two estimates, and how they failed

Wrong by 2.5×: the Studio has 32 GPU cores against the MacPro's 14, so a 2.3–2.9× speed-up was inferred. Measured, it is 1.03× on EEVEE and 1.18× on Cycles. This scene is overhead-bound, not throughput-bound. A core-count ratio is not a speed ratio.

Wrong by 14×: a 300-frame job was quoted at 60 minutes by multiplying a single-frame timing. The real figure is 4.3 minutes, because 299 of those frames never recompile the shaders.

So the Studio's value on this class of scene is not speed. It is that the job runs off the workstation, leaving the live Blender session free, and that frames can be split across both machines at once.

5 · cwrender

Claude/scripts/cwrender ships the .blend, renders the range headless on the Studio, rsyncs the frames back, and optionally encodes with ffmpeg.

cwrender <file.blend> <start> <end> [--engine BLENDER_EEVEE|CYCLES]
         [--out DIR] [--split] [--encode] [--fps 30]

--split renders odd frames on the MacPro and even frames on the Studio concurrently. The script preflights the tailnet connection and fails in the first second rather than forty minutes in.

Verified on 16 August 2026 with a three-frame run and then a forty-frame run, both returning complete frame sets. Full canon: Claude/render-farm.md.