← All projects

02 · 3D scanning · 2026

CloudClean

3D scanning workstation

A workstation that turns raw laser scans into cleaned, measured, inspection-ready parts from any web browser. Import a scan and Autopilot does the rest, or ask the built-in AI assistant and it runs the app for you. It runs on an NVIDIA DGX Spark, on a scanner driver I reverse-engineered.

In active development

Role
Design + engineering, end to end
Started
September 2026
Status
Ongoing
Code
GitHub ↗

What you're looking at

A scanned bolt going through the pipeline. Step through it with the buttons, or let it play.

  • Scan. Live capture from the scanner over my own USB driver, noise and all, including the table the part sat on.
  • Clean. Stray points, debris and the table are removed. Not a single point on the part moves.
  • Mesh. The cleaned points become a surface at true size, following every thread crest and root.
  • Measure. Length is measured along the part's own axis, and the thread is identified (1″-8 UNC).
  • Compare to CAD. Every point is coloured by how far it strays from the design.

Autopilot

Import a scan. That's the whole job.

Turning a raw scan into a finished part usually means a string of separate tools, each one run and tuned by hand. Autopilot does the whole chain for you. Import a point cloud, or just save a scan from the scanner, and it comes out cleaned, merged, meshed, inspected and exported without you clicking a single button.

Doing it by hand

7+ steps
  1. Open the scan
  2. Pick noise filters and tune them
  3. Crop out the table it sat on
  4. Line up each extra scan, pair by pair
  5. Merge, and hope the fit is right
  6. Choose mesh settings and build it
  7. Export, then inspect it somewhere else

With Autopilot

1 step
  1. Import the scan

Then, on its own, Autopilot

  • cleans it and removes the table
  • merges extra scans, but only when they genuinely fit
  • builds a mesh at true size
  • inspects it against CAD if you've added a model, with a pass/fail report
  • exports STL, PLY, OBJ or GLB

It isn't a blind macro. Filters scale to each scan's own point spacing, so the same settings work at any resolution. A scan is only merged if it adds new surface, lines up confidently and sits on the same surface as the others, and an ambiguous fit is flagged instead of guessed. Point it at a folder and every part saved there comes out finished on its own.

At a glance

What it does

~10×lower scan error than my first driver
89 fpslive capture on Linux, where the maker's software doesn't run
10.6 sper AI assistant request, down from 162 s
~300automated tests against parts of known size

It runs on an NVIDIA DGX Spark and works from any browser on the network. The app walks you through six steps: Scan, Clean, Align, Mesh, Measure and Export. Measuring covers a part's true size along its own axes, nine tools from calipers to flatness, thread identification (metric, UNC, UNF and BSP with ISO tolerance classes), a colour-coded comparison against CAD, and printable inspection reports.

One rule runs through all of it: no step may quietly move, stretch or thin out the data, and every step reports what it changed. That's what makes a number on an inspection report trustworthy.

The journey

From a closed scanner to an open workstation

  1. September 2026

    A great scanner with no Linux support

    The scanner is a metrology-grade blue-laser unit, but its software runs only on Windows and macOS, and its maker publishes no developer kit. I wanted scanning, processing and inspection on an NVIDIA DGX Spark, an ARM64 Linux machine, usable from any browser on my network.

    And the measurements had to be trustworthy. A scanning tool that quietly changes a part's size is worse than no tool at all.

  2. Reverse engineering

    Learning to speak the scanner's language

    I recorded the USB traffic between the scanner and its own software and decoded it. The scanner turned out to be a small Linux computer in its own right: its cameras stream as standard USB video, and a separate command channel reads its factory calibration and switches the lasers, exposure and gain.

    My native driver replays the start-up sequence, reads the calibration at every connect, streams at about 89 frames a second and turns camera images into 3D points across 12 worker processes.

    What I foundThe scanner's own project files store every frame's points and position. That gave me frame-by-frame ground truth to check my driver against, instead of guessing.

  3. Accuracy

    From millimetres to micrometres

    My first driver measured a flat board with 330 µm of error. Locating the centre of each laser stripe with a sub-pixel ridge detector brought that down to 31–40 µm.

    Naive stereo matching was also pairing the wrong laser lines between the two cameras, which threw points off by 11–44 mm. Identifying each line from the scanner's factory calibration removed that whole class of error.

  4. The workstation

    Six steps, one obvious action each

    Around the driver I built the full app: a FastAPI engine with long jobs in worker processes, and a React and three.js front end with a 3D viewer that pivots on the point under your cursor and snaps measurements to full-resolution data. Every edit makes a new model and keeps its lineage, so any result can be traced back to the scan it came from.

    Then came Autopilot, which chains those same steps together so a scan goes in and a finished part comes out, with the same checks a careful person would make.

  5. The assistant

    An AI that can run the whole app

    A local language model on the same machine can use about 28 of the app's tools. Ask it to “measure the head height” and it draws the dimension on the model. Ask it to “clean this scan and mesh it” and it does. It can highlight regions in plain language, drive the scanner and turntable, and use photos of the real part to pick the right alignment. It asks before anything that can't be undone, and nothing leaves the machine.

    Choosing and tuning the model on the Spark took a request from 162 seconds to 10.6.

  6. Proving the numbers

    When the bolt measured a little off

    A bolt came out “a little off”, so I built a test bench of synthetic parts with exactly known sizes to find out whether the scanner or my software was to blame. The software checked out: cleaning moved no point, merging was a pure rigid move, and the mesh followed the scan to within a few micrometres. The real causes were subtler:

    • The size readout used the scanner's axes. A tilted bolt read 94.6 × 40.0 × 95.5 mm, but it's really 107.2 mm long. Sizes are now measured along the part itself.
    • The bolt's 12-sided head let two scans line up one flat off, which shifted the length by 0.26 mm. Merges now detect that kind of symmetry and flag it.
    • The scanner's own scan-to-scan consistency is a few hundredths of a millimetre, so new accuracy tools separate scanner error from software error.

    About 300 automated tests now generate parts of known geometry, add noise, debris and a table, and check that cleaning leaves under 0.1% stray points, merging recovers the pose within 0.2°, and meshes stay within 0.15 mm.

    What I foundSeparate the instrument's error from the software's before fixing anything. Here neither the scanner nor the geometry code was wrong: the bugs were in how size was reported and how an ambiguous merge was accepted.

What's next

Where it's going

Still in progress

I'm still working on this project

CloudClean is under active development. Here's what I'm working on next.

  • Test marker-based tracking with real stickers. It's accurate to under 0.15 mm on synthetic data so far.
  • Track down a ~0.16 mm disagreement between the scanner's two laser-line families.
  • Run a final side-by-side check against the manufacturer's own scan of the same part.
  • Validate the Bluetooth turntable control, with rotate-and-tilt programs synced to capture, on real hardware.

Expect further improvements and changes to this project as it develops.

Contact

Hiring for a software role?

I'm looking for full-time software, backend and systems roles. Email is the fastest way to reach me.

pranch555@gmail.com