thisago's blog


Org Mode driven organizing

Table of Contents

According to the cutting-edge knowledge of my brain, I can say the one of the most crucial parts of a ongoing journey is awareness and understanding of it.

Getting cronically lost is one of the worse mistakes you could commit in a chase. Strategical decisions requires a competent understanding of the whole scenario, nuances and pitfalls. With it, you'll avoid repeating past mistakes and walking in circles easily.

No matter the kind of the journey:

Keeping yourself on track is the basis. The mind might store the progress and motivation as well, but discipline for the long-term is much easier with a static reference.

Reporting Progress

The first step for developing a strategy is aggregate data, true facts.

The reporting provides benefits for any chronological range:

Short Term
The notes invokes the recent memories of writing it, bringing you to the context you need to continue in the same path you left.
Medium Term
Recent progress made guides the short term decisions. A rich past is the main recipe for a wise present.
Long Term
The stale past becomes long-term memories, it serves as source of motivation and contributes to the identity of the travel and its travellers.

I refer to "reporting progress" as a dump of raw thoughts about the journey, aiming the highest sincerity with yourself, writing to no one, but for your future self.

This might seem clutter, but it is not. Once you perceive the advantages of thinking with intention and the ease to dive deeper in complex thoughts because of the writing, you'll never look back. The invested minutes to think clear will save hours or even days in the medium term of your journey. You're training your instinctive to take more reliable decisions with your extra reasoning, and your rational will get more strategical (IOW, creative).

With the ease of technology, we can store our progress as data, and extract programmatic insights, helping the ingestion of a extensive set of details. And now the post title will start make sense.

As a Emacs user, Org Mode is a privilege I have access. But if you don't have, no worries, the main goal is provide insights, not a copy-and-paste snippet. So you'll won't be losing that much.

My Flow

Before describing how I do, here's what I use and recommend:

Git
Any text you write should be tracked in Git. Losing spent efforts is not a option, plus it helps you to organize things inside repositories.
Org Mode
Because:
  • Integrates with your existing environment, Emacs.
  • Provides features like source code block execution as ipynb, task management, agenda, task clocking and more.
  • Plain text, Git friendly

And the flow is basically:

  • A Git repo which I copy the last report to be today's report.
  • I edit edit it with fn:git-auto-commit-mode for committing on saving.
  • The done/aborted tasks I archive with native Org's native fn:org-archive-subtree-default, which copies moves the entry to a archive repository.

Simple as that.

Basic Insights

With a unified place which tells you what you ever did, you can:

  • Understand the real direction you're going and plan next steps.
  • Get motivated.
  • Write reports, as a week report describing your gotchas and misses.

And because you clock your tasks, you have a data describing the amount of invested efforts towards every micro task. Examples of insights you can take from it:

  • Apparent load and if makes sense to increase.
  • Increase the capabilities for time management.
  • Even a simplistic projection of your long-term finances and health status.

Example: Real work hours valuation

Here's a example of insight generated by Org clocktable reports plus some Python scripting to understand how much your lifetime hours are being valued, considering a situation of earning a static monthly amount for a dynamic workload.

To let me re-use the same function in different clocktables, the logic was separated into a new code block:

#+begin_src python :session work-hours-price :results none
import re

monthly_salary = 1000 # Dummy amount, set your real monthly salary
hours_per_month = 8 * 5 * 4 # Intended to let you easily compare the expected hours against the real amount of worked hours.

def get_worked_hours(report: list[list[str]]) -> float:
    "Returns worked hours from the Total time of clocktable report"
    time_str = report[1][1].replace("*", "")
    matches = re.search(r"((\d+)d )?(\d+):(\d+)", time_str)
    if matches:
        (_, days, hours, minutes) = matches.groups()
        hours = (int(minutes) / 60) + int(hours)
        if days:
            hours += int(days) * 24
        return hours
    return 0

def print_real_hour_price(report: list[list[str]], salary: float):
    hours = get_worked_hours(report)
    hour_salary = salary / hours
    print(f"Expected {hours_per_month} worked monthly hours.")
    print(f"Worked a total of {hours:0.1f} hours by {monthly_salary / 1000:0.1f}k salary.")
    print(f"Got a salary of {hour_salary:0.1f} per hour.")
#+end_src

Then you can generate a named clocktable for past month in your archive file to let it be used by a code block:

#+BEGIN: clocktable :scope file :maxlevel 4 :block thismonth-1 :header "#+name: month-clocktable\n"
#+name: month-clocktable
| Headline                                           | Time      |          |          |          |         |
|----------------------------------------------------+-----------+----------+----------+----------+---------|
| *Total time*                                       | *5d 1:00* |          |          |          |         |
|----------------------------------------------------+-----------+----------+----------+----------+---------|
| 2026                                               | 5d 1:00   |          |          |          |         |
| \_  2026-01 January                                |           | 3d 9:00  |          |          |         |
| \_    2026-01-01 Thursday                          |           |          |     1:00 |          |         |
| \_      From 20260102.org                          |           |          |          |     0:30 |         |
| \_      From 20260106.org                          |           |          |          |     0:30 |         |
| [..]                                               |           |          |          |          |         |
#+END:

And finally, you can run the script with the generated clocktable:

#+begin_src python :var report=month-clocktable :results output :session work-hours-price
print_real_hour_price(report, monthly_salary)
#+end_src

#+RESULTS:
: Expected 160 worked monthly hours.
: Worked a total of 121.0 hours by 1.0k salary.
: Got a salary of 8.3 per hour.

Ouch, 8.3 per hour is low. Might be a sign to study so it can get higher! LOL

Outro

The motivation was the ease to generate initial insights from Org Mode, but the goal was to share what I'm doing well in my life. I really think this is worth and is one of the best things I decided to do.

If you want to see the scaffolding of the real repo I use to write the reports, check out: thisago/repot: Simple template for keeping on track with tasks - Codeberg.org

Keep yourself on track and aim high. Bye.