My GTD and slip box-ish workflow within logseq

Screenshots:


Key points of my workflow in logseq:

  • journals are summaries only, where tasks are listed from their priorities. This setup eases the intention requirement of picking up tasks. I simply and almost always pick up the first task from the up.
  • fleet notes are used to capture everything initially where date, tags, context, achievement, and next action are caught
    • the fleet notes are atomic. one idea one note
    • if it’s a note of anything, I’ll add a new property to link it to the source and remove the type property
    • if a note contains a topic with several things that are formed logically, the fleet note is considered to be a writing output. I’ll name this note and remove the type property. (like this one)

Journal structure. As mentioned above, the journal page contains summaries ONLY. the following parts show on each journal page from the top. I use importance and urgency to categorize tasks and don’t really care about anything that isn’t important and urgent.

  • NOW. the task I’m working on. Only shows up whenever there’s anything in the DOING state
  • Important & Urgent. use priority A
  • Important. use priority B
  • Urgent. use priority C
  • Re-think. fleet notes that are created within a certain period (3 days in my setup) but without any relationship to things I know (no tag)
  • Lobby. tasks that are created in 30 days but haven’t been assigned priorities
  • Junkyard. tasks that are created more than 30 days (in my setup) ago without priorities.

Within a fleet note:

  • following properties are created automatically

    • date: to link the notes to a day
    • Title: set the name of the note to reflect the time is created
    • type: always be fleet note
  • tags are used to indicate the areas or related people etc., using tags in the namespace style is a good way whenever there’s a clear logic hierarchy, for example, company/project/project name

  • context shows as the task you’re working on. this ensures me I know what I’m working on

    • this is a good way to prevent me from drifting away when something may cause me a long time. Please google yak shaving for more ideas.
    • manually replace the query result with a block reference.
  • achievement is something I have done when the note is created.

    • you should always finish something and write it done. Never write anything blindly I don’t have in my hands unless I’m 100% sure it’ll be true, like after today, it's tomorrow
    • if you have a new idea when I’m writing a note. Write it as a new task in the action. Don’t come back and add new things once a note is done unless it’s a fix for typo, grammar, etc.
    • it’s preferable to keep achievements atomic to unload my brain unless they’re strongly connected, easy to finish, or trivial.
  • next action is a must unless this note is the last note to conclude a series of actions when the goal is reached.

    • multiple actions are possible in one note
    • comments are good places to add anything about the next actions so I won’t need to re-read or re-think what I need to do next time.

Known issue. mainly because of the limit of logseq

  • need manual work to set the timestamp in the template for journals. This is because logseq uses epoch timestamp in created-at and updated-at attributes, which can’t be created easily. Please refer to https://www.epochconverter.com/
  • can’t create a new fleet note from the template directly. This may be achievable through a plugin, but I haven’t confirmed it.
  • you need to remove the first block after applying the fleet note template and move all blocks one level up. Can’t be fixed AFAIK as this is how templates work in logseq right now.
  • The filename of the fleet notes contains [[ ]], not sure how to change/add macro in settings
  • journals in past days should display different summaries like how many tasks are done etc., but it’s not possible AFAIK at least now.

Q&A

  • Why don’t you use [*] in the template?
    • [*] doesn’t contain children of returned notes, which are possibly comments in my workflow.
  • How can I get the epoch timestamp?
    • use the link above to get it. there’re only two timestamps needed each day: 30 days ago (for junkyard and lobby sections) and 3 days ago (for re-think section)
  • How can I find all fleet notes related to a task?
    • see the number on the right side of each task?
  • Do you manually update the timestamp each day?
    • No. I use airflow to generate a new journal page at 00:01 each day and sync it to my repo

Fleet note template

- template:: templates/fleet note,
	- type:: fleet note,  
	  title:: <% today %> <% time %>
	  date::  <% today %>
	  tags::
	- {{query (TODO DOING NOW)}}
	  query-table:: true
	- what has been done
	- TODO next action(s)
		- comments

Journal template (note there’re three %d, which are variables as mentioned above)

- #+BEGIN_QUERY
  {:title "🔨 NOW",
   :query
   [:find
    (pull ?h [:db/id
                    :block/uuid
                    :block/type
                    :block/left
                    :block/format
                    :block/refs
                    :block/_refs
                    :block/path-refs
                    :block/tags
                    :block/content
                    :block/marker
                    :block/priority
                    :block/properties
                    :block/pre-block?
                    :block/scheduled
                    :block/deadline
                    :block/repeated?
                    :block/created-at
                    :block/updated-at
                    :block/file
                    :block/parent
                    :block/heading-level
            {:block/page [:db/id :block/name :block/original-name :block/journal-day]}
            {:block/_parent ...}]
        )  :where
    [?h :block/marker ?marker]
    [(contains? #{"NOW" "DOING"} ?marker)]
    [?h :block/page ?p]]
   :result-transform
   (fn [result] (sort-by (fn [h] (get h :block/priority "Z")) result)),
   :collapsed? false}
  #+END_QUERY
- query-table:: false
  #+BEGIN_QUERY
  { :title [:h1 "🔥Important & Urgent"]
  :query [
        :find (pull ?b [:db/id
                    :block/uuid
                    :block/type
                    :block/left
                    :block/format
                    :block/refs
                    :block/_refs
                    :block/path-refs
                    :block/tags
                    :block/content
                    :block/marker
                    :block/priority
                    :block/properties
                    :block/pre-block?
                    :block/scheduled
                    :block/deadline
                    :block/repeated?
                    :block/created-at
                    :block/updated-at
                    :block/file
                    :block/parent
                    :block/heading-level
            {:block/page [:db/id :block/name :block/original-name :block/journal-day]}
            {:block/_parent ...}]
        )
        :where  [?b :block/page ?p]
                [?b :block/marker ?marker]
                [(contains? #{"TODO"} ?marker)] 
                [?b :block/priority ?priority]
            (or 
                (and [(contains? #{"A"} ?priority)])
            )
  ]
  }
  #+END_QUERY
- #+BEGIN_QUERY
  { :title [:h2 "⚠️Important"]
  :query [
        :find (pull ?b [:db/id
                    :block/uuid
                    :block/type
                    :block/left
                    :block/format
                    :block/refs
                    :block/_refs
                    :block/path-refs
                    :block/tags
                    :block/content
                    :block/marker
                    :block/priority
                    :block/properties
                    :block/pre-block?
                    :block/scheduled
                    :block/deadline
                    :block/repeated?
                    :block/created-at
                    :block/updated-at
                    :block/file
                    :block/parent
                    :block/heading-level
            {:block/page [:db/id :block/name :block/original-name :block/journal-day]}
            {:block/_parent ...}]
        )
        :where  [?b :block/page ?p]
                [?b :block/marker ?marker]
                [(contains? #{"TODO"} ?marker)] 
                [?b :block/priority ?priority]
            (or 
                (and [(contains? #{"B"} ?priority)])
            )
  ]
  }
  #+END_QUERY
- #+BEGIN_QUERY
  { :title [:h2 "⏰Urgent"]
  :query [
        :find (pull ?b [:db/id
                    :block/uuid
                    :block/type
                    :block/left
                    :block/format
                    :block/refs
                    :block/_refs
                    :block/path-refs
                    :block/tags
                    :block/content
                    :block/marker
                    :block/priority
                    :block/properties
                    :block/pre-block?
                    :block/scheduled
                    :block/deadline
                    :block/repeated?
                    :block/created-at
                    :block/updated-at
                    :block/file
                    :block/parent
                    :block/heading-level
            {:block/page [:db/id :block/name :block/original-name :block/journal-day]}
            {:block/_parent ...}]
        )
        :where  [?b :block/page ?p]
                [?b :block/marker ?marker]
                [(contains? #{"TODO"} ?marker)] 
                [?b :block/priority ?priority]
            (or 
                (and [(contains? #{"C"} ?priority)])
            )
  ]
  }
  #+END_QUERY
- #+BEGIN_QUERY
  { :title ["Lobby - pick one up"]
  :query [
        :find (pull ?b [:db/id
                    :block/uuid
                    :block/type
                    :block/left
                    :block/format
                    :block/refs
                    :block/_refs
                    :block/path-refs
                    :block/tags
                    :block/content
                    :block/marker
                    :block/priority
                    :block/properties
                    :block/pre-block?
                    :block/scheduled
                    :block/deadline
                    :block/repeated?
                    :block/created-at
                    :block/updated-at
                    :block/file
                    :block/parent
                    :block/heading-level
            {:block/page [:db/id :block/name :block/original-name :block/journal-day]}
            {:block/_parent ...}]
        )
        :where                      
          [?b :block/marker ?marker]
    [(contains? #{"TODO"} ?marker)]
           [?b :block/page ?p]
  [?p :block/created-at ?updated]
  [(>= ?updated %d)]
   
  (not [?b :block/priority ?priority]  [(contains? #{"A", "B", "C"} ?priority)])
       
  ]
  }
  #+END_QUERY
- #+BEGIN_QUERY
  { :title "🧠Re-think - It's your 2nd chance to think them",
  
  :query [
        :find (pull ?b [:db/id
                    :block/uuid
                    :block/type
                    :block/left
                    :block/format
                    :block/refs
                    :block/_refs
                    :block/path-refs
                    :block/tags
                    :block/content
                    :block/marker
                    :block/priority
                    :block/properties
                    :block/pre-block?
                    :block/scheduled
                    :block/deadline
                    :block/repeated?
                    :block/created-at
                    :block/updated-at
                    :block/file
                    :block/parent
                    :block/heading-level
            {:block/page [:db/id :block/name :block/original-name :block/journal-day]}
            {:block/_parent ...}]
        )
        :where        
           [?b :block/page ?p]
           [?p :block/created-at ?updated] 
           [(>= ?updated %d)]
    [?p :block/properties ?prop]
    [(get ?prop :type) ?v]
    (or [(= ?v "fleet note")] [(contains? ?v "fleet note")])
    (not [(get ?prop :tags) ?t])
    ]
  }
  #+END_QUERY
- #+BEGIN_QUERY
  { :title ["🗑️Junkyard"]
  :query [
        :find (pull ?b [:db/id
                    :block/uuid
                    :block/type
                    :block/left
                    :block/format
                    :block/refs
                    :block/_refs
                    :block/path-refs
                    :block/tags
                    :block/content
                    :block/marker
                    :block/priority
                    :block/properties
                    :block/pre-block?
                    :block/scheduled
                    :block/deadline
                    :block/repeated?
                    :block/created-at
                    :block/updated-at
                    :block/file
                    :block/parent
                    :block/heading-level
            {:block/page [:db/id :block/name :block/original-name :block/journal-day]}
            {:block/_parent ...}]
        )
        :where                      
          [?b :block/marker ?marker]
    [(contains? #{"TODO"} ?marker)]
           [?b :block/page ?p]
  [?p :block/created-at ?updated]
  [(<= ?updated %d)]
  ]
  }
  #+END_QUERY
- query-table:: false

I’ll try to make a video instruction of my workflow soon later

3 Likes

Inspiring! Will keep tracking what you post.