Using org-roam as a CRM

org-roam is an Emacs application which makes efficiently capturing and finding notes easy. It does so a good job at that, I decided to use it as a makeshift personal CRM. With a few lines of Elisp, I get to:

  1. Take notes about people and events. I usually capture their contact information, important dates, how they made me feel during our interactions. Documenting meetings and calls has proven to be very helpful on more than one occasion.

    SPC P f to very quickly find or create a person/event.

  2. Link events and people to build a graph of relationships, which provide context and help me remember our meetings vividly. It is valuable for me because it save me from anxiety about forgetting people and things I discuss with them.

    SPC P i to insert link to a person/event in an org file (mostly my diary).

I have similar keybindings for taking (SPC n f) and inserting notes (SPC n i), so it builds into a nice theme for easy-to-remember keybindings and consistent UI.


Elisp I use org-roam as a CRM, while keeping "normal" org-roam available for taking notes.

(defvar spook--org-roam-crm-dir "~/Documents/org/people"
  "Directory where org-roam notes related to people are kept.")

(defun spook--with-org-roam-crm (func &rest args)
  "Evaluate FUNC with ARGS org-roam set for working as CRM."
  (let* ((org-roam-directory spook--org-roam-crm-dir)
         (org-roam-db-location (concat org-roam-directory "/roam.db")))
    (apply func args)))

(defun spook-crm--db-sync ()
  (spook--with-org-roam-crm #'org-roam-db-sync))

(defun spook-crm--find-person ()
  (spook--with-org-roam-crm #'org-roam-node-find))

(defun spook-crm--insert-person ()
  (spook--with-org-roam-crm #'org-roam-node-insert))

Setup keybindings for calling spook-crm--find-person to quickly search for (and/or add) a person or event, and spook-crm--insert-person to add a link to a person or event in any org-mode buffer. I frequently use it when adding meeting notes and in my diary.

Here's how I add the keybindings:

 "spook-people" "C-c P"
 '("f" . spook-crm--find-person)
 '("i" . spook-crm--insert-person))

You can find source of my very naive spook-defkeymap macro in my Emacs configuration. In addition to this, I assign the spook-people keymap to my meow leader key, means I can press SPC P f to find a person/event, and SPC P i to insert a link to a person/event.

Does it solve everything?

No. But it is the quickest solution which achieves satisfactory result and free me up to focus on other things. I feel org-roam itself to be over-engineered sometimes, and there are a bunch of things I might like but don't need right now. e.g

  • More structured way of capturing specific kind of information. e.g contact details. Structure of data kept in org files is upto me, which works for now
  • Searching by something which isn't title or tags. This is solved by doing grep over
  • Visualize the people and events I participate in. org-roam-ui didn't work on first shot.
  • Contacts/details on the go i.e a mobile app
  • Psychoanalyze people I meet; building, tracking and concluding experiments. But it is perhaps too much to ask without making effort

Why am I sharing this?

  • To bounce ideas off of internet
  • Hoping someone will point me in a better direction if there is one
  • Hoping someone will solve some problems with this snippet, build on it until I come around to do it myself
  • To spread the cult of Emacs/org-mode (my precious-es)
  • To have some activity on my blog. It is too quiet here