Installing Kardboard

Settings & Configuration

Much of kardboard can be controlled via settings. The easiest way control these is add an environment variable, KARDBOARD_SETTINGS, that is a path to a .cfg file containing these settings.

export KARDBOARD_SETTINGS=/opt/www/kardboardve/etc/kardboard-prod.conf

The config file should be in a format compatible with Flask’s file-based configuration standard.

Flask settings

Kardboard is built atop Flask and as such all of its built in options can be adjusted in your configuration file.

Kardboard settings

All the necessary settings to get a basic kardboard instance up and running are contained in kardboard/


Default: 'simple' Specifies which type of caching object to use. This is an import string that will be imported and instantiated. It is assumed that the import object is a function that will return a cache object that adheres to the werkzeug cache API.

For werkzeug.contrib.cache objects, you do not need to specify the entire import string, just one of the following names.

Built-in cache types:

  • null: NullCache
  • simple: SimpleCache
  • memcached: MemcachedCache
  • gaememcached: GAEMemcachedCache
  • filesystem: FileSystemCache


Default: [] (Empty list)

Optional list to unpack and pass during the cache class instantiation.


Default: {} (Empty dictionary)

Optional dictionary to pass during the cache class instantiation.


Default: 3600

The default timeout that is used if no timeout is specified. Unit of time is seconds.


Default: (No default)

The maximum number of items the cache will store before it starts deleting some. Used only for SimpleCache and FileSystemCache


Default: (No default)

A prefix that is added before all keys. This makes it possible to use the same memcached server for different apps. Used only for MemcachedCache and GAEMemcachedCache.


Default: (No default)

A list or a tuple of server addresses. Used only for MemcachedCache


Default: (No default)

Directory to store cache. Used only for FileSystemCache.


Default: [ 'Bug', 'Feature', 'Improvement',]

The list of categories users should be able to assign cards to. Example:

CARD_CATEGORIES = [ 'CMS', 'iPhone', 'Android', ]
CARD_CATEGORIES = [ 'Project X', 'Project Y', 'Project Z']


Default: [ 'Todo', 'Doing', 'Done', ]

The list of states, or columns, that a card could be in. The last state should represent whatever Done means to your team.


When a user sets a Done date for a card, it’s automatically set to the last state in your CARD_STATES setting.


Default: [  ('Team 1', ), ('Team 2', 10), ]

The list of teams, and optionally their work-in-progress limits working on cards. This allows you to have “mini-boards” for each team/person while still seeing a “meta-board” that shows you cards across all states from all teams.


Default: No default

A Python two-element tuple containing the lower and upper bounds of a cycle time goal for the board. Used to highlight cards in the range and beyond the range.:



Default: 'INFO'

See Celery configuration documentation for details


Default: 'redis'

See Celery configuration documentation for details


Default: 'redis'

See Celery configuration documentation for details


Default: ('kardboard.tasks', )

See Celery configuration documentation for details



    # How often should we look for old tickets and queue them for updates
    'load-update-queue': {
        'task': 'tasks.queue_updates',
        'schedule': crontab(minute="*/3"),
    # How often should we update all the Person
    # objects to make sure they reflect reality, due to deleted cards
    # or people being removed from a card
    'update_person': {
        'task': 'tasks.normalize_people',
        'schedule': crontab(minute="*/30"),
    # How often (probably nighly) should we update daily records for the past
    # 365 days
    'calc-daily-records-year': {
        'task': 'tasks.update_daily_records',
        'schedule': crontab(minute=1, hour=0),
        'args': (365, ),
    # How often should we update daily records for the past
    # 7 days
    'calc-daily-records-week': {
        'task': 'tasks.update_daily_records',
        'schedule': crontab(minute="*/5"),
        'args': (14, ),

If you’re using a TICKET_HELPER then you probably don’t want to adjust this setting. The crontab(minute=”*/3”) determines how often kardboard should check for out of date cards. See TICKET_UPDATE_THRESHOLD for more.

See Celery configuration documentation for details


Default: (No default)

If set, it will output an appropriate <meta> tag so you may claim your site on Google Webmaster Tools.

GOOGLE_SITE_VERIFICATION = 'someverylongstringgoeshere'


Default: (No default)

If set, it will output an appropriate <script> tag for Google Analytics.

GOOGLE_ANALYTICS = 'UA-11111111-2'


Default: (No default)

A two item tuple consisting of a username and password that has at least read-only access to any projects and tickets you’ll be enterting into kardboard.

JIRA_CREDENTIALS = ('jbluth', 'theresalwaysmoneyinthebananastand')


Default: (No default)

If you set TICKET_HELPER to use the built-in JIRAHelper then you’ll want to set this to your JIRA installation’s SOAP end point.



Default: (No default)

The level of log events that should be output to LOG_FILE.

Possible settings are:

  • 'debug'
  • 'info'
  • 'warning'
  • 'critical'
  • 'error'


Default: (No default)

The file that log events should be written too.

LOG_FILE = '/var/logs/kardboard-app.log'


The LOG_FILE file will be automatically rotated every ~100k and up to 3 previous ~100k chunks will be kept.


Default: 'kardboard'

The name of the database you want to store your data in.


Default: 27017

The port MongoDB is running on.


Default: 'yougonnawannachangethis'

A secret key for this particular kardboard instance. Used to provide a seed in secret-key hashing algorithms. Set this to a random string – the longer, the better.

As the default implies, you’re going to want to change this.


Default: False

If True, then add/edit/delete views become protected by authentication tied to your TICKET_HELPER instance.

So for example if you had the following::
TICKET_HELPER = ‘kardboard.tickethelpers.JIRAHelper’ TICKET_AUTH = True

Then users would be required to login with their JIRA credentials.


Default: 'kardboard.tickethelpers.NullHelper'

A Python class that will fetch additional information from a ticketing system (JIRA, Redmine, Pivotal Tracker, e.g.) about a card.

The only provider shipped with kardboard is 'kardboard.tickethelpers.JIRAHelper'.


Default: 60*5 (seconds)

The minimum length of time in seconds before a individual card has its data updated from its ticketing system of record.

Every 90 seconds (unless changed in CELERYBEAT_SCHEDULE), kardboard will scan for cards older than TICKET_UPDATE_THRESHOLD and fetch data on them.