# 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`         &#x20;

{% hint style="warning" %}
**Let Artist Machine Validate On Re-Check Days:**

* If artist machines have internet access and the central `license.json` is **writable**, no extra steps are needed. The first artist who opens the tool when a re-check is due will auto-validate and update the shared file. You can skip this page.
* Otherwise, if you’re keeping the central `license.json` as **read-only**, and prefer to have Groomer's Tool on a centralized network folder, a dedicated box (a refresher machine) that can read/write, and has internet access will be required. No Maya launch is required for this refresher machine. Please follow along with documented below.
  {% endhint %}

## 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`&#x20;

***

## Windows

### First Activation - No Maya Required

You can use this code to activate the license.json file for the first time.&#x20;

Make sure to change:

* env path
* path for the xgt\_license\_refresh.pyc
* path for license.json
* license key&#x20;
* email

```powershell
# 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

```powershell
# 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

```powershell
# 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

```powershell
# 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.

```powershell
# 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
  
```

***

## Recommended Studio Refresher Schedule

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.                                             |
