Spirula Studio meshes the splats inside the room (clean.py --outside); the result stands upright with the
floor at height 0 – Z up for OBJ/PLY/STL, Y up for GLB. Texture when the training images are still there.
Tested on real scenes (kitchen without images: colours per corner; textured on one with images) and with a
fake spirula mesh in the tests (579 passing). Not done yet: look at the dialog in the browser, changelog,
README, release.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From issues #1 and #2:
- Unknown settings in config.toml (e.g. splat-transform instead of splat_transform) show up in the
setup hints and in install.sh, with the right spelling.
- install.sh writes the full path of splat-transform into a new config or prints the line for an
existing one: started from the desktop, the app does not see the shell's PATH.
- The setup guide's npm --prefix instructions match the path they tell you to configure.
- A pipeline not pinned below PyAV 19 is spotted before a run; a run failing on it says why.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Dialog: for the Frame (one size, with measured fps) or for the PC (all splats); clean-up; optionally
the same without; a preview of what will be made and what it replaces; one version per click.
- Names carry the clean-up strengths; As template takes a version's settings into the form.
- A cleaned PC version keeps its ply; /api/open opens a version in Spirula Studio.
- Versions unfold under their scene or tour, with Spirula, Frame, template and delete.
- The PC sizes 3/5/8 M are gone; measured frame rates updated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- clean.py: the ceiling is the highest strong line where walls meet it (a cupboard top lies lower).
- The API takes the clean-up as a flat string (ceiling=0.5,haze=0.3), like every other field.
- tests/test_clean.py: a synthetic living room with thin ceiling, veil, cupboard top, bird cage,
haze, a hole in the floor and things beyond the walls – each told apart by its colour.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
scripts/clean.py and an optional clean-up field for versions.sh and /api/versions. No interface and no
tests yet; tried on a real living room (the ceiling as liked in the Studio; haze now by the smallest axis,
so the bars of a bird cage are no haze any more – not checked yet).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found moving the runs to an NTFS disk: the tour "Rundgang 12.10." (folder Rundgang-12.10.) was not copied.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The watcher reports the next part (or putting the parts together) as running in the tick that
starts it: no false standby notice between parts.
- Deleting an unfinished part deletes its piece of video in runs/.parts too.
- combine.sh keeps the floor plan's labels (plan.json).
- Tests: the chain through the watcher's tick (twice), one standby notice per chain, the own lock
released before suspending, rooms of the same name, view-dependent colour matched, the preview plan
of a home named by rooms; notifications are awaited instead of checked too early.
- 0.3.0: version, changelog, READMEs without the preview notice.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A checkbox on the running job: when everything is finished (parts, putting them together, copying),
a minute's notice, then systemctl suspend; cancelling a job switches it off; a refused standby is
reported. Our own lock is released first (it kept the PC up in a first try by hand).
- One sleep lock of the server spans the seconds between two jobs (parts of a long recording).
- A renamed room's floor plan and previews are drawn again with the new name.
- Rooms of the same name: "Kitchen (2)"; the combine dialog and job card speak of a room's recordings.
- README: filming tips for ceilings and light; 0.3 notes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each part gets up to 500 image pairs; parts are cut losslessly with the original time stamps, converted
one after the other and put together as a room. The original stays (asked once more before deleting).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A group can be a room (several recordings of one room); any other group may hold scenes and rooms and
is put together from the recordings, each in its room. Recordings of one room no longer count as
walking in to each other, which also hid a real walk-in from another room.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Documents/GaussianXR is left alone by Steam updates. Old copies in the app's own Scenes folder
move over when copied again, or all at once from the On the Frame tab.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tab lists everything in Gaussian XR's gallery on the Frame with its preview image and what it
is (scene, tour, version, or not from Splat Workshop) and takes any of it off the Frame. Scenes are
copied straight into the gallery; copies left in Documents/GaussianSplats go along with their scene.
The tour dialog offers 0.75–2 M or an own size. 250 tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
For the Frame 0.75 / 1 / 1.5 / 2 M, for the PC all / 3 / 5 / 8 M, plus an own size; with a scale
also walkable in the original's size. Every version is a complete scene in <run>/versions/<key>/
and gets its own scene folder on the Frame, so e.g. 0.75 M and 2 M can be compared in the gallery.
The tour dialog offers 0.75–2 M or an own size for its Frame version. Measured frame rates are
shown as information only. 14 new tests (240 in all).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Floor plan, sizes, scale bar and measuring tool in the original's size; the floor plan measures
walls and floors in the model's scale. Optionally Gaussian XR's worldScale is set when copying to
the Frame (not tested on the Frame yet). The floor plan no longer fails without walls.
13 new tests (226 in all).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Fakes for kdialog, zenity and xdg-open; every test catches shutdown/os._exit
- Broken download, frame folder found on rename, nested values in non-text fields,
Start over from the cancelled runs, the watcher's notification and tidying up
(watcher split into watch_once for that)
- Fake pipeline refuses to continue an unfinished extraction, like the real one
213 tests, every mutation of both review rounds is caught.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
206 tests instead of 57; every surviving mutation of the review is caught now. New fakes for
ffprobe, ssh/scp (the Frame as a folder) and notify-send; synthetic rooms with tracking noise,
scale error, turned splats, tracking turn and an adjustable walk-in. Fixed: wrongly typed
members/key/align/partition gave a 500 or were stored.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
57 tests without GPU, recordings or Frame: fake pipeline, fake splat-transform and trash, and
synthetic rooms with a known error for putting rooms together. Found on the way: after cancelling,
the job counted as finished when systemd-inhibit ended, while splat.sh was still putting the
previous scene back – pid_alive now looks at the whole process group.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Scenes can be grouped (with a name); a group shows collapsed with its tour or expanded
with its scenes. Scenes recorded right after each other are suggested as a group.
- "Put the tour together" (scripts/combine.sh + combine.py) as a background job: full version
for the PC and a reduced one for the Frame, floor plan as preview, optional copy to the Frame.
- Corrections to choose: A Frame only, B all images (default), C + shift the overlaps,
D + shift and turn; borders through doors (walk in/out ignored) or nearest camera.
The group shows how well the overlaps match, and when its scenes changed since.
- Memory estimate before starting; the full version can be left out.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Runs without a finished scene (and leftover logs) show up below the finished scenes with
how far they got and their size. Resume where the pipeline can continue (camera positions
complete), otherwise start over with the same settings; delete moves them to the trash.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The scene keeps its folder on the Frame (frame_folder); an upload removes the files
under the old name there, so the folder holds one scene. A renamed folder can only be
started over, like a renamed recording. Renaming with the same name tidies up the folder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deleting asks first and moves the scene folder, log and settings to the desktop trash
(recoverable); a copy on the Frame is not touched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The scenes use a Y-down frame; seen from above, x has to run right to left on screen.
Cached plans are drawn anew when floorplan.py changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The server puts a scene from runs/.previous back when splat.sh was killed before it could
(SIGKILL after cancelling, power cut) and no run of that scene is going
- While a scene is computed again it stays in the list, marked, without actions
- No leftovers after success: empty .previous folder and the "previous" key are removed
- Scene cards knew too late that no Frame is configured (frame_configured from /api/ping)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Start over keeps the finished scene until the new one is done and restores
it (with its settings) if the run fails, is cancelled or never finishes
- LAN mode checks the client's real address, not only the Host header
- Requests from other websites (Sec-Fetch-Site) are refused, except opening the page
- Invalid requests get a 400 instead of a dropped connection; timeouts everywhere
- At most two floor plans drawn at once; no cache entries for unknown Frame names
- Server also checks the recording before starting; downloads never overwrite
- Metadata written atomically and under a lock
- Scripts run as one block, so updating them does not affect a running job
- Page: offline notice, no polling in background tabs, long names wrap,
thumbnails with quotes in the name, dialog padding click, contrast
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pipeline stores the recording's path and refuses to resume with another one.
Renaming is blocked while a run of the recording is unfinished; finished runs
remember it, and the UI offers only a fresh start for them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Recordings on this PC can be renamed. The original name is remembered, so the
date, the match with the Frame listing, thumbnails and check results stay.
- Scenes can be renamed: new name plate for the gallery, optionally copied to the Frame.
- Each scene shows its disk usage. The clean-up dialog deletes intermediate data
(training checkpoint, SfM working files) or the training images. Scene, floor
plan and Spirula viewer keep working; after deleting the images a run can only
be started over.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Jobs run under systemd-inhibit --what=sleep; KDE and GNOME respect the lock.
The lock belongs to the job process, so it ends with the job even if the server stops.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Click points on a floor plan to get segment lengths and the total distance,
with a live preview to the mouse pointer. The server sends the plan's scale
as X-Pixels-Per-Metre.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Scenes from one recording session share the Steam Frame's tracking frame,
so their floor plans line up without manual alignment. scripts/floorplan.py
draws a colour top view with walls and the camera path ("pretty") or a
glowing point density ("classic"), rotated so walls are axis-aligned.
The web UI gets a "Floor plan" button per scene and a "Combined floor plan"
dialog; plans are cached and can be saved as PNG.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Web interface, tray icon and recording check for turning Arcturus Vision
Camera recordings from the Steam Frame into Gaussian splats and copying
them into the Gaussian XR gallery.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>