Reference

External software

Pinman works with two categories of external software, stored and used differently.


Category 1: Tracked Software (Emulators & Frontends)#

These are the pinball programs installed on your cabinet. Pinman tracks them to understand your ecosystem — which emulator runs your games, which frontend manages them, which display zones each program owns.

Where defined: YAML catalog files in data/schemas/ — any file with a top-level software: section.

What comes pre-loaded#

SoftwareCatalog IDClass
Visual Pinball X (64-bit)visual_pinball:vpx64emulator
Visual Pinball X (32-bit)visual_pinball:vpx32emulator
Visual Pinball X (OpenGL 64-bit)visual_pinball:vpx_gl64emulator
Visual Pinball 9visual_pinball:vp9emulator
Visual Pinball 8visual_pinball:vp8emulator
VPinMAME (runtime)visual_pinball:vpinmameemulator
VPinMAME Setup (config tool)visual_pinball:vpinmame_setuputility
DirectB2S / B2S Servervisual_pinball:directb2sfrontend
Future Pinballfuture_pinballemulator
PinUP Popperpinupsystem:popperfrontend
DOF (DirectOutput Framework)dofutility

Detection is automatic. Pinman checks Windows uninstall keys, known install paths, registry keys, and process names. Software that isn't found is simply absent from the UI.

How detection works#

Each catalog entry declares a detection block with any combination of:

  • uninstall_key — Windows uninstall registry name (most reliable)
  • locations — list of candidate install paths or schema_var references (e.g. VPX_ROOT, resolved from the schema's global: block at detect time)
  • registry_keys — registry paths that confirm installation
  • process_names — exe names if the program is currently running

Category 2: Configuration Tools (Guided Mode)#

These are Windows utilities and vendor apps that Pinman cannot control programmatically. When a profile needs a setting that Pinman can't write directly — an NVIDIA 3D graphics setting, a default audio device — Pinman enters guided mode: it opens the right tool automatically and walks you through numbered steps.

What comes pre-loaded#

Windows OS tools (core_os.yaml):

  • windows:device_manager, windows:display, windows:sound, windows:sound_classic, windows:power, windows:disk_management

NVIDIA (core_nvidia.yaml):

  • nvidia:app, nvidia:control_panel

AMD / Other GPU (core_gpu.yaml):

  • amd:adrenalin, asus:armoury_crate

The group:member ID Format#

All catalog IDs use group:member format:

visual_pinball:vpx64      → group: visual_pinball, member: vpx64
nvidia:app                → group: nvidia, member: app
windows:device_manager    → group: windows, member: device_manager
dof                       → bare ID — no sub-members defined yet

Group prefix matching: software filter queries use the group prefix — visual_pinball matches all visual_pinball:* entries.

Bare IDs (like dof, future_pinball) are valid but have no sub-members. Use a bare ID when there's only one entry for that software ecosystem.


software_refs: Blocks in Schema YAML#

The software_refs: block is a virtual container in schema YAML — it propagates a list of catalog IDs to all child items. It is not saved as a DB item.

Basic usage#

# All items in this subtree get software_refs: [visual_pinball]
- software_refs: [visual_pinball]
  const:
    VPX_DATA: '{{APPDATA_ROOT}}/Roaming/VPinballX'
  items:
    - location: "{{VPX_ROOT}}"
      itemtype: directory
      ...

Narrowing (override)#

A child software_refs: block replaces the parent's list — it does not merge:

- software_refs: [visual_pinball]
  items:
    - location: "{{VPX_ROOT}}"
      ...

    # VPinMAME subtree — narrowed to a specific member
    - software_refs: [visual_pinball:vpinmame]
      items:
        - location: "{{VPX_ROOT}}/VPinMAME"
          ...

    # DirectB2S files — narrowed to a different member
    - software_refs: [visual_pinball:directb2s]
      items:
        - location: "{{VPX_ROOT}}/Tables"
          items:
            - for:
                B2S: "*.directb2s"
              items:
                - selector: "{{B2S}}"

Multiple refs#

An item can reference multiple catalog entries — for resources shared by several programs:

- software_refs: [visual_pinball:vp8, visual_pinball:vp9]
  items:
    - location: "{{VPX_ROOT}}/Tables"
      items:
        - for:
            VPT: "*.vpt"
          items:
            - selector: "{{VPT}}"

The relationships: Field#

Catalog entries can declare typed edges to other entries. These are an extension hook for future graph features (visualization, dependency-aware backup):

- id: visual_pinball:vpx64
  relationships:
    - type: invokes
      target: visual_pinball:vpinmame
    - type: invokes
      target: visual_pinball:directb2s

Defined types: invokes, configures, shares_dir, reads, writes, listens

Unknown type values are silently ignored.


Catalog YAML Format#

Catalog files live in data/schemas/. Any YAML file with a top-level software: section is a catalog file.

Software-only catalog file#

# core_os.yaml — Windows OS built-in tools

software:
  - id: windows:device_manager
    name: Device Manager
    command: devmgmt.msc
    launch_type: msc
    vendor: microsoft
    program_class: os_builtin
    device_classes: [display, audio, usb, computer]
    detect: null
    icon: TechnicianIcon
    relationships:
      - type: invokes
        target: windows:mmc

Key fields#

FieldRequiredDescription
idYesUnique group:member ID (or bare ID)
nameYesHuman-readable display name
exeNoExecutable filename
commandNoHow to launch: an exe name, a ms-settings: URI, or a .msc name
launch_typeNoexe, uri, or msc
vendorNoVendor name
program_classNoemulator, frontend, utility, os_builtin
device_classesNoHardware categories that surface this tool: display, audio, usb, computer
default_for_groupNotrue to mark this as the default entry in its group
detectNoDetection command or path; null for always-present OS tools
detectionNoFull detection block with uninstall_key, locations, registry_keys, process_names
iconNoIcon name
relationshipsNoTyped edge list

The Configuration Package Pattern#

A configuration package is the downloadable content bundle that adds support for a tool or setup: a Schema, Profiles for known/useful configurations, and supporting guidance. (Pinman-released packages are "Pinman configuration packages"; contributor-maintained ones are "community configuration packages".)

The simplest configuration package ships one YAML file containing both its software catalog entry and its schema items:

# pinscape_package.yaml

software:
  - id: pinscape:config
    name: Pinscape Config Tool
    exe: PinscapeConfigTool.exe
    vendor: mjrnet.org
    program_class: utility
    device_classes: [usb]
    relationships:
      - type: configures
        target: pinscape:firmware
    detection:
      locations:
        - path: "C:\\PinscapeConfigTool"
      process_names: [PinscapeConfigTool.exe]

items:
  - software_refs: [pinscape:firmware]
    items:
      - location: "fs:/C/PinscapeConfigTool/Config"

pinman schema import path/to/pinscape_package.yaml registers the catalog entry and imports the schema items in one pass.

To import a whole directory of packages:

pinman schema import data/schemas/          # imports all *.yaml files
pinman schema import data/schemas/ --strict  # fail on undefined software_refs IDs

How Guided Mode Works#

When a profile step requires manual action, Pinman:

  1. Looks up the relevant tool in the catalog
  2. Launches it (launch_type is uri, exe, or msc)
  3. Displays the step list from instructions.d/, with template variables filled in
  4. Optionally prompts you to confirm and re-reads the value to verify

Example guided step sequence for an NVIDIA setting:

Open NVIDIA App → Navigate to Graphics > Global Settings → Find 'Power Management Mode' → Set to Maximum Performance → Click Apply

In the CLI#

# Apply: direct targets write automatically, then guided actions are listed
pinman profile apply "My GPU Profile"
  Guided Actions (2 settings need manual changes):

    NVIDIA App:
      1. Set Vertical Sync to ForceOff
         - Open NVIDIA App
         - Navigate to Graphics > Global Settings
         - Find 'Vertical Sync'
         - Set to ForceOff
         - Click Apply

Add --interactive for a step-by-step flow with prompts:

pinman profile apply "My GPU Profile" --interactive

  NVIDIA App:
  Open NVIDIA App? [Y/n] y
    1. Set Vertical Sync to ForceOff
       ...
     Done/Skip/Quit [d/s/q]: d
     Verifying... [VERIFIED]

In the Web UI#

When applying a profile with guided targets, a guided action dialog appears after direct targets complete:

  • Instructions are always visible
  • "Open Tool" launches the tool on the cabinet
  • "Done" triggers verification
  • "Skip" moves to the next action

A guided-action banner appears on profile cards when drift is detected on a guided property.


Adding New Software#

Step 1: Add to a catalog YAML file#

Add an entry to an existing file in data/schemas/, or create a new one:

software:
  - id: myvendor:mytool
    name: My Config Utility
    exe: MyTool.exe
    command: MyTool.exe
    launch_type: exe
    vendor: myvendor
    program_class: utility
    device_classes: [display]
    detection:
      locations:
        - path: "C:\\MyTool"
      process_names: [MyTool.exe]

Step 2: (Optional) Add schema items#

If this software manages files that Pinman should track, add an items: section to the same file or another schema YAML:

items:
  - software_refs: [myvendor:mytool]
    items:
      - location: "fs:/C/MyTool/Config"

Step 3: Import#

pinman schema import data/schemas/

Step 4: (Optional) Add guided instructions#

Add an entry to instructions.d/ for guided step templates. The software_ref field must match your catalog ID:

{
  "my_tool_setting": {
    "software_ref": "myvendor:mytool",
    "summary_template": "Configure {label}",
    "steps": [
      "Open My Config Utility",
      "Find '{label}'",
      "Set to {target_value}",
      "Save"
    ],
    "verify": true
  }
}

Then reference it in profiles:

p.guided("winrt:/MyCategory/MySetting", "value", software="myvendor:mytool")

Summary#

Tracked softwareConfiguration tools
ExamplesVPX, VPinMAME, PinUP PopperDevice Manager, NVIDIA App
PurposeCabinet ecosystem, detection, zone filteringGuided manual settings changes
Defined indata/schemas/*.yaml (software: section)data/schemas/*.yaml (software: section)
Has detection logicYes (uninstall key, paths, registry, process)Yes, or null for always-present OS tools
Launched by PinmanNoYes (guided mode)
Schema itemsAssociated via software_refs: blocksReferenced via property catalog software_refs field