Lennart Friebel24 downloadsPersonal relationship tracker and social CRM to track contact cadence, birthdays, and touchpoints with friends and family.
Keep track of friendships, family, mentors, and colleagues with contact cadences, birthday reminders, and conversation history. Your contacts live in ordinary Markdown notes in your vault.
Requires Obsidian 1.7.2 or newer. To install a local build:
Prebuilt plugin files are available on the GitHub releases page. Download main.js, manifest.json, and styles.css to skip the build step below.
npm install and npm run build in this project.<your-vault>/.obsidian/plugins/relationship-radar/.main.js, manifest.json, and styles.css into that folder.No sample contacts are created. Use Add person to start your circle. The command palette also includes Add person and Refresh contacts.
The default contacts folder is contacts, and the default cadence for new people is 14 days. Change either in the plugin settings. Changing the folder selects a different location; it does not move existing notes. Scanning is limited to that folder and its subfolders. Only notes with relationship_radar: true are shown. On Obsidian 1.13 and newer, both settings appear in the global settings search.
A contact note looks like this:
---
relationship_radar: true
name: Sarah
relationship: Friend
cadence_days: 7
last_contacted: "2026-11-04"
birthday: "05-14"
phone: "+49 170 1234567"
---
## Conversation Topics
- Ask about the photography exhibition
## Gift Ideas
- Vintage 35mm film roll
## Interaction History
- 2026-11-04: Phone call (30 min)
Use YYYY-MM-DD for contact dates and either YYYY-MM-DD or MM-DD for birthdays. Quote yearless birthdays and phone numbers in YAML. February 29 birthdays are counted toward the next actual leap day. An empty last-contact date means no connection has been logged. Dates follow your local calendar, including across daylight saving changes.
The dashboard uses name when present, otherwise the note's filename. Editing a person's name updates frontmatter and keeps the note's existing path, so links to it keep working. New notes get unique filenames when names collide.
Saves preserve unrelated frontmatter properties and Markdown sections. Frontmatter is serialized through Obsidian's YAML API, so its formatting and comments may change. Connected today! leaves the Markdown body unchanged. Logging a historical interaction adds history without moving a newer last-contact date backward. Unchanged form fields preserve edits made in the note while the form was open; when both surfaces change the same field, the saved form value wins.
Remove asks for confirmation before moving the entire contact note to the trash using your vault's deletion preference. To keep a note and remove it from Radar, change relationship_radar to false in its frontmatter instead.
npm install
npm run dev # Watch and rebuild main.js
npm run check # Svelte diagnostics and TypeScript
npm run lint # Official Obsidian rules and type-aware linting
npm test # Markdown, dates, and store regression tests
npm run build # Production plugin bundle
Tests run against an in-memory vault and a real YAML parser, without reading or modifying a personal vault. GitHub Actions runs checks, tests, and the production build on pull requests; tagged releases include main.js, manifest.json, and styles.css.
Keep package.json, manifest.json, and versions.json aligned. Add release notes in releases/<version>.md, run the development checks above, then run node scripts/check-release.mjs after building. Push an annotated tag that exactly matches the manifest version, such as 1.0.0 without a v prefix. The release workflow verifies the versions, builds and attests the assets, and publishes the GitHub release.
MIT.