Also published at the Asteria Research and Technology (A.R.T.) home: https://github.com/Asteria-Research-and-Technology/lingbot-desktop-mac.
A minimal, Mac-native desktop front end and custom 3D viewer for Lingbot-Map's streaming 3D reconstruction. Drag a video into the window and, a few minutes later, explore a 3D point cloud and the solved camera trajectory in a customized viser viewer. Everything runs locally on Apple Silicon (MPS). No cloud, no remote GPU, by design.
What it is, precisely: the output is a point cloud in a customized viser viewer. It is not Gaussian splatting. The reconstruction model is Lingbot-Map's work. My contribution is the Mac wrapper: the drag-in workflow, the FastAPI/desktop shell, the installer, and the viewer UX (upright auto-alignment, hero framing, a playback strip, and point-cloud/splat-format save buttons).
Built on Lingbot-Map by the Robbyant Team. Paper: "Geometric Context Transformer for Streaming 3D Reconstruction," Chen et al., arXiv:2604.14141. This project is an independent wrapper and is not endorsed by or affiliated with the Robbyant Team.
Developed with Asteria Research and Technology (A.R.T.).
Released as open source under the Apache License 2.0, which permits commercial and non-commercial use. It is intended as a community/research release. Note that the model weights are downloaded separately and may carry their own, possibly more restrictive, terms, so review them before use. All I ask in return is attribution.
See LICENSE for the full text and NOTICE for attribution and the licenses of the upstream projects (one of which, VGGT, is non-commercial).
One line, on an Apple Silicon Mac:
curl -fsSL https://raw.githubusercontent.com/donalleniii/lingbot-desktop-mac/main/install.sh | bashThe installer is conservative: it detects Homebrew, ffmpeg/ffprobe, and a Python 3.10 toolchain, and asks before installing anything. It then creates a virtual environment, installs Apple-Silicon PyTorch and pinned dependencies, clones Lingbot-Map at a pinned commit and applies the Mac/MPS patches, and downloads the checkpoint (after showing you its license note). It never installs FlashInfer or kaolin and never builds CUDA extensions.
Prefer to read before you run? You should. Open install.sh, or follow the manual steps below.
# 1. Clone this repo
git clone https://github.com/donalleniii/lingbot-desktop-mac.git ~/Projects/lingbot-desktop
cd ~/Projects/lingbot-desktop
# 2. Python 3.10 venv + pinned deps (uv recommended; provisions Python 3.10 for you)
uv venv --python 3.10 .venv
uv pip install --python .venv/bin/python -r requirements-lock.txt
# 3. Clone upstream Lingbot-Map at the pinned commit and apply the Mac/MPS patches
git clone https://github.com/Robbyant/lingbot-map.git app
git -C app checkout 7ae07810ddac6f449f856ca0f6260ab3e1dcaa84
git -C app apply "$(pwd)/patch/lingbot-map-mps-and-viewer.patch" # run from the repo root
cp patch/presentation.py app/lingbot_map/vis/presentation.py
uv pip install --python .venv/bin/python --no-deps -e app
# 4. Download the checkpoint (~4.63 GB) and verify it (see "Model weights" below)
mkdir -p checkpoints
curl -fL -o checkpoints/lingbot-map-long.pt \
https://huggingface.co/robbyant/lingbot-map/resolve/main/lingbot-map-long.pt
shasum -a 256 checkpoints/lingbot-map-long.pt
# expect: 832bc82cbae0bc9bbe946ef5ee1f7226abd8c0e183ccf8beddbb3d133576f409(ffmpeg is used to read a clip's duration for frame estimates: brew install ffmpeg.)
cd ~/Projects/lingbot-desktop
./launch.command # starts the server, opens http://localhost:8000launch.command is also double-clickable in Finder.
- Drop a video anywhere in the window (or click Choose Video). It previews immediately and never leaves your Mac.
- Check the estimated time (the sampling rate is chosen automatically; override it under Options) and click Create 3D Scene.
- While it runs, a live progress bar shows the stage, frame count, and time remaining.
- When the scene is ready, the 3D viewer fills the window: orbit, use the bird's-eye view, the ground plane, and the rotation gizmo. Save the point cloud (PLY) from the viewer; a splat-format PLY is also written for import into splat viewers (it is converted from the point cloud, not trained Gaussian splatting).
Reconstruction quality depends on parallax. Translate the camera through the scene, walk it around and past objects, and avoid pure rotations (panning in place gives the model almost nothing to triangulate). Steady, deliberate motion beats fast, shaky motion.
Developed and measured on the dev machine: an Apple Silicon M5 Max MacBook Pro with 128 GB unified memory. Performance and reconstruction time will vary on other hardware, likely significantly on machines with less unified memory or weaker GPUs. Treat the numbers below as "measured on the dev machine; your mileage may vary."
Verdict: CLEAN_MPS_SLOW, roughly 0.3 to 1.0 frames/sec. It runs on
clean Apple-Silicon MPS (no CUDA, no FlashInfer, no CPU-fallback crutch needed)
and reconstructs real handheld footage into a coherent point cloud, but it is
usable-but-slow: "drop a clip in, wait a few minutes, then explore," not
interactive.
Measured on the dev machine:
| Input | Mode | Result |
|---|---|---|
Bundled loop scene, 16 frames |
streaming, clean MPS | ~1.9 fps |
Bundled loop scene, 237 frames (294x518) |
windowed | 242 s to viewer, ~1.0 fps |
| Real handheld clip, 100 frames (portrait cropped to 518x518) | windowed, clean MPS | ~236 s total (~3.9 min), ~0.45 fps, coherent |
Notes:
- Portrait phone footage is the slow case: the model crops it to a 518x518 square, which is more tokens per frame than a landscape crop.
- Plain streaming mode does not scale on MPS (per-frame cost balloons and long runs get killed), so the app auto-switches to windowed mode with small windows above roughly 48 sampled frames.
- It is not real-time and is not meant to be.
Full build log, the three MPS code patches, and how these numbers were obtained are documented in the developer's local notes.
The reconstruction checkpoint is downloaded separately from Hugging Face and is not part of this repository.
- File:
lingbot-map-long.pt(~4.63 GB, 4,632,303,465 bytes) - URL: https://huggingface.co/robbyant/lingbot-map/resolve/main/lingbot-map-long.pt
- sha256:
832bc82cbae0bc9bbe946ef5ee1f7226abd8c0e183ccf8beddbb3d133576f409(matches Hugging Face's publishedx-linked-etag; the installer verifies it)
The checkpoint carries its own license terms, which may be more restrictive than this project's Apache-2.0 code. Its model lineage includes VGGT, which is released under a non-commercial research license. Review the checkpoint's license on Hugging Face before use.
This repo contains only original wrapper code plus a patch set. It does not re-host Lingbot-Map's source or the model weights; the installer fetches those.
lingbot-desktop/
├── server.py # FastAPI backend (port 8000) [original]
├── desktop_app.py # pywebview macOS shell [original]
├── launch.command # double-click launcher [original]
├── web/index.html # single-page UI [original]
├── assets/ # app icon + glass.css [original]
├── patch/
│ ├── lingbot-map-mps-and-viewer.patch # my changes to upstream demo.py, rope.py, viewer
│ └── presentation.py # new module, mine, copied into lingbot_map/vis/
├── install.sh # conservative installer
├── requirements-lock.txt # fully pinned dependencies
├── LICENSE # Apache 2.0
└── NOTICE # attribution + upstream licenses
# created by the installer, not committed:
# app/ cloned Robbyant/lingbot-map at the pinned commit, patched
# checkpoints/ lingbot-map-long.pt (downloaded from Hugging Face)
# .venv/ Python 3.10 environment
Per Section 4(b) of the Apache License 2.0, the files modified relative to
upstream are listed in NOTICE and expressed as a patch in patch/.
- Lingbot-Map by the Robbyant Team (Apache 2.0), the streaming 3D reconstruction model this wraps.
- The upstream stack Lingbot-Map credits: VGGT (non-commercial research license), DINOv2 (Apache 2.0), and FlashInfer (Apache 2.0, CUDA-only and not used by this Mac build).
- viser for the 3D viewer.