Digital Handstand
← Back to all apps
Beta Download
FlywheelCAD icon

FlywheelCAD

Python-first, constraint-driven CAD for reproducible sketch and body workflows.

FlywheelCAD combines direct sketch editing in the UI with a live Python script backend. You can draw and constrain geometry interactively, create bodies with extrude, revolve, loft, and booleans, compose reusable components into mated assemblies, export bodies as .3mf files for 3D printing, then edit or rerun the generated script as the repeatable source of truth.

The beta is signed but not notarized, so macOS will warn on first launch. If “Open” isn’t offered directly, open System Settings → Privacy & Security and click Open Anyway next to the FlywheelCAD entry.

What You Can Do

Sketch and constrain

Create points, lines, circles, arcs, ellipses, splines, and trimmed geometry, then solve sketches with geometric constraints, dimensions, and shared variables. A live status badge tells you whether a sketch is under-, fully-, or over-constrained, and which constraints conflict.

Build bodies and analyze them

Turn closed regions into solids with extrude, revolve, and loft — with optional edge rounding, wall taper (draft), plane-normal offset, and twist for helical and herringbone shapes. Then use boolean union, subtraction, and intersection (with optional smooth or chamfer blends at the seam), derive sections and projections from bodies, and export finished geometry as .3mf for 3D printing. Bodies are parametric: edit the sketch they came from and they re-derive, and they can be deleted, cascading to anything built on top of them. Meshing runs on the GPU — including whole boolean trees evaluated in a single pass — and when a preset isn’t fine enough for a small detail, set_cell_size pins an absolute mesh resolution per body.

Work across multiple planes

Sketch on the standard xy, yz, and zx planes, then define custom sketch planes directly from topology points of existing bodies. Multi-section lofts sweep one smooth solid through any number of cross-section planes — the sample aircraft fuselages and wings are built this way.

Compose components into assemblies

Define a part once inside with cad.component(...), export its bodies and named anchor points, then place it many times with cad.instance(...) — translated, mirrored, scaled, or rotated — and snap instances together with mates. Components can be parametric (one wing factory, many wings), live in their own files next to the assembly, and nest into sub-assemblies that re-export parts of their children. Per-body colors and finishes (matte, glossy, metallic, glass) carry into .3mf export.

Place parts from component libraries

Catalog parts come from component libraries — folders of parametric part modules. A standard library ships in the app (NEMA stepper motors, hobby servos and control horns, metric cap screws / nuts / washers, deep-groove ball bearings, T-slot extrusion, and RC linkage hardware); add your own as folders under ~/Documents/FlywheelCAD/Libraries/. Component → Insert from Library… browses them with a live 3D preview and parameter fields. Inserting is copy-on-use: the module is vendored into the document’s lib/ folder, so a design stays self-contained and a later library update never silently changes it — Update from Library refreshes vendored parts on your terms.

Keep everything reproducible

The right panel keeps the model as editable Python. A document is a plain .py file or a .fwcad project bundle — a folder that packages the script with everything it imports, so it moves and shares as a single self-contained item. Helper modules live next to the main file (or drop one in with File → Add File to Project…, or place a loose component with Component → Insert Component from File…). Writing scripts with an AI assistant? Drop the AI scripting guide into its context — it is the full API reference in one machine-friendly Markdown file.

Sample Assemblies

Five complete multi-file assemblies show the component workflow end to end: components defined in their own files, parametric part factories, instances placed with mirrors and transforms, mates snapping everything to named anchor points, and catalog parts pulled from the standard component library. They are the best reference for structuring a real project — download them with the Sample Assemblies bundle and open the top-level file as the document. (Assembly geometry lives inside the component files, so these show the composed 3D result; click to enlarge.)

FlywheelCAD 3D view of the Glider sample assembly.

Glider/glider.py

A sailplane with a multi-loft fuselage (rounded nose cap, cockpit, tail boom), a parametric NACA-profile wing with non-linear taper, washout, and dihedral — instanced once per side with the left wing mirrored — and a symmetric-airfoil T-tail, all placed on a common frame with per-component colors.

FlywheelCAD 3D view of the Toy Airplane sample assembly.

ToyAirplane/airplane.py

The introductory assembly: fuselage, parametric wing (instanced right and mirrored left), and tail, each defined in its own component file and mated to named mount points exported by the fuselage — move a mount and the parts follow.

FlywheelCAD 3D view of the Nested Airplane sample assembly.

AirplaneNested/airplane.py

A two-level assembly demonstrating nesting: leaf parts (fuselage, wing, engine, stabilizer) compose into sub-assemblies (a powered wing, an empennage) that re-export parts and anchors of their children, and the top assembly places and mates the sub-assemblies as opaque units.

FlyingWing/flying_wing.py

A tailless flying wing in the spirit of the Prandtl-D research aircraft: a NACA 4412 center section swept and tapered outward with the bell-spanload twist schedule (the tips fly at negative incidence), a pusher motor pod with spinner and prop, and elevons cut from the wing as separate bodies — a V-groove hinge opens downward from the upper skin, with an embedded servo, control horn, and pushrod on each side. Geometry-heavy generated-from-math modeling throughout.

MotorMount/motor_mount.py

A standard-library showcase: a mounting plate whose every cutout is a declared region hole, populated with catalog parts placed straight from the component library — a NEMA 17 stepper, a servo with a control horn mated onto its output spline, four M3 cap screws, and a 608 bearing pressed into its seat, each in its own display color. Its vendored lib/standard/ travels with the sample, so it opens and builds self-contained.

Showcase Projects

Five short, heavily-commented projects teach the FlywheelCAD workflow one concept at a time — sketching with constraints, body creation, lofting, components, and the standard library. Read the comments top to bottom; they are meant to be learned from, not just run. Download them with the Showcase Projects bundle and open each folder's .py file as the document.

FlywheelCAD 3D view of the constraint-driven mounting bracket. FlywheelCAD dimensioned, constrained 2D sketch of the mounting bracket.

1 · Sketching, constraints & dimensions — 01_sketch_bracket/bracket.py

A flat mounting bracket drawn as a rough sketch, then pinned with geometric constraints (horizontal / vertical / parallel / perpendicular and a tangent fillet) and dimensions bound to shared variables. Change WIDTH, HEIGHT, HOLE_DIA or SLANT and the whole part re-solves; a light extrude lets the profile read in 3D.

FlywheelCAD 3D view of a machine hand-knob with scalloped finger grips.

2 · Body creation: extrude + revolve + booleans — 02_knob/knob.py

A machine hand-knob built from both body operations: a revolved, dished body, an extruded central boss unioned on, a ring of extruded cylinders unioned then differenced to scallop the rim into finger grips, and a subtracted shaft bore — along the way showing edge_radius, offset, and boolean union / difference.

FlywheelCAD 3D view of a transition duct lofted through four stations.

3 · Custom planes & multi-level loft — 03_loft_duct/duct.py

A transition fairing that morphs from a nearly-round inlet to a wide, flat outlet. Custom sketch planes stacked along the axis each carry a reusable oval cross-section (a shared profiles.oval(...) helper), and cad.multi_loft(...) sweeps one smooth solid through all four sections with no internal seams.

FlywheelCAD 3D view of a base plate with four hex standoffs.

4 · Components: fixed + parametric — 04_standoff_kit/standoffs.py

A base plate with four hex standoffs, contrasting the two ways to define reusable parts: a fixed component that builds one specific part and exports named anchor points, and a parametric factory that makes any size on demand and is memoised per size. Instances are placed by mating their base anchor onto the plate's exported anchors.

FlywheelCAD 3D view of a pillow bearing block with a 608 bearing and four cap screws.

5 · Library insertion & mating — 05_bearing_block/bearing_block.py

A pillow-style bearing block with a 608 ball bearing pressed into its bore and four cap screws holding it down — catalog parts (bearing, cap_screw) pulled straight from the standard component library and mated onto the block's anchors. Its vendored lib/standard/ travels with the sample, so it opens self-contained.

Script Quick Start

A FlywheelCAD file is ordinary Python. The minimal pattern is to import the API, create a FlywheelCAD object, enter a sketch context, then emit geometry and body operations.

from flywheelcad import *
cad = FlywheelCAD()

cad.with_sketch("xy")
p1 = cad.point2d(-60, -12.5)
p2 = cad.point2d(-20, -12.5)
line = cad.line2d(p1, p2)
cad.horizontal(line)
cad.length(line, 40)

When you need reusable logic, keep helper files next to the main script and import them directly. The included gear examples use exactly that pattern.

from flywheelcad import *
from CADgears import gear_outline

cad = FlywheelCAD()
gear = gear_outline(center_x=0, center_y=0, tooth_count=24, module=5.0, plane_name="xy")
body = cad.extrude("xy", gear["region_ring"], 24, quality="high")

Bring Your Own AI

FlywheelCAD contains no AI integration — no cloud connection, no account, nothing leaves your machine. It doesn’t need one: because every document is ordinary Python, any coding agent you already use can write and refactor your models for you.

That is what the AI Scripting Guide is for. It packs the whole scripting surface — the rules an agent must follow, the full command reference, and worked patterns — into one Markdown file sized for an assistant’s context window. Drop it into a session with the coding agent of your choice, describe the part you want, and let the agent work out the hard geometry: circular-arc approximations of involute gear teeth, accurate NACA airfoil sections, parametric part families driven by a handful of variables. The meshing gear pairs in the test projects and the NACA-profile glider wing in the samples are exactly this kind of generated-from-math geometry — ordinary Python logic emitting FlywheelCAD commands.

Whatever the agent writes stays a plain .py file: open it in the app, run it, inspect the result, and keep editing by hand or by prompt — the script remains the single, reproducible source of truth either way.