[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-105432":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":16,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":29,"readmeContent":30,"aiSummary":10,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":31,"discoverSource":32},105432,"Mesh-Mix-S2C","STL2CURVES-MMM\u002FMesh-Mix-S2C","STL2CURVES-MMM","(in the process of merging) A macOS, Windows and Linux that turns STL, 3MF, OBJ and PLY meshes, even messy ones, into editable STEP files with real CAD faces: planes, holes, fillets, gear teeth, swept and freeform surfaces. Repairs the mesh first, checks every result against it, and reads Bambu Studio and OrcaSlicer projects.","",null,"Python",61,3,59,2,0,37.43,"GNU Affero General Public License v3.0",false,"main",true,[23,24,25,26,27,28],"3dprinting","design","fusion360","software","step","stl","2026-11-01 00:16:37","\u003Cimg src=\"app\u002FResources\u002FAppIcon-1024.png\" alt=\"Mesh Mix-S2C logo\" width=\"128\" align=\"right\">\n\n# Mesh Mix-S2C (formerly Manifold Mesh Mix)\n\n> **Manifold Mesh Mix is merging with [stl2curves](https:\u002F\u002Fgithub.com\u002FDuvdivan\u002Fstl2curves) and is now called Mesh Mix-S2C.**\n> The two projects were built separately and turned out to be good at different things. Manifold Mesh Mix has the desktop apps, the mesh check and repair, smooth surfaces for organic shapes and scans, and the check of every result against the mesh. stl2curves, by Duvdivan, has very precise detection of holes, fillets and screw threads, and spots parts that were scaled or drawn in inches so it can snap them back to round sizes. Together they make one converter that is better than either one alone.\n>\n> The project now lives in a shared GitHub organization run by both authors, Tuna-The-First and Duvdivan, and stays free and open source (AGPL-3.0).\n>\n> - **Right now:** the latest release is still **1.6.0**, the Manifold Mesh Mix engine described below.\n> - **Coming next: 2.0.0**, the first release with the merged engine. Early tests on more than 170 files are very promising, and it's still being tested and tuned.\n> - **Already have the app?** You don't need to do anything. The ⬇ update button finds 2.0.0 automatically when it's released, because GitHub forwards the old address to this one.\n\nAn app for **macOS, Windows and Linux** that turns 3D-printing meshes (**STL, 3MF, OBJ, PLY**) into **editable STEP files** you can open in Fusion, SolidWorks, FreeCAD or Onshape. The STEP files are made of real CAD surfaces: flat faces, holes and cylinders, cones, spheres, fillets, gear teeth and smooth freeform surfaces. You can select, measure and edit them like a part you modelled yourself.\n\nIt's made for real-world files, including messy ones: CAD exports, coarse OpenSCAD models, noisy 3D scans, sculpts and slicer projects. Every mesh is checked and repaired first. Every result is compared with the mesh it came from, so a wrinkled, dented or patchwork shape is never saved when a closer one can be made. Every STEP file is opened again and checked after it is saved.\n\n\u003Ca href=\"https:\u002F\u002Fbuymeacoffee.com\u002Ftunathefirst\">\u003Cimg src=\"https:\u002F\u002Fimg.buymeacoffee.com\u002Fbutton-api\u002F?text=Buy%20me%20a%20coffee&emoji=%E2%98%95&slug=TunaTheFirst&button_colour=5F7FFF&font_colour=ffffff&font_family=Poppins&outline_colour=000000&coffee_colour=FFDD00\" alt=\"Buy Me a Coffee\" height=\"40\">\u003C\u002Fa>\n\n## What's new in 1.6\n\n1.6 rebuilds the CAD side of the converter. In 1.5.1, mechanical parts often came out as hundreds or thousands of small freeform patches, sometimes crumpled or with flaps. In 1.6 they come out as the few clean faces a CAD program would make. In each picture below, every face has its own color: fewer, larger colors mean a cleaner, more editable part.\n\n![A printed hub: 1.5.1 made 2,243 crumpled patches, 1.6.0 makes 214 clean CAD faces](docs\u002Fimages\u002Fcompare_rim.png)\n*A printed hub (a user's problem file). 1.5.1 gave up on CAD and saved 2,243 smooth patches that crumple around the holes. 1.6.0 saves 214 CAD faces, all within 0.08 mm of the mesh.*\n\n![A curved mount: 2,156 patches in 1.5.1, 182 faces in 1.6.0](docs\u002Fimages\u002Fcompare_mount.png)\n*A headrest mount made in OpenSCAD (a user's problem file): 2,156 patches in 1.5.1, 182 faces in 1.6.0. The bent arm is a few large faces instead of a patchwork.*\n\n![A noisy scanned plate: 443 patches in 1.5.1, 13 faces in 1.6.0](docs\u002Fimages\u002Fcompare_scan_plate_noisy.png)\n*A noisy scan of a flat plate with holes (test model). 1.5.1 followed the noise and left a lumpy surface, worst around the counterbore. 1.6.0 sees through the noise: 13 faces with the counterbore as true flat faces and cylinders.*\n\n![A bevel gear: 662 patches in 1.5.1, 5 faces in 1.6.0](docs\u002Fimages\u002Fcompare_cad_bevel_gear.png)\n*A bevel gear (test model): 662 strips in 1.5.1, 5 faces in 1.6.0. The tapered teeth are swept faces instead of strips.*\n\n![A cam with a rounded edge: 55 faces in 1.5.1, 8 in 1.6.0](docs\u002Fimages\u002Fcompare_cad_cam_fillet.png)\n*A cam with a fillet along its curved outline (test model): 55 pieces in 1.5.1, 8 in 1.6.0. The fillet follows the curve in a few long faces instead of many small pieces.*\n\n![A tractor tire: 1,186 faces in 1.5.1, 610 in 1.6.0](docs\u002Fimages\u002Fcompare_tire.png)\n*A tractor tire (a user's problem file): 1,186 faces in 1.5.1, 610 in 1.6.0, with straight borders between the tread faces.*\n\n**The big changes** (the [release notes](.github\u002Frelease-notes\u002Fv1.6.0.md) explain each one in detail):\n\n- **Every conversion is checked against the mesh, not just for validity.** The app measures how far the result is from the mesh everywhere, both ways, and which way the surface faces. Different kinds of meshes get their own rules: a clean CAD export, a coarse OpenSCAD model and a noisy scan aren't judged the same way. When a result only just passes, a finer second check decides, and the other method is tried too so the closer result is kept. The app says when it does this, so you know why a file takes longer.\n- **New kinds of CAD faces: swept surfaces and fillets.** Straight and helical gear teeth, tapered bevel-gear teeth, worm threads, tire treads and bent arms become one swept face each instead of hundreds of patches. Fillets along curved edges become one face that follows the curve.\n- **Clean borders between faces.** Faces used to meet along saw-tooth borders that followed the mesh's triangles, which left jagged edges, folded faces and thin slivers. Borders are now straightened and smoothed, and leftover slivers are joined to their neighbours.\n- **Much better with bad meshes.** Noisy scans keep their real flat faces instead of falling apart into thousands of pieces. Coarse exports (few, long triangles) are judged by their own faceting. Hole fills in the mesh check never cut through the part. Parts that touch along an edge each stay closed.\n- **Files that are right in every program.** Every face is written to STEP, read back and checked before the file is saved. Faces that would break in the saved file (STEP doesn't keep everything OpenCASCADE keeps in memory) are built again.\n- **Two versions when no method fits.** If no method follows the mesh everywhere, the app keeps both the closest result and a valid one, and you pick (**Closest to the mesh** or the other version).\n- **Better preview and progress.** Faces OpenCASCADE can't mesh are no longer missing from the STEP preview. The queue shows each step of a conversion, such as a second check or another method being tried. Long lists of touching parts in 3MF projects are cut short so the buttons stay on screen.\n\n## Download\n\nGet the newest version from the [Releases page](https:\u002F\u002Fgithub.com\u002FSTL2CURVES-MMM\u002FMesh-Mix-S2C\u002Freleases\u002Flatest):\n\n| System | File | Notes |\n|---|---|---|\n| **macOS** 14+ (Apple silicon) | `ManifoldMeshMix-\u003Cversion>-macOS-arm64.zip` | Unzip and drag **Manifold Mesh Mix** into Applications. The app isn't notarized, so the first time, right-click it and choose **Open**. |\n| **Windows** 10\u002F11 (64-bit) | `ManifoldMeshMix-\u003Cversion>-Windows-x64-Setup.exe` | Installs just for your user account (no administrator password). Windows SmartScreen may warn about an unknown publisher the first time: click **More info → Run anyway**. |\n| **Linux** (x86-64; Ubuntu 22.04, Fedora 36, Debian 12 or newer) | `ManifoldMeshMix-\u003Cversion>-Linux-x86_64.AppImage` | Make it executable (`chmod +x`, or Properties → Permissions) and double-click it. If it doesn't start, install `libfuse2` (Ubuntu: `sudo apt install libfuse2`). **File → Add to Applications Menu** puts it in your app menu and in \"Open With\" for meshes. |\n\n### Updates\n\nEvery version can update itself. Click the **⬇ button** next to the app name (or **Check for Updates…** in the menu or in Preferences\u002FSettings). The app looks up the newest release on GitHub, downloads the file for your system, checks it against the release's checksums, installs it and opens again. A few seconds after opening, the app also checks once by itself and shows **Version X is available** under the app name; it never installs anything without a click (turn the check off in Preferences\u002FSettings).\n\n- **Windows:** the installer runs silently and the app restarts.\n- **Linux:** the AppImage replaces itself (the folder it is in must be writable) and restarts.\n- **macOS:** the app replaces itself in its folder (normally Applications) and restarts. If macOS asks, allow Manifold Mesh Mix under **System Settings → Privacy & Security → App Management**.\n\n## Using it\n\n1. Open **Manifold Mesh Mix** (Applications on the Mac, the Start menu on Windows, the AppImage on Linux).\n2. Drop files or whole folders onto the window, or click the drop area to browse. You can also right-click a file and choose **Open With → Manifold Mesh Mix** (Finder on the Mac, Explorer on Windows).\n3. Pick a **preset** (Auto is fine for almost everything) and set the **Speed ↔ Quality** slider.\n4. Press **Convert** (⌘↩ on the Mac, Ctrl+Enter on Windows\u002FLinux). The STEP files stay inside the app until you export them; nothing is saved into your folders yet.\n5. Click a file in the queue to compare the **Mesh** and **STEP** views. The STEP view shows the body the way a CAD program does; the palette button gives every face its own color, so you can see how the surfaces were split up.\n6. Press **Export…** (⌘E \u002F Ctrl+E, or **Export All** ⇧⌘E \u002F Ctrl+Shift+E). The export window shows the file names, where they go (by default a **STEP Files** folder next to each original) and whether existing files are replaced. If replace is off and a file with the same name is already there, the app asks whether to replace it or save under a new name.\n7. A green **File checked** badge means the saved STEP file was read back and is a valid solid with the mesh's volume, and that its surface follows the mesh (hover over the badge to see how closely, for example \"99.9% of the surface is within 0.13 mm of the mesh\"). Otherwise the app lists each problem it found in plain words (for example gaps in the surface, a part that isn't a closed solid, or a volume that doesn't match the mesh), or shows **Doesn't match the mesh everywhere** when no method followed the mesh closely enough. In that case the app keeps two versions, the one closest to the mesh and a valid one, and shows **Two versions were made** above the preview: the one you pick is shown and exported.\n   **Automatic repair.** If reading the file back finds small errors (faces whose edges don't line up, small gaps, a solid whose surfaces cross), the app repairs the file the way CAD programs like Fusion do when they import one, and checks it again. Then the badge says **Repaired automatically**, so the file is clean in every program, not just in CAD programs that heal files themselves. The repair only runs when there is a problem, and a repaired version is kept only if it reads back better with the same shape and volume. If a part still has errors the repair can't fix, the app converts just that part again another way: smooth surfaces instead of CAD faces, CAD faces instead of smooth surfaces for mechanical parts, or denser smooth surfaces for organic ones. It uses the new version only if that checks out clean. It tells you when it did. Problems in the mesh itself (holes, missing pieces) can't be repaired this way and are still listed.\n\n### Mesh check\n\nEvery file is checked when you add it, and again right before it's converted. The check looks for the problems that make 3D-printing meshes hard to turn into solids, fixes what it can, then checks the fixed mesh again from scratch. While a file is read, the queue and the preview show the step it is on (for example \"Looking for hidden internal walls\" or \"Filling holes\"), with a progress bar. The **Mesh** view shows the result above the file name (**Mesh is clean**, **Mesh fixed**, **Your choice needed** or **Mesh has problems**) and lists each problem in plain words with what was done about it.\n\n| Problem | What the app does |\n|---|---|\n| Triangles with broken coordinates, squashed flat, or duplicated | Removes them. |\n| Paper-thin walls hidden inside a part (left where shapes were glued together, for example by slicer tools that merge parts into one mesh) | Removes them, so the outer surface is one clean piece. |\n| Tiny cracks between edges that should be joined | Joins them. |\n| Triangles facing the wrong way, or whole parts inside out | Turns them around. |\n| Points where the surface touches itself at a single corner | Separates them. |\n| Holes and tangled edges (an edge shared by 3 or more triangles) | Fills and untangles them. Big holes are filled with a simple surface, and the app says so. |\n| The surface passing through itself | Repairs it only where that doesn't change the shape: every repaired spot is compared with the original solid, and spots where material would be added or removed are put back. What's left is listed. |\n| Pieces that overlap each other | Asks you: they stay separate solids unless you click **Merge Overlapping Pieces**, which joins them into one. |\n| A surface with no thickness, or holes too big to fill | Converts it as a surface instead of a solid, and tells you. |\n| A model that's tiny or huge | Notes that it may be in inches or meters, so you can change **Units**. |\n\n**Save Fixed Mesh…** saves the checked and fixed mesh as an STL or 3MF (one object per part), for example to print it from your slicer. Nothing in your original file changes.\n\n### When something goes wrong\n\nIf a conversion fails, the app says what went wrong and **why**, in plain words (for example that the file itself is the problem, or that the computer ran out of memory). **Save Report…** writes a small text file to send with a bug report ([open an issue](https:\u002F\u002Fgithub.com\u002FSTL2CURVES-MMM\u002FMesh-Mix-S2C\u002Fissues) and attach it). It has the app and system versions, your settings, the mesh check, the error and its technical details, and the log. It doesn't have the mesh itself, and the file's folder and your user name are removed from it.\n\n### Presets\n\n| Preset | Best for | What you get |\n|---|---|---|\n| **Auto** | Everything | Checks every part and picks CAD or Smooth for it. After converting, the preset Auto used is marked **Auto used** in its own color. |\n| **CAD** | Mechanical parts, brackets, enclosures, wheels | Planes, holes, cylinders, cones, fillets (tori) and spheres as exact CAD faces you can select, measure and edit. Anything else becomes fitted NURBS. |\n| **Smooth** | Sculpts, figurines, organic shapes, scans | Large smooth NURBS surfaces fitted to the mesh. |\n| **Precise** | When accuracy matters most | Like Auto, but with a tighter tolerance and more detail. |\n\n### 3MF projects (Bambu Studio, OrcaSlicer, Snapmaker Orca, PrusaSlicer)\n\nThe app reads the actual parts from slicer project files:\n- **Modifiers and support blockers\u002Fenforcers are skipped.** Only real printable parts are converted.\n- **Copies on the plate are converted once**, in their original orientation and position (the same coordinates as the STL they came from). Scaling you applied in the slicer is kept.\n- **Split to parts (on by default):** every part becomes its own STEP file, named *Project - Part.step*, like \"Split to parts\" in the slicer. The preview shows one tab per part, so you can look at each part's mesh and STEP separately. Turn it off (the **Split to parts** button above the preview, or **Split 3MF projects into parts** in the settings) to get one STEP file with all parts as named bodies.\n- To keep the plate arrangement instead, set **Advanced → 3MF projects → Whole build plate** (this keeps all parts in one file).\n- **Parts that touch each other** (a two-color print, a soft liner in a hard mount) are found when the file is read, and the app asks: **Split to Parts** keeps them apart, **Merge Into One** joins them into one solid with an exact union (no leftover walls where they touched). **Merge Touching Parts** in the Mesh view changes it later.\n\n### Speed ↔ Quality\n\nHigher quality tightens the fitting tolerance and adds surface detail, but takes longer.\n\n**Auto quality** (with the Auto preset, on by default): each file gets its own quality from its size, because small meshes are quick even near the top of the slider while very big ones would take hours. Under 50,000 triangles 90%, up to 300,000 80%, up to 1 million 70%, up to 3 million 60%, and 50% above that. The slider shows the quality picked for the selected file. Moving the slider switches to one quality for every file; the **Auto** button next to it switches back.\n\n**Best quality keeps fine detail.** In the *Best quality* part of the slider (85% and up), organic shapes get more surfaces the denser the mesh is, so sculpted texture like cracks, scales and tool marks survives. At the far right the surfaces stay within a few hundredths of a millimeter of a typical sculpt. Dense meshes then make much bigger STEP files and take a lot longer: a 2-million-triangle bust took about 20 minutes and made a 130 MB file, instead of about 8 minutes and 25 MB. When that's about to happen, a warning under the slider gives the expected file size. It needs a few GB of memory. A **Smooth surface limit** (Advanced) turns it off.\n\n## Building from source\n\n**Getting the code:** download only the latest version, not the whole history:\n\n```\ngit clone --depth 1 https:\u002F\u002Fgithub.com\u002FSTL2CURVES-MMM\u002FMesh-Mix-S2C\n```\n\nThe current files are under 4 MB. The full history is about 120 MB, because it still contains large test files that were removed later, so a plain `git clone` downloads far more than you need. If you only want to use the app, download it from the [Releases page](https:\u002F\u002Fgithub.com\u002FSTL2CURVES-MMM\u002FMesh-Mix-S2C\u002Freleases\u002Flatest) instead; no cloning needed.\n\nAll three versions share the conversion engine in `engine\u002F`. The version number lives in `VERSION`.\n\n### macOS\n\nNeeds macOS 14 or newer on Apple silicon, the Xcode command line tools and Python 3.12.\n\n```\npython3.12 -m venv .venv\n.venv\u002Fbin\u002Fpip install -r requirements.txt\n.\u002Fbuild.sh            # builds dist\u002FManifold Mesh Mix.app (Swift app + bundled engine)\n.\u002Fbuild.sh --install  # also copies it to \u002FApplications\n.\u002Fbuild.sh --zip      # also makes the release download\n```\n\n### Windows and Linux\n\nOne Qt (PySide6) app in `desktop\u002F` builds both. Needs Python 3.12; Windows also needs [Inno Setup 6](https:\u002F\u002Fjrsoftware.org\u002Fisinfo.php) for the installer.\n\n```\npython3.12 -m venv .venv                       # Windows: py -3.12 -m venv .venv\n.venv\u002Fbin\u002Fpip install -r requirements.txt -r desktop\u002Frequirements.txt\n.venv\u002Fbin\u002Fpython desktop\u002Fbuild.py               # Windows: .venv\\Scripts\\python desktop\\build.py\n```\n\nThis builds `dist-desktop\u002FManifoldMeshMix\u002F` (the app with its engine) and the installer (Windows) or AppImage (Linux). To run the app straight from the source code: `.venv\u002Fbin\u002Fpython -m mmm_app` inside `desktop\u002F`.\n\n### Releases\n\nPushing a tag such as `v1.0.1` (matching `VERSION`) makes GitHub Actions build and test all three versions and publish a release with their downloads and `SHA256SUMS.txt`, which the apps' updaters use. Every push runs the same builds and tests (`.github\u002Fworkflows\u002Fbuild.yml`).\n\n### Where things are\n\n- `engine\u002Fmmm\u002F`: the Python conversion engine (OpenCASCADE via OCP). Run it directly with `.venv\u002Fbin\u002Fpython engine\u002Fmmm_engine.py convert part.stl --preset auto`.\n- `app\u002FSources\u002F`: the SwiftUI Mac app. `app\u002FTests\u002Fupdate_test.py` tests its self-update.\n- `desktop\u002Fmmm_app\u002F`: the Windows\u002FLinux app; `desktop\u002Fpackaging\u002F`: its installer and AppImage files; `desktop\u002Ftests\u002F`: unit tests, the scripted self-test checker and update tests.\n- `tests\u002F`: test-model generator (`make_models.py`, creates `tests\u002Fmodels\u002F`), test suite (`run_suite.py`, with `render.py` for its pictures) and `measure_detail.py`, which measures how closely a STEP file follows its mesh.\n\n### How the engine works (short version)\n\n- **Mesh check** (`engine\u002Fmmm\u002Fmeshcheck.py`): runs on every part before converting. Each problem has its own detector (zero-volume pieces and coincident opposite sheets for internal walls, union-find over corner fans for pinched points, a uniform grid with exact triangle–triangle tests for self-intersections, Manifold booleans for overlapping pieces) and is fixed in an order where each fix makes the next one easier. MeshFix repairs crossing surfaces, but its result is compared with the original patch by patch, using winding numbers to tell inside from outside, and only kept where no material is added or removed. A second pass (`verify_bodies`) checks the fixed mesh again without fixing anything; the engine's `fix` command saves the fixed mesh.\n\n- **CAD:** the mesh is segmented by region growing with robust, area-weighted fits of planes, cylinders, cones, spheres and tori. Simpler surface types are preferred, and fits are checked between mesh vertices, not just at them, within the mesh's own faceting (measured from its curved areas; shallow creases don't count). Coarse cylinders made of a few long facets (typical of OpenSCAD) are recognised from the edges that run along them.\n  - **Swept surfaces** (`engine\u002Fmmm\u002Fsweep.py`): leftover areas are tested for a motion that leaves them unchanged: a straight pull (extrusions, straight gear teeth), a turn about an axis, a screw motion (helical teeth, worm threads, treads) or a screw that also shrinks (tapered bevel-gear teeth). The motion comes from the surface normals, which are all square to it (Pottmann & Randrup); the profile is then fitted once and swept. **Fillets along curved edges** (`engine\u002Fmmm\u002Ffillet.py`) become one pipe surface around the measured spine instead of the many small tori and cylinders the segmenter cuts them into. A new surface is only kept where it is no worse than what it replaces.\n  - **Clean borders:** jagged borders between regions are straightened by a minimum cut through the triangles that fit both surfaces, then smoothed; slivers left behind join their neighbours, and a border move that would leave a strip narrower than two tolerances is skipped. Edge curves are checked so they never fold back.\n  - What's left is split into height-field patches and fitted with trimmed B-splines. Edges are fitted curves shared by both faces; wrap-around faces get proper seams and poles. Before the shape is accepted, its faces are written to STEP and read back, and faces that come back broken are built again.\n- **Smooth:** quad remesh (Instant Meshes, with a decimate → Manifold-clean → quad-split fallback), then Catmull–Clark-style bicubic patches (Loop–Schaefer ACC) least-squares fitted to the mesh. Regular patch areas are then merged into large B-spline faces.\n- **Shape check against the mesh** (`engine\u002Fmmm\u002Ffidelity.py`): every result is tessellated again (finer than the fit tolerance) and compared with the mesh both ways: exact point-to-triangle distances from evenly spread points on the mesh to the shape (missing material, dents) and from the shape to the mesh (bulges, flaps), plus the direction the surface faces at each point (wrinkles keep close to the mesh but tilt it). A result follows the mesh when 99% of its surface is within 3 tolerances, 99.9% within 8, and almost none faces the wrong way. Each kind of mesh has its own rules, picked by measuring the mesh (`mesh_kind`): **clean** meshes are judged as they are; **coarse** ones (an OpenSCAD 16-sided circle) get a tolerance as large as their own faceting; **scans** get a tolerance as large as their noise, and only whole patches facing the wrong way count, not single noisy points. Each verdict has a certainty: near a limit, or with a spot further off than the mesh's coarseness explains, a finer second check decides, and Auto tries the other method too and keeps the closer result. The CAD builder uses the same measure face by face: a face that strays is fitted again as a freeform face, and a freeform face that still strays becomes flat faces made from its own triangles. The pipeline uses it to choose between methods: one that follows the mesh beats one that is merely valid, and when nothing smooth follows a small mesh (up to 20,000 triangles), it is saved with flat faces exactly like the mesh.\n- Every result is checked with OpenCASCADE's shape analyzer before it's written, and the saved file is read back and checked again. When that finds problems, `engine\u002Fmmm\u002Frepair.py` opens the saved file and saves it again (as a CAD program would), then tries shape healing and sewing, keeping each step only if the file reads back better with the same volume. If problems remain, the broken parts are converted again another way (`convert_alt` in `pipeline.py`). The STEP file also stores each edge's 2D curve on its faces, so CAD programs rebuild every face exactly as it was checked (the test suite reads each file back and compares volumes).\n\n## Support the project\n\nManifold Mesh Mix is free. If it saves you time, you can [buy me a coffee](https:\u002F\u002Fbuymeacoffee.com\u002Ftunathefirst): it helps pay for the AI credits that go into building and improving it. **Help → Support the Project** in the app opens the same page.\n\n## License\n\nCopyright © 2026 Tuna-The-First and Claude (Anthropic's AI assistant).\n\nManifold Mesh Mix is free and open-source software, licensed under the **GNU Affero General Public License v3.0** (AGPL-3.0). See [LICENSE](LICENSE) for the full text.\n\nIn short: you may use, study, change and share it. If you give the app (or a changed version of it) to others, or run a changed version for others over a network, you must make its source code available to them under the same license. It comes with no warranty.\n\nIt bundles other open-source software; see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n\n","2026-10-31 04:26:46","CREATED_QUERY"]