Distributed configurations in Flow PTR (ADN Article)

Table of Contents:

  1. Table of Contents
  2. Introduction to distributed configurations
  3. How distributed configurations work internally
  4. Distributed vs centralised configurations overview
  5. Distributed configurations with GitHub
  6. How to Automate the configuration upload to FPTr with new releases
  7. CI/CD Automation with GitHub Actions
  8. Descriptors in a distributed configuration
  9. Files in a Distributed Configuration
    1. How is the configuration cached
  10. Tank Commands in a distributed Configuration
  11. Folder Creation WorkFlows
  12. Core API Management in Distributed Systems
  13. Bundle Cache Management
  14. Troubleshooting Distributed Configurations
  15. Recommended Studio Best Practices
  16. Where to Find More Articles

Written by @Felix.Onsare and @sergio.leon

Introduction to distributed configurations

In traditional centralized Toolkit deployments, a shared configuration exists on a studio’s network storage that can be accessed by all users. On the other side, a distributed configuration is stored in the cloud and get cached locally per user. This helps centralized maintenance while allowing local and remote users to use the same project’s configuration and allow easily deployments.

A distributed configuration is uploaded to Flow Production Tracking and automatically downloaded to client machines during bootstrap.

Instead of all users accessing a single shared configuration path:

  • Each user receives a locally cached copy.
  • Toolkit bootstraps the configuration dynamically.
  • The configuration may originate from:
    • Git descriptor
    • Path descriptor
    • Toolkit App Store descriptors

This architecture is manly used with:

  • Flow Production Tracking Desktop
  • Browser Integration
  • ToolkitManager bootstrap workflows
  • Cloud-hosted or hybrid deployments
  • VPN-sensitive pipelines

Further documentation in:

How distributed configurations work internally

When a user launches Toolkit through Flow Production Tracking Desktop or a Toolkit-enabled integration:

  1. ToolkitManager authenticates the user.
  2. ToolkitManager resolves the pipeline configuration.
    17.Toolkit downloads the configuration’s descriptor.
    18.Toolkit downloads missing engines/apps/frameworks.
    19.The configuration is cached locally.
    20.Toolkit initializes the tk-core API.
  3. Engines are launched under the resolved context.

Unlike centralized systems, users do not normally interact with a permanent shared configuration directly. When a user bootstraps, this process triggers to update the config, if changes were done in the distributed configuration.

Toolkit caches distributed configurations in locations in the following folder locations depending on your operating system:

  • Windows:
    • %APPDATA%\Shotgun
  • Linux:
    • ~/Shotgun
  • macOS:
    • ~/Library/Caches/Shotgun

Documentation on tk-core environments variables

Distributed vs centralized configurations overview

Feature Centralized Distributed
Configuration Location Local or shared in a File system Server Remote and copied to local user cache
Requires Shared Storage Yes No
Toolkit Updates Directly on Shared Config Upstream Descriptor Update
Tank Command Usage Primary Workflow Mostly Debugging/Admin
Offline Capability Limited Better
Remote Workforce Friendly Moderate Strong
Local Cache Dependency Minimal High
Bootstrap Required Optional Required

Distributed configurations with GitHub

It is recommended to work with git in a distributed configuration. Here are the steps.

Create a repo

It is generally recommend storing distributed Toolkit configurations in Git repositories rather than editing the production configurations directly. Git repository provides version control, change history, collaboration workflows, code review capabilities, and the ability to roll back problematic changes. In a distributed configuration setup, Git effectively becomes the source of truth while Toolkit’s bootstrap system downloads the correct version for all users.

Step 1: Create a GitHub repository

On GitHub:

  1. Click on New Repository, and name it something meaningful. Samples: tk-config-studio, tk-config-production, tk-config-default2-custom.

  2. Choose Private or Public

  3. Initialize with a READMe

Step 2: Clone the repository locally

Once created:

[terminal] git clone https://github.com/studio/tk-config-production.git

This downloads the repository to your workstation.

Example:

cd tk-config-production

You can now edit files like the following files, without affecting any production users:

*env/project.yml*
*hooks/tk-multi-publish2*
*templates.yml*

Step 3: Commit changes

Lets assume you modify

*git status #* first review changes
               *git add . # ad changes*
               *git commit -m "Added custom Nuke publish plugin"*
               *git push origin main #* push changes to GitHub

Also rem that a good commit message should describe why the change was made, not just what change.

e.g you can do sth like:

Added support for OCIO v2 publish validation

Step 4: Downloading updates

In case you need to pull the latest changes use this to update your local configuration to match what is exists on GitHub

git pull origin main

For studios with multiple developers, this ensures everyone works from the same configuration.

Create releases (tags) in Github

Distributed Toolkit configurations should not be pointing directly at a moving branch such as main or master. Instead, use immutable version references. This is where Git tags come in.

A tag creates a permanent snapshot of a configuration at a specific point in time. Example: v1.0.0 or v1.1.0. A descriptors can reference these tags directly, ensuring everyone accesses same config.

Creating a Tag from the Command Line:

*git tag v1.2.0 # create a tag*

*git push origin v1.2.0 # push the tag:*

Git will store that version permanently.

Creating a GitHub Release

Navigate to ”Repository –> Releases → Create Release”.

Select:Tag: v1.2.0

Add release notes:

  Added custom publish hooks.
  Improved Nuke startup performance
  Fixed OCIO validation issues

Publish Release.

Step 2: Clone the repository locally

Once created:

[terminal] git clone https://github.com/studio/tk-config-production.git

This downloads the repository to your workstation.

Example:

cd tk-config-production

You can now edit files like the following files, without affecting any production users:

env/project.yml
hooks/tk-multi-publish2
templates.yml

Step 3: Commit changes

Lets assume you modify

*git status #* first review changes
*git add . # ad changes*
*git commit -m "Added custom Nuke publish plugin"*
*git push origin main #* push changes to GitHub

Also rem that a good commit message should describe why the change was made, not just what change.

e.g you can do sth like:

*Added support for OCIO v2 publish validation*

Step 4: Downloading updates

In case you need to pull the latest changes use this to update your local configuration to match what is exists on GitHub

*git pull origin main*

For studios with multiple developers, this ensures everyone works from the same configuration.

Create releases (tags) in Github

Distributed Toolkit configurations should not be pointing directly at a moving branch such as main or master. Instead, use immutable version references. This is where Git tags come in.

A tag creates a permanent snapshot of a configuration at a specific point in time. Example: v1.0.0 or v1.1.0. A descriptors can reference these tags directly, ensuring everyone accesses same config.

Creating a Tag from the Command Line:

*git tag v1.2.0 # create a tag*

*git push origin v1.2.0 # push the tag:*

Git will store that version permanently.

Creating a GitHub Release

Navigate to ”Repository –> Releases → Create Release”.

Select:Tag: v1.2.0

Add release notes:

Added custom publish hooks
Improved Nuke startup performance
Fixed OCIO validation issues

Publish Release.

Referencing the Tag in Toolkit

You could use:

*location:*
   *type: git*
   *path: https://github.com/studio/tk-config-production.git*
   *version: v1.2.0*

When Toolkit bootstraps, it will download the repo, resolves tag v1.2.0, download that exact version, cache it locally, every user receives same configuration code.

How automate the config upload to Flow PTR with new releases

If your configuration uses a Git descriptor, you’re not required to upload the configuration into FPTr after every change.

What happens instead will be:

  1. GitHub hosts the configuration
  2. Toolkit reads the descriptor
  3. Toolkit downloads the tagged release
  4. Users receive updates automatically

This means, GitHub becomes the deployment platform while Flow PT only stores the descriptor reference.

CI/CD automation with GitHub Actions

You could have a workflow like: Developer → Git Commit → GitHub Pull Request → Automated Tests → Git Tag Created → GitHub Release → Toolkit Descriptor Updated → Users Bootstrap New Version.

GitHub Actions can automatically run validation tests, create tags, publish releases and update descriptor repositories.

Example trigger:

on:
push:
branches:
- main

When changes reach production:

  1. Tests execute
  2. A release is generated
  3. Tag is published
  4. 4.Toolkit can resolve the new version

Here’s an example step by step workflow using gihub actions. If we want Flow Production Tracking still distributes the uploaded ZIP, we can use git locally with GitHub, and update the configuration with this script:

1. Repository structure

2. Use Github Secrets.

Go to:

GitHub → Repository → Settings → Secrets and variables → Actions

Create these repository secrets:

FPT_BASE_URL

FPT_SCRIPT_NAME

FPT_SCRIPT_KEY

FPT_PIPELINE_CONFIG_ID

3. Requirements.txt

Create requirements.txt file and a deployments script

 *scripts/deploy_fpt_config.py*

and you can paste the following code deploy_fpt_config.py

This uses the FPTr python API for uploading a file to an entity( uploaded_config)

But before uploading anything to the web, first validate. So add the file:

scripts/validate_config.py .

You can get the contents of this file from here validate_config.py .

This file is expandable to validate more items like YAML syntax, hooks…

4. Now create:

.github/workflows/deploy-fpt-config.yml

Then paste the following code to it:
deploy-fpt-config.yml

You make your changes:

git checkout main
# Make configuration changes
git add .
git commit -m "Update Nuke publish settings"
git push origin main

Nothing gets deployed yet.

Then when you’re ready:

git tag v1.4.0
git push origin v1.4.0

GitHub sees:

refs/tags/v1.4.0

and starts:

Deploy FPT Distributed Configuration

Github actions then checks out the version and uploads it to the Flow Production Tracking web, from where Toolkit’s bootstrap recognizes the uploaded configuration and downloads it when users start up

Descriptors in a distributed configuration

We just covered the git descriptor. We also have more descriptors supported by the toolkit:

  • An app_store descriptor – represents items in the ToolkitApp Store
  • A dev descriptor – represents the developer sandbox
  • Shotgun descriptor – represents items stored in Flow Production Tracking
  • Manual descriptor – gives raw access to the bundle caching structure

The ‘Path descriptor’ represents a location on disk, that would be a centralised configuration.

Further documentation ca be found here.

Files in distributed configurations

How is the configuration’s cache?

Because distributed configs are downloaded and cached locally at startup, a copy of the Pipeline Configuration plus the[/color] tank command ends up on each user’s machine (in local cache paths such as %APPDATA%\Shotgun,~/.shotgun[color=black], etc.) for windows.

This means:

  • You do not normally run tank setup_project because the config was already created and delivered via Flow Production Tracking.
    *The Toolkit bootstrap system creates or updates the config on first launch, so tank is already present locally.
  • We discorage using[/color] tank manually.

We write this section for debug purposes only.

cd ~/Library/Caches/Shotgun/Shotgun/_SITE_/pXXXcYYY.basic.shotgun/cfg
./tank

You may notice that within this cache directory, folders follow the pattern:

p<project_id>c<pipeline_config_id>.<plugin_id> 

Example:
P355c430.basic.desktop

What Each Component Means?

  1. p355 → Project ID
  • The number after p corresponds to the internal Project entity ID in Flow Production Tracking.
  • You can see this in the URL when viewing a project:
  1. c430 → Pipeline Configuration ID
  • The number after c corresponds to the Pipeline Configuration entity ID associated with that project.
  • This identifies which configuration definition was bootstrapped.
  • You can find it in this URL:
  1. .basic.desktop → Plugin ID
  • This is the plugin_id used during bootstrap (e.g., basic.desktop).
  • The plugin ID separates cache instances created by different launchers or integrations.
  • Different plugin IDs for the same project/config pair will create separate cache folders.

Why This Matters? This naming convention ensures:

  1. Multiple projects remain isolated.
  2. Multiple pipeline configurations per project remain isolated.
  3. Multiple launch contexts (via different plugin_ids) remain isolated.
  4. Bootstrap resolution remains deterministic.

Tank commands in distributed configurations

In an older article we saw the Tank command. It is primarily used for automating and streamlining tasks within the studio production pipeline.

One of the most misunderstood aspects of distributed configurations is that the tank command still exists. It could work for certain actions, but it is not recommended to use outside read-only actions. Produced changes won’t align anymore with the remote configuration, and they may even be replace when there are updates on the remote configuration.

Once Toolkit bootstraps and caches a distributed configuration locally, the cached configuration still contains:

  • tk-core
  • config
  • install
  • tank command
  • cached bundles

This means you could technically execute tank commands from the cached configuration. However, distributed configurations were explicitly designed so that configuration maintenance occurs upstream rather than directly on local caches.

This creates an important operational distinction that;

  • In Centralized Configurations: Users intentionally operate directly on the production configuration.
  • In Distributed Configurations: Users operate on temporary cached copies.

Note any local modifications may be overwritten when:

  • the descriptor version changes
  • the cache refreshes
  • Toolkit reboots
  • the configuration is re-downloaded

Tank commands available in distributed setups

Command type Recommendation Notes
tank configurations Safe for diagnostics Useful for checking available pipeline configurations.
tank app_info Safe for diagnostics Useful for inspecting installed apps, engines, and frameworks.
tank validate Recommended Good read-only validation command for checking configuration health.
tank folders, tank preview_folders, tank synchronize_folders Use with care Useful for folder workflows, but should be run intentionally because they can affect filesystem/path-cache state.
tank cache_apps Recommended for troubleshooting Can rebuild or pre-cache missing bundles.
tank clear_shotgun_menu_cache Recommended for troubleshooting Useful when Toolkit menu items are stale or not updating.
tank Shot 1122 launch_maya Use with care Can help validate launch behavior from a specific context, but should not replace normal bootstrap workflows.
tank --debug Recommended for diagnostics Useful to collect more detailed troubleshooting output.
tank localize Avoid Distributed configurations are already local caches; localizing can create unnecessary divergence from the descriptor source.
tank move_configuration Avoid Moving cached configurations can break descriptor resolution and bootstrap assumptions.
tank push_configuration Avoid Risky because the cached configuration may not represent the intended production source.
Editing cached YAML files Avoid Changes to files such as env files, templates.yml, or roots.yml may disappear during the next bootstrap refresh.

Folder creation workflows

A common misconception is that distributed configurations eliminate the traditional Toolkit filesystem model. The folder creation system remains fundamentally the same. The filesystem process in distributed configurations follows the same logic as centralized setups. What changes is how the configuration is delivered, cached, and initialized but the underlying Toolkit folder schema system remains the same.

It’s important to note that distributed configurations still contain:

  • Templates
  • Schema definitions
  • Folder creation logic
  • Filesystem Location entities
  • Toolkit hooks
  • Dynamic entity mapping
  • Filesystem registration
  • Context resolution
  • Publish path parsing

The only major difference is that the configuration itself is no longer required to live permanently on a shared network path. The filesystem model itself remains one of the foundational parts of the Toolkit.

Core API management in distributed setups

Toolkit Core (tk-core) management changes substantially in distributed systems.

In centralized configurations:

  • projects may share a common core
  • administrators may manually upgrade core versions
  • core swapping is common

In distributed configurations:

  • descriptors usually define the core version
  • ToolkitManager resolves compatible versions
  • tk-core may be bundled dynamically
  • local cache consistency becomes important

Core Upgrade Commands

Traditional commands like ‘tank core’ or ‘tank core --version v0.20.25’ are more commonly used in centralized setups. In distributed environments, changing core versions is generally handled upstream through descriptor versioning.

More documetation here…

attach_to_core

This command allows configurations to point to an external tk-core installation. Useful for testing, debugging, sandbox upgrades and temporary validation.

More documentation here…

Bundle cache management

Distributed configurations rely heavily on bundle caching. Bundles include engines, apps, frameworks or descriptors. Toolkit stores bundles locally.

If bundles are missing or corrupted, this command can rebuild or pre-cache them

tank cache_apps

Descriptor documentation here…

Troubleshooting distributed configurations

Limitations summary

Some important limitations to note when handling distributed configurations are:

1. Local changes are disposable; any changes made inside cached configs may be overwritten.

2. Debugging can become harder, each user may have:

  • different caches
  • stale bundles
  • inconsistent local states

3. Storage root consistency becomes critical. There are differences in:

  • capitalization
  • UNC paths
  • mapped drives
  • Linux mount points

may break Toolkit path resolution. Documentation: https://developers.shotgridsoftware.com/9ea34457/

4. Distributed configurations still depend on local disk integrity. Corrupted caches may require:

  • deleting bundle cache
  • re-bootstrap
  • reauthentication
  • reinstalling Toolkit Desktop

5. Some legacy tank workflows are less relevant. Commands heavily designed around shared configs are less operationally useful. Examples like share_core, localize or move_configuration.

6. Version drift. Users may temporarily run different cached versions if descriptor refreshes are inconsistent.

Common troubleshooting scenarios

Cannot Resolve Template Data — Usually caused by:

  • missing folders
  • stale path cache
  • unregistered folders

Fix: tank Asset tree01 folders, or: tank synchronize_folders --full.
Reference: Text instead of status icons

Local Storage Errors — Example: Path does not match any defined Local Storage. Cause: mismatch between:

Menu Items Not Updating — Fix: tank clear_shotgun_menu_cache. This rebuilds Toolkit menu caches.
Missing Bundles — Fix: tank cache_apps, or clear the local bundle cache.

Recommended studio best practices

Recommended

  • Manage configs upstream through descriptors
  • Use Git-based descriptors where possible
  • Version every configuration change
  • Automate bootstrap validation
  • Use preview_folders before schema deployment
  • Keep storage roots consistent across OS platforms
  • Standardize mount points
  • Maintain backup bundle caches
  • Use sandbox descriptors for testing

Avoid

  • editing cached distributed configs directly
  • manually moving cached configs
  • manually editing FilesystemLocation entities
  • changing roots.yml without synchronizing caches

Where to find more API articles

We are tagging our articles with adn-articles so they are easy to filter in the community forum. These posts cover API-related topics designed to help you apply Autodesk Platform Services and Flow Production Tracking APIs more effectively in real production workflows with common workflow implementations, troubleshooting guides and research insights.

We hope these resources become valuable to you. Stay tuned!*

This is a good overview and comparison to shared configs. Though there are a lot of formatting issues and broken links (as well as links to unrelated pages). Could use a thorough edit pass :slight_smile: .

That aside, these articles are great deeper dives that help fill gaps in the documentation for those that need it.