apps.header.allAppsCount
meerkat-crm
apps.detail.types.app from fbuchner's Repository
apps.detail.sections.overview
Readme
View on GitHubMeerkat CRM - a simple CRM for the personal life
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.
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:
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.exampleConfigure environment:
# Copy the environment template cp .env.example .env # Edit with your settings nano .envStart the container:
docker compose up -dAccess 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:
Clone the repository:
git clone https://github.com/fbuchner/meerkat-crm.git cd meerkat-crmRun 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.goThe project uses an SQLite database for storage. Database migrations run automatically on startup.
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.detail.sections.requirements
apps.detail.sections.categories
apps.detail.sections.related
apps.detail.related.exploreCategories
apps.detail.related.exploreAllapps.detail.sections.links
apps.detail.sections.details
ghcr.io/fbuchner/meerkat-crm:latestapps.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
Host port for the Meerkat CRM web interface.
- apps.detail.config.target
- 8080
- apps.detail.config.default
- 7300
- apps.detail.config.value
- 7300
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
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
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
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
- *
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
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
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
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
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
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 server hostname. Leave empty to disable SMTP e-mail.
- apps.detail.config.target
- SMTP_HOST
587 for STARTTLS, 465 with SMTP Use TLS enabled.
- apps.detail.config.target
- SMTP_PORT
- apps.detail.config.default
- 587
Leave empty for an unauthenticated relay.
- apps.detail.config.target
- SMTP_USERNAME
SMTP password.
- apps.detail.config.target
- SMTP_PASSWORD
Sender address for reminder e-mails.
- apps.detail.config.target
- SMTP_FROM_EMAIL
true = implicit TLS (port 465). false = plaintext or STARTTLS.
- apps.detail.config.target
- SMTP_USE_TLS
- apps.detail.config.default
- false
Optional alternative to SMTP, see https://resend.com. If both are configured, mail is sent through both.
- apps.detail.config.target
- RESEND_API_KEY
Verified sender address for Resend.
- apps.detail.config.target
- RESEND_FROM_EMAIL
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 ID.
- apps.detail.config.target
- OIDC_CLIENT_ID
OIDC client secret.
- apps.detail.config.target
- OIDC_CLIENT_SECRET
Create an account automatically on first SSO login.
- apps.detail.config.target
- OIDC_AUTO_PROVISION
- apps.detail.config.default
- false
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
Hours between calendar sync runs.
- apps.detail.config.target
- CALDAV_SYNC_INTERVAL_HOURS
- apps.detail.config.default
- 6
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
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
How long a login stays valid, in hours.
- apps.detail.config.target
- JWT_EXPIRY_HOURS
- apps.detail.config.default
- 96
debug, info, warn or error.
- apps.detail.config.target
- LOG_LEVEL
- apps.detail.config.default
- info
User ID owning files in the mounted volumes. 99 = nobody on Unraid.
- apps.detail.config.default
- 99
- apps.detail.config.value
- 99
Group ID owning files in the mounted volumes. 100 = users on Unraid.
- apps.detail.config.default
- 100
- apps.detail.config.value
- 100