Verano means summer in Spanish. Verano is also a project management package written in Go. I wrote it as a way to understand how Primavera - the O.G. project management software - works. Also, adding activities in Primavera is pretty annoying, since you have to add them one by one. So, one of the cool features of this package is that you can import activities in xlsx, csv, and json formats. For context, I was mainly using Primavera during my civil engineering project management classes.

The design of this package is not very complicated. At the highest level, an activity is represented by the following struct:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
type Activity struct {
    Id             int           // Unique identifier of the activity
    Description    string        // Description of the activity
    Duration       time.Duration // Duration of the activity
    Start          time.Time     // Start time of the activity
    Finish         time.Time     // Finish time of he activity
    PredecessorsId []int         // ID of the activities that precede
    SuccessorsId   []int         // ID of the activities that come after
    Cost           float64       // Cost of the activity
}

Then, there a few different sub-packages that do different things:

  • verano/db:
    • stores and update activities in an SQLite database.
  • verano/parser:
    • parses a slice of activities to JSON, CSV, and XLSX formats, and vice-versa.
    • It can also export activities to an SQLite database.
  • verano/sorter
    • sorts activities based on their relationships with other activities.
    • it also sorts activities based on other parameters, such as duration, start date, etc.
    • it uses a topological sorting algorithm on a directed acyclic graph through the heimdalr/dag package.
  • verano/project
    • computes the total cost of the project.
    • computes the start and finish times of activities (assuming start to finish relationships between activities) after they get toplogically sorted.
  • verano/graph
    • uses the graphviz package to generate a graphical representation and timeline of the activities of the project.

Additionally, there is a CLI tool - veranocli - that can be used to interact with the program. See it in action:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# parse activities in a xlsx file and generate a graphical representation
$ veranocli parse -f activities.xlsx -g activities.png
Id  Description   Duration  Start             Finish            Cost   
1   Tip landlord  6h0m0s    1 Jan 0001 00:00  1 Jan 0001 00:00  10000  
2   Buy eggs      20m0s     1 Jan 0001 00:00  1 Jan 0001 00:00  20     
3   Buy pan       15m0s     1 Jan 0001 00:00  1 Jan 0001 00:00  30     
4   Eat eggs      5m0s      1 Jan 0001 00:00  1 Jan 0001 00:00  0      
5   Cook eggs     10m0s     1 Jan 0001 00:00  1 Jan 0001 00:00  0      
6   Get money     36h0m0s   1 Jan 0001 00:00  1 Jan 0001 00:00  0      

# sort activities from a xlsx file
$ veranocli sort -f activities.xlsx 
Id  Description   Duration  Start              Finish             Cost   
6   Get money     36h0m0s   8 Apr 2024 17:48   10 Apr 2024 05:48  0      
1   Tip landlord  6h0m0s    10 Apr 2024 05:48  10 Apr 2024 11:48  10000  
2   Buy eggs      20m0s     10 Apr 2024 05:48  10 Apr 2024 06:08  20     
3   Buy pan       15m0s     10 Apr 2024 05:48  10 Apr 2024 06:03  30     
5   Cook eggs     10m0s     10 Apr 2024 06:08  10 Apr 2024 06:18  0      
4   Eat eggs      5m0s      10 Apr 2024 11:48  10 Apr 2024 11:53  0      

And here is the generated graph

graph

the picture is pretty unreadable, so you might want to open it another tab and zoom in.

Now of course, this piece of software is missing a lot of essential features, such as support of multiple relationships types between actvities (Start to Start, Finish to Start…). Also, there’s no way to generate a Gantt chart of the project, which is literally one of the most important features of a project management program. Another missing feature is the implementation of human resources tools.

Finally, I don’t know if i’ll keep working on this project as it is really time consuming and complex…🗿

Thanks for your time !

FOSS Alternatives