Doop
Doop: 오픈소스 멀티플레이어 디자인 캔버스 및 AI 에이전트용 MCP
브라우저에서 미분화 가능한 암시적 CAD, GUI·코드 편집·제약 해결·WebGPU 레이마칭 렌더링·형태 최적화까지 지원
Differentiable implicit CAD in the browser: edit via GUI or code, solve constraints, render with WebGPU raymarching, optimize shapes end-to-end.
디자인Python · TypeScriptGitHub @andrinr온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Differentiable code-first CAD: sketches, constraints, SDF geometry, meshing and
FEM simulation composed into one function JAX can differentiate end to end.
The API is not stable. Expect breaking changes.
, free=True, ...). Then the camera makes one full turn around the bracket.]
*The handle under the pointer is a named Vector2 in scene.py, and the
joint it moves is a smooth union of three extrusions. Dragging it writes the
parameter buffer the shader already reads, so the blend follows at frame
rate; releasing it patches the literal in the source. The source is the
model.*README 전문 보기 ↗Differentiable code-first CAD: sketches, constraints, SDF geometry, meshing and FEM simulation composed into one function JAX can differentiate end to end.
[!WARNING] The API is not stable. Expect breaking changes.
Dragging the rib_tip handle updates the shader's parameter buffer each frame and rewrites the Vector2 literal in scene.py on release.
sketch vertices ─► constraints ─► SDF ─► mesh ─► FEM solve ─► objective
└─────────────────────────── ∂J/∂θ ◄───────────────────────────┘
One Python program declares every stage, and JAX differentiates through each:
Vector2 parameters.Optimization are declared in the scene beside the geometry.
Each optimization step is a mesh, a solve and an adjoint, projected back onto
the constraints.The end cap's ThermalStudy is meshed and solved with one click.
The heat sink starts overbuilt; its declared Optimization slims it by descending on the gradient of peak temperature with respect to the sketch.
In Sketch mode, dragging a literal work plane by its gizmo rewrites its SketchPlane(origin=...); a plane taken from a face (SketchPlane.on(body.cap("+"))) is instead an expression over the parent feature's parameters, so it is differentiable.
apply/vjp interface, implemented as a
Tesseract and run
in-process, in a container or remotelypip install cadjoint # pin an exact version: the API is not stable
Everything beyond the geometry core is an extra (pip install "cadjoint[fem]",
or uv sync --extra fem in a checkout, one --extra per name):
| Extra | Pulls in |
|---|---|
cuda | GPU JAX (Linux + NVIDIA only; no macOS wheels, so avoid --all-extras on a Mac) |
fem | jax-fem finite-element stack (basix, meshio, petsc4py, gmsh); compiles PETSc |
tesseract | tesseract-core + tesseract-jax, the plugin runtime |
gmsh | Gmsh in-process for the tet10 mesher (GPL, hence its own extra) |
viewer | the playground server (pydantic), the Jupyter widget (anywidget) and the process monitor (psutil) |
editor | playground lint, completion and signature help (ruff, jedi) |
stepcheck | OCCT validation of STEP exports (dev) |
docs | Quarto API reference (quartodoc) |
Installing from a checkout, the platforms CI verifies, and the toolchain the
fem extra needs are in
Getting started.
uvx --from "cadjoint[viewer,editor]" cadjoint-viewer --open # no checkout
uv run --extra viewer --extra editor cadjoint-viewer --open # from a checkout
The editor holds scene.py and the viewport shows the compiled field. Vertex
handles, gizmos, material swatches, face picks, constraint chips, solver runs
and the properties window all write back into the source.
The properties window edits the arguments of the selected call: here the comb's extrusion depth.
The server listens only on localhost but executes the scene's Python on your machine; only run code you trust. The playground guide covers every window, the scenes directory and browser support.
from cadjoint.construction import PolygonProfile, SketchPlane, extrude
from cadjoint.constraints import DistanceConstraint, satisfy_constraints
from cadjoint.geometry import Scalar, Vector2
from cadjoint.meshing import GridSpec, extract_mesh
a = Vector2([0.0, 0.0], free=True, name="a")
b = Vector2([1.0, 0.0], free=True, name="b")
c = Vector2([1.0, 1.0], free=True, name="c")
d = Vector2([0.0, 1.0], free=True, name="d")
DistanceConstraint(a, b, 1.2)
depth = Scalar(0.5, free=True, name="depth")
block = extrude(PolygonProfile([a, b, c, d], plane=SketchPlane()), depth=depth)
satisfy_constraints(block) # projects a and b onto the constraint, in place
grid = GridSpec.from_bounds((-0.5, -0.5, -0.5), (2.0, 2.0, 1.5), 32)
mesh = extract_mesh(block, grid)
functionalize(block) returns a pure function of the parameter values, so
jax.grad of anything downstream reaches a, b, c, d and depth.
Modelling covers
sketches, features and constraints, and the
guides continue to
meshing, a thermal study and an optimization;
examples/fem_bracket_optimization.py runs the full chain from the command
line, with the adjoint checked against finite differences at every boundary.
uv run pytest tests -q --ignore=tests/fem # fast gate
uv run pytest tests/fem -q # needs the fem extra; CalculiX via CADJOINT_CCX
uv run pre-commit install # ruff on commit
The playground UI is a Solid + TypeScript app in frontend/, built into
cadjoint/viewer/static and committed, so installing cadjoint needs no Node
toolchain; its workflow is in
developing the UI.
The same app also builds as a static public demo with no Python server
(npm run dev:static in frontend/); see
frontend/src/static/README.md.
Docs need Quarto and the docs extra:
uv run quartodoc build, then quarto preview.
benchmarks/jax_compile_profile.py splits a worker request into trace, lower,
XLA compile and cache time per program;
research/performance.md
records what each optimization bought.
Inspired by Fidget and Inigo Quilez's distance functions.