Skip to main content

A lightweight personal CRM for the command line and local browser.

Project description

Narad

Narad is a lightweight, local-first personal CRM for people who want a fast way to remember contacts, conversations, and follow-ups without adopting a sales platform.

It gives you a Python CLI, a compact local browser UI, and a SQLite database on your machine. Use it to track people, organizations, relationship notes, follow-up tasks, contact sources, interaction channels, tags, and full-text search.

Why Narad?

Most CRMs are built for teams, pipelines, dashboards, and reporting. Narad is for a single user (including local agents) who wants to keep context:

  • Consultants tracking client outreach and follow-ups

  • Sales reps managing relationships in a lightweight flow

  • Solo founders organizing contacts and partnerships

  • Who did I meet?

  • Where did this relationship come from?

  • What did we talk about last time?

  • What should I follow up on today?

  • Can I find that note from LinkedIn, WhatsApp, a call, or a conference?

Narad keeps that loop small, searchable, and local.

Features

  • Contacts with name, email, phone, title, location, source, company, and tags.
  • Organizations linked to contacts.
  • Relationship notes and interactions with optional channel metadata.
  • Follow-up tasks with due dates and completion state.
  • today view for overdue tasks, tasks due today, and recent notes.
  • FTS5 search across contacts, organizations, notes, tasks, sources, channels, and tags.
  • Local browser UI served by FastAPI at http://127.0.0.1:8765.
  • Plain SQLite storage under your own home directory.

Contact source means where the relationship originated, such as linkedin, tea shop, twitter, referral, or conference.

Interaction channel means where a specific note or event happened, such as call, email, whatsapp, linkedin, twitter, or in-person.

Quick Start

Narad requires Python 3.12 or newer.

Install from a checkout:

git clone https://github.com/gauravvgat/narad.git
cd narad
uv tool install .

Then initialize your local database:

narad init
narad today

For contributor-style local development, use uv sync and run commands with uv run narad ... instead.

Usage

Create a small relationship graph:

narad add org "Acme Labs" --website https://acme.example --tag investor
narad add contact "Asha Rao" --company "Acme Labs" --email asha@example.com --source linkedin --tag warm
narad add note "Discussed pilot timeline" --contact "Asha" --channel whatsapp
narad add task "Send pilot proposal" --due today --contact "Asha"

Keep it current:

narad edit contact 1 --email asha@acme.example --source conference
narad list contacts --tag warm
narad list tasks --status open
narad search "pilot"
narad show 1
narad done 1

Open the local web UI:

narad serve

Useful commands:

  • narad init: create the Narad home directory and initialize the database.
  • narad today: show overdue tasks, tasks due today, and recent notes.
  • narad list contacts: list contacts, optionally filtered by tag.
  • narad list tasks: list tasks by open, done, or all.
  • narad search: search across your CRM.
  • narad show: show one contact profile with tasks and timeline.
  • narad serve: start the local browser UI.
  • narad path: print the configured home and database paths.
  • narad search-reindex: rebuild the full-text search index.

Storage And Privacy

By default, Narad stores data in:

~/.narad/narad.db

For isolated runs, demos, tests, or agent sandboxes, override the paths:

export NARAD_HOME=/tmp/narad-home
export NARAD_DB=/tmp/narad-home/narad.db

Narad is local-first and single-user in v1. The web UI binds to 127.0.0.1 by default and does not include accounts, teams, permissions, or remote sync.

Development

Install dependencies and run checks:

uv sync
uv run pytest
uv run ruff check .
uv run pre-commit install

The pre-commit hook runs ruff and pytest.

Project stack:

  • Python package management: uv
  • CLI: Typer and Rich
  • Web UI: FastAPI, Jinja templates, and plain CSS
  • Database: SQLite through Python sqlite3
  • Tests: pytest
  • Lint: ruff

Before changing behavior, read:

  • AGENTS.md
  • memory/index.md
  • relevant memory/areas/*.md
  • relevant user_stories/*.md

The repo memory and user stories are part of the project documentation, not generated scratch notes.

Maintainer Release

Before publishing, run the checks and build the release artifacts:

uv run pytest
uv run ruff check .
uv build --no-sources

This creates a source distribution and wheel under dist/.

The wheel includes only the runtime narad package, including the web UI templates and CSS. The source distribution is intentionally trimmed to source files and public package metadata:

  • src/narad/
  • README.md
  • LICENSE
  • pyproject.toml

Repo-local memory, user stories, artifacts, tests, and uv.lock are not shipped in distribution artifacts.

Publish to PyPI after the project is configured:

uv publish

For automated releases, prefer PyPI Trusted Publishing from GitHub Actions over long-lived PyPI tokens.

Contributing

Contributions are welcome, especially when they keep Narad small and useful.

Good first areas:

  • Improve CLI ergonomics.
  • Tighten the local web UI.
  • Add focused tests for store, CLI, or web behavior.
  • Improve import/export workflows.
  • Clarify docs for real personal CRM use cases.

Design principles:

  • Keep source code as the source of truth.
  • Keep CLI and web behavior aligned through narad.store.
  • Prefer simple SQLite-backed behavior over premature platform features.
  • Do not touch a user's real ~/.narad/narad.db in tests.
  • Use NARAD_HOME and NARAD_DB for isolated test data.

AI Agent Usage

Agents should treat Narad as the user's local personal CRM and prefer the CLI over direct SQLite writes.

Before adding a likely duplicate contact, search first:

narad search "asha acme"
narad show 1

Then record structured context through the CLI:

narad add contact "Asha Rao" --company "Acme Labs" --source linkedin --tag warm
narad add note "Discussed pilot timeline" --contact "Asha" --channel whatsapp
narad add task "Send pilot proposal" --due tomorrow --contact "Asha"
narad edit contact 1 --source conference --tag champion
narad done 3

Agent guidelines:

  • Use contact IDs from narad search, narad list contacts, or narad show when a name is ambiguous.
  • Store relationship origin in contact --source.
  • Store event medium in note --channel.
  • Record follow-ups as tasks instead of burying them only in note text.
  • Use NARAD_HOME and NARAD_DB for sandboxed runs.

Roadmap

Near-term ideas:

  • Add practical import/export commands.
  • Add backup helpers.
  • Improve filtering and editing flows in the web UI.

Narad is intentionally not trying to become an enterprise CRM. Sync, hosted multi-user access, and advanced reporting can wait until they clearly earn their complexity.

License

Narad is released under the MIT License. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

narad-0.1.0.tar.gz (15.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

narad-0.1.0-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

Details for the file narad-0.1.0.tar.gz.

File metadata

  • Download URL: narad-0.1.0.tar.gz
  • Upload date:
  • Size: 15.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.0

File hashes

Hashes for narad-0.1.0.tar.gz
Algorithm Hash digest
SHA256 11ca3386d8f5cf7aa29c31c15266517cf36cbe5649f9ab3c19c64f39ac5858a5
MD5 41d2cb7345c341dd14a58b854f9d71ba
BLAKE2b-256 eb2c523c8fed92dc72795739b4598c396275d9b5eb1b156def76cc72f1d538e6

See more details on using hashes here.

File details

Details for the file narad-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: narad-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.0

File hashes

Hashes for narad-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0214fc17b91696c8bb6b52245ba717f00972ef442b37eea359a91492646aa77d
MD5 3e906af2a4f68781e5cf16903e56a94b
BLAKE2b-256 0667039ead3e6f7b4e74d9bf8a4ed46830236cb87921361fa52e7f1fb824c2fd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page