or click Open… · STL, OBJ, PLY, OFF, glTF (+.bin), GLB, 3MF, HEM · several at once
Restore last session?
Recent files
Left-drag: rotate · Wheel: zoom · Right-drag / Shift+drag: pan · R: reset view · ?: help
Drop to open
meshcore app: help
Load, view, check and save 3D mesh files. Everything runs on this computer: the page talks only to
the local meshcore server (127.0.0.1), or in the static (Pyodide) version runs meshcore inside the page.
Nothing is uploaded to the internet.
Loading files
Drag and drop files anywhere on the page, or click Open…. You can pick several files at once.
Formats: STL (binary or ASCII), OBJ, PLY, OFF, glTF, GLB, 3MF,
and meshcore half-edge files .hem (binary) / .hemt (text).
A .gltf file that uses an external .bin (or textures) must be dropped together with it.
Likewise drop an .obj together with its .mtl to get its colours.
Files are Z-up / Y-up: choose Y-up before loading files made in Y-up programs, so they stand upright.
glTF/GLB is always handled automatically.
Weld: merges vertices closer than the given distance when loading (blank = off, 0 = exact duplicates).
Use it if a closed part shows as open because its vertices are split at seams.
Loaded files appear in Models on the left. Click one to show it; × removes it from memory.
Printability check
Check printability (right panel) looks for 3D-printing problems: holes / open edges, non-manifold edges,
flipped normals, overhangs steeper than the set angle (build direction +Z), size against the bed
(and a too-small part that is probably in inches), several or floating shells, little flat contact with the bed
and walls thinner than the nozzle.
Affected faces are coloured (errors red, warnings orange);
open and non-manifold edges are drawn as lines. Click an issue to show only it and zoom to it; click it again to show all.
Clear removes the highlights. Bed size, nozzle and overhang angle are remembered with the other settings.
Sizes are in mm. Files without units are taken as mm.
G-code
Slice to G-code turns the current model into G-code for an FDM printer (walls, top/bottom skin, sparse
infill, skirt, retraction; Marlin or Klipper start/end code). It runs the printability check first and refuses
on errors unless ignore errors is ticked.
Supports adds support columns (purple in the preview) under overhangs steeper than the Printability
overhang angle, from the bed only unless on model too is ticked. Arc fitting writes round
walls as G2/G3 arcs (check that your firmware supports arcs). Brim adds loops around the first layer.
The result shows the estimated time, filament and layers, a Download .gcode button and a layer preview:
drag the slider to step through layers (red outer wall, green inner walls, orange skin, blue infill).
Mouse and keys
Left-drag
rotate
Scroll wheel
zoom (towards the cursor)
Right-drag, or Shift + left-drag
pan
W
wireframe (triangle edges)
E
feature edges (sharp edges)
B
colour each body differently
G
ground grid
R / F
reset / fit the view
N / P
next / previous model
?
this help (Esc closes it)
What the checks mean
Closed (watertight)
Every edge is shared by faces on both sides: no holes or gaps.
“boundary edges” counts the edges along holes.
Manifold
No edge is shared by more than two faces, and no vertex joins separate fans of faces
(like two cubes touching at a corner).
Oriented
Neighbouring faces agree on which side is outside. “inward” means the faces of a
closed shell all point inward (the part is inside out).
Solid
Closed, manifold, consistently oriented with outward normals and a positive volume.
Only then are the volume and point-in-solid answers reliable; 3D printing and CAD need this.
Bodies / shells
Bodies are named parts from the file (OBJ groups, glTF nodes, 3MF objects).
Shells are connected pieces of surface; a hollow part has an outer shell and a void shell.
Saving and exporting
Pick a Format: STL binary/ASCII, OBJ, PLY binary/ASCII, OFF, GLB, glTF (one .gltf file with the data
embedded) or 3MF. Download saves to your browser's Downloads folder.
Save to folder (local server mode only) writes into the app's output folder (shown below the buttons; set with
--out). Existing files are not replaced unless you tick Overwrite. File names are cleaned
up: folders, unusual characters and reserved names are removed, and the right extension is added.
An OBJ with colours also needs its .mtl, so its download is a .zip of both.
HEM (half-edge) saves the half-edge structure exactly: every half-edge with its origin, next,
previous and face (twins are pairs h, h^1; face -1 = boundary), one half-edge per face and per vertex,
the cut non-manifold edges and skipped faces, and all colours, groups, normals, UVs, units and names.
.hem is a compact numpy archive; .hemt is the same as readable text. A loaded .hem file is checked
for consistency (broken loops, twin pairing, bad indices) and problems are listed in the info panel; it
is never rebuilt. Exporting an unchanged .hem upload as HEM (units keep, Z-up, no weld) writes it back
exactly; otherwise the half-edge structure is rebuilt from the mesh.
STEP (.step, AP214) exports a CAD solid for FreeCAD, Fusion, SolidWorks, OnShape and others. Each closed,
manifold body becomes a B-rep solid (a cavity becomes a void); open or non-manifold bodies become a surface
model (a warning is printed in the app's console). Coplanar neighbouring triangles of the same colour are merged
into one face, so a cube has 6 faces. Units come from the Units setting (default mm) and face colours are kept.
STEP (faceted) writes the simpler FACETED_BREP form for programs that prefer it. STEP files cannot be
opened here (that needs OpenCascade).
Units: “keep” leaves the numbers alone. Choosing a unit converts the coordinates if the file
had units (e.g. mm → in divides by 25.4); if it had none, the unit is only assigned (labelled).
glTF/GLB is always stored in metres with a scale that keeps the true size; 3MF records the unit.
STL, OBJ, PLY and OFF have no standard unit field (meshcore writes a comment).
Up axis: meshcore works Z-up, like CAD and 3MF. “Y-up (rotate)” turns the model so +Z becomes +Y
for programs that expect Y-up. glTF/GLB is Y-up by definition: with Z-up meshcore adds a rotation node,
with Y-up the coordinates themselves are rotated. Either way it looks upright in glTF viewers.
Weld tol.: merges close vertices before saving (blank = off).
Saving in this browser or your account
Save to browser keeps an exact half-edge copy (.hem, including your edits) with a thumbnail in this
browser. My models on the left lists them with date and size: click one to open it, ✎ renames,
× deletes (after asking). The line below shows the space used. If the browser runs out of space you get a
message and nothing is lost; delete some saved models and try again.
Autosave (Settings) keeps a copy of the model you are looking at, with its edits. After a reload the
start screen offers Restore last session?; Discard forgets it. Undo history is not kept.
Recent files on the start screen lists what you opened lately. Files from disk must be opened again with
Open… (the browser cannot reread them); entries saved in the browser open with a click.
Settings: load options, view toggles, export format and options and the edit-mode pick type are
remembered; Reset settings restores the defaults (saved models stay).
All of this is stored per page address and per browser profile. Clearing the browser's site data removes it.
Download important files as well.
Accounts (on a site with sign-in, e.g. spinstop.com/mesh/): the top bar shows whether you are signed in.
Signed in with a verified email, Save to account, My models, Recent files and Settings use your account,
so they follow you to other computers; signed out (or unverified) they stay in this browser. Sign in, register and
sign out on the site's own page: the link goes there and brings you back (the model on screen returns
through the autosave; signing in or out in another tab is noticed too). After signing in you are
offered to copy the browser's models to your account (the browser copies stay).
Saving a model you opened from My models under the same name updates it. If it was changed meanwhile in another
tab or on another computer you are asked: overwrite it, or keep the other version (it opens next to yours).
If your sign-in expires, the app says so and saves in this browser instead; the open models are not affected.
The autosave always stays in this browser.
Editing
Click Edit mode (T). The model is now drawn from its half-edge structure: thin lines are the
real polygon edges, red lines are boundary edges (holes) and
orange ones non-manifold edges (both can be switched off).
Pick what to select: Vertex1, Edge2 or Face3, then click the
model. An edge pick takes the face edge nearest to the click; a vertex pick the nearest corner. Ctrl+click
adds a second vertex (for Split face). Esc clears the selection. The panel shows the ids
(vertex, half-edge and twin, face) and basic facts.
Edge: Flip (two triangles only), Split (adds a vertex in the middle and splits neighbouring triangles),
Collapse (merges the two ends; refused if the link condition fails, e.g. on a tetrahedron, because
the result would not be a valid surface), Join faces, Fill hole (pick a red boundary edge; optionally
with a fan of triangles).
Face: Poke (vertex at the centre), Triangulate, Delete (Del; leaves a hole), Flip shell (reverses the
whole connected piece).
Several faces: in Face mode Shift+click adds or removes faces; Grow / Shrink / Connected
change the selection. Extrude pulls the faces out by a distance (along the vertex normals or one average
normal) and adds side walls; Inset adds a smaller copy inside each face (or the whole region), by a distance
or a fraction; Merge coplanar and Triangulate work on the selection. Bevel (Edge mode) cuts a
flat chamfer of the given width along an edge.
Vertex: type x, y, z and click Move to x, y, z, or drag the selected (purple) vertex with the
mouse: it moves in the plane facing you.
Whole mesh: Subdivide (each triangle into 4), Loop subdivide (and smooth), Compact (renumbers ids after
deletions), Triangulate all, Merge coplanar, Smooth (Taubin keeps the volume, Laplacian shrinks; only the selected
vertices if any), Decimate (reduce to 50% or a face count while staying closed), Clean up (merge close
vertices, remove degenerate and duplicate faces, fix orientation, fill small holes; shows a report) and Normals
(smooth shading with an angle limit, or flat). Subdivision and decimation need triangles: use Triangulate all first.
Long operations show a spinner.
UndoCtrl+Z / RedoCtrl+Y. If an edit can't be done, the reason is shown in red and the
mesh is left exactly as it was. The info panel and the validation report update after every edit.
Save / Export uses the edited mesh. HEM export (units keep, Z-up, no weld) saves the edited half-edge
arrays exactly, including any not-yet-compacted deletions. Leave edit mode (T) to see the normal view.
Limitations
A HEM file whose half-edge loops are broken cannot be displayed (the error lists the problems); use
python -m meshcore.convert info file.hem to inspect it.
Only triangle/polygon meshes: no NURBS/STEP, point clouds, lines, textures, animation or skins.
Colours are kept where the formats allow (face/vertex colours, materials as plain colours).
The upload limit is set with --max-upload (MB). Very large meshes (millions of triangles)
take a while to check and display, and feature edges are switched off above 2 million triangles.
Models are kept in memory only while the app runs; nothing is saved unless you export it.
The view needs WebGL. The page must be opened from the running app (not as a file).
Editing: edit mode shows plain grey faces (colours come back in the normal view). Each edit sends the
whole half-edge data back to the page, so very large meshes (well over 100k triangles) feel slower.
Concave faces are drawn and triangulated as fans.
More: README.md, docs/APP.md, docs/HEM.md and docs/STEP.md in the meshcore folder.