Repository navigation
Releases
SplatWork 1.2.0
What's new
SplatWork 1.2.0 for Mac, SplatWork for Linux 1.5.0.
Highlights
- Never start over: every processing stage is checkpointed and training saves checkpoints and finished blocks,
so quitting, a crash or Stop costs at most the step that was running. A new Projects list shows where every
project stands and resumes or redoes it from any stage. - Drone footage and photo locations: imported photos keep their GPS (only that), so camera solving checks the
cameras against it and puts the scene in metres. Drone photos are recognised by the drone's own markers — not by
GPS, so phone photos stay ordinary — and get aerial settings; there's a new Drone / aerial tile. - Training on several devices, sturdier: Retry or leave out a failed block without stopping the rest, Pause and
Stop reach every device, a live view of block runs, and Show Live View to get back to a run from anywhere. - SplatWork for Linux: the Linux app (formerly SplatWork Node) now has the Mac's layout and wording, and keeps
training jobs' saved state when it is stopped. - New look: the hex mesh logo on every app, the website and the docs.
Projects and resuming
- Projects list in the sidebar replaces Recent: every project you've worked on, including ones made with New
Project and training results, with its status (processing, interrupted, ready, training, trained). - Project page: each processing stage with what it produced, Resume, Redo from Here, Change Settings…,
Train, and every result. The start page offers projects that stopped partway. - Processing checkpoints: each stage (frames, masks, camera positions, dataset) is saved and reused on any rerun
whose settings and source files haven't changed. Quitting, a crash, Stop or a failure costs at most the stage
that was running. Try Again after a failure continues where it failed. - Training resume: this Mac checkpoints every 10 minutes and on Stop; block runs keep every finished block and
reuse it. - Choose the processing device in New Project (Cameras & masks page) and when resuming, separately from the
training devices; the training devices you tick are remembered.
Photo locations and drone footage
- Imported photos keep only their location (GPS, and a drone's height above take-off), on the Mac and on Linux,
under a new Use photo locations switch; off strips locations from the project's photos. - Drone footage (camera maker, DJI flight / gimbal tags, DJI file names) gets Aerial settings: learned camera
solving with GPS checks, the sky as a learned skybox, the High quality preset. - The Maximum preset stores photos at its 2400 px training resolution.
- Sky masking is on for video, photos and 360° whichever way the project is started, and is skipped with a note
(not a failed run) when no sky model is available.
Training on several devices
- A failed block waits for Retry (on any device) or Leave This Block Out instead of failing the whole run.
- Pause / Resume now reach worker jobs and blocks, not only a single run on the Mac. Stop stops a block
training on the Mac too, and shows Stopping… while the run winds down. - Live view for block runs: the viewer shows every block's latest state, merged.
- Show Live View: look at other projects while one trains, then get back to it from the toolbar, the banner,
the Train tab or the project page. Home no longer stops training. - Charts no longer draw a line back to zero when a block restarts; block cards keep the device's name if it drops
off the network.
Quality
- Flat surfaces: surface-normal consistency loss and flat-splat regulariser on by default; predicted depth
(Depth Anything V2 on the Mac, monocular depth priors on Linux) for photos without a depth sensor. - Fisheye footage: solved with a fisheye lens model, with masks warped along.
- Camera solving drops cameras placed far off the camera path.
SplatWork for Linux 1.4–1.5
- The Linux app is now a full studio: viewer, New Project, editing (including Auto clean and the mask editor),
export, turntable videos, iPhone Inbox, compute devices and block-parallel training across machines, all next to
the worker server. - Renamed from SplatWork Node to SplatWork; sidebar, start page and New Project follow the Mac's.
- Worker jobs can be paused (state saved, GPU freed) and checkpointed; stopping the worker pauses running training
jobs instead of discarding their state. - Multi-device runs follow a device that changes address and retry a block here after 30 minutes unreachable.
- The setup screen shows the exact command to install a missing NVIDIA driver extension.
Fixes
- About 30 issues from an independent review of this release's new code, among them: masks from an earlier run
baked into reused frames; two preparations running in one folder after Stop; Stop not reaching a block
training on the Mac; a failed block holding up its device's other blocks; resumed runs on the wrong devices or
from step 0; the Linux mask editor not showing why a job failed.
Security
- Mac worker requests need an access token; Bonjour-advertised addresses are only trusted once the worker confirms
them; dataset paths can't escape their folder; benchmark runs are isolated.
Changes
- Licensed under Apache 2.0; public documentation, website and project files.
- The repository moved to
Benevision/SplatWork. - Local Mac builds are signed with a development identity when there is one, so the Keychain stops asking again
after every update. - iPhones no longer act as training workers for other devices; SplatWork Capture still processes and trains its own
scans.
Install
Mac (Apple silicon, macOS 15 or later) — SplatWork-1.2.0-macOS-arm64.dmg: open it and drag SplatWork to Applications. This build is ad-hoc signed (not notarized): the first time, right-click the app → Open → Open, or run xattr -dr com.apple.quarantine "/Applications/SplatWork.app".
Linux GPU worker (NVIDIA) — SplatWork for Linux 1.5.0, SplatWork-Linux-1.5.0-x86_64.flatpak:
flatpak install --user SplatWork-Linux-1.5.0-x86_64.flatpak
On first start its setup assistant downloads PyTorch, CUDA and gsplat for your driver (about 3 GB). To get updates automatically instead, add the repository: flatpak install --user https://benevision.github.io/SplatWork/flatpak/splatworker.flatpakref.
iPhone (SplatWork Capture) — not included: iOS apps can't be installed from a download; build it from ios/ in Xcode.
All changes
- Prepare release 1.2.0: SplatWork 1.2.0 (Mac), SplatWork for Linux 1.5.0, SplatWork Capture 1.2
- The Linux app is SplatWork (no more "Node"), with the Mac's layout and wording
- Release debugging pass: fixes from three independent code reviews
- Hex mesh logo across the suite
- Local Mac builds sign with the Apple Development identity when there is one
- Photo locations kept on import; drone footage recognised and given aerial settings
- Job defaults: consistent sky masking, Maximum preset resolution, remembered devices, processing device up front
- Fix a flaky worker API test; user guide: local colour correction is on by default
- Landing page for the project site
- Retire iPhones as training workers; SplatWork Capture keeps training its own scans
- Docs: public-facing revamp, Apache-2.0 licence
- Block runs: live view, charts that survive a restarted block, device names that stay
- Show Live View: get back to a running training after looking at another project
- Projects list with resume from any stage; processing device choice
- Stop: show Stopping… while the run winds down, and disable Pause/Stop meanwhile
- Pause/Resume reach worker jobs and block runs, not just a single run on this Mac
- Block training: a failed block waits for Retry (any device) or Leave Out instead of failing the run
- Node setup: give the exact flatpak install command for a missing NVIDIA driver extension
- iOS: regenerate the Xcode project with xcodegen so it includes Train/MonoDepth.swift (the committed project no longer built)
- Security fixes from the Claude Security review (F2, F3, F5, F6, F21)
- Camera solving: drop cameras placed far off the camera path (PoseSanity), with a note in the prep log
- Revert to sequential matching for video solves: auto's loop closures mis-registered the Arcturus garden video
- Video camera solving uses splatprep's auto matching (neighbours + loop closure) instead of plain sequential
- Masks follow undistortion: splatprep warps each mask with the lens model into the undistorted image; the Mac uses those (and drops the frame's distorted mask / sky / depth layers) for undistorted frames; SplatWork Node 1.4.4
- Tests: fisheye focal guess is a prior for initialisation but never fixes the focal length
- Fisheye camera solving works: flag splatprep's fisheye focal guess as a prior (COLMAP otherwise marks every fisheye pair degenerate) but keep it free in bundle adjustment; SplatWork Node 1.4.3
- Depth-prior caches written atomically (blocks of one run may cache the same photo at once)
- Predicted depth only for real training: off for Auto clean, --eval and the speed benchmark (which also keeps normalWeight 0 to stay comparable)
- Flat surfaces on by default (normalWeight 0.05, Mac + Linux 1.4.2); stereo-fisheye camera solving fixes
- Regenerate SETTINGS.md and the Linux settings catalog (flat surfaces, predicted depth, flat splats)
- Predicted depth on the Mac (Core ML Depth Anything V2), edge-aware normal loss, normal-map export, settings UI
- Depth priors: dense start from the predicted depth maps (priorInitPoints), cache keyed on photo + pose
- Flat surfaces: depth-normal consistency loss, flat-disc regulariser, monocular depth priors (Linux), fisheye routing
- Repository renamed to Benevision/SplatWork: update URLs (Mac updater, Node update check, gsplat wheels, docs)
- PROTOCOL: who may pause, auto-resume of o...
SplatWork developer build 243
Developer build 1.2.0-dev (build 243) from 18e7a7d — rebuilt on every push to main; may be unstable.
Turn on SplatWork → Settings → Updates → Developer builds to update to these automatically.
Recent changes
- Docs: VHS.md as built and results (clip 13, clip 6 default flow, joint solve), user guide for the recommended clip
- Home video: Object Capture for a single clip with one lens setting
- Home video: one recommended clip by default, leave out wrongly joined clips, rigidity
- Home video: worker capability, clip listing in the CLI, sheet snapshot, cleaner thumbnails and picks; docs
- Home video in SplatWork for Linux; frame cap fix; settings reference
- Home video (VHS) restoration in splatprep and the Mac app; square pixels for all video
- Docs: VHS footage study and plan (docs/dev/VHS.md)
- vktrain: run the float-atomics start-up probe six rounds; lavapipe's lost updates are intermittent and one round let them through about once in 25 runs
- docs: Vulkan trainer stage 2b numbers (test times, resume precision, lavapipe atomics note)
- vktrain: stage 2b in the training loop — skybox (sky.png / sky.json), appearance correction, bilateral grid, decoupled SSIM, depth + depth-normal losses (cached depth priors), transient masking, pose refinement, optimizerPrecision compact; resume file v2; synthetic scenes per feature and end-to-end tests; compare_training.sh runs every feature (--core-only for 2a)
- vktrain: stage 2b kernels — skybox, colour correction (affine / bilateral grid), decoupled SSIM, depth and depth-normal losses on ED, transient masks, camera-pose gradient; gradient checks against the double-precision reference
- Drone surveys: GPS-neighbour matching, GPS-held re-solve when the solve disagrees with GPS, stop before training on a folded solve
- vktrain: silence a GCC false positive in the PLY reader's byte swap
- docs: Vulkan trainer stage 2a status (interface, what matches trainer.py, unsupported keys, deviations, lavapipe numbers, PC comparison)
- vktrain: compare_training.sh — CUDA (Flatpak --cli train) vs Vulkan trainer on one dataset and config; builds the Vulkan trainer on the host or in the Freedesktop SDK
SplatWork 1.1.0
Install
Mac (Apple silicon, macOS 15 or later) — SplatWork-1.1.0-macOS-arm64.dmg: open it and drag SplatWork to Applications. This build is ad-hoc signed (not notarized): the first time, right-click the app → Open → Open, or run xattr -dr com.apple.quarantine "/Applications/SplatWork.app".
Linux GPU worker (NVIDIA) — SplatWork Node 1.3.16, SplatWorkNode-1.3.16-x86_64.flatpak:
flatpak install --user SplatWorkNode-1.3.16-x86_64.flatpak
On first start its setup assistant downloads PyTorch, CUDA and gsplat for your driver (about 3 GB). To get updates automatically instead, add the repository: flatpak install --user https://benevision.github.io/Gaussian-Vibe-Code/flatpak/splatworker.flatpakref.
iPhone (SplatWork Capture) — not included: iOS apps can't be installed from a download; build it from ios/ in Xcode.
Changes
- Mac: developer-build update channel (Settings > Developer) following a rolling "dev" pre-release built from main
- Self-updating apps: Mac updates from GitHub Releases, SplatWork Node 1.3.16 updates itself through Flatpak
- iPhone training memory: plan with headroom, smaller images when needed, refuse instead of being killed
- Prep window can be hidden while it works; toolbar progress button brings it back
- Use the SplatWork names in this branch's new strings (SplatWork, SplatWork Capture, SplatWork Node)
- Undo the SplatWork rename in this branch (main does it; reconciled on merge)
- iPhone makes splats on its own and offloads to Macs / PCs; Mac can act as a worker; rebrand to SplatWork
- Blocks: no empty blocks, no runaway splitting, no forced split for iPhones
- Trainer: fix Adam seed overflow that trapped on the iPhone (UInt32(k * 0x85EBCA6B) for k ≥ 2)
- Metal: say which buffer or pipeline failed (and why) instead of a bare trap
- Rebrand to SplatWork: SplatWork (Mac), SplatWork Capture (iPhone), SplatWork Node (Linux)
- Preparation never goes to a training-only worker (iPhone Compute); it runs on this Mac
- Device checkboxes always sit under their label (the row flipped between side-by-side and stacked as the note under the list appeared)
- iOS: keep the bundle id (com.gunntower.splatcapture), category and landscape orientations set in Xcode in project.yml
- Mac trainer: learned skybox (same model as the worker), loaded/saved with the PLY
- A job too big for its one device trains there in blocks that fit instead of being refused
- Compute devices as checkboxes: this Mac and each worker (PCs, iPhones)
- iOS: no Objective-C header copy step for SplatTrainKit (it failed under script sandboxing)
- iOS: set the development team in project.yml (regenerating the project had reset it)
- iOS: drop the increased-memory-limit entitlement (personal teams can't sign it); compile the whole shared Train folder
- Mac trainer: compact optimizer state (8/16-bit Adam), memory forecast per mode
- Camera solving ignores the sky: no keypoints on pixels the sky mask marks
- Viewer draws a scene's learned skybox behind the splats
- Sky as its own mask layer and a learned skybox at infinity (worker 1.3.15)
- iPhone as a training worker: Splat Capture's Compute screen serves the worker protocol for block training
- Worker 1.3.14: apply mask files when training (they were ignored); compact optimizer state
- Block-parallel training: per-block splat budgets, memory-aware assignment, reuse photos on the worker
- Check a training job fits a worker before sending it
- mac/scripts/update_local.sh: build and install the local app only while it is closed (staged otherwise); local builds are -dev
- Worker 1.3.13: training images no longer exhaust host memory on very large sets
Splat Studio 1.0.0
Install
Mac (Apple silicon, macOS 15 or later) — SplatStudio-1.0.0-macOS-arm64.dmg: open it and drag Splat Studio to Applications. This build is ad-hoc signed (not notarized): the first time, right-click the app → Open → Open, or run xattr -dr com.apple.quarantine "/Applications/Splat Studio.app".
Linux GPU worker (NVIDIA) — Splat Worker 1.3.12, SplatWorker-1.3.12-x86_64.flatpak:
flatpak install --user SplatWorker-1.3.12-x86_64.flatpak
On first start its setup assistant downloads PyTorch, CUDA and gsplat for your driver (about 3 GB). To get updates automatically instead, add the repository: flatpak install --user https://benevision.github.io/Gaussian-Vibe-Code/flatpak/splatworker.flatpakref.
iPhone (Splat Capture) — not included: iOS apps can't be installed from a download; build it from ios/ in Xcode.
Changes
- NewProjectSheet: explicit init (Swift 6.3 makes the memberwise one private)
- Split two expressions Swift 6.3 (GitHub's macOS runner) could not type-check in time
- build_app.sh: empty-array expansion that works with macOS bash 3.2 under set -u
- Release workflow: tag v* → GitHub Release with the Mac .dmg and the Linux worker .flatpak
- Leaner remote transfers: skip the camera solve's nested image copy; upload only what a dataset references; don't re-download a reused solve
- Ask before reusing earlier results; reuse a worker's earlier video split (no re-upload); tidy slider precision
- Reruns reuse a project's frames; wait for the worker before falling back to this Mac
- Pick up earlier worker jobs instead of redoing them; retry result downloads through network drops
- Rig-aware 360° camera solving: match and map whole 360° frames (worker 1.3.11)
- Local colour correction (bilateral grid) on by default
- Prefer ethernet for a worker on both ethernet and Wi-Fi; hide discovered workers
- splatprep: find the pycolmap mapper behind the LightGlue import blocker; check for a mapper before matching
- tools/eval/novel_views.py: render models from closer-in viewpoints no photo was taken from (floaters, needles, haze)
- tools/eval/align_splat.py: bring another tool's splat into our dataset frame (camera-name Sim3) for held-out scoring
- Worker: backgroundShell option (same far-field sphere as the Mac), tested
- Mac: backgroundShell option — far-field sphere of splats for distant land/sky beyond the capture (off; drone test queued)
- Mac trainer: local colour correction (bilateral grid, same model as the worker): apply/backward kernels, CPU Adam + TV per photo, mean pinned to identity every 50 updates
- Export/open PlayCanvas compressed PLY (.compressed.ply): 4× smaller than PLY at SH 3 (175 → 43 MB), −0.02 dB held-out
- Mask fixed parts of the frame (lens rim, burned-in overlays, propellers, rig): per-camera low-variance + structure detector, opt-in
- Mac GPU memory forecast: warns next to the device picker and refuses a Mac run that won't fit (e.g. 9,824-view 360 sets: ~57 GB of photos), suggesting a worker or the largest image size that fits
- splatprep: parallel two-view verification (thread pool; OpenCV releases the GIL) — identical results, scales with cores
- Mac: errorDrivenDensify (FastGS-style): MCMC sampling weighted by each splat's share of the worst-fitting pixels (off; to be measured)
- Docs: rewrite USER_GUIDE and ARCHITECTURE for the current app/worker; Mac progressiveResolution option (¼→½→full, off; to be measured)
- Worker 1.3.9: progressiveResolution (¼→full over first half of densify) and decoupledSSIM options (off; to be measured)
- Eval harness: --eval … --save-renders DIR; tools/eval/evaluate.py (PSNR/SSIM/LPIPS-if-available, percentile visual sheets with detail crops)
- Regenerate docs/SETTINGS.md (109 settings)
- Compute → Benchmark: same synthetic training test on this Mac and each worker, plus transfer speed
- Automatic camera solver: learned SfM for 360 video (Object Capture placed 1,041 of 9,824 views)
- Keep video frames on the worker between steps (worker 1.3.8 'chain')
- Mac setting for PC local colour correction; worker 1.3.7 records scene up in trained PLYs
- Ignore splatprep build output
- Mac: big-splat penalty on by default (10)
- Worker 1.3.6: per-photo local colour correction (bilateral grid, opt-in)
- Viewer camera: keep the photo's heading when adopting a straight-down/up camera (drone nadir views were rotated); CLI --view uses dataset up
- Auto clean: also select floaters seen by few photos (contribution census per photo)
- Mac: densify stop 14k for High (19k Ultra); big-splat screen-size penalty (off by default, experimental)
- Opening a splat from a project's outputs/ loads that project's cameras (and clears stale ones); project gravity beats the file's up note; camera toggle enabled when watching
- Auto clean (Edit tab): select splats that never add > 2 % to any pixel of any project photo
- Keep the capture's gravity through pose refinement; F frames a watched job from its own central camera
- build_app.sh: SPLAT_BUILD_PATH to build the app without relinking a running CLI binary
gsplat 1.6.0 dev build (PyTorch 2.7 + CUDA 12.8)
Built locally with build-gsplat-wheel.sh --all for RTX 20–50 series. Used by the Splat Worker Flatpak build instead of compiling.