Studio Refresher

The Studio License for Maya Groomer’s Tool assumes artists can access the internet from Maya and have read/write permission to the shared license.json in the xgtc folder you installed).

In stricter environments, that isn’t always the case. Artists may have limited internet access and studios may prefer centralized control of licensing. This guide outlines some alternatives to accommodate those policies and keep re-checks smooth.

This guide shows how to refresh a Studio Tiered license without launching Maya, using a XGT Refresher bundle. Py3.7, Py3.9, Py3.10, Py3.11 versions of the XGT_Refresher are available from your download page.

Using the XGT_Refresher, the refresher machine can run a different OS than the artists’ machines; it simply rewrites the central shared license.json

Setting up XGT Refresher

  • Know the Python version your refresher machine can run with. (This is a dedicated machine that has read/write to the xgtc/license.json file and internet access, not artists' machine)

  • Download the refresher bundle (with the same Python version and OS build that matches your refresher machine, Linux or Windows). The files are located under a folder called "XGT_Refresher" in your content/download page.

  • Unzip, you will see a xgt_refresher folder

  • If you put Groomer's Tool's xgtc folder:

vdisk/.../plugins/2023/xgtc/
  • Create another folder and put the xgt_refresher folder in there.

vdisk/.../plugins/xgt_refresher/

Inside vdisk/.../lugins/xgt_refresher/

--xgt_license_refresh.pyc
--xgt_license_core.pyc
--pyarmor_runtime_009008/
  • Make sure your refresher machine has internet access and read/write access to vdisk/.../plugins/2023/xgtc/license.json


Windows

First Activation - No Maya Required

You can use this code to activate the license.json file for the first time.

Make sure to change:

  • env path

  • path for the xgt_license_refresh.pyc

  • path for license.json

  • license key

  • email

# Point to actual refresher folder
$env:XGT_XGTC_SCRIPTS = "vdisk\...\plugins\xgt_refresher\" 

py -3.10 vdisk\...\plugins\xgt_refresher\xgt_license_refresh.pyc `
  --path "vdisk\...\plugins\2023\xgtc\license.json" `
  --license "XGT-1234ABCD-1234ABCD" `
  --email "email@company.com" `
  --verbose

Refresh with commands

# Point to actual refresher folder
$env:XGT_XGTC_SCRIPTS = "vdisk\...\plugins\xgt_refresher\" 

# Point to actual refresher folder and the license.json in xgtc folder
py -3.10 vdisk\...\plugins\xgt_refresher\xgt_license_refresh.pyc `
  --path "vdisk\...\plugins\2023\xgtc\license.json" `
  --verbose

Expected success output (real run):

[XGT] Loading license from: vdisk\...\plugins\2023\xgtc\license.json
[XGT] Calling Gumroad/Render verify… 
[XGT] Snapshot state: ('ok', {}); last_check=YYYY-MM-DD; is_studio=True
[XGT] License refreshed and written.

# .json must be set to "writable" to the refresh machine.
# you can check the license.json time stamp to see if it updates.

Linux

First Activation - No Maya Required

# Point to refresher folder
export XGT_XGTC_SCRIPTS=”vdisk/.../plugins/xgt_refresher/”

python3.10 vdisk/.../plugins/xgt_refresher/xgt_license_refresh.pyc \
  --path "vdisk/.../plugins/2023/xgtc/license.json" \
  --license "XGT-1234ABCD-1234ABCD" \
  --email "email@company.com" \
  --verbose 

Refresh with commands

# Point to refresher folder
export XGT_XGTC_SCRIPTS="vdisk/.../plugins/xgt_refresher/"

# Point to actual refresher folder and the license.json in xgtc folder
python3.10 vdisk/.../plugins/xgt_refresher/xgt_license_refresh.pyc \
  --path "vdisk/.../plugins/2023/xgtc/license.json" \
  --verbose

Expected success output (real run):

[XGT] Loading license from: vdisk\GroomersTool_2023_win\xgtc\license.json
[XGT] Calling Gumroad/Render verify…
[XGT] Snapshot state: ('ok', {}); last_check=YYYY-MM-DD; is_studio=True
[XGT] License refreshed and written.

# .json must be set to "writable" to the refresh machine.
# you can check the license.json time stamp to see if it updates.

Duplicating Jobs for Multiple Targets

Running Groomer's Tool on different projects (different OS/Maya)

  • Duplicate the task and change only the --path argument, e.g.:

    • vdisk/.../plugins/2023/xgtc/license.json
    • vdisk/.../plugins/2025/xgtc/license.json
    • Then, create additional tasks pointing at other versions/builds.

    • You can use the same refresher to refresh different builds of Groomer's Tool license.

# Still using the same refresher path
export XGT_XGTC_SCRIPTS="vdisk/.../plugins/xgt_refresher/"
# As long as it match with refresher box Py version,
# multi-refresh can still use the same refresher script

# Refresh license.json (on a Maya 2023 project)
python3.10 vdisk/.../plugins/xgt_refresher/xgt_license_refresh.pyc \
  --path "vdisk/.../plugins/2023/xgtc/license.json" \
  --verbose
  
# Refresh license.json (on a Maya 2025 project)
python3.10 vdisk/.../plugins/xgt_refresher/xgt_license_refresh.pyc \
  --path "vdisk/.../plugins/2025/xgtc/license.json" \
  --verbose
  

To keep licenses up to date, while letting artists work offline, schedule the Studio refresher at these intervals:

  • Monthly plans: Twice per week

  • Quarterly / Bi-Annually / Yearly plans: Once per week

Troubleshooting

Symptom

Likely cause

Fix

ERROR: bad magic number in 'xgt_license_core'

Python version mismatch for .pyc

Refresher machine must have the same matching Python version as the XGT_Refresher bundle files

verify failed: ...

Network block, wrong product ID, or license key missing in JSON

Allow outbound HTTPS; pass --product-id; confirm JSON has license_key.

Permission denied writing JSON

Share not writable from scheduler box

Run on an IT/RW box; fix share conditions; avoid read-only mounts.

Written OK but artists don’t see change

Artists looking at a different xgtc file/path

Ensure everyone points to the intended target path.

Last updated