PAST (Plain And Simple Tracking) is a tool for status tracking of projects and developments. In contrast to planning tools PAST is created to match the actual reality and it tracks projects by updating its tasks on a regular basis.

The input is currently a set of milestones, resources, tasks, vacations and the output is a HTML file showing the current progress and if milestones are met or not.

Example output:

A resource is basically just a name and its fraction of time in the project (like 100% for a full-time developer).

A milestone consists of a target date, a buffer, and a list of tasks.

A task has a name, an assigned resource, an effort in days, a progress in percent, optional dependency to other tasks, and a priority.

Vacation is basically a fixed time window for a given resource where he is not available at all.

With these information, PAST will create a task plan output based on a given start date. For each milestone, PAST will show a generic condition from 5 to 1. MILCON5 means everything is fine, MILCON1 means the target date will not be met.

PAST is free software released under the GNU General Public License V3 or later. For details read COPYING.

PAST (C) 2013-2014 Ralf Hoffmann.


The current release is PAST 0.1.3 (16 kB) (signature) from 2014-03-08.



Currently, you have to insert all data as python objects, although you don't need to know python to use PAST. See for an example.

For simplicity, all effort and dates are counted based on Monday to Friday working days.

Here's a quick walk through:

  1. Define resources
    name1 = Resource( "name1", <availability> )
    <availability> can be between 0 and 100 to indicate that this resource is only available for the given percentage of its time.
    You can have any number of resources.
  2. Define milestones (releases etc)
    m1 = Milestone( "ms name", "YYYY-MM-DD", <buffer> )
    This creates a milestone for the given target date with number of <buffer> days as a buffer. This buffer will be used to calculate how critical is deadline is met.
    You can use any number of milestones.
  3. Add tasks to milestones
    m1.add( Task( "task name", <resource>,
                  <effort>, <complete>
                  [, <depends on tasks>
                  [, <priority>]] ) )
    <resource> is the resource object created before.
    <effort> is the number of work days as estimated effort.
    <complete> is the completeness between 0 and 100.
    <depends on tasks> can be the task object this task depends on. This argument can also be a fixed date in format "YYYY-MM-DD" to place this task at exactly this date in the schedule.
    <priority> can be a priority. 0 is the default priority, any higher value will make it more important, -1 means a low priority tasks.
    Low priority tasks (prio = -1) will not be used for milestone calculation.
  4. Create a PAST object
    p = PAST( "YYYY-MM-DD" )
    creates an object for scheduling tasks from given start date.
  5. Place fixed days off (vacation etc.)
    p.scheduleVacation( <resource>, "YYYY-MM-DD", <workdays> )
    From the given date, the resource will not be available for given number of work days.
  6. Schedule milestones
    p.scheduleMilestone( m1 )
    Call with every milestone, they will be placed one after another, regardless of the date.
  7. Create an HTML view
  8. Show schedule
    open "plan.html" in a web browser.
  9. Update project progress
    1. Go through tasks and update progress value.
    2. Update start date for PAST object
    3. recreate schedule


Related tools

There are of course other tools for planning, such as:

These tools allows for planning with Gantt diagrams, partially also with cost and status tracking.

The advantage of PAST in contrast to these tools is, that the schedule dynamically changes with the progress of tasks and current time. That means, that if tasks are finished earlier than planned, everything following will be scheduled earlier as well.