Sculpt · 3D and 2D studioIn developmentWindows build first

Shape It Freely.
Make It Exact.

Sculpt is Avlory's 3D and 2D studio. Sculpt clay, model exact CAD solids, paint, rig and animate, simulate and render with a path tracer, all in one .sculpt file. Every demo below runs in your browser; the screens are from Sculpt itself, and every number says how it was measured.

  • Windows
  • Linux
  • macOS
  • iOS
  • Android
All planned. Downloads open through the waitlist.
01 · Sculpt

Clay that keeps up. Undo that does too.

Twelve brushes, sculpt layers you can fade, Mirror X, and pen pressure on size and strength. Undo keeps only the chunks a stroke touched, so it stays quick on dense meshes. Drag on the sphere to try it: hold Shift to smooth and Ctrl to carve, as in Sculpt.

Keyboard: arrow keys move the brush, Enter presses in, Shift+Enter smooths. A 2D canvas shading a height field, not Sculpt's engine.

Brush
History
  1. No strokes yet.

Undo here also keeps only the tiles a stroke changed.

0.73 msa stroke step at 10 M faces, mean (Clay Strips, typical brush)
1.31 msthe same, 95th percentile
11.5 msundo of that stroke at 10 M faces
0.9 sto build a 10 M-face sphere into chunks

Measured 31 October 2026 on a cloud VM with 4 processor threads and no graphics card, so this is the processor's share only: the dabs of one pen event, then normals and bounds. The target is 60 fps sculpting and undo under 100 ms at 10 million faces on a desktop with a GPU; the GPU's share isn't measured yet. cargo run --release -p avlory-sculpt-sculpt --example bench

Sculpt in Sculpt mode, Pro view: a clay sphere with a Clay Strips stroke, the brush shelf below, and the Layers panel with Layer 1 at 100% strength, Merge down, Bake into mesh and the undo history.
Sculpt mode, from Sculpt's screen tests. In those tests a stand-in engine draws the viewport, so shapes are simple.
02 · Model with exact CAD

Exact solids. Failures that explain.

Meshes and exact NURBS solids share one scene, from Avlory's own CAD engine, in real units. When an operation can't work, Sculpt says where, why, and what would fit. Try a 4 mm fillet on the edge between a speaker's dial and its nearest grille hole.

Cross-section of the speaker housing: the wall between the dial and the grille hole, with the picked edge at its top left.
Fillet

1 edge picked: the dial's rim.

Mesh tools

First build

Extrude, inset, bevel, loop cut, Catmull–Clark subdivide, merge, mirror, booleans and UV unwrap. Every refusal names the place and the reason.

Real units

First build

Millimetres, centimetres, metres or inches. A 4 mm fillet is 4 mm in any scene, and so is the print check’s “walls at least 2 mm”.

Booleans under stress

First build

In a 1,000-pair run each of box and cylinder, and box and box, no pair failed after the October fixes.

STEP in and out

First build

Assemblies, colours, layers and units come across; anything that can't is listed in the import report.

Our own CAD engine

Exact geometry we wrote, so every failure can explain itself.

The solids in Sculpt come from Avlory CAD: a NURBS and B-rep kernel in Rust, written from scratch, with no runtime dependencies and nothing from OpenCASCADE, a paid kernel or any LGPL or GPL code. It's its own library, so Nebula uses the same exact solids, measuring and STEP support rather than a copy.

Why it's ours: truck, the open-source Rust kernel we read first, against what Sculpt needed
Sculpt neededtruck (read, not adopted)Avlory CAD
Clean dependenciesApache-2.0, but pulls in 135 crates, one flagged unmaintained, so the workspace's licence and advisory check fails without an exception. Last release September 2024.No dependencies; the check passes with no exceptions
Exact booleansIntersections are polylines from triangles, so a drilled hole comes back with a faceted rim. A failure gives no reason.A hole's rim is an exact circle; curves that have to be traced are fitted within 0.0001 mm
Fillets, chamfers, shellNoneAll three, each checked for fit before anything is built
Failures that explainNothing structuredWhat failed, where, the measured size, what fits, and a suggestion
STEP with a reportNo colours, layers, assemblies or reportOur own reader and writer, keeping all of them, with an import report

We read truck's code to compare approaches and copied none of it. Its NURBS maths was the one piece worth adopting, and that part is textbook (Piegl and Tiller), so we wrote it and tested it ourselves. From the engine's design notes, checked against truck's crates at versions 0.3 to 0.6 on 31 October 2026.

Curves and surfaces

First build

NURBS, plus exact lines, circles, ellipses, parabolas and hyperbolas, and exact planes, cylinders, cones, spheres and tori.

Features

First build

Extrude with draft, revolve, sweep, push and pull, shell, booleans, fillets and chamfers along tangent chains.

Sketches

First build

Lines, arcs, circles and splines with eleven kinds of constraint. The solver says how much is still free, and which constraints clash.

History you can edit

First build

“How this part was made”, step by step. Change a size and it rebuilds; a step that no longer fits says so and waits.

Measure

First build

Volume, area and centre from the true surfaces (volumes exact to about one part in a billion), and a print check for thin walls.

STEP AP214 and AP242

First build

Names, assemblies, units, colours, layers and PMI come in, with a report on every item. PMI is kept as data, not shown yet.

Why it says “Use 2.5 mm”

Before a fillet is built, every check runs: the strip left between the round and the next edge, two blends on one face, the ends of the chain. If one fails, the engine searches for the largest size that passes and rounds it to a tidy step. A fillet must leave at least 0.1 mm of flat, so a 2.6 mm wall fits up to 2.5 mm.

Same point
closer than 0.000001 mm
Largest error it adds
0.0001 mm, on traced curves
Narrowest strip left
0.1 mm
Size steps
0.05 mm, or 0.01 mm below 0.5 mm

What's honestly left

  • Corners where several filleted edges meet, variable-radius fillets, and fillets between curved faces whose normals change (spheres, tori, free-form sides) are refused with “isn't supported yet”.
  • The fit checks don't yet catch a fillet running into a third face further away.
  • IGES isn't done. STEP surface bodies, offset surfaces and cross-drilled seamed cylinders are reported as not supported.
  • Two equal cylinders overlapping aren't merged into one face yet, and very small intersection loops can be missed.
91CAD engine tests, all passing (88 when the first pass landed)
0 of 2,000random box-and-cylinder and box-and-box booleans failed
1 of 4,000more failed: a cylinder's rim 25 nm from a box's edge, reported as a gap with a fix
0runtime dependencies

Tests: cargo test -p avlory-sculpt-cad, run 3 November 2026 on the same 4-thread VM. Booleans: a one-off stress run with the property tests' generators, seeded per pair and not part of the suite, after the 31 October fixes: 1,000 box/cylinder and 1,000 box/box pairs, each result valid, its mesh closed and the volumes adding up, or (19 pairs) refused in words as touching only along an edge or a line; then 2,000 more of each. Recorded in the engine's design notes.

Sculpt in Model mode with Edges picked and units in millimetres. The Fillet panel shows a 4.0 mm radius and a Didn't fit message: the wall between the dial and the nearest grille hole is 2.6 mm, fits up to 2.50 mm, with Use 2.5 mm and Dismiss buttons.
The same diagnosis in Sculpt's Model mode, from its screen tests (stand-in viewport).
03 · Paint

Paint in layers, inside the modeler.

Texture sets from 1K to 8K, or vertex paint when a mesh has no UVs. Layers with masks and four blend modes, six channels, bakes for ambient occlusion, curvature and high-to-low normals, and maps exported for the engine you use. Paint on the layer below, then change how it blends.

Drag to paint on Layer 2. Hold Ctrl to erase.

Layer 2 · paint
Blend
  1. Layer 2 paint · base colour, roughness
  2. Layer 1 fill · base colour
  3. Material under every layer
about 6 msa pen event on a 4K texture set, painting and mixing together, typical brush
under 100 msundo at 4K: a swap of the touched tiles, then re-mixing them
2.5 msa vertex-paint step on a million vertices

Measured 1 November 2026 on the same 4-thread VM with no graphics card: 120 pen events along an arc over a 16,128-triangle sphere, painting base colour and roughness. Big brushes at 8K fall short of 60 fps on the processor; painting on the GPU is the next step there. cargo run --release -p avlory-sculpt-paint --example bench

Sculpt in Paint mode: a teal stroke across a cube, brush presets along the bottom, and the Paint layers panel with Layer 3 masked at 85% opacity, Normal blend, and the channels it writes to.
Paint mode, from Sculpt's screen tests (stand-in viewport).
04 · Animate

Rigs that say what went wrong.

Auto-rig a figure, bind it, key it on animation layers, and work in the dope sheet or the curves. When binding fails, the Rig check names the bone, says why, and its fixes work. AI walk and run cycles are off unless you turn them on, and are always marked.

A figure with its rig. The left forearm bone is drawn in red with its tip outside the hand.
Rig check

    23 msbinding a 55,298-vertex figure to a 31-bone rig with envelopes
    1.9 msa frame, engine side: layers, IK, skinning, vertices to the renderer

    Measured 1 November 2026 on the same 4-thread VM with no graphics card, keyed over two seconds and played frame by frame as the viewport does. cargo run --release -p avlory-sculpt-ffi --example anim_bench

    Sculpt in Animate mode: the Rig check says No weights for forearm.L with Move tip inside the hand, Select forearm.L and Use envelope weights. Below, animation layers and the dope sheet at frame 42 of 120.
    Animate mode with the Rig check, from Sculpt's screen tests (stand-in viewport).
    05 · Simulate

    Lay out a scene in one step.

    Settle lets objects fall and come to rest; Drop to floor moves each one straight down; Separate pushes them apart. Each is one undo step. Rigid bodies and cloth play on the shared timeline and bake into the file as they go, so a crash loses at most a frame.

    Scene layout
    Check

    674 msSettle 200 objects to rest (6.8 s of falling simulated)
    4.4 msa cloth bake frame, 3,600 vertices at 15 substeps
    44 msplacing a scatter of 100,000 copies

    Measured 1 November 2026 on the same 4-thread VM with no graphics card. Liquids, smoke and fire on the graphics card come later. cargo run --release -p avlory-sculpt-ffi --example sim_bench

    Sculpt in Simulate mode with Cloth picked: silk fabric, pins, a timeline at frame 18 of 120, and a notice that a bake stopped at frame 57 when Sculpt closed, with 58 frames safe and Keep them or Discard.
    Simulate mode offering back a bake cut short by closing, from Sculpt's screen tests (stand-in viewport).
    06 · Render

    A path tracer, honestly labelled.

    A real-time view plus a full path tracer. It uses RTX or other ray-tracing hardware when the graphics card has it, a compute path when it doesn't, and the processor as the reference, and it says which one is drawing. The picture fills in as you watch, pauses and resumes, and a crash or restart costs only the last few samples.

    Toy path tracer

    Running on your browser's processor: a few dozen lines, nothing like Sculpt's. It shows how a path-traced picture fills in.

    0 / 64 samples

    Not tested on a real graphics card yet

    • Nothing has run on RTX or any real GPU. The ray-tracing path ran only on a software GPU (Mesa's lavapipe) on the build VM, where the image matched the processor's reference.
    • DirectX 12 and Metal aren't tested, the browser build isn't wired up, and Open Image Denoise isn't installed on the build machine.
    • The screen below comes from a screen test: its graphics card name and memory are test values, not a measurement.
    0.65 Msamples a second, the processor's reference path tracer, 99,202 triangles
    108 msa real-time 1280 × 720 frame on the software GPU, with shadows

    Measured on the same 4-thread VM, using lavapipe (a software Vulkan GPU running on the same processor). These show relative cost on a processor, not GPU speed. cargo run --release --example measure

    Sculpt in Render mode: a path-traced sphere at 204 of 256 samples with Pause, camera, size and samples, light bounces, the denoiser, and a graphics memory check.
    Render mode, from Sculpt's screen tests. The graphics card shown is a test value.
    07 · The translation layer

    Opens the way it looked.

    Every format has its own translator, and every translator reads into the same neutral scene. Units and axes are converted exactly and said out loud, so a centimetre FBX isn't 100 times too big and a Blender file doesn't land on its back. Anything that can't come across exactly is never changed silently: the import report marks every item exact, approximated (with by how much) or not supported. The same layer serves Nebula. Pick where a file came from, then open it with and without its translator.

    1. 1 · The fileAs its app saved itglTF, OBJ, STL, FBX, USD (.usda), .blend or STEP, in that app's units and axes
    2. 2 · Its translatorOne per formatReads the file as the app that made it means it; ufbx (MIT or Unlicense) for FBX, our own readers for the rest, and the CAD engine for STEP
    3. 3 · The neutral sceneOne model for every formatMetres, right-handed, +Y up: n-gons, hierarchy, OpenPBR materials, cameras, lights, skins and clips
    4. 4 · Sculpt, or NebulaOpens with a reportEvery item exact, approximated or not supported, and why
    The model as it lands in Sculpt.
        Made in
        Open it

        The files are the format tests' own reference files, written by hand the way Maya, Blender and CAD apps lay them out, and the report lines are what the translators print for them. “Numbers as they are” shows what a reader without the translator's conversion would get.

        Reference files

        Built

        Each translator is tested against a reference file in its format: positions, normals, UVs, materials and the report's lines are checked against what the file says.

        Round trips

        Built

        glTF, GLB, OBJ, STL, USDA and STEP are written and read back, and must come back the same: a texture lands the same way up from OBJ to glTF to USD.

        Every axis system

        Built

        Conversions are exact and reversible, and keep faces pointing outwards when handedness changes.

        Hostile files

        Built

        Damaged and oversized files fail with a message, never a crash. Fuzzing found crashes inside the glTF library; those inputs are now turned away before it sees them.

        Files saved by the apps themselves

        Not yet

        The reference files are written by hand in each app's layout. Checking against files saved by Blender, Maya and CAD apps is still to do.

        50format-layer tests, all passing (43 when it landed)
        16,100damaged files per test run (1 to 4 bytes changed, some cut short): each refused with an error or opened consistently, none crashing
        ×0.01a centimetre FBX scaled into metres in the geometry, with no scale left on any node
        3.0e-3 mmthe gap reported when a STEP corner is 3 µm off, as an approximation

        Tests: cargo test -p avlory-sculpt-formats (glTF, OBJ, STL, FBX, USDA and .blend) run 3 November 2026 on the same 4-thread VM; STEP is tested with the CAD engine. Damaged files: the sum of the fuzz rounds in those tests (glTF 4,000, .blend 4,500, USDA 3,000, OBJ 2,000, STL 2,000, FBX 600). The FBX and STEP values are from the house and bracket reference tests.

        FormatOpenSaveUsed for
        glTF, GLBYesYesGodot, the web, real-time apps
        FBXYesNot yetGame engines and other 3D apps
        USD (.usda)YesYesFilm and studio pipelines. USDC and USDZ come later.
        OBJ, STLYesYesSimple meshes and 3D printing
        Blender .blendYes, 4.5 and 5.xNoMeshes, objects, materials, armatures and clips
        STEPYesYesExact CAD solids, through the CAD engine
        Sculpt's Import dialog listing each format with Open and Save, units and up-axis choices for OBJ and STL, and beside it the GLB import report for props.glb: 18 exact, 2 approximated, 1 not supported.
        The Import dialog and a GLB import report, from Sculpt's screen tests.
        08 · Game-ready

        Ready for your engine.

        The check is builtIts panel in Sculpt comes next

        The game-ready check reads an asset against Unreal, Unity, Godot or Nebula: 25 checks, each problem in plain words with the measured value, the limit, where it is, and a fix. A fix returns a changed copy and a list of what changed; nothing is changed silently. Pick an engine.

        hero_knight.glb · hero character
          Target

          An example asset. Budgets are Sculpt’s defaults (“your budget”), not engine limits, and you can change them.

          360 msa full Unreal 5 check of a 200,000-triangle skinned character with four 2K textures
          28 msa convex collision hull of 100,400 points, capped at 255

          Measured on one processor core of the build container, including reading the normal map's pixels. cargo run --release --example bench in crates/gameready

          Sculpt's Export dialog: GLB picked, everything visible or the selection, units and up axis, and textures inside the file. It says export is never locked, even after a plan ends.
          The Export dialog, from Sculpt's screen tests.
          Status

          Where Sculpt is today.

          In development. Model, Sculpt, Paint, Animate, Simulate and Render work end to end at core depth in the first build, which comes to Windows first; the 2D studio comes in a later pass. Downloads open through the waitlist.

          Tested

          • On a Linux build machine with 4 processor threads and no graphics card.
          • The engine's Rust tests, the app's widget, accessibility and screen tests, and the app against the real engine library.
          • Every control at least 44 × 44, 200% text, and WCAG AA contrast in every theme.

          Not tested yet

          • A Windows build and installer.
          • Wacom, Huion and XP-Pen pens through Windows Ink.
          • Any number on a real graphics card, including the RTX path tracer.
          • macOS, iOS and Android builds.

          Sculpt in the marketplace

          Coming soon

          Open the Engine marketplace from Sculpt and it starts at Sculpt's own section: models, materials, brushes and rigs, made by people who use Sculpt. Each maker chooses whether an item is free, paid or earns a royalty; one button shows the whole marketplace across every app. Every upload is scanned for malware, add-ons run sandboxed with plain-words permissions, and listings show real compatibility and crash rates. Proposed: a Nebula-ready badge on assets that pass the game-ready check for Nebula. About the marketplace

          • No feature moves up a tier

            A saved project always opens and exports, even after a plan ends.

          • Never locked out offline

            A failed licence check never stops editing or export.

          • AI never changes work silently

            Every AI change is a visible, undoable suggestion in the AI ledger.

          • Free to start

            Plans and prices are announced at launch. All the promises

          Waitlist

          Try Sculpt First.

          Sculpt's downloads open through the waitlist. We'll email you when it's ready on your platform.

          Which apps?

          It helps us decide what to finish first.0 / 500