Production Asset Management System
Python Other
Failed to load latest commit information.
alembic * **Fix:** Fixed the ``downgrade()`` function in alembic migration sc… May 27, 2017
docs * **New:** Switched from ``nose`` + ``unittest`` to ``pytest`` as the… May 24, 2017
examples * **Update:** Updated the ``stalker.config.Config.database_engine_set… Mar 13, 2017
stalker finalizing the 0.2.21 release May 30, 2017
tests * **Fix:** Fixed ``stalker.db.check_alembic_version()`` function to i… May 30, 2017
.codeclimate.yml * **Fix:** Removed unnecessary function from ```` that … May 26, 2017
.gitignore Opps wrong version number! May 24, 2017
.travis.yml ok it seems that TravisCI doesn't support Python versions 3.0, 3.1 or… May 30, 2017
CHANGELOG.rst finalizing the 0.2.21 release May 30, 2017
CHANGELOG_OLD.rst * **New:** Switched from ``nose`` + ``unittest`` to ``pytest`` as the… May 24, 2017
COPYING * updated license text Apr 4, 2013
COPYING.LESSER * updated license text Apr 4, 2013
Dockerfile-py2.7 Embed into Dockerfiles Feb 14, 2017
Dockerfile-py3.5 Embed into Dockerfiles Feb 14, 2017
INSTALL v0.1.1.a1: Jan 13, 2011 * **New:** Switched from ``nose`` + ``unittest`` to ``pytest`` as the… May 24, 2017
README.rst * **New:** Added ``DateTimeUTC`` type decorator and ``GenericDateTime… May 26, 2017
TODO.rst * **New:** Switched from ``nose`` + ``unittest`` to ``pytest`` as the… May 24, 2017
alembic.ini updated alembic.ini Feb 10, 2015
appveyor.yml * **New:** Switched from ``nose`` + ``unittest`` to ``pytest`` as the… May 24, 2017
create_sdist Executive bit changes due to moving from Linux to Windows Nov 28, 2016
create_sdist.cmd * **New:** Created ``create_sdist.cmd`` and ``upload_to_pypi.cmd`` fo… Jun 20, 2016
doTests * **Update:** Updated the ``stalker.config.Config.database_engine_set… Mar 13, 2017
doTests.bat * **Update:** Updated the ``stalker.config.Config.database_engine_set… Mar 13, 2017
setup.cfg Add universal wheel Mar 13, 2017 * **Fix:** Fixed ``.coverage`` file generation on TravisCI. May 26, 2017
upload_to_pypi.cmd * **New:** Created ``create_sdist.cmd`` and ``upload_to_pypi.cmd`` fo… Jun 20, 2016


Travis-CI Build Status License Supported Python versions PyPI Version Wheel Support


Stalker is an Open Source Production Asset Management (ProdAM) Library designed specifically for Animation and VFX Studios but can be used for any kind of projects. Stalker is licensed under LGPL v3.


Stalker has the following features:

  • Designed for Animation and VFX Studios.
  • Platform independent.
  • Default installation handles nearly all the asset and project management needs of an animation and vfx studio.
  • Customizable with configuration scripts.
  • Customizable object model (Stalker Object Model - SOM).
  • Uses TaskJuggler as the project planing and tracking backend.
  • Mainly developed for PostgreSQL in mind but SQLite3 is also supported.
  • Can be connected to all the major 3D animation packages like Maya, Houdini, Nuke, Fusion, Softimage, Blender etc. and any application that has a Python API. And with applications like Adobe Photoshop which does not have a direct Python API but supports win32com or comtypes.
  • Mainly developed for Python 3.0+ and Python 2.7 is fully supported.
  • Developed with TDD practices.

Stalker is build over these other OpenSource projects:

  • Python
  • SQLAlchemy and Alembic
  • Jinja2
  • TaskJuggler

Stalker as a library has no graphical UI, it is a python library that gives you the ability to build your pipeline on top of it. There are other python packages like the Open Source Pyramid Web Application Stalker Pyramid and the Open Source pipeline library Anima which has PyQt/PySide/PySide2 UIs for applications like Maya, Nuke, Houdini, Fusion, Photoshop etc.



pip install stalker


Let's play with Stalker.

Initialize the database and fill with some default data:

from stalker import db

Create a User:

from stalker.db.session import DBSession
from stalker import User
me = User(
    name='Erkan Ozgur Yilmaz',

# Save the user to database

Create a Repository for project files to be saved under:

from stalker import Repository
repo = Repository(
    name='Commercial Projects Repository',

Create a FilenameTemplate (to be used as file naming convention):

from stalker import FilenameTemplate

task_template = FilenameTemplate(
    name='Standard Task Filename Template',
    target_entity_type='Task',  # This is for files saved for Tasks
         '{%- for parent_task in parent_tasks -%}'
         '{%- endfor -%}',  # This is Jinja2 template code

Create a Structure that uses this template:

from stalker import Structure
standard_folder_structure = Structure(
    name='Standard Project Folder Structure',
    custom_template='{{project.code}}/References'  # If you need extra folders

Now create a Project that uses this structure and will be placed under the repository:

from stalker import Project
new_project = Project(
    name='Test Project',
    repositories=[repo],  # if you have more than one repository you can do it

Define the project resolution:

from stalker import ImageFormat
hd1080 = ImageFormat(

Set the project resolution:

new_project.image_format = hd1080

# Save the project and all the other data it is connected to it

Create Assets, Shots and other Tasks:

from stalker import Task, Asset, Shot, Type

# define Character asset type
char_type = Type(name='Character', code='CHAR', target_entity_type='Asset')

character1 = Asset(
    name='Character 1',

# Save the Asset

model = Task(

rigging = Task(
    depends=[model],  # For project management, define that Rig can not start
                      # before Model ends.

# Save the new tasks[model, rigging])

# A shot and some tasks for it
shot = Shot(

# Save the Shot

animation = Task(

lighting = Task(
    depends=[animation], # Lighting can not start before Animation ends,
    schedule_unit='d',  # The task expected to take 1 day to complete
)[animation, lighting])

Let's create versions for the Animation task.

from stalker import Version

new_version = Version(task=animation)
new_version.update_paths()  # to render the naming convention template
new_version.extension = '.ma'  # let's say that we have created under Maya

Let's check how the version path is rendered:

assert new_version.absolute_full_path == \
assert new_version.version_number == 1

Create a new version and check that the version number increased automatically:

new_version2 = Version(task=animation)
new_version2.update_paths()  # to render the naming convention template
new_version2.extension = '.ma'  # let's say that we have created under Maya

assert new_version2.version_number == 2

See more detailed example in API Tutorial.