My Project Management Workflow; An In-Depth Explanation

I was asked by @WintersMischief to share my workflow. I have been working with it now for some time and managed to iron out most of the kinks in the process.

My vault is separated into two parts. One part is to collect knowledge, processes, etc. that I use for work and the other one is to manage projects I get assigned.

I will talk about my Project Management Workflow. I currently use it to manage projects assigned to me but I am sure you can also use it to manage the work of other people.

Broadly speaking my Project management can be broken down to 3 main components. The Landing Page, Individual Project Pages and Associated Daily Notes.

Landing Page




The Landing Page is split up into the segments Open Projects, Limbo (This is used for Projects that depend on others to progress; this way Open Projects doesn’t overflow) and Finished Projects.
Each project I create will be automatically displayed in one of these Dataview-Tables. I have these two checkbox properties in each Project Page.


image


The three Tables on the Landing Page use where statements to display the Projects with the correct checkbox states.
In Open Projects that would be the following: WHERE Completed = False and Limbo = False

Urgency, Date and Responsible and Department should be self-explanatory. They are just simply queried form the Project Page. I’ll talk about Open Tasks and Image a bit later.


New Project Creation:

To create a new project, I have to click on “New Project”. Templater and QuickAdd are used to automate the process.

image

Step by step:

  1. A new note is created with my projects template in it. It prompts me to add a name.

  2. The template is “activated” through “Replace templates in the active file”, meaning the template commands get activated. This prompts me to fill out the department, indicate who takes the lead on the project, and how urgent it is.

  3. In the next step I use Natural Language Date’s Date Picker to select the due date. This will be appended to Due Date, because I used tp.file.cursor(1). (I had a lot of problems getting this to work properly.)

  4. In the last step I use folder notes (A plugin) to make a folder out of the note. This might seem unnecessary at first, but it is needed to correctly create and link the Daily notes when I create them. I could also use it to store important PDFs, images or other files associated with the project, although I prefer to keep the folder empty, and link to them in the Project Page itself.

  5. This will create a folder in my Projects folder. The only manual thing I still have to do is pull the newly generated folder into one of the Department folders. This just keeps the Projects folder clean and can prevent problems with Dataview down the line. It’s just good practice.
    I tried to automate this part to, but failed. It’s a small detail, so I didn’t pursue it further.

image

Image:

I mentioned the Image on the Landing page. This is where the property “CoverImg” comes into play. With each new project it automatically adds the link placeholder.jpg to CoverImg. If there is no placeholder image, the row of that project will not be displayed. Just don’t delete it, I guess?

Once you have an actual image of your project you can just replace placeholder.jpg with it.

This has been extremely helpful. Sometimes I have quite a few projects open at the same time and having a visual representation of your projects makes it easy to open the correct Project Page. No more clicking through it, until you find the correct one.

This is done with the following line in Dataview:

embed(link(meta(CoverImg).path, "125")) as "Image"

Most of the other stuff in my Project template is done to accommodate my specific needs.




One thing that I have that might differ from other setups is how I handle my Daily Notes.


Daily Notes and Task

I wanted to have a Daily note for every project I was working on that day. So, that would mean that I’d need three Daily Notes when I worked on three projects that day.
I tried just using only one but was really unhappy with it. It was messy, the tasks were not well separated and was all around a bad experience in this particular setup.

I handle all my task in the Daily Notes to keep the Project Page as clean and overview-able as possible.
When I use the “Open Daily Note” Button I have custom code in a Templater template that does a bunch of stuff:

On top of that I use QuickAdd to create the new Daily Note and call the “Daily Note Template” (Points 1 and 2) and then move it to the desired Folder (3)

  1. The note is created inside the Project Page’s folder and I immediately link to it using tp.file.folder(). This is the most important step, so this note is associated with this project and you can place it wherever you want in your vault.

  2. The next step is giving the note a unique name. I kept the naming format of adding the date of creation, but because I can have multiple Daily Notes for different projects on the same day, I appended No. “number”. This was quite a struggle and someone over at Github helped me with this immensely. (I don’t remember who it was, but thank you so much, if you read this.)
    What it does is checking the Daily Notes Folder and checks if the Note: {{Date}} No.1 already exists. If so, it changes the new Daily Note’s name to No.2, and so on.

  3. This needs to be done, because I throw every Daily Note into the same folder. I do this by appending another Templater function at the bottom of the Daily Note. This is done after note creation and renaming. I append it by using QuickAdd’s capture feature.
    (await tp.file.move("/Daily notes/" + tp.file.title)

Because of the link to the Project Page it is always associated with it. I can now add tasks to the Daily Note, and display them dynamically with Dataview-Task on the project page. When they are done and I tick them off, they disappear, keeping my Project page clean.

image

In another Dataview table I list all the files that are associated with this Project. They are grouped by type and with some Dataview code I found, nicely separated. If there are, for example, no Meetings associated with this Project, there will be no “Meeting” group displayed.
When linking to other Projects though, they must be in the same department, otherwise they will not be displayed.

Next to the file name I added QuickFind, which is a simple property that allows me to add the most important infos of what I have done that day. Things like: Client accepted, Concept finished, etc. It helps to quickly find information, even if I haven’t worked on a project for a couple of months.

I know exactly where a copy of an important E-Mail is for example. I use the daily notes that way too. I save every important information I get or gather on that day in the corresponding Daily Note. I’ll also add the really important stuff at the bottom of the Project Page too.

image

I also have the ability to add a daily note for the following day (tomorrow), but did not manage to create something like a Date-Picker to create Daily Notes that are further in the future. This isn’t really necessary for my case, because all the open Task are displayed anyways, but it would have been a “nice to have”.

Displaying Open Tasks on Landing Page:

I really wanted to see my open tasks on my Landing Page as well, but I am not a pro like @holroy, who helped me a ton to get this working. It gets all the tasks from the Daily Notes that are linked to the project, lists them and filters them to display only the ones that are not completed. This also dynamically updates and removes the ones that were completed.





Holroy came up with this monstrosity, and it works like a charm!:
FLATTEN list(flat(file.inlinks.file.tasks)) as AllProjectTasks
FLATTEN list(filter(AllProjectTasks, (task) => !task.completed)) as OpenTasks


This more or less concludes my Workflow! It’s quite a long OP, but it’s necessary to explain how it works (At least I hope so!).
If you have any questions, suggestions or anything else, feel free to post. If someone is interested in the Templater and Dataview Code, I can post that too.
I always like reading these kinds of posts here and hope you enjoyed or found it informative as well.
All the best!

@sprout @harr in case you are interested as well.

2 Likes

This is amazing and thanks again for sharing! I’m going to have a go at incorporating it into my current workflow but I will keep you updated with how it goes!

1 Like

Hey @New, I am having some trouble connecting my daily notes to each project. I have been able to have it move into the correct folder but none of my tasks are syncing through to my own variation of your landing page?

If you have any questions, please ask! Glad if I can help.

I’m not quite sure yet how to share the code because of the setup’s complexity. It’s probably the easiest to share it bit by bit.

Necessary Plugins are:
Templater
Dataview
QuickAdd
Natural language dates
Folder Notes
Buttons

Maybe we can start with creating a new project:

You need a button that kicks off the Quickadd:

```button
name New Project
type command
action QuickAdd: New Project
```

This will be your QuickAdd setup:

  1. This is the capture you will set up (change the path to wherever you will put your template in):
  2. For the following steps, just copy what I added.

The template for the project is as follows:

To add the urgency I wrote a small js file so I can color the text. If you don’t want to do that, you can use a system.suggester like for the Department property.
This is the js file. Just put it in a txt file and change the file extension to .js. Now you can put it in a folder (I have a dedicated one for js files called Templatejs). Just make sure the option “detect all file extensions” in “files and links” is turned on.

async function urgencyPicker(tp) {
    const selectedOption2 = await tp.system.suggester(
        ['Urgent', 'High', 'Medium', 'Low'], 
        [1, 2, 3, 4], 
        false, 
        "How urgent is the Project?"
        );

    if (selectedOption2 === 1) {
        return ' 1 Urgent'.fontcolor("red");
    } else if (selectedOption2 === 2) {
        return ' 2 High'.fontcolor('orange');
    } else if (selectedOption2 === 3) {
        return ' 3 Medium'.fontcolor('yellow');
    } else if (selectedOption2 === 4) {
        return ' 4 Low'.fontcolor('green');
    } else {
        return 'Nothing was indicated!!!'.fontcolor("red")
    }
}
module.exports = urgencyPicker

This should now add a new folder in the same folder where the file with the “New Project” button is located.

Edit: Sorry I did this before you responded. I’ll respond in a separate post

For it to create a link the project must be a folder. You can achieve this with the plugin Folder notes.

In your daily note you add: [[ <% tp.file.folder()%> ]]. Don’t forget the double square brackets.

The code for open projects on the landing page is:

```dataview
TABLE  
OpenTasks.text as "Open Tasks", 
Urgency as Urgency, 
DueDate as Date,
Responsible + "<br>" + Department as "Responsible and Department",
embed(link(meta(CoverImg).path, "125")) as "Image"

FROM "Projects"

WHERE file != this.file
WHERE Completed = False and Limbo = False 

FLATTEN list(flat(file.inlinks.file.tasks)) as AllProjectTasks
FLATTEN list(filter(AllProjectTasks, (task) => !task.completed)) as OpenTasks
```