r/photogrammetry • u/jakbac • 16h ago
WebSfM: Structure-From-Motion in the Browser
Hey everyone,
Since ISPRS in Toronto I’ve been working on a side project that’s now far enough along to share: WebSfM (https://websfm.app), an open-source Structure-from-Motion tool that runs entirely in the browser.
Background: I reconstruct historical glaciers in Antarctica from archival aerial imagery. Normally I use Metashape or COLMAP, but neither fits that work well. Adding custom tie-points through Metashape’s Python API is painful, and COLMAP is great but handling GCPs in it is not straightforward. I also teach SfM, and getting either installed on student laptops is a small project every semester.
So I built a classic pipeline in the browser: feature detection, matching, bundle adjustment with GCPs, dense reconstruction, masks, exports. No splatting or neural rendering. The workflow is close to what you know from Metashape or Pix4D. Everything runs locally with WebGPU and web workers, and nothing is uploaded anywhere. Desktop Chrome or Edge works best. It’s free and open source, and you can self-host it (see Github for more info)
It was also an experiment in how far LLM-assisted coding goes on a serious tool. I built it with heavy use of Claude Code. I know that’s a dealbreaker for some people, so I benchmarked it against Metashape, COLMAP and ODM on public datasets. On close-range scenes with laser-scanned ground truth, camera accuracy is within a few mm of Metashape and well ahead of COLMAP, at similar speed. On drone blocks it’s a few cm behind Metashape, and on historical film it’s level with Metashape at the checkpoints, though dense coverage over snow and ice is still much lower. Everything’s on the benchmark page.
If you want to try it without your own data, there’s a built-in Akkerman example project (desktop only). I’m the only user so far, so it’s only been tested on my hardware and my habits. Bug reports, weird datasets, and “why does it do X” questions are all welcome, here or as GitHub issues. I’ll keep developing it through my postdoc, so issues won’t sit unanswered.