meerkat-crm

meerkat-crm

apps.detail.types.app from fbuchner's Repository

apps.detail.sections.overview

Meerkat CRM is a self-hosted personal CRM, i.e. a digital rolodex for the people in your life. Keep track of contacts, group them into circles (friends, family, work), record how they are related to each other, and keep a social-network style timeline of notes and shared activities. Reminders (with optional e-mail notifications) nudge you about birthdays and about staying in touch. Features: - Contact management with circles, relationships, photos and custom fields - CardDAV server for two-way contact sync with your phone - Notes, activities and journaling - Recurring reminders with e-mail notification via SMTP or Resend - Calendar sync (CalDAV/ICS) to import activities - Optional single sign-on via OIDC - Multi-user with per-user data isolation All data lives in a single SQLite database inside your appdata share. No cloud, no telemetry. SETUP: set a JWT_SECRET_KEY of at least 32 characters before first start (the container will not run without it). Then browse to the WebUI and register the first account. You can customize the setup with a variety of environment variables.

Meerkat CRM - a simple CRM for the personal life

Meerkat CRM Logo

License: MIT Backend: Go Frontend: React

About the project

Meerkat CRM (Contact Relationship Management) is a self-hosted solution to keep track of your important contacts. As your digital rolodex it reminds you of birthdays, helps you to keep in mind dietary habits as well as names of spouses of contacts - and much more.

You can find the detailed documentation here: fbuchner.github.io/meerkat-crm/

[!TIP] Click here to try the Demo! (user: demo, password: test_12345)

Demo instance will be started on demand, expect some seconds delay. Demo data is reset periodically. Photo upload is disabled.

Meerkat CRM Demo

Features

  • Contact management
    • add and search contacts
    • group contacts by circles (e.g. friends, family, work)
    • store relationships of contacts (e.g. spouses, children)
    • CardDav server for two-way synchronization with your phone's contact list
  • Notes and activities
    • social network style timeline for contacts
    • notes assigned to individual contacts
    • activities with one or multiple contacts
    • general notes (for e.g. journaling)
  • Reminders
    • Keep in touch through reminders and get e-mail notifications
    • See upcoming birthdays
  • Usability
    • Multiple languages (currently EN and DE)
    • Light and dark mode

Installation

Docker (Recommended)

Meerkat CRM ships as a single all-in-one image (ghcr.io/fbuchner/meerkat-crm) that bundles the frontend and backend into one container. The easiest way to run it is with Docker Compose:

  1. Download the Docker Compose file:

    curl -O https://raw.githubusercontent.com/fbuchner/meerkat-crm/main/docker-compose.yml
    curl -O https://raw.githubusercontent.com/fbuchner/meerkat-crm/main/.env.example
    
  2. Configure environment:

    # Copy the environment template
    cp .env.example .env
    
    # Edit with your settings
    nano .env
    
  3. Start the container:

    docker compose up -d
    
  4. Access the application: Open http://localhost:7300 in your browser.

Prefer to skip Compose? You can run the image directly:

docker run -d -p 7300:8080 \
  -v ./data:/app/data \
  -v ./photos:/app/static/photos \
  ghcr.io/fbuchner/meerkat-crm:latest

Contributing

Bugs and feature requests

This application is under development. You can open an issue to report a bug or request a new feature.

You can also participate and open up a pull request.

While AI-assistants can be used to support coding, please note that you are ultimately responsible for code quality. Do not open pull requests for hands-off "vibe-coding" developments, rather stick to feature requests in these cases.

Development

To set up this repository for development, follow these steps:

  1. Clone the repository:

    git clone https://github.com/fbuchner/meerkat-crm.git
    cd meerkat-crm
    
  2. Run the backend: Ensure you have Go installed. Then, set up your environment configuration:

     cd backend
     # Copy the example environment file and configure it with your settings
     cp .env.example .env
     
     # Install dependencies and run
     go mod tidy
     source .env
     go run main.go
    

    The project uses an SQLite database for storage. Database migrations run automatically on startup.

  3. Run the frontend (in a second terminal):

    cd frontend
    
    yarn install
    yarn start
    

You can find a more comprehensive overview for developers in the developer README.

Alternative software

Notable other personal CRM systems are

  • MonicaHQ (Open Source, development seems to have stalled; the new version chandler is available at beta.monicahq.com)
  • Dex (paid offering with social media integration)
  • Clay (paid offering with focus on automation)

Other software that can be used to build or configure something similar includes

  • Twenty (Open Source "classic" CRM system)

apps.detail.sections.mediaGallery

apps.marketingCta.appInstallTitle

apps.marketingCta.appInstallDescription

apps.installHelp.stepOpen apps.installHelp.stepSearchApp apps.installHelp.stepReview apps.installHelp.stepInstall

apps.detail.sections.requirements

A JWT secret key of 32+ characters. Optional: SMTP or Resend credentials for e-mail reminders.

apps.detail.sections.categories

apps.detail.sections.related

apps.detail.sections.details

apps.detail.details.repository
ghcr.io/fbuchner/meerkat-crm:latest
apps.detail.details.lastUpdated2026-08-10
apps.detail.details.firstSeen2026-08-10

apps.detail.sections.runtime

apps.detail.details.webui
http://[IP]:[PORT:8080]
apps.detail.details.network
bridge
apps.detail.details.shell
sh
apps.detail.details.privileged
false

apps.detail.sections.configuration

WebUI PortPorttcp

Host port for the Meerkat CRM web interface.

apps.detail.config.target
8080
apps.detail.config.default
7300
apps.detail.config.value
7300
DataPathrw

SQLite database and application data. Back this up.

apps.detail.config.target
/app/data
apps.detail.config.default
/mnt/user/appdata/meerkat-crm/data
apps.detail.config.value
/mnt/user/appdata/meerkat-crm/data
PhotosPathrw

Uploaded contact profile photos. Back this up.

apps.detail.config.target
/app/static/photos
apps.detail.config.default
/mnt/user/appdata/meerkat-crm/photos
apps.detail.config.value
/mnt/user/appdata/meerkat-crm/photos
JWT Secret KeyVariable

REQUIRED. Secret used to sign login tokens. Minimum 32 characters, random. Changing it logs everyone out and invalidates stored calendar passwords.

apps.detail.config.target
JWT_SECRET_KEY
Frontend URLVariable

Origin allowed by CORS. Leave as * for LAN-only use, or set the exact public URL (e.g. https://crm.example.com) when exposing via reverse proxy.

apps.detail.config.target
FRONTEND_URL
apps.detail.config.default
*
apps.detail.config.value
*
TimezoneVariable

IANA timezone for the container, e.g. Europe/Berlin or America/New_York.

apps.detail.config.target
TZ
apps.detail.config.default
Europe/Berlin
apps.detail.config.value
Europe/Berlin
CardDAV ServerVariable

Enable the built-in CardDAV server so phones can sync contacts two-way. true or false.

apps.detail.config.target
CARDDAV_ENABLED
apps.detail.config.default
true
apps.detail.config.value
true
Disable RegistrationVariable

Set to true after creating your accounts to block new sign-ups.

apps.detail.config.target
DISABLE_REGISTRATION
apps.detail.config.default
false
apps.detail.config.value
false
Cookie SecureVariable

Set to true when serving over HTTPS through a reverse proxy.

apps.detail.config.target
COOKIE_SECURE
apps.detail.config.default
false
apps.detail.config.value
false
Reminder TimeVariable

Time of day reminder e-mails are sent, HH:MM in 24-hour format.

apps.detail.config.target
REMINDER_TIME
apps.detail.config.default
06:00
apps.detail.config.value
06:00
Reminder TimezoneVariable

IANA timezone used to schedule reminders, e.g. Europe/Berlin.

apps.detail.config.target
REMINDER_TIMEZONE
apps.detail.config.default
UTC
apps.detail.config.value
UTC
SMTP HostVariable

SMTP server hostname. Leave empty to disable SMTP e-mail.

apps.detail.config.target
SMTP_HOST
SMTP PortVariable

587 for STARTTLS, 465 with SMTP Use TLS enabled.

apps.detail.config.target
SMTP_PORT
apps.detail.config.default
587
SMTP UsernameVariable

Leave empty for an unauthenticated relay.

apps.detail.config.target
SMTP_USERNAME
SMTP PasswordVariable

SMTP password.

apps.detail.config.target
SMTP_PASSWORD
SMTP From AddressVariable

Sender address for reminder e-mails.

apps.detail.config.target
SMTP_FROM_EMAIL
SMTP Use TLSVariable

true = implicit TLS (port 465). false = plaintext or STARTTLS.

apps.detail.config.target
SMTP_USE_TLS
apps.detail.config.default
false
Resend API KeyVariable

Optional alternative to SMTP, see https://resend.com. If both are configured, mail is sent through both.

apps.detail.config.target
RESEND_API_KEY
Resend From AddressVariable

Verified sender address for Resend.

apps.detail.config.target
RESEND_FROM_EMAIL
OIDC Provider URLVariable

Issuer URL of your OIDC provider. Register your-url/api/v1/auth/oidc/callback as the redirect URI. All three OIDC fields must be set to enable SSO.

apps.detail.config.target
OIDC_PROVIDER_URL
OIDC Client IDVariable

OIDC client ID.

apps.detail.config.target
OIDC_CLIENT_ID
OIDC Client SecretVariable

OIDC client secret.

apps.detail.config.target
OIDC_CLIENT_SECRET
OIDC Auto ProvisionVariable

Create an account automatically on first SSO login.

apps.detail.config.target
OIDC_AUTO_PROVISION
apps.detail.config.default
false
OIDC Trust EmailVariable

Accept e-mail claims without email_verified=true. Only enable for a provider you control.

apps.detail.config.target
OIDC_TRUST_EMAIL
apps.detail.config.default
false
CalDAV Sync IntervalVariable

Hours between calendar sync runs.

apps.detail.config.target
CALDAV_SYNC_INTERVAL_HOURS
apps.detail.config.default
6
CalDAV Block Private URLsVariable

Block calendar URLs pointing at private or loopback addresses. Keep false to sync calendars on your LAN.

apps.detail.config.target
CALDAV_BLOCK_PRIVATE_URLS
apps.detail.config.default
false
Webhook Block Private URLsVariable

Block outgoing webhooks to private IP ranges. Keep false to reach services on your LAN.

apps.detail.config.target
WEBHOOK_BLOCK_PRIVATE_URLS
apps.detail.config.default
false
JWT Expiry HoursVariable

How long a login stays valid, in hours.

apps.detail.config.target
JWT_EXPIRY_HOURS
apps.detail.config.default
96
Log LevelVariable

debug, info, warn or error.

apps.detail.config.target
LOG_LEVEL
apps.detail.config.default
info
PUIDVariable

User ID owning files in the mounted volumes. 99 = nobody on Unraid.

apps.detail.config.default
99
apps.detail.config.value
99
PGIDVariable

Group ID owning files in the mounted volumes. 100 = users on Unraid.

apps.detail.config.default
100
apps.detail.config.value
100