Version history

For each version below, this page lists that version’s most important changes, or any minor changes that I considered important to know about when upgrading.

Version 2.2

  • support for the otreezip format (otree zip, otree unzip, otree runzip)

  • MTurk: in sandbox mode, don’t grant qualifications or check qualification requirements

  • MTurk: before paying participants, check if there is adequate account balance.

  • “next button” is disabled after clicking, to prevent congesting the server with duplicate page loads.

  • Upgrade to the latest version of Sentry

  • Form validation methods should go on the model, not the page. See Dynamic form field validation

  • app_after_this_page

  • Various performance and stability improvements

Version 2.1

  • oTree now raises an error if you use an undefined variable in your template. This will help catch typos like {{ Player.payoff }} or {% if player.id_in_gruop %}. This means that apps that previously worked may now get a template error (previously, it failed silently). If you can’t remove the offending variable, you can apply the |default filter, like: {{ my_undefined_variable|default:None }}

  • oTree now warns you if you use an invalid attribute on a Page/WaitPage. You can disable this by setting _allow_custom_attributes=True on the page class. See here for more details.

  • CSV/Excel data export is done asynchronously, which will fix timeout issues for large files on Heroku.

  • Better performance, especially for “Monitor” and “Data” tab in admin interface

Version 2.0

See oTree 2.0.

Version 1.4

Here are the main changes in 1.4:

  • MTurk: improved stability, and upgrade from boto2 to boto3.

  • group_by_arrival_time now filters out participants who have disconnected or dropped out. See group_by_arrival_time.

  • Upgrade timeout JavaScript library (jQuery countdown)

To install, run this:

pip3 install -U otree-core
otree resetdb

Version 1.3

Here are the main changes in 1.3:

  • get_timeout_seconds lets you set timeouts dynamically, and create timeouts that span multiple pages or rounds. See get_timeout_seconds.

  • get_players_for_group lets you control how group_by_arrival_time assigns players to groups. See get_players_for_group()

  • Bots: you can now simulate & test a page timeout. See Testing timeouts.

  • DEMO_PAGE_TITLE setting added. See DEMO_PAGE_TITLE.

To install, run this:

pip3 install -U otree-core
otree resetdb

Please send feedback to

Version 1.2

  • If a page is submitted automatically by a timeout, oTree will attempt to save the incomplete form. See Forms submitted by timeout

  • The |json filter was added, as an alternative to safe_json.

Version 1.1

Here are the changes in oTree-core 1.1:

Version 1.0

Here are the main changes in 1.0:

  • You can configure sessions in the admin interface (modifying SESSION_CONFIGS parameters without changing the source code). See Configure sessions.

  • Performance improvements

  • The default for the payoff field is now 0, not None. (Make sure your code doesn’t rely on payoff being None.)

Version 0.8

The bot system has been overhauled, and there are some changes to the bot API. See the notes here.

Browser bots now work together with otree runserver.

Version 0.7

Version 0.7 beta is available.

The main new feature is browser bots. There are also some changes to the admin UI.

Version 0.6

Version 0.6 is available. You can install it as usual:

pip3 install -U otree-core
otree resetdb

Here are some changes:

  • The rooms feature is more fully developed and functional.

  • Various improvements to the admin interface

  • If you update a template you don’t have to reload the server

  • Chinese now uses the proper zh-hans language code

  • runprodserver now defaults to port 8000 (before was 5000)