Shell
Shell hollows a solid into walls of a given thickness. You pick the faces to remove; they become the openings. A box becomes a tray, a cylinder becomes a cup.
In the viewport
- Click Shell on the toolbar. A small panel opens beside the model.
- Click the face (or faces) to open in the viewport. Right-click a pick for the multi-select menu — same-type faces, the producing feature's other buckets (Extrude End Faces …), Select other.
- Type the thickness. The statement is written as soon as the pick is complete.

- 1SelectionThe faces to remove — they become the openings. Each pick is a numbered chip; the ✕ drops one, and clicking a picked face again drops it too. Leave it empty and nothing happens: Shell always needs at least one face.
- 2ThicknessHow thick the walls end up. Negative shells inward and keeps the outer shape; positive shells outward and keeps the inner cavity.
- 3Join typeHow the offset walls meet at a corner: Arc rounds the join, Intersection runs both walls on until they cross, Tangent extends them tangentially. Arc is the safe default.
- 4ApplyWrites the statement and adds the timeline row; Exit writes nothing.
From solid to walls
A cylinder with both flat faces removed becomes a tube:
Before

cylinder(50, 100)A Ø50 cylinder, 100 tall, solid all the way through.
After

shell(-5)The top and bottom faces are gone and what is left is a 5-thick wall. The outside is still Ø50 — a negative thickness grows the wall inward.
The solid
cup.part.js
import { cylinder } from 'fluidcad/core';
// A Ø50 cylinder, 100 tall — solid all the way through.
cylinder(50, 100)
The complete file
import { cylinder, select, shell } from 'fluidcad/core';
import { face } from 'fluidcad/filters';
// A Ø50 cylinder, 100 tall — no sketch needed for a primitive.
cylinder(50, 100)
// Select the flat circular faces (top and bottom) — the Shell tool writes
// this select() when the picked faces match a filter.
select(face().circle())
// Hollow the cylinder with 5-thick walls, removing the selected faces.
// Negative: the walls grow inward and the outside stays Ø50.
shell(-5)
Thickness direction
| Sign | Result |
|---|---|
Negative, e.g. -5 | Walls grow inward — the outer shape stays the same |
Positive, e.g. 5 | Walls grow outward — the inner cavity stays the same |
Passing faces directly
In code, the faces to remove can come from an operation's accessors instead of a select():
const e = extrude(30)
shell(-3, e.endFaces()) // remove the top face, hollow the rest
Several faces at once:
shell(-3, e.endFaces(), e.startFaces()) // open on top and bottom
With no faces at all, shell() takes the last selection — the Selection and filters page covers how those are written.
Accessing geometry
const s = shell(-3, e.endFaces())
s.internalFaces() // the inner wall faces
s.internalEdges() // edges on the inner walls