"A brain that also has to load 12 GB of model weights is a brain that crashes when the GPU runs out."
The Temptation to Make One Big Thing
When you sit down to build an AI that can chat and generate images and help you draw, the obvious move is one app. One repo. One process. One place where everything talks to everything. It feels simpler. It is a trap.
The triad — Pippa the brain, Ember the engine, Cinder the workspace — exists because those three jobs change at different speeds, run on different stacks, and fail in different ways. Bolting them together means every change risks the whole thing.
Three Rates of Change
The brain changes when reasoning changes — a new model, a new tool, a new conversation shape. The engine changes when a new image-model family ships (SDXL, then SD3, then FLUX). The workspace changes when the drawing experience changes — a new canvas, a new candidate board. These clocks are not synchronized. If they share a process, a fast-moving engine update can break a stable brain for no reason.
Three Runtimes
The brain runs in a Python ML environment with the agent SDK. The engine runs in its own Python environment with PyTorch, diffusers, and the model weights. The workspace runs as a native desktop app — Tauri shell, Rust core, a web view on top. You cannot cram a Rust-native window and a 12 GB diffusion model and a streaming chat loop into one comfortable runtime. The boundaries are real, not bureaucratic.
Three Failure Modes
When the engine runs out of GPU memory mid-generation, that should not take down the chat you were having. When the workspace window crashes, the engine should keep the model warm. When the brain is mid-thought, an image job should queue, not block. Process isolation is what gives you these guarantees for free — a crash in one body doesn't reach the others.
import. That single rule is what keeps the three bodies independent. The moment one repo imports another's internals, you've quietly fused two processes back into one.