GanttMeister

Introduction

Have you ever prepared a non-trivial meal and had to plan when to execute which task? (Like: The meatballs can be fried while the potatoes are cooking, but peeling the potatoes has to precede the cooking. But should I first peel the potatoes, or mix the salad, or prepare the meatballs? And when will each of these tasks have to be started such that the meal can be served at 1 o'clock p.m.?) At the latest when you find yourself making such a plan on a sheet of paper — then you should use GanttMeister.

GanttMeister knows tasks and projects. Tasks have a name and relative start and end times, as well as an optional attribute "exclusion group", consisting of just a Unicode character, like '1' or '🔪', while a project is basically a set of tasks. Tasks can be related: If a task t is required to precede a task u, we say that u depends on t. In this sense a project is not just a set, but an oriented graph, with the tasks as nodes and the dependencies as edges.

Two tasks are said to overlap if one of them starts before the other one ends, but ends after the other one starts.

GanttMeister projects always satisfy the following conditions:

  1. Tasks with the same exclusion group attribute do not overlap.
  2. The task dependency graph does not contain an oriented cycle.
  3. If a task u depends on a task t, then t does not end after the start of u.
The duration of a project is the time from the earliest task start until the latest task end.

Installation

The only known way of obtaining GanttMeister is to download the disk image.

By default, GanttMeister tries to check on application start whether a newer version is available at https://www.jakob-spies.de/GanttMeister/. If so, it will ask you if you want an automatic update. If so, GanttMeister starts a helper application, SoftwareUpdater, which downloads https://www.jakob-spies.de/GanttMeister/GanttMeister.zip" (note that this is a TLS connection where the web server's identity is verified), decompresses it, verifies the code signature, quits the running old GanttMeister, and replaces it with the downloaded one.

The automatic version check can be switched off in the Preferences dialog.

Usage

Features and properties not explained in this documentation are regarded as obvious or irrelevant. Actually, most of the functionality will become clear by staring at the following pictures and inspecting the application menus — where you can see, for example, that projects can be saved to and opened from the file system. BTW, they are stored as human-readable JSON documents, so if you like, you can edit them with a text editor, which comes in handy if you e.g. decide to replace chard with spinach in a cooking project.

Project Window

This is an example for what you could see when no task is selected:

The middle column lists the names of the tasks, the right panel shows their relative position in time and their duration — a kind of Gantt chart. The time direction is from left to right. The exclusion group of a task is shown in its lower left corner.

You will notice that the times are displayed as plain numbers without measurement unit. This is intended. Attach whatever time unit you like. For cooking you would want to count minutes, for bigger projects maybe days.

And this is what you would see in this example when a task is selected:

The start time of the task is relative to the end of the project.

Dependencies are added by dragging from the task names list into the successors or predecessors pane of the selected task. Illegal dependencies (condition (2) above) are immediately denied. Dependencies are deleted by selecting a task name in this panel and hitting the delete or backspace key.

Tasks can be dragged to the left or right in the Gantt chart, changing their start and end times, but not their duration. GanttMeister does not allow to drag a task as far to the right that it ends after the start of a dependent task, and not as far to the left that it starts before a task it depends upon ends. Neither does it allow to drag a task with exclusion group such that it gets into overlap with another task of the same exclusion group — unless the shift key is pressed while dragging. Dragging to the left beyond the start of the project is possible if and only if the option key is down while dragging.

Whenever a change of a task would violate the project consistency conditions (1) or (3) listed above, then GanttMeister automatically moves other tasks away for keeping consistency.

The order of the tasks in the vertical list can be changed by dragging the rows with the task names in the middle column of the project window. But see known bug #1 below.

Menu "Project"

The command Postpone Task moves the selected task as far into the future as it is possible without violating the constraints (1) or (3) or making the project end later.

Release Notes

New in Version 1.4.2

New in Version 1.4

Limitations

Known Bugs

  1. Reordering the task list by dragging in the list with the task names works only of the mouse is clicked left of the task name. Again a weird behavior or even bug of SwiftUI I have not been able to find a work-around for yet.
  2. The cursor flickers during dragging. GanttMeister sets it to the "closed hand", but some daemon immediately resets it to the default arrow. If the user interface was built using the classic Cocoa framework, I would know how to correct this, but GanttMeister uses the relatively new SwiftUI technique, where these means do not seem to exist (yet).
  3. When a new task is added, its row in the list of the task names is selected but not highlighted. Seems to be a bug in the List view of SwiftUI.

Source Code

… is available here, so you can check that the program does not try to raid your refrigerator.