Summary: I made a CLI tool that combines several productivity tools into one, and is powered by markdown flavored plain text notes.

For the past decade or so, I've put a moderate amount of effort into maximizing my personal productivity and minimizing 'down time'. I define productivity as working towards my goals, and down time as... not doing that, but also not doing something genuinely enjoyable or restful.

My personal workflow organically developed over these years based on experimentation and trial and error. I may go into the specifics in another post, but the essentials are as follows:

  • I plan and set goals annually (based on 8760 Hours)
  • Those goals are broken down into sub-goals and ordered by prerequisites to keep them manageable
  • I attempt to maintain resilient habits based on those goals
  • I use spaced repetition for raw knowledge retention, but also integrate cards to remind myself of goals, values, purpose, etc.
  • I use a standup journal for work
  • I summarize interesting books or blog posts I read

My workflow worked pretty well for me, but I always felt a little stress because to use this workflow I needed jump around between 4 or 5 different applications each day. Anki, Inkdrop (love this app), Todoist, etc...

Additionally, I felt like it was easy for things to slip between the cracks. I could take notes on a book and then forget to add a valuable takeaway to Anki cards, write a todo in my daily notes that I didn't add to Todoist, or complete a work task in Todoist and forget to add that to my daily standup notes. Ideally, I would have these things pushed to other systems automatically.

So, naturally, a couple months ago I decided to write my own tool to combine the essential functionality of all of these into one tool that I could use instead.

I realize this may seem a little underwhelming, but I think there are some cool features worth writing about. But first, some technical design goals I had:

  • Lightweight
  • Editor agnostic (sorry, org-mode. I know you can do all of this)
  • Plain text files, no database
  • Quick to code (a weekend)

Because of these design goals, Oren is comprised of two parts: A CLI interface for accessing files, and a Language Server to interact with whatever editor you're using (I use Vim mainly) and provide some Oren-specific functionality.

Anyway, the primary concept behind this system is that everything is driven by notes. Habits, todos, goals, Anki-style spaced repetition cards are all driven by the same notes. How does this work? Let's go on a quick tour of the features.

The daily command creates or opens up three files - today's notes, yesterday's notes, and habits for the day. This is usually how I start the day, because I rely on these notes for my standups at work - and throughout the day I'll generally add to my daily notes any of the following:

  • notes about my current work or personal life
  • meeting notes
  • one-off tasks that come up during the day
  • random musings or ideas

Habits are provided with checkboxes, so I can mark them off as done. They're all saved so if I want to do any analysis in the future it would be easy.

Straight forward. But let's say on this particular day, I realize I want to define a new habit. How would I do that? Well, easy... I would write the name habit in my notes (maybe alongside some explanation) and give it the habit annotation with a schedule. Eg.

Now this habit is permanently defined and will show up as a checkbox from that date onward (on matching days, in this case it would be every Mon/Wed/Fri). Habits can be defined in any note, but what else can we define?

Let's say I learn a fact that I want to remember via spaced repetition - I just add it in my notes like this:

Next time I run the remember command, the card will be added to the spaced repetition deck.

Oren keeps track of those cards and shuffles them semi-intelligently, as you would expect from a spaced repetition program. If I want to delete a card, I just delete the remember: annotation in my notes.

If I have a new goal or todo, I just need to add a markdown checkbox in any of my notes, and then when I run the todos command I'll see it (assuming it isn't blocked by a prerequisite todo).

I really like how this type of information is pushed to me from my notes, and I don't have to worry about things getting lost or forgotten in old files.

The last feature I wanted to talk about was the general note taking and note discovery feature. It's inspired by the Zettelkasten system which has been making rounds on Hacker News and other websites recently.

Essentially, as I'm editing any note, I'll receive auto-complete recommendations for any other notes that I've tagged with a term. Eg. given the file in the first picture, I will receive recommendations that will generate a link to another note as shown in the gif.

This helps me discover older notes and connect ideas.

Overall, I'm very happy with the system I created. I don't have any major improvements planned for now, except maybe to add some analytics tools to measure historic habit performance, and maybe some sort of visualization to show connections between all my notes since that could be interesting.

Thanks for reading!