A lightweight task viewer and status manager for artists, integrated with Kitsu via gazu.
Runs inside Nuke, Maya, Houdini and standalone Python — a single file, one config.
Author: Eduardo Brandao — eduardo@bosonpost.com.br
- View assigned tasks grouped into configurable tabs (TODO, RETAKE, PUBLISH…)
- Sequence name on each card — identify shots across multiple sequences
- Change task status directly from the panel with an optional comment
- Due-date badge per card: OVERDUE / TODAY / TOMORROW / Xd
- Days-open counter showing how long a task has been in its current status
- Comment history with author name and date
- Click any task to open it in the Kitsu web interface
- Auto-login via environment variables
- Fully configurable via a JSON file — no code changes needed
| Dependency | How to get it |
|---|---|
| gazu | pip install gazu or copy the gazu/ folder next to the scripts |
| requests | usually bundled with gazu; pip install requests otherwise |
| PySide2, PySide6 or PySide (Nuke 10) | provided by your DCC; install PySide2 for standalone |
your_pipeline_folder/
├── kitsu_task_panel.py
├── kitsu_task_launch.py
├── kitsu_task_panel_config.json ← copy from .example and edit
├── kitsu_task_panel_config.json.example
├── kitsu_task_context_detection.py
├── gazu/ ← gazu library folder (or installed via pip)
└── requests/ ← requests library folder (or installed via pip)
Tip: if
gazuandrequestsare installed system-wide viapip, you can leave out those folders and remove them fromsys_pathsin the config.
Copy kitsu_task_panel_config.json.example to kitsu_task_panel_config.json and fill in your values:
{
"kitsu_host": "https://your-kitsu-server.com/api",
"kitsu_base_url": "https://your-kitsu-server.com",
"env_user_var": "KITSU_USER",
"env_pass_var": "KITSU_PASS",
"sys_paths": [
"/path/to/your_pipeline_folder",
"/path/to/your_pipeline_folder/gazu",
"/path/to/your_pipeline_folder/requests"
],
"tabs": {
"TODO": {
"label": "TODO",
"statuses": ["todo", "work in progress", "wip"],
"allowed_status": ["Work In Progress"],
"badge": "#4CAF50", "border": "#2E5E2E", "bg": "#1A221A"
},
"RETAKE": {
"label": "RETAKE",
"statuses": ["retake"],
"allowed_status": ["Work In Progress"],
"badge": "#E53935", "border": "#5E2E2E", "bg": "#221A1A"
},
"PUBLISH": {
"label": "PUBLISH",
"statuses": ["to publish", "publish"],
"allowed_status": ["Published"],
"badge": "#2196F3", "border": "#1A3055", "bg": "#1A1E28"
}
}
}statuses — Kitsu status names (case-insensitive) that should appear in this tab.
allowed_status — status names shown in the change-status dropdown. Must match your Kitsu server exactly (check Settings → Task Statuses in Kitsu).
| Variable | Value |
|---|---|
KITSU_USER |
your Kitsu email |
KITSU_PASS |
your Kitsu password |
Set them in your OS, render farm or DCC launch script. If they are not set, the panel shows a login dialog on startup.
The snippet below works in Nuke, Maya, Houdini without modification. Only the first sys.path.insert line needs to point to your pipeline folder.
import sys
sys.path.insert(0, "/path/to/your_pipeline_folder")
import kitsu_task_launch, importlib
importlib.reload(kitsu_task_launch)
kitsu_task_launch.launch()Nuke — paste into a Python Toolbar button.
Maya — paste into a Shelf button (Python tab).
Houdini — create a Shelf tool, paste into the Script tab.
Add a detection block before return "standalone":
try:
import your_dcc_module
return "your_dcc"
except ImportError:
passFind _get_main_dcc_window() and add a branch:
elif _DCC == "your_dcc":
try:
import your_dcc_module
return your_dcc_module.qt.mainWindow()
except Exception as e:
print("KitsuTaskPanel: could not get your_dcc main window: " + str(e))The panel will parent itself to that window, or float freely if you return None.
| DCC | Code |
|---|---|
| Houdini | hou.qt.mainWindow() |
| Maya | shiboken2.wrapInstance(int(OpenMayaUI.MQtUtil.mainWindow()), QWidget) |
| Nuke | iterate app.topLevelWidgets() for Foundry::UI::DockMainWindow |
| Standalone | None |
Event loop: never call
app.exec()inside a DCC. The panel only calls it when_DCC == "standalone".
| Key | Type | Description |
|---|---|---|
kitsu_host |
string | Full API URL, e.g. https://your-server.com/api |
kitsu_base_url |
string | Base URL without /api, used for browser links |
env_user_var |
string | OS env var name for the login email (default: KITSU_USER) |
env_pass_var |
string | OS env var name for the password (default: KITSU_PASS) |
sys_paths |
list | Paths prepended to sys.path before importing gazu |
tabs |
object | Tab definitions — see below |
| Key | Type | Description |
|---|---|---|
label |
string | Text shown on the tab button |
statuses |
list | Kitsu status names (case-insensitive) that belong to this tab |
allowed_status |
list | Status names shown in the change-status dropdown |
badge |
hex color | Accent color (left bar + tab indicator) |
border |
hex color | Card border color |
bg |
hex color | Card background color |
| File | Purpose |
|---|---|
kitsu_task_panel.py |
Main UI and logic |
kitsu_task_launch.py |
Entry point — use this in your shelf button |
kitsu_task_context_detection.py |
Detects active DCC — shared with Kitsu Publisher |
kitsu_task_panel_config.json |
Your studio config (excluded from git) |
kitsu_task_panel_config.json.example |
Template to copy and edit |
MIT — free to use, modify and distribute.