9 min read
Personal CRM Project

“NOTE”: This is still an ongoing project that I’m working on. It is a mess because requirements are being decided in the moment. Please feel free to contact me about how the project is going. I will try my best to update on how the project is going.

This document will continually be updated, associated blog posts will be attached, and this will continue to be maintained and enhanced by me for my workflow

Why Did I Start This Project?

I want to write a blog post about this topic (maintaing relationships, connections, etc.)

”Not so” fun fact about me (and most people): we are not that good at keeping in touch with people, remembering details about people, and “being a good friend”. In interpersonal settings, most are ok. However, we have those friends, connections that we know we should keep in touch with but we forget in the busyness and entropy of life.

The key goals with this project is to build components -> system that can

  1. Remind me to keep in touch with people
  2. Help me remember & keep track of details about people
    1. Place to store information
    2. Easy way to add information
  3. KEY POINT Integrated with my daily workflow

People I Want To Add Into CRM

  1. Friends (Daily Life)
  2. Friends (Out-Of-Area) >> This is a huge priority
  3. Connections

Requirements For Building My CRM

  1. Well integrated & low barrier-to-entry to use.
    • An issue I’ve found while building systems for processes (ex. personal-finance, productivity, routines, etc.) is reducing the “friction” to use it and be effective.
    • Example: While working, put your phone “out-of-sight” (e.g: other end of room). The “friction” to check your phone has slightly increased, the likelihood of actually checking is significantly decreased.
    • Problem: Many processes have too much friction to use consistently. Therefore, its effectiveness is greatly decreased.
    • Goal: To reduce friction -> easy to interact with & actually use
  2. Data/Tech Control (Privacy & Security): I’ve been looking to better secure and privatize my tech life. Therefore, I hope to be able to self-host & control my data.
    • Data: If all my tools dissapear tomorrow, the data is still safe, controlled by me, and in formats that are standardized (SQL Tables, Text (Markdown) Files)
    • Tools: If possible, use Open-Source or tools with good development & support.
  3. Only necessary features: . The features implemented are purpose-built and simple for me to be effective.

How I’m Using It

Key

  • Daily Note: I have a daily note (Markdown File) that contains everything I need to know for the day (tasks, schedule, log, etc.)
  • CRM Note: Each person in the CRM has a Markdown file associated with them. All CRM notes are in a directory (currently /ionia/crm/{Name}.md)

Components

  • Obsidian: My note-taking tool.
    • Main Features
      • Bi-Directional Linking (can create Markdown links)
      • Easy Search & Display of Backlinks >> Linked & Unlined Mentions
      • Daily Notes
      • Templates
      • Plugins: Obsidian Tasks
  • Database: PostgreSQL server on a Vultr instance.
    • (07/11/24) It is on a Vultr cloud instance. I’m considering moving it to my local HomeLab when I get a more proper networking setup.
  • Database UI: NocoDB
    • TLDR >> Open-Source, Self-Hosted Notion/Airtable alternative that can be run on your own database (SQLite, Postgres)
    • This allows me the flexibility, control, & freedom of hosting my own PostgreSQL database with the convienence of a nice UI with extra features.
  • Files: Markdown files

”External APIs”: Services I use that are integrated with the CRM

  • Todoist: My task manager
  • Dropbox: My cloud storage (w/ live sync)

Obsidian Features >> Linked & Unlinked Mentions, Outline

How I Interact?

  1. When I interact with a person on my CRM, I make a note of it in my daily note (there is a header called “Interactions”)
    • Every interaction is in a bulleted list
    • Each line has a link to that person’s file (which is tied to the row in the CRM)
> example in file ({YYYY-MM-DD}.md)

# Interactions
- [Andrew Lee](../crm/Andrew Lee.md) talked with him #exampleTag
    - he's having fun writing documentation xD
- [Barack Obama](../crm/Barack Obama.md) ate dinner with him 
    - talked about Lebron vs Jordan

  1. If I want to add/change metadata information that’s in the database, I navigate to my NocoDB URL (where the instance is hosted), login, and make the changes necessary (like Airtable, Notion)

NocoCRM

It’s empty because I’m not showing any data. However, you can imagine it looks pretty self-explanatory

  1. If I want to add any additional information about a person that is not basic metadata (that belongs in the database), I just add it to the body of that person’s respective doc.

Structure of a Person MDFile

NOTE: This is still being iterated on. The goal is to have as standardized of a format to allow for tools/scripts to reliably use it.

  1. YAML Metadata: Some of the metadata in the database is also in the file as a top-level YAML section.
    • Read [Obsidian Properties]
  2. Body: Any information that I want
  3. Backlinks: When I add a note & link of a person in the daily note, Obsidian shows the backlinks in the editor, allowing me to see thie history of

Example File

---
Id: 1
Name: Jay Park
URL: https://h1ghermusic.com
Linkedin: null
Email: moresojuplease@h1ghermusic.com
Phone: 123-456-7890
Last_Contact: null
Tags: null
Birthday: null
relationship:
  - career
Location: null
Connections: 0
interests: null
Next_Contact: null
Tier: null
Next_Contact_Interval: 30
Role: 
Company_Title: []
---
#hiTags

Text in the file
# Hello World
Another text line

And more text about anything and everything #exampleTag

Features

  1. Every day (EOD), check who I interacted with (by the links) and updates the Last_Contact & Next_Contact fields and update them in the database.

From the section Basic Use Cases, I add my interactions with people into the document. When the day is complete, it updates the database that I last-contacted them on that day. The history of previous contacts are in previous daily notes and can be all seen through Obsidian’s backlinks view.

> example in file ({YYYY-MM-DD}.md)

# Interactions
- [Andrew Lee](../crm/Andrew Lee.md) talked with him #exampleTag
    - he's having fun writing documentation xD
- [Barack Obama](../crm/Barack Obama.md) ate dinner with him 
    - talked about Lebron vs Jordan

> script -> NocoDB (Database)

Andrew Lee
- Last_Contact => {YYYY-MM-DD}
- Next_Contact => {YYYY-MM-DD} + 30 Days
- Next_Contact_Interval === 30

Barack Obama
- Last_Contact => {YYYY-MM-DD}
- Next_Contact => {YYYY-MM-DD} + 90 Days
- Next_Contact_Interval === 90
  1. Every day (EOD), it creates Todoist tasks to remind me to reach out to people

Hardest part about relationships is keeping in touch with people. Let’s make it automated so I don’t have to remember everything.

  • Current Logic: Next_Contact => If it is within 7 days of the date, create the task to reach out to them on Next_Contact date
> example (in NocoDB) Today's Date: 2024-08-01

Yoo Jimin (if you know you know) xD
- Next_Contact: 2024-08-08
> example (in Todoist) Today's Date: 2024-08-01
-> Create a task in Todoist w/ "Contact Yoo Jimin" on 2024-08-08"
  1. When I add a new person to the CRM, it automatically creates a new file with the correct template
  • Note: There are 2 ways to add a new person (create a new row in NocoDB). With how NocoDB works, I needed to support both “insert” and “update” (because NocoDB sometimes auto creates rows with null name)
> example (in NocoDB)

- Add a new person into the database
- Webhook is called
> example (in Dropbox)

- New file in `/ionia/crm/{new_person}.md
- Syncs to my local computer -> accessible in Text Editor & Obsidian
  1. When a metadata change happens in the database (a field is changed), update it in the YAML of that person’s file
  • Goal: I wanted to be able to see some of the metadata components in the text file itself without going to the database (NocoDB)
> Example in database (NocoDB)

- Name: Kim Minjung
- Phone: null -> 123-456-7890
(updated phone number in the database)

> Example In File
> Previously, when the phone YAML property was null, now it has the new number

---
Id: 1
Name: Kim Minjung
URL: null
Linkedin: null
Email: null
Phone: 123-456-7890
Last_Contact: null
Tags: null
Birthday: null
relationship:
  - career
Location: null
Connections: 0
interests: null
Next_Contact: null
Tier: null
Next_Contact_Interval: 30
Role: 
Company_Title: []
---

Text in the file
# Hello World
Another text line

Future Enhancements

Note: Look at the GitHub repo & its issues. I’ve decided that’s the “primary” location to track all things that need to be worked on.

  1. Transition To Other Tools >> The goal with these transitions is to try to take more control & reduce dependencies on 3rd-party software. General rule is that open-source, self-hosted and/or “standardized/universal” tools are preferred. To be realistic, most of the tasks on this list I’ll never have a need to do. I’ll do them if
    1. I have the time,

    2. I want to just try, have fun & learn, or

    3. I have a real need to take more control (again, unlikely)

    • Noco Webhooks -> PostgreSQL Listener
    • PostgreSQL database (on cloud) -> on-site (homelab)
    • Todoist -> Self-Hosted task manager
    • Dropbox -> NextCloud (or any other self-hosted cloud storage)
  2. Make it easier to work with NocoDB database (directly through PostgreSQL)
  3. Introduce ways to add easier tracking & insert of information (through Mobile)
  4. Learn & Integrate Terminal Tools: Vim, Scripts, CLI Tools