Skip to content

CLI reference

Installed as: quiltwright, core-only (numpy, pillow, click) -- no extra needed just to run --help. Source: src/quiltwright/cli/

Most commands operate on a quilt, which is where the backends have already met: a manifold swept out of PyVista and a molecular scene ray-traced from POV-Ray produce the same artifact, and cast / weave / wallpaper / dynamic treat them identically. Three commands are a whole pipeline rather than a step after one -- mesh, cartoon, probe -- and none of them is a generic renderer for the bundled scenes; those stay in scripts/, covered in shell.md.

This page is the flag-by-flag reference for every command. For the why behind each one, see shell.md.

quiltwright [OPTIONS] COMMAND [ARGS]...
Option Effect
--version Print the installed version and exit
--help Show help and exit -- also works on any subcommand
Command For
bridge Inspect and restart Looking Glass Bridge
cartoon Convert a structure into a POV-Ray cartoon include
cast Show a saved quilt on the connected Looking Glass
dynamic Pack stills into a macOS Dynamic Desktop HEIC
mesh Auto-frame a mesh file and render it as a quilt
probe Measure a scene's near and far depth by plane sweep
wallpaper Set a woven frame as the desktop picture of its own panel
weave Weave a quilt into a native pre-lensed frame for one panel

bridge

quiltwright bridge COMMAND [ARGS]...

Inspect and restart Looking Glass Bridge.

quiltwright bridge status    # is it actually able to draw?
quiltwright bridge reset     # kill and relaunch a wedged daemon

bridge status

quiltwright bridge status [OPTIONS]

Reports whether Bridge is running, responsive, and seeing a panel. Exits non-zero if Bridge is unusable, so this can gate a cast in a script. Bridge keeps its HTTP port open and keeps issuing session tokens after crashing internally, so a cast can report success at every step against a daemon that will never draw -- status checks the port, the session, the device list and whether any device is actually a Looking Glass, then gives a verdict.

Option Default Effect
--bridge-url TEXT http://localhost:33334 Bridge HTTP API base URL
--timeout FLOAT 5.0 Per-request timeout. A wedged Bridge hangs rather than refusing, so this is what separates "slow" from "dead"

bridge reset

quiltwright bridge reset [OPTIONS]

Terminates Bridge and starts it again. Bridge's own menu restart spawns a replacement that inherits the wedge, which is why this kills the processes outright. Anything currently playing on the panel stops.

Option Default Effect
--no-relaunch off Terminate Bridge without starting it again
--wait FLOAT 20.0 Seconds to wait for the relaunched daemon to answer
--bridge-url TEXT http://localhost:33334 Bridge HTTP API base URL

cartoon

quiltwright cartoon [OPTIONS] [SOURCE] [OUTPUT]

Converts a structure into a POV-Ray cartoon include, via headless PyMOL. SOURCE is anything PyMOL can load -- .pdb, .cif, .cif.gz. OUTPUT is the .inc to write. See pdb2pov.md for the object-only contract this writes to.

Option Default Effect
--rep TEXT cartoon Representation. cartoon and surface are what pdb2pov cannot draw; sticks and spheres duplicate its -b and -v
--color TEXT spectrum spectrum ramps rainbow along the chain; any PyMOL color name is flat; none keeps PyMOL's own coloring
--selection TEXT polymer PyMOL selection to show. The default drops waters and ligands
--assembly TEXT 1 Biological assembly. 1 is the biological unit -- ferritin arrives as a 24-mer rather than a 24th of itself. "" gives the asymmetric unit
--transparency FLOAT (0.0-1.0) 0.0 Exports as POV-Ray transmit, which is flat see-through rather than refractive
--surface-quality INTEGER -- PyMOL surface_quality; lower is coarser. Worth setting negative for a large --rep surface, which otherwise runs to millions of triangles
--name TEXT output stem POV-Ray identifier to declare. Defaults to the output stem, made legal (a leading digit gains an underscore)
--raw off Skip coalescing and keep PyMOL's one mesh per triangle. For comparing against the raw export; several times larger
--check off Report how PyMOL can be reached and exit, converting nothing
quiltwright cartoon 2omf.cif.gz ompf_cartoon.inc   # a molecular ribbon, via PyMOL
quiltwright cartoon --check                         # is PyMOL reachable, and by which route?

cast

quiltwright cast [OPTIONS] [QUILT]

Shows a saved quilt on the connected Looking Glass. QUILT is a quilt PNG on this machine, normally one written by save_quilt() or make quilt-<name>, whose _qs<cols>x<rows>a<aspect> filename suffix supplies the tiling automatically.

Requires Looking Glass Bridge >= 2.2 running on the machine the panel is plugged into. Quit Looking Glass Studio first -- it holds the display exclusively, and Bridge will report success while the glass stays black.

Option Default Effect
--preset [16-landscape\|16-portrait\|27-landscape\|27-portrait\|32-landscape\|32-portrait\|65\|go\|portrait] -- Quilt tiling grid and aspect, by device preset name
--grid COLSxROWS from filename Quilt tiling grid, explicit (e.g. 8x6); defaults to parsing the _qs<cols>x<rows>a<aspect> filename suffix
--aspect FLOAT from filename Tile aspect, overriding the filename's. Rarely needed -- a value disagreeing with the panel is letterboxed by it
--head INTEGER -1 Bridge head index to play on. -1 lets Bridge choose, which is right until it picks an ordinary monitor; run --check for the list
--playlist TEXT a fresh name per cast Bridge playlist name. Leave it unset: a fresh name is what replaces the picture. Reusing a name Bridge already holds adds to that playlist, and the panel keeps showing the first quilt
--bridge-url TEXT http://localhost:33334 Bridge HTTP API base URL
--check off List the output devices Bridge can see and exit without casting. The first thing to run when the glass stays black
# Cast a rendered quilt; tiling comes from the filename
quiltwright cast renders/quilts/bell-jar-holo_qs8x6a1.77778.png

# Which displays can Bridge see? Run this first when nothing appears
quiltwright cast --check

# Pin the panel when Bridge picks an ordinary monitor
quiltwright cast quilt.png --head 1

# A quilt whose filename carries no _qs suffix
quiltwright cast plain.png --grid 8x6 --aspect 1.77778
quiltwright cast plain.png --preset 16-landscape

mesh

quiltwright mesh [OPTIONS] SOURCE

Auto-frames the mesh file SOURCE and renders it as a quilt through Blender Cycles -- the only command here that needs no scene of ours at all. See mesh-import.md.

Option Default Effect
--device [16-landscape\|16-portrait\|27-landscape\|27-portrait\|32-landscape\|32-portrait\|65\|go\|portrait] portrait Target display, which sets the quilt grid, size and view cone
--view-cone FLOAT device's, capped at 35 View cone in degrees. Defaults to the device's own, capped at 35 so a wide panel does not overrun the disparity budget: 16-landscape declares 50. An explicit value is used as given
--lighting TEXT studio Light rig for a mesh that carries none: one of soft, studio, sky, or a path to an .hdr/.exr environment map
--fov FLOAT 14.0 Vertical field of view in degrees. Object-centric, so narrow
--view-direction X Y Z 0.0 -1.0 0.0 Direction from the object's center to the eye (+z is up)
--margin FLOAT 1.2 Framing headroom beyond a tight fit; 1.0 is exactly tight
--samples INTEGER 128 Cycles samples per pixel
--view-transform TEXT Standard OCIO view transform (Standard, AgX, Filmic, ...); see cycles.md
--compute [auto\|gpu\|cpu] auto Cycles compute device. auto prefers a GPU, Metal first
--preview off Quarter-size quilt, for iterating on framing
--still off One center view as a flat image, at the device's aspect, instead of a quilt
--out TEXT source name Output stem; defaults to the source name under renders/quilts/ (or gallery/ with --still)
--cast off Send the result to Looking Glass Bridge
quiltwright mesh model.glb
quiltwright mesh scan.fbx --lighting sky --still
quiltwright mesh asset.obj --device 27-portrait --samples 256 --cast
quiltwright mesh statue.ply --view-direction 0.5 -1 0.3 --fov 20

paraview

quiltwright paraview [OPTIONS] [STATE]

Renders the ParaView state file STATE (a .pvsm) as a quilt, by sweeping the render view's camera inside ParaView's own pvpython. The session's pipeline, color maps and camera all come with it. The depth budget is printed before the sweep starts. See paraview.md.

Option Default Effect
--device [16-landscape\|16-portrait\|27-landscape\|27-portrait\|32-landscape\|32-portrait\|65\|go\|portrait] 16-landscape Target display, which sets the quilt grid, size and view cone
--fov FLOAT 14.0 Vertical field of view in degrees; the camera is dollied back to keep the state's framing. 0 keeps the state's own FOV
--zoom FLOAT -- Dolly factor after framing; above 1 fills more of each tile, which is what drives perceived depth
--view-cone FLOAT device's, capped at 35 View cone in degrees. Defaults to the device's own, capped at 35 so a wide panel does not overrun the disparity budget: 16-landscape declares 50. An explicit value is used as given
--orientation-axes off Keep ParaView's corner axes widget. Hidden by default: it is pinned to the screen, so it would sit on the glass in every view
--preview off Quarter-size quilt, for iterating on framing
--still off One center view as a flat image, at the device's aspect, instead of a quilt
--keep-views DIR -- Directory to keep the per-view PNGs and camera.json probe in
--out TEXT state name Output stem; defaults to the state name under renders/quilts/ (or gallery/ with --still)
--cast off Send the result to Looking Glass Bridge
--check off Report where pvpython was found and exit, rendering nothing
quiltwright paraview session.pvsm
quiltwright paraview session.pvsm --still
quiltwright paraview session.pvsm --device 27-portrait --zoom 1.4 --cast
quiltwright paraview --check

playlist

quiltwright playlist [OPTIONS] SOURCES...

Plays several quilts on the connected Looking Glass as one playlist that advances on a timer and loops. SOURCES are quilt files, played in the order given, or folders. A folder holding a playlist.json is read the way Looking Glass Studio 1.x keeps a playlist -- a folder of media and a list of {"filename": ...} entries -- and plays in that order, so a Studio playlist folder plays unchanged. Any other folder plays its quilt files by name.

Each quilt's tiling comes from its own _qs<cols>x<rows>a<aspect> filename suffix, so one playlist can mix grids. A file without the suffix is refused by name rather than guessed at.

The whole playlist is built before it starts playing, which is what makes it advance: quilts inserted into a playlist that is already playing never show. Each run plays a fresh playlist, so it replaces whatever is on the panel.

Option Default Effect
--duration FLOAT 20.0 Seconds each quilt shows before the next
--head INTEGER -1 Bridge head index to play on. -1 lets Bridge choose; quiltwright cast --check lists them
--once off Play through once instead of looping
--playlist TEXT a fresh name Bridge playlist name. Leave it unset: a fresh name is what replaces the picture
--bridge-url TEXT http://localhost:33334 Bridge HTTP API base URL
# Two quilts, 10 seconds each, on the panel at head 1
quiltwright playlist bdna-go_qs11x6a0.5625.png bell-jar-portrait_qs11x6a0.5625.png --duration 10 --head 1

# A Looking Glass Studio playlist folder, in its own order
quiltwright playlist ~/Documents/HoloPlayStudio/"EGS Science Go"

# Every quilt in a folder, by name, once through
quiltwright playlist renders/quilts/go --once

# The Looking Glass Go set, from the Makefile
make playlist-go PANEL_HEAD=1

probe

quiltwright probe [OPTIONS] SCENE

Measures SCENE's near and far depth by plane sweep -- the measurement every POV-Ray depth budget starts from: it slides an opaque plane along the view axis and reports where content actually begins and ends, which is what focal_distance_for_range() wants. Probe through the camera you will render with, and at +Q8 or above -- below that POV-Ray disables transparency and a room reports no windows at all. On a scene whose backdrop runs to the horizon the sweep never closes and the printed far is the end of it; the command says so, and --rows prints the curve to fit the knee from.

Option Default Effect
--eye X Y Z required Camera position to probe through, in scene units
--aim X Y Z required Camera look-at point
--fov FLOAT 53.13 Vertical field of view in degrees. The default is POV-Ray's own unit direction/up lens, 2*atan(0.5)
--min-distance FLOAT 1% of --max-distance Near end of the sweep. A scene composed far from its eye -- porin sits 1100 units out -- wants its probes where its content is, not 200 of them in front of it
--max-distance FLOAT 400.0 Far end of the sweep, before the one at infinity
--probes INTEGER 200 Number of planes between the two distances
--include-path DIR -- Extra #include directory; repeatable. The scene's own is automatic
--width INTEGER 320 Probe frame width
--height INTEGER 180 Probe frame height
--quality INTEGER 11 POV-Ray +Q. Below 8 it disables transparency and glass reads solid
--pov-arg ARG -- Extra POV-Ray argument, e.g. +MV3.1 for a scene with no #version pragma of its own; repeatable
--rows off Print the whole curve, one distance per line
quiltwright probe pov-scenes/bell_jar/bj.pov --eye 0 35 -95 --aim 0 18 0
quiltwright probe pov-scenes/porin/3porin.pov --eye 0 0 -1100 --aim 0 0 0 \
    --include-path pov-scenes/myinclude --min-distance 700 \
    --max-distance 1600 --pov-arg +MV3.1

dynamic

quiltwright dynamic [OPTIONS]

Packs finished stills into a macOS Dynamic Desktop .heic. macOS picks the frame from sun position, wall-clock time, or Light/Dark appearance -- with no agent of ours running. Install the file with wallpaper.

This is not POV-Ray's clock. That identifier is POV-Ray's animation parameter (+K). Real time of day lives in the HEIC metadata, which macOS reads. POV-Ray's contribution is render_pov_quilt(..., lighting="light") or sun=(altitude, azimuth) to produce the stills.

Woven _native_ frames always encode lossless 4:4:4. Lossy HEVC 4:2:0 would mix the per-channel views and destroy the hologram. Encoding needs the heic extra (pip install 'quiltwright[heic]').

Option Default Effect
--appearance LIGHT DARK -- Two stills: light appearance, then dark
--solar FILE.json -- JSON array with altitude / azimuth per still (wallpapper shape)
--time FILE.json -- JSON array with time (HH:MM or HH:MM:SS) per still
-o, --output PATH -- Output .heic. Required unless --dump
--lossless off (on for _native_) Force lossless 4:4:4
--lossy off Force lossy HEVC. Refused for woven frames
--dump PATH -- Print apple_desktop metadata from an existing HEIC
quiltwright dynamic --appearance day_native_LKG-J00332.png night_native_LKG-J00332.png \
    -o scene.heic
quiltwright dynamic --solar solar.json -o scene.heic
quiltwright wallpaper scene.heic

Give exactly one of --appearance, --solar, or --time.


wallpaper

quiltwright wallpaper [OPTIONS] [WOVEN]

Sets a woven frame as the desktop picture of its own panel. WOVEN is a native-resolution frame from quiltwright weave -- already interleaved for one panel, so displayed 1:1 it fuses into a hologram with no Looking Glass software running at all. The panel is identified from the _native_<serial> filename and matched against each desktop's display name.

The frame is copied into a stable pictures folder first, because macOS stores wallpaper as a path: pointing the desktop into renders/ means the panel goes blank the next time that directory is cleaned.

Option Default Effect
--display TEXT serial in filename Panel serial to target (e.g. LKG-J00332)
--desktop INTEGER -- Target desktop by 1-based index instead of by serial. Use --list to see them
--dir DIRECTORY ~/Pictures/LKG-wallpapers Where to install the frame
--no-install off Set the file where it lies instead of copying it. Convenient, but the desktop breaks if that path is later cleaned
--list off List the desktops and their current pictures, then exit
# Weave, then hang it on the panel it was woven for
quiltwright weave renders/quilts/bell-jar-holo_qs8x6a1.77778.png \
    --cal ~/Pictures/LKG-wallpapers/visual.json
quiltwright wallpaper bell-jar-holo_native_LKG-J00332.png

# What is on each desktop right now?
quiltwright wallpaper --list

# Target explicitly, when the filename carries no serial
quiltwright wallpaper frame.png --display LKG-J00332
quiltwright wallpaper frame.png --desktop 2

# Leave it where it is (it will break if renders/ is cleaned)
quiltwright wallpaper renders/quilts/x_native_LKG-J00332.png --no-install

weave

quiltwright weave [OPTIONS] QUILT

Weaves QUILT into a native pre-lensed frame for one panel -- interleaved for display 1:1, most usefully as its desktop wallpaper, with no Bridge process required. See docs/lfd.md and quiltwright.weave for the math.

Option Default Effect
--cal FILE required Path to the panel's visual.json calibration file
--preset [16-landscape\|16-portrait\|27-landscape\|27-portrait\|32-landscape\|32-portrait\|65\|go\|portrait] -- Quilt tiling grid, by device preset name
--grid COLSxROWS from filename Quilt tiling grid, explicit (e.g. 8x6); defaults to parsing the _qs<cols>x<rows> filename suffix
-o, --output FILE <quilt stem>_native_<serial>.png Output path
--invert off Reverse the view order if the fused result reads inside-out
quiltwright weave renders/quilts/bell-jar-holo_qs8x6a1.77778.png --cal visual.json