Skip to content

dce/obrol

Repository files navigation

obrol (Obsidian Rolodex)

Obsidian Rolodex ("obrol") is a small CLI written in Go to manage a contact database stored as Markdown files, designed to be browsed in Obsidian. Each contact is a Markdown file with a YAML frontmatter block containing fields like email, last contact date, and location.

Features

  • Reads configuration from a TOML file, pointing to your contacts directory.
  • Lists contacts in a tabular view (Name, Last Contact, Email, Location).
  • Adds new contacts with frontmatter keys present even when values are omitted.
  • Updates existing contacts by case-insensitive, partial name match.
  • Quickly marks a contact as contacted today via touch.

Requirements

  • Go 1.24+

Build

  • With Make: make build (binary at bin/obrol)
  • With Go: go build -o bin/obrol ./cmd/obrol.go

Install (Homebrew)

brew tap dce/taps
brew install obrol
  • Upgrade: brew upgrade obrol

Releases

  • Tags drive releases: create a tag like v1.2.3 and push.
  • GitHub Actions runs GoReleaser on tags to build macOS (arm64) tarballs, publish checksums, and push a Formula update to vigetlabs/homebrew-taps/Formula/obrol.rb.
  • Version info is baked into the binary via ldflags and defaults to dev for non-release builds.

Configuration

Obrol expects a TOML config file specifying the directory that contains your contact Markdown files.

  • Default path: ~/.config/obrol/config.toml
  • Override with: -c /path/to/config.toml

Config file format:

# ~/.config/obrol/config.toml
basedir = "/absolute/or/relative/path/to/contacts"

Notes:

  • basedir must exist and be a directory.
  • Relative paths are resolved relative to the current working directory.
  • ~ is expanded to your home directory.

Contact File Format

Each contact is a Markdown file named by the contact's name, for example: Firstname Lastname.md.

Frontmatter (always present keys):

---
email: someone@example.com
phone: 555-1234
last contact: 2025-09-30
location: City/Region
---

Optional freeform notes below the frontmatter.
  • The tool treats email, phone, last contact (YYYY-MM-DD), and location as optional when reading; missing values display as blank in the list.
  • When adding contacts, these keys are written even if values are blank.

Usage

General form:

obrol [-c /path/to/config.toml] <subcommand> [args]

List

Scan basedir for *.md (and *.markdown) files and print a table.

obrol list

Example output:

Name              Last Contact  Email                Phone      Location
Ada Lovelace      2025-09-28    ada@example.com                  London

Add

Create a new contact file named Name.md in basedir. The YAML frontmatter always includes email, last contact, and location keys (blank when not provided).

obrol add [--email EMAIL] [--phone PHONE] [--location LOCATION] [--last-contact YYYY-MM-DD] Firstname Lastname

Examples:

obrol add "Grace Hopper"
obrol add --email grace@example.com --phone 555-1234 --location "Arlington, VA" --last-contact 2025-09-01 "Grace Hopper"

If the file already exists, the command errors without overwriting.

Update

Update frontmatter fields of an existing contact. Matching uses case-insensitive substring against the contact name (from the filename). If multiple matches are found, the command errors and lists them.

obrol update [--email EMAIL] [--phone PHONE] [--location LOCATION] [--last-contact YYYY-MM-DD] NameQuery

Examples:

obrol update --email new@example.com "ada"
obrol update --location "UK" Ada

After a successful update, a confirmation message is printed indicating which fields were changed.

Note

Append or prepend a dated note section to a contact’s Markdown file. The date heading is inserted as ## YYYY-MM-DD followed by your note text.

obrol note [--prepend] [--touch] [--date YYYY-MM-DD] \
  [-m TEXT ... | --file PATH | --stdin | --edit] NameQuery

Input modes (choose one; if none are given and stdin isn’t piped, $EDITOR opens):

  • -m, --message TEXT: Repeatable; each becomes a new line.
  • -f, --file PATH: Read note content from a file.
  • --stdin: Read note content from standard input (useful with pipes or here-docs).
  • -e, --edit: Open $EDITOR to compose the note.
  • --touch: After inserting the note, also set "last contact" to today (same as running obrol touch).

Examples:

obrol note -m "Met at lunch." -m "Follow up next week." Ada
obrol note --stdin Ada <<'EOF'
Met at the conference.
Discussed a pilot next quarter.
EOF
obrol note --file notes/today.txt "Scofield"
obrol note --edit --prepend --date 2025-09-30 "Dana"
obrol note --touch -m "Quick check-in call." "Grace Hopper"

Touch

Update a contact’s "last contact" date to today (YYYY-MM-DD). Matching uses the same case-insensitive substring behavior as update and note.

obrol touch NameQuery

Examples:

obrol touch Ada
obrol touch "Grace Hopper"

Shell Completions (Fish)

Fish completion script is included at completions/obrol.fish.

  • Install: make install-fish (copies to ~/.config/fish/completions/obrol.fish).
  • Activate: start a new Fish session, or run source ~/.config/fish/completions/obrol.fish.
  • Name suggestions: the completer queries obrol list and extracts the Name column.
    • If your config is not at the default path, add -c /path/to/config.toml to the current command line so completions can find it.

Acknowledgments

This project was developed with the assistance of ChatGPT for code generation.

License

MIT License -- see LICENSE for details.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published