{"id":23328827,"url":"https://github.com/healkeiser/fxserver","last_synced_at":"2025-08-22T22:33:22.159Z","repository":{"id":64985050,"uuid":"580348352","full_name":"healkeiser/fxserver","owner":"healkeiser","description":"Transform any Cloud drive into a VFX pipeline ready server.","archived":false,"fork":false,"pushed_at":"2024-12-04T10:25:17.000Z","size":102,"stargazers_count":23,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"main","last_synced_at":"2024-12-18T19:09:10.054Z","etag":null,"topics":["cgi","houdini","maya","nuke","substance-painter","vfx","vfx-pipeline"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/healkeiser.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["healkeiser"],"patreon":"valentinbeaumont","buy_me_a_coffee":"healkeiser"}},"created_at":"2022-12-20T10:42:03.000Z","updated_at":"2024-12-04T10:25:21.000Z","dependencies_parsed_at":"2024-12-08T12:47:10.528Z","dependency_job_id":null,"html_url":"https://github.com/healkeiser/fxserver","commit_stats":null,"previous_names":["healkeiser/fxserver"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/healkeiser%2Ffxserver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/healkeiser%2Ffxserver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/healkeiser%2Ffxserver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/healkeiser%2Ffxserver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/healkeiser","download_url":"https://codeload.github.com/healkeiser/fxserver/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230645418,"owners_count":18258549,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cgi","houdini","maya","nuke","substance-painter","vfx","vfx-pipeline"],"created_at":"2024-12-20T21:18:52.409Z","updated_at":"2025-08-22T22:33:22.133Z","avatar_url":"https://github.com/healkeiser.png","language":"Shell","funding_links":["https://github.com/sponsors/healkeiser","https://patreon.com/valentinbeaumont","https://buymeacoffee.com/healkeiser","https://www.buymeacoffee.com/healkeiser"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n  \u003ca href=\"https://github.com/healkeiser/cloud_vfx_server\"\u003e\n    \u003cimg src=\"https://cdn-icons-png.flaticon.com/512/2345/2345350.png\" alt=\"Logo\" width=\"80\" \u003e\u003c/a\u003e\n\n  \u003ch3 align=\"center\"\u003efxserver\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\n    Setup cloud as a VFX server.\n    \u003cbr/\u003e\u003cbr/\u003e\n  \u003c/p\u003e\n\n  ##\n\n  \u003cp align=\"center\"\u003e\n    \u003c!-- Maintenance status --\u003e\n    \u003cimg src=\"https://img.shields.io/badge/maintenance-as--is-yellow?\u0026label=Maintenance\"\u003e\u0026nbsp;\u0026nbsp;\n    \u003c!-- \u003cimg src=\"https://img.shields.io/badge/maintenance-deprecated-red.svg?\u0026label=Maintenance\"\u003e --\u003e\n    \u003c!-- License --\u003e\n    \u003c!-- \u003cimg src=\"https://img.shields.io/badge/License-MIT-brightgreen.svg?\u0026logo=open-source-initiative\u0026logoColor=white\" alt=\"License: MIT\"/\u003e\u0026nbsp;\u0026nbsp; --\u003e\n    \u003c!-- PyPI --\u003e\n    \u003c!-- \u003ca href=\"https://pypi.org/project/cloud_vfx_server\"\u003e\n      \u003cimg src=\"https://img.shields.io/pypi/v/cloud_vfx_server?\u0026logo=pypi\u0026logoColor=white\u0026label=PyPI\" alt=\"PyPI version\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp; --\u003e\n    \u003c!-- Last Commit --\u003e\n    \u003cimg src=\"https://img.shields.io/github/last-commit/healkeiser/cloud_vfx_server?logo=github\u0026label=Last%20Commit\" alt=\"Last Commit\"/\u003e\u0026nbsp;\u0026nbsp;\n    \u003c!-- Commit Activity --\u003e\n    \u003ca href=\"https://github.com/healkeiser/cloud_vfx_server/pulse\" alt=\"Activity\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/commit-activity/m/healkeiser/cloud_vfx_server?\u0026logo=github\u0026label=Commit%20Activity\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n    \u003c!-- GitHub stars --\u003e\n    \u003cimg src=\"https://img.shields.io/github/stars/healkeiser/cloud_vfx_server\" alt=\"GitHub Stars\"/\u003e\u0026nbsp;\u0026nbsp;\n  \u003c/p\u003e\n\n\u003c/div\u003e\n\n\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n## Table of Contents\n\u003c!--ts--\u003e\n   * [About](#about)\n   * [Setup Server](#setup)\n     * [Windows](#windows)\n     * [Unix](#unix)\n   * [Software](#software)\n   * [Useful Resources and Tools](#useful-resources-and-tools)\n   * [Contact](#contact)\n\u003c!--te--\u003e\n\n\n\n\u003c!-- ABOUT --\u003e\n## About\nQuick tutorial to setup a Cloud Server for multiple machines access, and VFX Pipeline on Windows, macOS and Linux.\nThis repository is based on [Google Drive VFX Server](https://github.com/healkeiser/google_drive_vfx_server), with loads of improvements.\n\n\n\n\u003c!-- SETUP SERVER --\u003e\n## Setup Server\n\nFirst, you'll need to mount your Cloud server on your system, using any software you like ([rclone](https://rclone.org/), [Google Drive File Stream](https://support.google.com/a/answer/7491144?hl=en), etc.)\n\nWe can then start moving files around. The setup only relies on environment variables:\n - `SERVER_ROOT`: The root of the mounted Cloud server. This is the only value that needs to be changed depending on your setup\n - `CONFIG_ROOT`: The `.config` folder\n - `ENVIRONMENT_ROOT`: the `.config/environment` folder\n - `PIPELINE_ROOT`: the `.config/pipeline` folder\n\nYou can now download the code from this repository and extract its content to your `SERVER_ROOT`. Using `Z:/My Drive` as the mounted Cloud server path, it should look like this:\n\n``` bash\n.\n└── 📁 Z:/My Drive/\n    └── 📁 .config/\n        ├── 📁 environment\n        └── 📁 pipeline\n```\n\nWhich equals to:\n\n``` bash\n.\n└── 📁 $SERVER_ROOT/\n    └── 📁 $CONFIG_ROOT/\n        ├── 📁 $ENVIRONMENT_ROOT\n        └── 📁 $PIPELINE_ROOT\n```\n\nYou will need to modify `SERVER_ROOT` in [.zshrc](.config/environment/unix/.zshrc) (**Unix**) and/or [dcc.bat](.config/environment/windows/dcc.bat) (**Windows**) by your mounted Cloud server path:\n- In [.zshrc](.config/environment/unix/.zshrc): `export SERVER_ROOT=\"Path/to/drive/linux\"` (Line 12, 17, 21)\n- In [dcc.bat](.config/environment/windows/dcc.bat): `setx SERVER_ROOT \"Path\\to\\drive\\windows\"` (Line 9)\n\nOnce the folder structure is created and the `SERVER_ROOT` value has been modified, you can now assign the environment variables:\n\n### Windows\n\n**Windows** supports shell scripting after some [manipulations](https://walterteng.com/using-zsh-on-windows) but it's way easier to \"*hard*\" write the environment variables by running [dcc.bat](.config/environment/windows/dcc.bat).\n\n![dcc.bat](docs/images/WindowsTerminal_TFypL9uhfG.png)\n\nTo check that everything is working:\n- Type \u003ckbd\u003e Win \u003c/kbd\u003e + \u003ckbd\u003e I \u003c/kbd\u003e to open the Windows Settings\n- Scroll to the bottom of the page and click `About`\n- Navigate to `Device Specifications` and press `Advanced System Settings`\n- In the `System Properties` dialogue box, hit `Environmental Variables`\n- The freshly created variables should be under `User`\n- Check is `SERVER_ROOT` has been defined with the right path\n\n### Unix\n\n**macOS** and **Linux** are both Unix based OS.\nThe simplest way is to migrate your shell to `Zsh` using `chsh -s $(which zsh)` in your terminal.\nYou can then symlink [.zshrc](.config/environment/unix/.zshrc) in your `$HOME` folder.\nTo check that everything is working, restart your terminal and type `echo $SERVER_ROOT`: it should output your mounted Cloud server path.\n\n\u003e [!WARNING]\n\u003e [.zshrc](.config/environment/unix/.zshrc) needs to be called exactly that way in `$HOME` to be picked up by the terminal: remove any `alias` or `symlink` added in the name.\n\n\u003e [!WARNING]\n\u003e The `Make Alias` command in macOS Finder won't work properly. You should use this service instead to create proper Symlinks: [Symbolic Linker](https://github.com/nickzman/symboliclinker/releases)\n\n\n\n\u003c!-- SOFTWARE --\u003e\n## Software\nThis setup automatically links the following DCCs, using this folder structure:\n\n``` bash\n.\n└── 📁 $SERVER_ROOT/\n    └── 📁 .config/\n        ├── 📁 environment\n        └── 📁 pipeline/\n            ├── 📁 houdini               ──\u003e Using $HSITE\n            ├── 📁 maya                  ──\u003e Using $MAYA_APP_DIR\n            ├── 📁 nuke                  ──\u003e Using $NUKE_PATH\n            ├── 📁 other\n            └── 📁 substance_painter\n                └── 📁 python            ──\u003e Using $SUBSTANCE_PAINTER_PLUGINS_PATH\n```\n\nThe DDCs can be launched normally on **Windows** if the [dcc.bat](.config/environment/windows/dcc.bat) file has been used to define the environment variables.\n\nFor **macOS** and **Linux**, you should start them from a terminal, in order to inherit the environment variables defined by [.zshrc](.config/environment/unix/.zshrc).\n\nYou can find an example script for Houdini just here: [houdini.sh](.config/environment/unix/houdini.sh).\n\nTo access it quickly, we also defined an alias for `houdini` pointing to that script in [aliases.sh](.config/environment/unix/aliases.sh). It will allow you to simply type this command to launch Houdini.\n\n### \u003cimg src=\"https://cdn.worldvectorlogo.com/logos/maya-2017.svg\" alt=\"Maya\" width=\"20\"/\u003e Maya\n\n*WIP*\n\u003e [!NOTE]\n\u003e See [Maya file path variables](https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=GUID-228CCA33-4AFE-4380-8C3D-18D23F7EAC72)\n\n``` bash\n.\n└── 📁 $SERVER_ROOT/\n    └── 📁 .config/\n        ├── 📁 environment\n        └── 📁 pipeline/\n            └── 📁 maya/\n                └── 📁 2023/\n                    ├── 📄 Maya.env\n                    ├── 📁 prefs\n                    ├── 📁 presets\n                    └── 📁 scripts\n```\n\n### \u003cimg src=\"https://cdn.worldvectorlogo.com/logos/substance-painter.svg\" alt=\"Substance\" width=\"20\"/\u003e Substance Painter\n\n*WIP*\n\u003e **Note**\u003cbr\u003e\n\u003e See [Substance Painter environment variables](https://substance3d.adobe.com/documentation/spdoc/environment-variables-172823292.html)\n\n``` bash\n.\n└── 📁 $SERVER_ROOT/\n    └── 📁 .config/\n        ├── 📁 environment\n        └── 📁 pipeline/\n            └── 📁 substance_painter/\n                └── 📁 python/\n                    └── 📄 plugin.py\n```\n\n### \u003cimg src=\"https://secure.meetupstatic.com/photos/event/b/9/f/6/600_494327606.jpeg\" alt=\"Houdini\" width=\"20\"/\u003e Houdini\n\nHoudini will automatically scan the folder defined by `$HSITE` for any folder being named `houdini\u003choudini version\u003e/\u003crecognized folder\u003e` such as `otls` or `packages` and load the content of those folders at Houdini startup.\n\n\u003e [!NOTE]\n\u003e See [Configuring Houdini](https://www.sidefx.com/docs/houdini/basics/config.html#path)\n\nYou can find two package file examples:\n- A generic [plugin_name.json](.config/pipeline/houdini/houdini19.5/packages/plugin_name.json)\n- An [arnold.json](.config/pipeline/houdini/houdini19.5/packages/arnold.json)\n\nBoth taking advantage of the environment variables posteriorly defined.\n\n``` bash\n.\n└── 📁 $SERVER_ROOT/\n    └── 📁 .config/\n        ├── 📁 environment\n        └── 📁 pipeline/\n            └── 📁 houdini/\n                └── 📁 houdini19.5/\n                    ├── 📁 desktop\n                    ├── 📁 otls/\n                    │   └── 📄 digital_asset.hda\n                    └── 📁 packages/\n                        └── 📄 package.json\n```\n\n### \u003cimg src=\"https://www.foundry.com/sites/default/files/2021-03/ICON_NUKE-rgb-yellow-01.png\" alt=\"Nuke\" width=\"20\"/\u003e Nuke\n\nNuke will scan the content of the folder defined by `NUKE_PATH`, searching for `init.py` and `menu.py`.\n\n\u003e [!NOTE]\n\u003e See [What are the init.py and menu.py files](https://support.foundry.com/hc/en-us/articles/360003811839-Q100490-What-are-the-init-py-and-menu-py-files)\n\nYou can find an [init.py](.config/pipeline/nuke/init.py) file example, showing how to load plugins on Nuke startup.\n\n``` bash\n.\n└── 📁 $SERVER_ROOT/\n    └── 📁 .config/\n        ├── 📁 environment\n        └── 📁 pipeline/\n            └── 📁 nuke/\n                ├── 📄 init.py\n                └── 📄 menu.py\n```\n\n\n\n\u003c!-- RESSOURCES --\u003e\n## Useful Resources and Tools\n- [HSITE](https://www.sidefx.com/docs/houdini/basics/config.html \"SideFX: $HSITE\")\n- [Packages](https://www.sidefx.com/docs/houdini/ref/plugins.html \"SideFX: Packages\")\n\n\n\n\u003c!-- CONTACT --\u003e\n## Contact\n\nProject Link: [Cloud VFX Server](https://github.com/healkeiser/cloud_vfx_server)\n\n\u003cp align='center'\u003e\n  \u003c!-- GitHub profile --\u003e\n  \u003ca href=\"https://github.com/healkeiser\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/healkeiser-181717?logo=github\u0026style=social\" alt=\"GitHub\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003c!-- LinkedIn --\u003e\n  \u003ca href=\"https://www.linkedin.com/in/valentin-beaumont\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Valentin%20Beaumont-0A66C2?logo=linkedin\u0026style=social\" alt=\"LinkedIn\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003c!-- Behance --\u003e\n  \u003ca href=\"https://www.behance.net/el1ven\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/el1ven-1769FF?logo=behance\u0026style=social\" alt=\"Behance\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003c!-- X --\u003e\n  \u003ca href=\"https://twitter.com/valentinbeaumon\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/@valentinbeaumon-1DA1F2?logo=x\u0026style=social\" alt=\"Twitter\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003c!-- Instagram --\u003e\n  \u003ca href=\"https://www.instagram.com/val.beaumontart\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/@val.beaumontart-E4405F?logo=instagram\u0026style=social\" alt=\"Instagram\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003c!-- Gumroad --\u003e\n  \u003ca href=\"https://healkeiser.gumroad.com/subscribe\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/healkeiser-36a9ae?logo=gumroad\u0026style=social\" alt=\"Gumroad\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003c!-- Gmail --\u003e\n  \u003ca href=\"mailto:valentin.onze@gmail.com\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/valentin.onze@gmail.com-D14836?logo=gmail\u0026style=social\" alt=\"Email\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003c!-- Buy me a coffee --\u003e\n  \u003ca href=\"https://www.buymeacoffee.com/healkeiser\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Buy Me A Coffee-FFDD00?\u0026logo=buy-me-a-coffee\u0026logoColor=black\" alt=\"Buy Me A Coffee\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhealkeiser%2Ffxserver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhealkeiser%2Ffxserver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhealkeiser%2Ffxserver/lists"}