InfoMark is a scalable, modern and open-source online course management system supporting auto-testing of programming assignments scaling to thousands of students.

Uploaded solutions to programming assignments are tested automatically. TAs can grade these solutions online. The platform supports multiple courses each with multiple exercise groups, slides and course material.

For more information about writing such tests see our Tutor’s Guide. On how to use the system please refer to the Administrator’s Guide


To locally test the system we suggest to run the following commands:

cd /tmp && export VERSION=`curl -s | grep -oP '"tag_name": "\K(.*)(?=")'`
wget -qO-${VERSION}/infomark.tar.gz | tar -xzv

cd infomark
cp .infomark.example.yml .infomark.yml
cp docker-compose.example.yml docker-compose.yml

# configure paths for backend
sed -i 's/\/var\/www\/infomark-staging\/app/\/tmp\/infomark/g' /tmp/infomark/.infomark.yml

# start dependencies (redis, postgresql)
sudo docker-compose up -d

# create initial database
cd database
PGPASSWORD=pass psql -h -U user -p 5433 -d db -f schema.sql
PGPASSWORD=pass psql -h -U user -p 5433 -d db -f migrations/0.0.1alpha14.sql
PGPASSWORD=pass psql -h -U user -p 5433 -d db -f migrations/0.0.1alpha21.sql
cd ..

# start a single background worker
# sudo is required for talking to docker
sudo ./infomark work -n 1
# start Restful JSON web server
./infomark serve

After registration in the web-interface the email address needs to be confirmed. This can be done manually over the console. Further, you might want to upgrade the permission to root:

# confirm email
./infomark console user confirm

# find the id of a user
./infomark console user find

    1 YourFirstname YourLastname

# add the user with id "1" to admins.
./infomark console admin add 1

In a production setup we recommend to use NGINX as a proxy in front of InfoMark to increase security, performance and the ability to monitor and shape traffic connecting to InfoMark. See the Administrator Guide for different roles.

Design Choices

InfoMark is designed to run within IT-controlled private environments in public clouds on your own servers to be compliant with any data privacy issues providing data sovereignty.

It is based on several design choices:

  • Every part must be open-source, scalable and robust.
  • The backend must be easy to deploy and to maintain.
  • The frontend must be light-weight, fast and responsive.
  • Auto-Testing of programming assignments must be language-agnostic, isolated and safe.
  • All intense operations must be asynchronously scheduled.

System Overview

This section provides a brief overview of the InfoMark system including a description of its parts. We use continuous-integration tests to ensure the implementation can be built and passes all tests at any point.

At its core, InfoMark is a single-compiled Go binary that is exposed as a Restful JSON web server with Javascript clients. See the Restful API docs (created using Swagger) here.


Build Status Source

The backend acts as a Restful JSON web server and is written in Go. All dependencies are encapsulated in a docker-compose configuration file. The dependencies are:

  • We use a PostgreSQL database to store all dynamic data.
  • Computationally intensive operations are scheduled and balanced across several background workers asynchronous via RabbitMQ.
  • It uses Redis as a light-weight key-value memory store.
  • Docker is used as a light-weight sandbox to run auto-tests of solutions to programming assignments in an isolated environment.

Each exercise task can be linked to a docker-image and a zip file containing the test code to support testing. See the Administrator Guide for more details.


Part of the backend are workers, which are separate processes that handle the auto-testing of uploads. These worker can be distributed across multiple machines. We recommend using one worker process for 100 students. The workers can be added or removed at any time. Infomark uses AMPQ as a message broker. Each submission will be held in a queue and each worker will execute one job concurrently to avoid too much system load. Our recommendation is one worker per available CPU core.

The used amount of memory per submission can be configured. Memory-swapping is deactivated.


To avoid manual interaction with the database InfoMark provides a console to run several commands like enrolling a student into a course/group, set the role of a user.

./infomark console user find jane.doe

42 Jane Doe

./infomark console user confirm

      infomark console user confirm [email] [flags]

./infomark console user confirm

./infomark console course enroll

      infomark console course enroll [courseID] [userID] [role] [flags]

# roles: student (0), tutor/ta (1), admin (2)
./infomark console course enroll 1 42 2


Build Status Source

The frontend is written in Elm, a functional frontend language which compiles to JavaScript. The application is just a single page application (SPA) which uses fragments for routing. So the server only needs to distribute the static HTML page and the REST API which is used to interact with the server. The API is defined here using Swagger.


This system was developed in the computer graphics groups of the University of Tübingen because there are no comparable systems that meet our requirements.


InfoMark has the following minimal requirements: - one core for server infomark serve (1GB RAM) - one core for each backgound worker infomark work (depending on your docker-image size for the programming assignments)

You might want to sp