TaskJuggler is GPL-licensed (free software) project management software that runs under the Linux and Unix operating systems and is programmed in C++ using the Qt toolkit and KDE libraries. The TaskJuggler Project was started in 2001 by Chris Schläger. Early releases provided a command line tool that generated HTML reports. From August 2005 to July 2010, the package also provided a graphical user interface based on the KDE libraries. TaskJuggler III was released on 5 July 2010. It is a completely re-implemented version of the TaskJuggler 2.x series and written in Ruby. The graphical user interface from the 2.x version has not yet been ported to TaskJuggler III; TaskJuggler III documents, which are plain text files, are edited with a text editor and processed on the command line. Approach A TaskJuggler project consists of one or more plain text documents written in a domain-specific declarative programming language. The documents consist of a root project file and optional sub-files incorporated into the root by means of the include keyword (property in TaskJuggler lingo), to one or more levels. The TaskJuggler language reference refers to the project definition source document somewhat loosely as The TJP File. This discussion refers to the project definition source document simply as the TJP. The TJP is a declarative document. The focal objects are tasks, resources, reports, scenarios, and scheduling constraints applied to tasks and resources. There is also a rudimentary facility to describe accounts and accrue costs and expenses. Project progress can be tracked by declaring task completeness properties (as a percentage) or resource booking properties which associate resources to tasks for specific durations, which can be used to generate schedule projections. TaskJuggler functions as a report compilation tool. After TJP program is written, reports on the state of the project are generated by running the TaskJuggler compiler on the program. The TJP compiler includes a scheduling component based on a heuristic algorithm. TaskJuggler is able to generate a wide variety of reports including Gantt based on report declarations within the TJP. The TaskJuggler compiler is able to handle large projects with over 10,000 tasks, 1000 resources, and complex constraints. Non-incremental projection A common feature of compilation tools shared by TaskJuggler is that future compilations (reports) do not necessarily reflect past outputs, even where the inputs are extremely similar. Any change to the project state as declared in the TJP can potentially result in a completely