For the first 21 years of my life, it felt like I had been fighting an uphill battle against myself. Half abandoned projects everywhere, constantly thinking “I could and should be doing more”. It felt like I had shipped with broken software. Everyone else seemed to have such an easier time completing even simple tasks, and I was struggling.

It turns out I hadn’t been running broken software, I was running a completely different OS. And recently, I got the documentation: ADHD.

Once I understood the specs of this environment, I realized standard tools like Notion or a to-do list on my phone weren’t going to cut it. They assume a functioning environment I simply don’t have.

On my devices, I was already using Doom Emacs because I’m a tech nerd who loves to tinker. So instead of trying to change myself to fit a certain tool, I decided to learn some elisp and reshape the tool to fit me.

Here’s how I weaponized my config against executive dysfunction.

Phase 0: The Infrastructure Link to heading

Before I even touched a single line of lisp, I had to solve a different problem: Syncing my notes between devices.

My brain has a very small L1 cache. If I have an idea while in the kitchen, but my to-do list is on my desktop in the other room, the “latency” (and mental barrier) is high enough to kill the task. By the time I get to my desktop, the context is lost.

I used some solutions for this in the past, I used my phone’s note-taking app, but this caused me to have my notes split across my devices, which wasn’t ideal. I also used a personal discord server, but this became unmaintainable and unsearchable very quickly.

I needed a Single Source of Truth that was available everywhere, with zero friction.

I have 3 main devices that I use:

  1. My desktop
  2. My laptop
  3. My phone (orgzly revived app for org mode)

But there is a secret fourth device, and you’re accessing it right now! It is my VPS (which will hopefully become a homelab setup in the future)!

To solve this problem, I used Syncthing. Before I had my VPS, I was already considering using Syncthing to sync between devices, but that would require me to keep my devices on at the same time, and in practice, my laptop and my desktop are never turned on simultaneously. That’s where my VPS comes into play, it acts as a sort of “cloud” so even if my desktop is turned off, my laptop will be able to sync my notes from my VPS.

Phase 1: The “Energy” Index Link to heading

Standard productivity advice tells you to sort tasks by “Deadline” or “Importance”. This works great for neurotypical brains. For me, a list of 20 “Important” tasks just looks like a wall of noise. It triggers immediate analysis paralysis.

I realized my bottleneck isn’t time, it’s Battery.

Some days I run at 110%, some days I run at 10%. On a low-energy day, seeing a big task that requires a lot of energy will not only make me skip that task, it’ll make me skip the entire list.

The solution Link to heading

I modified my workflow so every task on my list includes an ENERGY property. I stopped asking myself “When is this due?”, and started asking “How much energy will this cost me?”

I defined three states:

  1. High (complex tasks, usually requiring deep focus)
  2. Medium (Standard work, like answering an e-mail)
  3. Low (Easy tasks, like cleaning up some files or scheduling an appointment)

Here’s how I implemented this in Doom Emacs. First, I made sure to map priorities to colours

;; Map priorities
(setq org-priority-highest ?A
    org-priority-lowest ?C
    org-priority-default ?B)

;; Colour code priorities
(setq org-priority-faces
    '((?A :foreground "#ff6c6b" :weight bold)
    (?B :foreground "#98be65")
    (?C :foreground "#51afef")))

;; Define energy levels
(setq org-global-properties
    '(("ENERGY_ALL" . "Low Medium High")))

;; Colour code task status
(setq org-todo-keyword-faces
    '(("TODO" :foreground "#51afef" :weight bold)
    ("DONE" :foreground "#98be65" :weight bold)
    ("WAIT" :foreground "#da8548")))

The overview Link to heading

The real magic happens in the agenda overview (SPC o A x). I created some custom commands that sort task by energy cost.

When I sit down and look at my agenda, I check my internal battery:

  • Tired? I choose a “Quick win”.
  • Focused? I choose “Deep work”.

This prevents a negative spiral. Even on a bad day, I can usually clear some “Low Energy” items, which keeps me moving forward.

(setq org-agenda-custom-commands
    '(("x" "Overview"
        ((tags-todo "PRIORITY=\"A\"+ENERGY=\"Low\""
            ((org-agenda-overriding-header "Quick Wins (High Impact, Low Energy)")))
        (tags-todo "PRIORITY=\"A\"+ENERGY=\"High\""
            ((org-agenda-overriding-header "Deep Work (Focus Required)")))
        (tags-todo "PRIORITY=\"A\"+ENERGY=\"Medium\""
            ((org-agenda-overriding-header "High Priority (Medium Energy)")))))))

Phase 2: Reducing Input Latency Link to heading

As I’ve mentioned previously, I struggle with forgetting (the context of) ideas, so a standard solution like opening a file browser, navigating to the correct file, typing it all out, etc, was way too much friction for me. I needed a solution that allowed me to effortlessly capture ideas, tasks, to-do’s, etc, on the fly.

I have two strategies for this. the first is the usage of org-capture. No matter what I’m doing on my computer, I can hit my custom keybind that launches emacsclient (Ctrl+Alt+e on KDE Plasma), then hit SPC X within emacs. Then, a custom window pops up that asks me for the type of thought I want to capture. In this example, let’s choose a to-do (t). After that, I get prompted for five bits of vital information:

  1. The priority
  2. The name of the task
  3. The tag of the task (can be anything)
  4. The deadline
  5. The energy level

Importantly, this forces me to assign a priority and energy level to the task immediately. If I don’t assign these now, I risk staring at a list of untagged tasks later.

(setq org-capture-templates
    '(("t" "Todo" entry (file+headline "~/org/inbox.org" "Tasks")
        "* TODO [#%^{Priority|A|B|C}] %^{Task Name} %^g\nDEADLINE: %^t\n:PROPERTIES:\n:ENERGY: %^{Energy?|Low|Medium|High}\n:END:\n")
    
    ("i" "Idea/Note" entry (file+headline "~/org/inbox.org" "Notes")
        "* %?\n%U\n")
    
    ("p" "Project Task" entry (file+headline "~/org/projects.org" "Projects")
        "* TODO [#%^{Priority|A|B|C}] %^{Task Name} [/]\nDEADLINE: %^t\n:PROPERTIES:\n:ENERGY: %^{Energy?|Low|Medium|High}\n:END:\n")))

Aside from org-capture, I also use org-roam for journalling and long-term knowledge, which I’ll get into in more depth in another blog post. For now, let’s look at some final visual tweaks.

Phase 3: Visuals Link to heading

Historically, I’ve struggled quite a bit with digital sensory overload. I can’t browse normal YouTube without a certain extension that removes all the clickbait titles and thumbnails. Naturally, this translates over to my editor as well. I use the Catppuccin theme (mocha), both because it is low contrast, but also out of personal preference. The most important tweak are the fonts.

I use a monospace font for codeblocks, and a variable-pitch font for text. This makes it easier to make a distinction between “Human Language” and “Computer Language”, and reduces the cognitive load on scanning a file.

;; Fonts
(setq doom-font (font-spec :family "Fira Code" :size 16 :weight 'semi-light)
      doom-variable-pitch-font (font-spec :family "Fira Sans" :size 17))

;; UI
(setq doom-theme 'catppuccin)
(setq display-line-numbers-type t) ;; Set to nil if you prefer not seeing line numbers

I also use “Zen mode” to center the text and hide the modeline if I really need to focus on something (like writing this blogpost!)

Conclusion: “Works on my Machine!” Link to heading

These methods don’t “cure” or “fix” my ADHD. there are certainly going to be days where I don’t even look at the agenda, and days where I won’t even be able to handle “low energy” tasks.

But because the system is built on plain text files and synced via Syncthing, it is resilient. It doesn’t shame or judge me for being inactive. If i come back after some downtime, the data will still be there, waiting for me.

I stopped fighting my brain’s operating system, and started writing software patches instead. For the first time in 21 years, it feels like I have root access.

If you want to steal my config, feel free! You can find my doom emacs dotfiles here, in my nix-config: https://git.kittycloud.eu/0xMillyByte/nix-config

Thank you for reading all the way through. I have plans for a future blogpost on how I use org-roam in a similar style to this one. Stay tuned!

As always, if you’re having trouble, or have questions, feel free to reach out, you can find my Discord linked on the homepage. Always happy to help ;3