Skip to content
doesthingsPublic

About

Fast, free and open-source 3D model viewer for Android: STL, OBJ, 3MF, STEP, IGES. Section cuts, measuring, wall thickness, weight estimates. No ads, no tracking.

Topics

Resources

Contributing

Stars

10 stars

Watchers

0 watching

Forks

Repository files navigation

Meshwise: a fast, native 3D model viewer for Android

Download APK Android 8.0+ OpenGL ES 3 MIT license Support on Ko-fi

Meshwise is a fast 3D model viewer for Android. Open 3D printing and CAD files on your phone and check them before you print: section cuts, measurements, wall thickness, exploded assemblies, print time and filament estimates and more.

  • Free and open source (MIT). No ads, no account, no paywall.
  • STEP and IGES included, through the Open CASCADE kernel.
  • Private. No tracking, and your files never leave your phone. The only network use is a daily update check (you can turn it off) and downloading an update when you tap Update.

Honest note: Meshwise is vibe coded: I built it with a lot of help from an AI coding assistant. It works well enough, it has automated tests, and I just wanted to share a good free tool with whoever needs one. If something breaks, please open an issue.

Download

Get the latest APK from the Releases page and open it on your phone. You may need to allow installs from your browser or file manager.

APK For
Meshwise-x.y.z-arm64-v8a.apk Nearly every phone and tablet from the last 8 years. Pick this if unsure.
Meshwise-x.y.z-armeabi-v7a.apk Older 32-bit ARM devices
Meshwise-x.y.z-x86_64.apk Chromebooks and emulators
Meshwise-x.y.z-universal.apk Any device (largest download)

Meshwise needs Android 8.0 (API 26) or newer with OpenGL ES 3.0. Almost every device in use today has both.

Every release is signed with the same Meshwise certificate, so a new version installs over the old one. The app tells you when a new version is out, shows what changed, and can download and install it for you (see Privacy). To check a download, run apksigner verify --print-certs on it. The SHA-256 must be 69:FE:7F:DD:77:48:C2:FA:DD:BE:F4:3C:66:BC:8B:EC:F7:19:AA:AC:CD:D3:40:DE:42:F7:F3:EB:31:4B:4D:11.

Screenshots


Home: recent files with thumbnails, library, samples

Viewer: STEP assembly with real part colors

Section analysis: hatched caps, live plane

Smart measure: tap two holes, get center distance and wall

Wall thickness: heat map, thinnest-wall callouts

Explode: automatic or manual with gizmo

Parts: search, isolate, x-ray, focus

Materials: plastics, metals, resin, ceramic

Dimensions: bounding box overlay

Color: paint parts, custom colors

Estimate (Print prep): print time, filament, weight, cost

Settings: themes, accent colors, controls, units

View: standard views, lighting, backgrounds, field of view

Your layout: accent color, labels, left-handed mode

Customize toolbar: pick, place and order the tools

Print prep: orientation stats and suggestions, build volume

Features

Open almost anything

  • STL (binary and ASCII), OBJ with MTL colors, 3MF (multiple objects, colors), PLY (binary and ASCII, vertex colors), OFF
  • STEP, IGES and BREP CAD files with assembly structure, part names and colors (Open CASCADE)
  • ZIP archives: every model inside is loaded and laid out side by side
  • Open files from other apps with "Open with" or "Share" (file managers, cloud drives, email, chat apps)
  • Recent files with thumbnails, an on-device library, and five sample models to try

A fast, clear viewer

  • Orbit, pan and pinch-zoom with inertia; zoom toward your fingers; double-tap to focus on a point
  • View cube, standard views, perspective or orthographic projection with an adjustable field of view, turntable mode
  • Physically based materials (matte, satin, glossy, resin, rubber, ceramic, steel, aluminium, chrome, gold, silver, copper, brass, titanium), studio, soft, dramatic, flat and headlight lighting, soft shadows on a grid floor
  • Eleven background presets or your own two-color gradient
  • Smooth shading that keeps sharp edges crisp, feature edges, wireframe and axes

Inspect and analyze

  • Section analysis: cut along X, Y or Z, flip the side, type an exact cut value, solid hatched caps
  • Smart measure: tap a hole, shaft, round edge, flat face, straight edge or corner and Meshwise recognises it, even in a plain STL. One tap gives a hole's diameter and depth, a face's area or an edge's length; two taps give what makes sense between them (wall thickness between parallel faces, the angle between faces, center distance and wall between holes, axis-to-face distance, or point-to-point with ΔX/ΔY/ΔZ). Hold and drag for a precision crosshair, keep several results on screen, copy them as text
  • Point modes: free point-to-point distance, circle through three points (radius, diameter, center) and angle, all snapping to corners and edges
  • Dimensions: tap the info bar to show the X/Y/Z size of the model
  • Wall thickness: gradient or threshold heat map and callouts at the thinnest walls
  • Overhang analysis with an adjustable angle, and a mesh check for open and non-manifold edges, flipped normals, degenerate faces and shell count

Work with assemblies

  • Parts list with search, show/hide, isolate, x-ray the rest, and focus
  • Explode slider, plus a manual mode with a 3-axis drag gizmo, per-part hide and undo
  • Paint parts individually or all at once, and assign materials per part

Print prep (one Print tool: Orient · Size · Printer · Estimate)

  • Lay flat: tap any face and the model turns so that face sits on the bed
  • Suggested orientations: compares the model's sides and large flat faces by overhang area, contact with the bed and height, and offers the best three
  • Live overhang share, build height and area on the bed for the current orientation, with overhang shading one tap away
  • Rotate in 90° steps, mirror, undo, or go back to the file as it was
  • Scale by percent or to an exact size on one side; one-tap fixes for files exported in inches, cm or meters
  • Printers: common Bambu Lab, Prusa, Creality and Elegoo printers or a custom size; the build volume is drawn around the model with "fits", "fits turned 90°" or "scale to fit"
  • Print estimate: print time, filament length and weight, and cost, worked out by slicing the model the way a slicer does (walls, top and bottom layers, infill, bridges, overhangs, supports, travel) with your printer's usual slicer settings. Change layer height, infill and pattern, walls and supports and see the result update. Materials from PLA to PC (for metals and resin, the weight of the solid part)
  • Exports and projects keep the new orientation and size

Make it yours

  • Light, dark or system theme, eight accent colors or Material You, and a pure black mode for OLED screens
  • Customize the toolbar: choose which tools sit in the bottom bar, which in the top cluster and which are hidden, and set their order
  • Button size, panel opacity, button labels, a left-handed layout, and switches for the view cube and the info bar
  • Opening view, model color and material for files without colors, selection highlight color
  • Controls: rotation speed, inverted drag, what a double tap does, turntable speed and direction, haptic feedback
  • Measurement units and decimal places, reopen the last model on start, and one tap to reset everything

Save and share

  • Save projects (.meshwise: camera, colors, materials, explode layout, section) and reopen them later
  • Export STL, OBJ (with part names), 3MF (with names and colors) or high-resolution PNG snapshots, optionally with a transparent background
  • Share any export straight to another app

How accurate is the print estimate?

Meshwise slices the model into layers like a slicer, works out the walls, shells, infill, bridges and supports in each layer, and times every move with the printer's speeds, accelerations and corner limits, its hotend's flow limit and the minimum layer time.

To check it, the same models were sliced in Bambu Studio 2.8 for four printers (Bambu Lab X1C, Creality K1, Prusa MK3S, Creality Ender-3 V2) with different layer heights, infill densities and patterns, wall counts and support types: 92 slices of 10 test models. Against Bambu Studio's own estimates:

Slices Mean difference Largest difference
Print time, no supports 80 3.3% 13%
Print time, with supports 12 14% (tree 8%, normal 21%) 31%
Filament, no supports 80 1.9% 8%
Filament, with supports 12 8% 22%

You can repeat the check with the scripts in scripts/estimate_check.

Your slicer's settings will differ from the defaults Meshwise assumes, and a slicer's estimate is itself an estimate of the real print, so treat the numbers as a good guide rather than exact. Heating, homing and bed levelling are not included.

Performance

The C++ core memory-maps the file, parses it without copies, welds vertices with a hash of exact positions, and builds normals, topology and the BVH on all cores. These numbers come from the bundled fsv_bench tool on a 4-core x86_64 cloud VM, not a phone. Expect a phone to be slower; real phone timings are welcome in an issue.

Model Size Triangles Load + mesh processing Topology BVH (picking) Wall thickness
Twisted vase (sample) 3.1 MB 66 k 13 ms 5 ms 12 ms 30 ms
Trefoil knot, dense 97.7 MB 2.05 M 0.41 s 0.17 s 0.57 s 1.3 s

Only loading has to finish before the first frame. Topology, BVH and analysis run in the background while you already orbit the model. The renderer packs each vertex into 24 bytes (position, 10-bit normal, color, part ID) and only redraws when something changes, so the GPU and battery rest when you are not touching the screen.

How it works

┌──────────────────────── Kotlin / Jetpack Compose ────────────────────────┐
│  HomeScreen · ViewerScreen · panels · overlays (labels, gizmo, cube)     │
│  ViewerViewModel ── Engine (JNI facade) ── GLSurfaceView (on demand)     │
└───────────────┬────────────────────────────────────┬─────────────────────┘
                │ JNI                                │ Messenger IPC
┌───────────────▼──────────────────┐  ┌──────────────▼─────────────────────┐
│ libmeshwise.so (C++17)           │  │ :cad process · libmeshwise_cad.so  │
│ loaders: STL OBJ 3MF PLY OFF ZIP │  │ Open CASCADE 7.8.1: STEP/IGES/BREP │
│ weld · normals · topology · BVH  │  │ XCAF names/colors · BRepMesh       │
│ analysis · exporters · camera    │  │ → FSM mesh, cached per file        │
│ GLES 3 renderer (PBR, shadows,   │  └────────────────────────────────────┘
│ stencil section caps, x-ray)     │
└──────────────────────────────────┘
  • native/core: loaders, mesh processing, BVH, analysis, exporters, camera and the OpenGL ES 3 renderer. Platform-independent; the same code runs in the headless desktop renderer and the unit tests.
  • native/jni: the JNI bridge (libmeshwise.so).
  • native/cad: Open CASCADE import (libmeshwise_cad.so). It runs in its own process, so a broken CAD file can't crash the viewer. Results are cached as compact FSM meshes, so a STEP file opens much faster the second time.
  • app/: the Kotlin app (Compose Material 3 UI, view model, file handling, projects).

Building

You need JDK 17+, Android SDK 36, NDK 28.2.13676358 and CMake 3.31.6 (Android Studio can install them), plus git and ninja for the CAD kernel.

git clone https://github.com/doesthings/Meshwise.git
cd Meshwise

# Optional but recommended: build Open CASCADE for STEP/IGES/BREP (once, about 20-40 min per ABI).
# Without it the app still builds, but it can't open CAD formats.
for abi in arm64-v8a armeabi-v7a x86_64; do scripts/build-occt-android.sh $abi; done

./gradlew assembleDebug          # app/build/outputs/apk/debug/
./gradlew assembleRelease        # signed with keystore.properties if present, see docs/RELEASING.md

Testing

# Native core: unit tests, benchmark and the headless renderer (Mesa EGL on Linux)
cmake -S native -B native/build-host -G Ninja -DCMAKE_BUILD_TYPE=Release
ninja -C native/build-host
native/build-host/fsv_tests
native/build-host/fsv_bench model.stl
native/build-host/fsv_render --in model.stl --out shot.png --size 1200x1200 --section z:0.5

# App: Robolectric tests that drive the real native engine through the view model
./gradlew :app:testDebugUnitTest -Pfsv.hostLibDir=$PWD/native/build-host

# Regenerate the screenshots in this README (Compose UI + offline 3D renders)
scripts/make_screenshots.sh

CI runs the native tests, a render smoke test, the JVM tests and a full APK build on every push. Changing the VERSION file on main publishes a signed release (see docs/RELEASING.md).

Support

Meshwise is free, open source and ad-free, and it will stay that way. If it saves you time, you can star the repo or buy me a coffee. Both help keep development going.

Star on GitHub Buy me a coffee on Ko-fi

Bug reports help just as much, especially files that don't open or look wrong: open an issue.

Privacy

Meshwise collects nothing. It reads only the files you open and keeps recent files, thumbnails, projects and the library in its private storage. Your files never leave your phone.

The app's only network use is the update check and, when you ask for it, the update itself. Once a day the app asks GitHub for the list of recent releases; nothing about you or your files is sent. If there's a newer version it shows what changed, and you choose Update, Not now or Skip this version. Update downloads the APK from the GitHub release, checks it against the release's SHA256SUMS.txt and hands it to Android's installer, which asks you to confirm (and only accepts an update signed with the same key). You can turn the check off in Settings. The Ko-fi and GitHub buttons open your browser (the Ko-fi button goes through a small redirect page on GitHub Pages, so the donation link can change without an app update).

License

Meshwise is released under the MIT License. The app bundles Open CASCADE Technology (LGPL 2.1 with the OCCT exception) for CAD import; see THIRD_PARTY_NOTICES.md for details and how to relink it. Sample models are CC0.

About

Fast, free and open-source 3D model viewer for Android: STL, OBJ, 3MF, STEP, IGES. Section cuts, measuring, wall thickness, weight estimates. No ads, no tracking.

Topics

Resources

Contributing

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages