Developer Bryan Diniz has released colmap-wasm 0.1.0, an unofficial WebAssembly build of COLMAP 4.2.1 that estimates camera poses inside a browser tab.
colmap-wasm turns images into cameras and a sparse point cloud without a server. SIFT extraction runs COLMAP's own code in Web Workers, one wasm instance each, and the author reports keypoints within about 1e-5 px of native COLMAP with identical descriptors. Matching runs in a WebGPU compute shader and returns the same matches as COLMAP's cpu_brute_force_matcher. Geometric verification, view graph calibration, and the GLOMAP global mapper share one worker, and every stage is seeded, so the same images produce the same cameras.
On 90 images at 1024×1280 on an Apple M4 in Chrome, the author reports 21 seconds for features across five workers, 4.7 seconds for matching, and 45 seconds for mapping. The colmap-wasm .wasm binary is 7 MB, or 2.1 MB gzipped. The port drops CUDA, MVS, and the GUI, and swaps SuiteSparse's CHOLMOD for Eigen's SimplicialLLT.
OfflineTools put a free browser build of COLMAP online in September, with WebGPU applied to SIFT extraction inside its own web app. colmap-wasm is an npm library that puts matching on the GPU and reconstructs with the global mapper. Arrival.Space's Splat.js also solves poses in the browser, using its own SIFT implementation and an incremental solver.
The colmap-wasm API centers on estimatePoses, which accepts File objects, optional pair lists from exhaustivePairs or sequentialPairs, and masks that follow COLMAP's mask_path convention. toColmapBinary writes cameras.bin, images.bin, and points3D.bin for a gaussian splatting trainer. All images share one SIMPLE_PINHOLE camera. The library needs WebGPU and module Web Workers, but not SharedArrayBuffer or cross origin isolation.
colmap-wasm was built for Gausify Orbit, an in browser orbit video to splat app from the same GitHub account, which offers it as a second pose estimator beside its own AKAZE based solver.
colmap-wasm 0.1.0 is available now under the BSD-3-Clause license.




