πŸ“… Simple alternative to Doodle polls and scheduling (Python 3, Django 3, JavaScript)





GitHub Stars



Last Commit

8d ago










.. image:: https://github.com/hartwork/jawanndenn/workflows/Build%20and%20test%20using%20Docker/badge.svg :target: https://github.com/hartwork/jawanndenn/actions

What is jawanndenn?

.. figure:: https://raw.githubusercontent.com/hartwork/jawanndenn/master/jawanndenn-setup.png :alt: Screenshot of poll creation in jawanndenn

jawanndenn is a simple web application to schedule meetings and run polls, a libre alternative to Doodle. It is using the following technology:

  • Python

    • Docker Compose_
    • Django_
      • Django Extensions_
      • Django Ratelimit + msgpack-python
      • django-redis_
      • Django REST framework_
      • Factory Boy_
    • Gunicorn + gunicorn-color-logger
    • parameterized_
    • pre-commit_
    • python-rapidjson_
    • sentry-python_
    • wait-for-it_
  • JavaScript / CSS / Fonts

    • Google Webfonts Helper_
    • jQuery_
    • jQuery noty_
    • Materialize_
    • Roboto_
  • Storage

    • PostgreSQL_
    • Redis_
    • SQLite_
  • Scheduling

    • Supercronic_

jawanndenn is libre software developed by Sebastian Pipping. The server code is licensed under the GNU Affero GPL license version 3 or later whereas the client code is licensed under the GNU GPL license version 3 or later.

Please report bugs and let me know if you like it.

Poll Setup Format

The textarea titled "Setup (JSON)" uses a simple JSON_-based format that knows the following keys:

  • equal_width β€” a bool to control whether all options are pumped up to the same width (true or false) to counter potential voter bias
  • lifetime β€” duration after which this poll will be deleted; can be "week" or "month"; an enum-like string
  • options β€” a list of strings, one for each option; supports Markdown_-like syntax for: bold, italic, inline code
  • title β€” the title or headline of the poll to run; supports Markdown_-like syntax for: bold, italic, inline code


To install the latest release without cloning the Git repository:


# pip3 install jawanndenn --user

To install from a Git clone:


# ./setup.py install --user

Deployment with docker-compose

Create a simple file .env like this one:



Make sure to use your own values!

You can then build and run a docker image using docker-compose up --build.

PostgreSQL data is saved to ~/.jawanndenn-docker-pgdata/ on the host system. The app is served on localhost:54080.

Command line usage

When installed, invocation is as simple as


# jawanndenn

During development, you may want to run jawanndenn from the Git clone using


# PYTHONPATH=. python3 -m jawanndenn --debug

Currently supported arguments are:


# jawanndenn --help
usage: jawanndenn [-h] [--debug] [--host HOST] [--port PORT]
                  [--url-prefix PATH] [--database-sqlite3 FILE]
                  [--django-secret-key-file FILE] [--max-polls COUNT]
                  [--max-votes-per-poll COUNT] [--dumpdata]
                  [--loaddata FILE.json]

optional arguments:
  -h, --help            show this help message and exit
  --debug               Enable debug mode (default: disabled)
  --host HOST           Hostname or IP address to listen at (default:
  --port PORT           Port to listen at (default: 8080)
  --url-prefix PATH     Path to prepend to URLs (default: "")
  --database-sqlite3 FILE
                        File to write the database to (default:
  --django-secret-key-file FILE
                        File to use for Django secret key data (default:

limit configuration:
  --max-polls COUNT     Maximum number of polls total (default: 1000)
  --max-votes-per-poll COUNT
                        Maximum number of votes per poll (default: 40)

data import/export arguments:
  --dumpdata            Dump a JSON export of the database to standard output,
                        then quit.
  --loaddata FILE.json  Load a JSON export of the database from FILE.json,
                        then quit.

Migrating data from jawanndenn 1.x to 2.x

Migration takes four steps:

  1. Update to the latest version of jawanndenn 1.x, e.g. by running: pip2 install --upgrade 'jawanndenn<2'; the JSON data export was first introduced with release 1.6.3.

  2. Export existing polls:

    a) If you're using the commend line app: python2 -m jawanndenn --dumpdata > dump.json

    b) If you're using docker-compose: docker-compose run -T jawanndenn --database-pickle /data/polls.pickle --dumpdata > dump.json

  3. Deploy latest jawanndenn 2.x somewhere (as described above) or just pip3 install 'jawanndenn>=2' it somewhere

  4. Import the JSON dump created in step (2):

    a) If you're using the commend line app: python3 -m jawanndenn --loaddata dump.json

    b) If you're using docker-compose: docker-compose run -T jawanndenn sh -c 'cat > /tmp/dump.json && DJANGO_SETTINGS_MODULE=jawanndenn.settings python3 -m django loaddata /tmp/dump.json' < dump.json


  • Libre software to host yourself, unlike Doodle

  • More simplistic, sexy and/or fun than libre alternatives_, in alphabetic order:

    • Bitpoll (ex. Dudel)
    • Croodle_
    • Dudle_
    • (Drupal Date picker formatter_)
    • (Foodle (discontinued; on GitHub, ex. DFN scheduler, ex. DFN Terminplaner+))
    • Framadata (Sources, ex. OpenSondage, ex. STUdS)
    • Nextcloud Polls_
    • Noodle_
    • Nuages_
    • Pleft_
    • Rallly_
    • RDVz_
  • Keep things simple, usable, maintainable

  • Support invocation from the command line, e.g. for spontaneous polls in a LAN

  • Have security in mind

Please check out the list of upcoming features_.


  • Use of heavy frontend frameworks: building blocks only
  • Read availability from calendars


Special thanks to Arne Maier (@KordonDev_) for reporting an XSS vulnerability, responsibly.

.. Python: https://www.python.org/ .. _Docker Compose: https://docs.docker.com/compose/ .. _Django: https://www.djangoproject.com/ .. _Django Extensions: https://github.com/django-extensions/django-extensions .. _Django Ratelimit: https://github.com/jsocol/django-ratelimit .. _msgpack-python: https://github.com/msgpack/msgpack-python .. _django-redis: https://github.com/niwinz/django-redis .. _Django REST framework: https://www.django-rest-framework.org/ .. _Factory Boy: https://factoryboy.readthedocs.io/en/latest/ .. _Gunicorn: https://gunicorn.org/ .. _gunicorn-color-logger: https://github.com/swistakm/gunicorn-color-logger .. _parameterized: https://github.com/wolever/parameterized .. _pre-commit: https://pre-commit.com/ .. _python-rapidjson: https://github.com/python-rapidjson/python-rapidjson .. _sentry-python: https://github.com/getsentry/sentry-python .. _wait-for-it: https://github.com/clarketm/wait-for-it .. _Google Webfonts Helper: https://google-webfonts-helper.herokuapp.com/ .. _jQuery: http://jquery.com/ .. _jQuery noty: http://ned.im/noty/#/about .. _Materialize: http://materializecss.com/ .. _Roboto: https://fonts.google.com/specimen/Roboto .. _PostgreSQL: https://www.postgresql.org/ .. _Redis: https://redis.io/ .. _SQLite: https://www.sqlite.org/index.html .. _Supercronic: https://github.com/aptible/supercronic .. _libre software: https://www.gnu.org/philosophy/free-sw.en.html .. _Sebastian Pipping: https://blog.hartwork.org/ .. _GNU Affero GPL license: https://www.gnu.org/licenses/agpl.en.html .. _GNU GPL license: https://www.gnu.org/licenses/gpl.html .. _report bugs: https://github.com/hartwork/jawanndenn/issues .. _like: mailto:sebastian@pipping.org .. _JSON: https://www.json.org/ .. _Markdown: https://commonmark.org/help/ .. _the related documentation of Django: https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/modwsgi/ .. _file a support ticket: https://github.com/hartwork/jawanndenn/issues/new .. _drop me a mail: mailto:sebastian@pipping.org .. _libre alternatives: http://alternativeto.net/software/doodle/?license=opensource .. _Bitpoll: https://github.com/fsinfuhh/Bitpoll .. _Croodle: https://github.com/jelhan/croodle .. _Dudel: https://github.com/opatut/dudel .. _Pleft: https://github.com/sander/pleft .. _Framadata: https://framadate.org/ .. _Sources: https://git.framasoft.org/framasoft/framadate .. _OpenSondage: https://github.com/leblanc-simon/OpenSondage .. _STUdS: http://studs.unistra.fr/ .. _Foodle: https://foodl.org/ .. _on GitHub: https://github.com/UNINETT/Foodle .. _DFN scheduler: https://terminplaner.dfn.de/ .. _DFN Terminplaner+: https://terminplaner2.dfn.de/ .. _Dudle: https://dudle.inf.tu-dresden.de/ .. _Nuages: https://nuages.domainepublic.net/ .. _RDVz: https://sourceforge.net/projects/rdvz/ .. _Drupal Date picker formatter: http://alternativeto.net/software/date-picker-formatter-dudel-for-drupal/?license=opensource .. _Nextcloud Polls: https://github.com/nextcloud/polls .. _Noodle: https://github.com/kmerz/noodle .. _Rallly: https://github.com/lukevella/Rallly .. _list of upcoming features: https://github.com/hartwork/jawanndenn/issues/created_by/hartwork .. @KordonDev: https://github.com/KordonDev

Rate & Review

Great Documentation0
Easy to Use0
Highly Customizable0
Bleeding Edge0
Responsive Maintainers0
Poor Documentation0
Hard to Use0
Unwelcoming Community0