Doop
Doop: 오픈소스 멀티플레이어 디자인 캔버스 및 AI 에이전트용 MCP
무거운 STEP 조립을 내 컴퓨터에서 작은 GLB로 바꾸며 모델은 기기를 떠나지 않고 버린 것을 봅니다
Turn a heavy STEP assembly into a small GLB on your own computer. Free and open source, the model never leaves your machine, and you see what you throw away.
디자인GitHub @xpayn3온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
Make heavy CAD models light, locally: reduce, repair and clean up, then export for the web. WebGPU viewer. Pre-1.0, breaking changes expected.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Drop a STEP file in. Get a Meshopt-compressed GLB and an interactive viewer out. A self-hosted take on the Pixyz preprocessor. Python + your browser, no licence server.
A 1,583-part, 5.4-million-triangle assembly in v0.11.
| The viewer — tree, viewport, and the scene's totals | Inspect — a part's triangles, share of the scene and rank |
| Remove holes — the command panel, and what the fill saved | Before / after — 27 holes closed, the rest untouched |
| All commands — one list, with shortcuts | Search — suggestions follow the selection |
| Scene tabs — every tab is its own scene | Isolate — one sub-assembly, 360 of 1,583 parts |
| Exploded view — a slider per axis | X-ray |
| Heatmap — triangle density, beside the heavy-parts list | Materials dock — filter, sort, inspect |
| Recolour — every part that shares a material | Settings — one window, with search |
| Right-click menu | Export |
CAD assemblies are big. A real-world STEP file might contain 400 identical bolts, 80 duplicate brackets, and half a million degenerate triangles, and still expect your GPU to render it.
The pipeline collapses what it can:
400 bolts × 50 KB → 1 mesh × 50 KB + 400 transforms
80 brackets × 12 KB → 1 mesh × 12 KB + 80 transforms
500K bad triangles → adaptive retess, size-culled
───────────────────────────────────────────────────────────
320 MB STEP → 11 MB Meshopt-compressed GLB
A CAD preprocessor, viewer, hierarchy editor, and exporter, in one local app.
discardNode clipping)
and WebGL2. Hot-swap from the toolbar, no reload.| 🌳 XCAF reader | Per-solid colours, names, and the full assembly tree pulled straight out of OCCT |
| 🧬 PCA pose-normalized hash | Same shape at any rotation/translation → one GPU mesh + N transforms |
| 🔷 Adaptive tessellation | Absolute or relative to bbox diagonal · size culling for the tiny stuff |
| 📦 Meshopt + Draco | Optional EXT_meshopt_compression via gltfpack — ~10× smaller GLBs |
| ⚡ One-click launch | start.bat / start.command bootstraps the venv and opens the app in a window of its own |
| 🔁 Background jobs | Long conversions run as server jobs with live progress streamed to the UI |
| 🌐 Dual renderer | WebGPU (default) with hot-swap to WebGL2 — pick from the toolbar |
| 💡 PBR + AO + envmap | Studio lighting, ambient occlusion, screen-space reflections, fog |
| 🎯 Pixel-perfect picking | Hover, click, marquee-select; works on instanced meshes |
| 👁 Hide / Isolate / Solo | One key per mode — flatten the noise, focus on what matters |
| 🎨 Recolor by group | Per-instance and per-material recolouring with reset baked-in |
| 📐 Wireframe / Shaded / Matcap | Three viewport modes, switchable mid-flight |
| 📊 FPS pill | Tabular-numeric FPS readout, colour-coded for stutter detection |
🕳 Remove holes (P) | Closes bolt holes, slots, pockets and engraved lettering in flat faces; leaves bosses, washer bores and cavity openings alone. Size limit in mm, watertight result, undoable |
| 🔩 Fasteners | Finds bolts, screws, nuts and washers by their shape, whatever they are called, and selects them to isolate or delete; bushings, bearings, O-rings and pipe fittings are left alone |
| 🔻 Decimate | meshoptimizer simplifier — keeps normals, UVs and vertex colours; −25 … −90 % or a triangle target for the selection |
| 📦 Smart fit | Replace parts with the best low-poly proxy: box, oriented box or cylinder |
| 🧽 Clean-up | Remove small, empty, duplicate and degenerate parts; delete empty groups; split fused meshes |
| 🎨 Materials dock | Filter, sort and inspect materials; select or isolate the parts that use one; assign, merge, duplicate, PBR presets |
| 🌳 Live tree | 10 K+ nodes; only the rows on screen are built, so rebuilds stay in the tens of milliseconds |
| 🔎 Search + filters | Fuzzy name search, "highlight small parts" tinting |
| ✂️ Flatten / Dissolve | Collapse single-child chains, dissolve groups, ungroup scopes — all undoable |
| ✏️ Batch rename (F2) | Token templates ({name}, {idx}, {depth}) + regex find/replace + presets |
| 🔄 Undo / Redo | Tree edits, recolours, renames, flattens — all on a single timeline |
| 📌 Right-click menu | Hide / isolate / recolour / rename / focus camera, all in one click |
| 📦 GLB / GLTF | Draco + Meshopt compression toggles, optional embedded textures |
| 🎬 FBX / USDZ / OBJ / STL | Common DCC + AR formats, scale presets (mm/cm/m/in) or custom |
| 🧷 Save Scene | Snapshot view + selection + recolours into a sidecar .scene.json |
| 👋 Welcome modal | Drag-drop, browse, recent files (IndexedDB-persisted handles) |
| 🗂 Scene tabs | Every tab is its own scene, with its own undo history. New and Open never replace a scene that has something in it |
| 🧩 Command panels | Split (X) and Remove holes (P) open as a panel beside the viewport: Enter runs, Esc puts it away |
| ⋯ All commands | Every command that acts on the model in one list, with its shortcut; what cannot run now is dimmed |
| ⌘ Search (⌘K) | Every menu item and every sidebar button and control, one keystroke away, with suggestions for the selection |
| 🔢 Drag any number | Shape parameters and limits are numbers you drag sideways, or click to type. Shift ×10, Alt ÷10 |
| ⌨️ Shortcuts overlay | Discoverable cheatsheet with live key bindings |
| ⚙️ Settings window | General, Viewport, Camera, Performance, Scene and Storage in one place, with search |
| 🎨 Design-token system | Centralised CSS variables — surfaces, radii, type scale, easings |
| 📋 Copy log / Cancel load | Every long operation is observable and abortable |
┌──────────────┐ ┌────────────────────┐ ┌────────────────┐
│ .step / .stp│ ─▶ │ step2glb.py (OCCT) │ ─▶ │ .glb (Draco) │
└──────────────┘ │ • XCAF tree │ └────────┬───────┘
│ • PCA instancing │ │
│ • Tessellation │ ▼
│ • gltfpack/Meshopt │ ┌────────────────┐
└────────────────────┘ │ WebGPU viewer │
│ index.html │
└────────────────┘
cadquery-ocp · trimesh · numpy · Draco · Assimp (WASM) · WebGPU · vanilla JS
No framework. No bundler. No npm install. Just open and run.
# Windows
start.bat
# macOS
./start.command
First run bootstraps
app/.venv, pulls deps, opens the viewer. Subsequent runs are ~1 second.
Run these from the app folder.
python step2glb.py input.step
python step2glb.py input.step --quality 0.2 --min-size 0.5
python step2glb.py input.step --no-instance # disable instancing (only with --no-colors, the plain reader)
python step2glb.py input.step --meshopt # shell out to gltfpack
python step2glb.py input.step --relative # quality as fraction of diag
python step2glb.py part.iges # IGES and BREP work the same way
python step2glb.py input.step --lod 100,50,25 # input.glb + input_lod1.glb + input_lod2.glb
python step2glb.py --batch cad/ --out glb/ # every CAD file in a folder
.step .stp),
IGES (.iges .igs) and BREP (.brep .brp), in any case; the server's
/api/convert takes the same six. IGES keeps the names,
colours and layers the file has; it has no assembly structure, so repeated
parts come out as separate geometry, and no part numbers. BREP is geometry
only. IGES and BREP are often surface models with no solid: those are
meshed as they are (an IGES face for face, one body per colour; a BREP one
body per shell). A STEP with no solid is still refused. Anything with
nothing to mesh, an unknown extension or a damaged file stops with a
message that says why and writes no GLB.--batch DIR converts every supported file in DIR with the
options you give, each in a process of its own, so one damaged file cannot
stop the run. It prints a table (file, parts, triangles in and out, size,
seconds, status) and writes batch-report.csv next to the results. --out OUTDIR collects the GLBs (and the report) in one folder, --recursive
includes sub-folders (and keeps them under OUTDIR), --file-timeout SECONDS gives up on a file that hangs. Two files with the same name in
different formats (part.step, part.iges) get part.glb and
part_iges.glb. The exit code is 1 if any file did not convert.
step2glb.command passes --batch on as it is; on Windows run
.venv\Scripts\python.exe step2glb.py --batch ... (in app\), because step2glb.bat
takes its first argument for a file.--lod 100,50,25 writes the model at those percentages of its
triangles: the first to <name>.glb, the others to <name>_lod1.glb,
<name>_lod2.glb. Every level has the same nodes, names, instances and
metadata. It uses meshoptimizer: gltfpack if it is installed (the same as
--simplify), otherwise the copy bundled in vendor/meshoptimizer/ through
Node.js (lod-simplify.mjs; the browser app's Decimate uses that same
file). With neither it stops and says so. --lod-error E (default 0.01, a
fraction of each part's size) is the most a part may change; where reaching
a percentage would exceed it, the level stays above it, and the log gives
the real triangle count of every level. Cannot be combined with
--simplify.start.bat, start_hidden.vbs, start.command, start.ico thin launchers: they hand over to app/
Install MeshOptimiser.bat the Windows installer
app/ the program (everything below runs from here; .venv, inbox and exports live here too)
├── start.bat, start.command, start_hidden.vbs, ui.ps1 the real launchers (ui.ps1 draws the start-up window)
├── serve.py local HTTP server + /api/convert endpoint
├── updater.py the in-app updater
├── step2glb.py STEP / IGES / BREP → GLB converter (OCCT + instancing, LOD, batch)
├── install.ps1 the installer (also fetched from the website)
├── index.html WebGPU viewer shell
├── js/
│ ├── app.js viewer logic (scene graph, picking, colour groups)
│ ├── mesh-worker.js background worker for Remove holes and Decimate
│ ├── lod-simplify.mjs the LOD simplifier when gltfpack is absent (Node, bundled meshoptimizer)
│ └── holefill.js, fasteners.js, cloner.js, … one module each (pure ones have no dependencies)
├── vendor/ three.js r172 (WebGPU build and add-ons), three-mesh-bvh, meshoptimizer (WASM),
│ lucide icons, Draco (WASM), Assimp.js (WASM), Inter (SIL OFL)
├── assets/, knowledge/ pictures, help clips; the docs Claude reads over MCP
└── step2glb.{bat,command} headless converters
tests/ node and python suites; selftest.js is the in-app suite (?selftest)
tools/app/ build scripts for the app (help, knowledge base, update archive, release zip, clips, splash)
tools/site/ build scripts for the website (see site/)
docs/, site/, CHANGELOG.md not part of the download
v0.37.3 — Save writes over the file, the window's title follows the scene and shows a job's progress, MeshOptimiser appears in Explorer's Open with list, long jobs notify you in the background, and an FBX keeps the names of its materials.
v0.37.2 — A review of v0.37.1's code: eight faults fixed, among them a texture-size export that could leave a shrunken picture on the graphics card, a Model mode that opened on a library shape, and WebP that made normal maps lossy.
v0.37.1 — A History card that goes back to any step, a Model inspector that draws the faults of a mesh on the model, an Animate window that keeps what you move and copies its clips, Settings built as cards with a say in what a scene file keeps, right-click menus on the toolbar, and 58 fixes.
v0.37.0 (Vršič) — A Section view that cuts the whole scene with a plane, a Photo mode with a toolbar, lens rings and softboxes, Remove thickness for thin-walled parts, textures in OBJ and FBX exports, a Profile that shapes its outline, a Properties card of one height, and 17 fixes.
v0.36.1 — One Boolean card with five styles, a Photo mode that looks like a studio render, a reducer that keeps closer to the shape (meshoptimizer 1.3), new scene tabs that open at once, and 9 fixes.
v0.36.0 (Triglav) — The biggest update so far: three.js r186 under the view and three-mesh-bvh 0.9.16 for picking, USD and Collada files, a Profile tool, a still view refined in Photo mode, textures where you pick them, the lens in millimetres, and 27 fixes.
.usd, .usda, .usdc, .usdz, .dae), with their up axis and unit.v0.35.5 — Depth of field in Photo mode, a Visible switch in Edit mesh, status pills that slide, and 42 fixes: merges keep their materials, mirrored parts stay the right way out, the STEP converter cleans up after itself, and the app does no work while idle.
v0.35.4 — Edit mesh keeps up with big models: a part of millions of triangles is read in the background, shows its points, and moves and box-picks without holding the view up.
v0.35.3 — Smart optimise scans the model first, the colour picker has a right-click menu, a material of the Properties card is picked with a click, and the colours and buttons of the app are cleaned up.
v0.35.2 — parts can be copied between scenes and between windows, the app opens in a window of its own, and the Animate timeline edits several clips at once.
v0.35.1 — big STEP files mesh on all cores, the command cards line up, and drags stay smooth on big models.
v0.35.0 — one part can wear several colours, STEP files open with cleaner meshes, and Photo mode draws the model for pictures.
v0.34.0 — Animate gets a timeline and a motion for pistons, Claude works with notes, and axis tools arrive.
v0.33.0 — notes are tasks: a title, a description, parts, who it is for, a priority and a due date, with comments under them.
N, click a spot, fill the form: title, description, kind, who it is for, priority, due date. Comments go under it.v0.32.0 — notes: leave them on the model, answer, edit and resolve them, and send the scene with everything inside.
N, click a spot, write. A numbered pin stays on the part; anyone can reply, edit, resolve or delete.v0.31.1 — Enter goes into Edit mesh, Edit mesh and Undo work together, and the viewport no longer stalls after editing.
v0.31.0 — a polish of the interface, and a tidier folder: icons, toolbars, menus and dropdowns share one look and one speed, groups can be locked, Export puts each part's pivot at the part, and the download is organised like an installed program, with the program inside app.
start.bat, start_hidden.vbs, start.command, Install MeshOptimiser.bat, README, LICENSE) and one folder, app, with the program in it. The top level had grown past fifty files and it was hard to see what to double-click. An installed copy is offered the full download once.v0.30.0 — two alpha features: follow Claude as a feed with your model beside it, and make parts spin, swing, shake and travel.
v0.29.0 — groups align and copy as one piece, windows move like macOS, and everything is sharp to the pixel.
v0.28.0 — see what is wrong with your model, fix it in a tap, and keep the real edges of your CAD file.
v0.27.1 — pictures with a transparent background, at last.
render_image) now gives a real see-through PNG when the background is transparent, and a white, light, grey, dark or black background shows its own colour instead of black.v0.27.0 — shadows, better paint, a smarter Quick remesh, and scenes that come back as they were saved.
v0.26.0 — faster, lighter and easier to pick with: Box and Brush select whole parts, big files open without freezing the page, the same STEP opens instantly the second time, and the app gives memory back.
inbox/cache/, 3 GB at most). Two conversions run at a time and the rest wait.v0.25.0 — more to build with, and a better way to line it up: 26 new library parts, an Align parts panel, a Transform panel for several parts, and a search you can move.
>5000 triangle filters and is:hidden.v0.24.0 — into the mesh: an Edit mesh mode with points, edges and polygons, a shortcuts window with a keyboard and keys you can change, and a faster start.
1 2 3 4). Pick with Click, Box or Brush, pick loops, then move, turn, scale, delete or reverse what is picked with the gizmo. The view modes moved to Alt+1 to Alt+4.Alt+1 to Alt+4 on a Mac, and a faster start: the browser keeps the app's files between starts.v0.23.0 — back to the mesh itself: you decide how a CAD file becomes triangles, Fill holes is now Remove holes and closes far more, three tools clean up what is left, and the search looks through Settings.
U and Shift+U) and Split by faces with a smallest part.v0.22.0 — let Claude do the work, and never lose the scene: Claude can drive the optimiser, the app updates itself, and a crash is recoverable.
v0.21.0 — show it and ship it: a turntable video, export presets for where the file is going, and a Selection bar with the actions I reach for most.
v0.20.0 — draw, organise and trust it: a Draw tool and Sweep, lines that are real parts of the scene, tree organising commands, IGES and BREP, and an app that closes its server with the window.
L) — Pen, Rectangle, Circle, Arc, Polygon, Freehand and Edit, on the ground, front, side, view or the face of a part, with a field of snapping dots, typed sizes, Round and Bevel corners (drag the ring on the corner), Bezier handles that snap to the grid and break with Ctrl. Sweep carries a profile along a line.--batch), writes LOD files (--lod 100,50,25) and keeps the CAD file's own data on the nodes.v0.15.0 — the commands come to the pointer: a Quick wand ring on W, four clean-up tools, Untriangulate, a wireframe that shows polygons, and a scale handle for Dynamic place.
W over the viewport: a ring of commands opens round the pointer. Move toward a slice and let go; a short flick is enough. With a selection it has Hide, Reduce, Delete and More; with nothing selected it has Fit view, Select all, View, Show all, File and Clean. Slices that hold a group fan out as soon as the pointer is on them (Decimate −25 % to −90 %, Smart fit, Split, Remove holes; the views; Save; the clean-ups), and a command that cannot run stays on the ring, dimmed, with the reason. A quick tap of W leaves the ring open to click. It never acts by accident: Esc, any other key, the wheel or a click outside closes it.Ctrl+K).v0.14.0 — the biggest release so far: a CAD view, Dynamic place, an Align to floor that shows what it will do, Help inside the app, and a Settings window that changes the look.
6; a strip of small 3D nuts, one for every look (Default, Clay, Porcelain, Steel, Red wax, and the CAD looks Ceramic, Light, Mono); one Outlines switch for the edge lines.D: drag the selected part over other surfaces; it rests on them and turns to face them.v0.13.0 — it feels like an app: installs to the desktop, opens in a window of its own, and the tabs grew up.
v0.12.0 — the app builds as well as reduces: a library drawer of 86 parametric parts to drag onto the model, Align to floor, Select hidden parts, Fit to budget, Smart fit Boxes and Blocks, Clay view, and dark parts that have a shape.
v0.11.0 — how the app is used changes: scenes in tabs, command panels beside the viewport, numbers you drag, one Settings window, and a speed pass on a 5.4M-triangle assembly.
v0.10.1 — libraries bundled: the app starts without a CDN and works offline.
v0.10.0 — the biggest release so far: new tools, and everything you touch is immediate.
?selftest runs 31 regression tests inside the live app (41 as of v0.11); node tests/holefill.test.mjs checks the hole filler.See CHANGELOG.md for the full list and the known issues.
Open the app with ?selftest (http://localhost:4242/?selftest) to run the
regression suite inside the live app. It drives the tree, toolbar, dialogs
and context menu like a user would and checks undo/redo, exports, save
round trips and more; results appear in a panel at the bottom right and in
the console. ?selftest=groups runs only the tests whose name contains
"groups". Nothing is downloaded — exports are captured in memory. Add a
test to tests/selftest.js whenever a bug is fixed.
The hole filler has its own suite, which needs only Node:
node tests/holefill.test.mjs
It builds plates, pockets, counterbores, engraved letters, a boss, a washer and a hollow box, runs the filler on them and checks that the result is closed, has the right volume, and is untouched where it should be.
The fastener recogniser has one too:
node tests/fasteners.test.mjs
It builds bolts, screws, nuts and washers to the ISO sizes, turns and scales them, and checks that each is recognised with the right thread — and that bushings, bearings, O-rings, cable glands, shafts and boxes are not.
MeshOptimiser is built on open source. Thank you to everyone who made these. Their licence files are in vendor/; the same list is on the website and in Settings › About.
| Library | By | Licence | What it does here |
|---|---|---|---|
| three.js | the three.js authors | MIT | The 3D view, on WebGPU or WebGL2 |
| three-mesh-bvh | Garrett Johnson | MIT | Fast picking on very large meshes |
| meshoptimizer | Arseny Kapoulkine | MIT | The simplifier behind Decimate and Smart Fit, and Meshopt compression (gltfpack too, when installed) |
| Draco | Apache 2.0 | Reads and writes Draco-compressed GLB | |
| Basis Universal | Binomial LLC | Apache 2.0 | Reads KTX2-compressed textures in glTF |
| Open Asset Import Library (assimpjs) | the assimp team; Viktor Kovacs | BSD 3-Clause; MIT | Opens other 3D formats in the browser |
| CadQuery OCP | the CadQuery contributors | Apache 2.0 | The Python bindings that read STEP files |
| Open CASCADE Technology | Open Cascade SAS | LGPL 2.1 with exception | The geometry kernel under OCP |
| trimesh | Michael Dawson-Haggerty | MIT | Meshes and GLB writing in the converter |
| NumPy |
MIT. Do whatever — just don't blame me when your assembly tessellates into a black hole.
✦ ✦ ✦
Built for engineers who want their CAD to load before their coffee. ☕
extrasnamepathTestAsm/Bolt-3productpartNumberdescriptionPRODUCT.idcolorlayersmaterialnamedensityvolumearea--no-extras| the NumPy developers |
| BSD 3-Clause |
| The numbers underneath |
| Inter | Rasmus Andersson and the Inter Project Authors | SIL OFL 1.1 | The typeface |
| Lucide | the Lucide contributors | ISC | The icons |
| Gearbox Assy | Khronos glTF-Sample-Models; converted by Okino Computer Graphics | see the repository | The sample assembly in the screenshots and the online version |