macOS desktop companion

Glina Desktop is a separate SwiftUI client in the glina-desktop repository. It does not reimplement pipeline jobs and keeps no Glina process running: every operation is one finite run of the installed glina CLI.

Command lifecycle

GlinaCommand searches PATH first, then:

  1. ~/.stado/bin/glina
  2. ~/.local/bin/glina
  3. /opt/homebrew/bin/glina
  4. /usr/local/bin/glina

For each operation the app starts one glina process, streams stdout and stderr into the live log, and waits for it to exit. The exit status and final JSON document are the result. A failed workspace import shows the JSON report's reason; other failures show stderr or the failed doctor checks. A missing executable is reported as Glina is not installed. and the panel offers Retry.

Client mappings

Window action Command
Check config glina config check
Doctor glina doctor
Setup glina setup [--check] [--dry-run]; the two toggles are the two flags, check-only on by default so a click installs nothing
Export Config glina config export --out <path>
Sculpt glina sculpt <prompt> --rounds <n>
Create glina create <prompt> [--race <race>]
Verify glina verify <path>
Animate glina animate [<path>] --preset <name>; an empty path animates the active imported asset
Showcase glina showcase <asset>
Declarations glina showcases|presets list, … add <name> <file.json>, … remove <name>
Animation preview glina preview anim <path> [--clip <name>]
Import glina import <file.glb> [--variant-of <base-id>]; the Assets and Check Config screens accept the optional base id
Workspace glina workspace list|select <id>|remove <id>; variants are shown with variantOf, and base removal refuses while variants remain
Scene preview glina preview scene <file.glb>; Assets offers Preview in scene on a GLB, displays a decoded PNG, and reports a refused Blender render, missing path or unreadable image instead of claiming success

A failed doctor check exits 1 with the report on stdout; the window shows the failed checks, each as <name>: <error>, taken from the report itself rather than from the bridges' stderr chatter.

Import existing assets

Import runs glina import, so the window and CLI verify and activate the same asset. A variant names an existing base id; a refused parent or failed gate leaves existing data untouched and displays the report's reason. The accepted destination becomes the Assets directory, animation selection and Verify input. The Assets gallery renders a selected GLB on neutral ground through the same Blender bridge, then retains the decoded image for display; animation preview remains a separate GIF operation.