2.1 KiB
2.1 KiB
Mascarpone CRM
I always write "cream cheese" on my grocery list as "crm chs", so that's what I think of when I see "CRM".
Current features
- In-app contacts
- For each contact:
- Names
- Birthday
- Last-contact-time mapping
- Address as single field (plus code? lat/long? go crazy!)
- Free-text-entry field
- Desired contact periodicity
- Journal with Obsidian-like
[[link]]syntax - Contact groups (e.g. "Met with
[[Brunch Bunch]]at the diner") - ical server for birthday reminders
Explore
My instance is at https://crm.rperce.net. Username "demo" and password "demo" let you log into an ephemeral demo user if you want to poke around.
If you want an account, contact me directly or use the "self-hosting" instructions below.
Planned features
- Report birthdays and manage add'l fields for contacts stored on a remote CardDAV server
- Act as CardDAV server for other clients
- For each contact:
- Arbitrary add'l yearly dates (e.g. anniversaries) that show on calendar
- Relationship mapping
- Additional arbitrary fields (no special handling)
- "Named in journal but has no contact entry" detection
- Email birthday reminders over SMTP
Development / self-hosting
- Clone the repo.
- Build for your system with
./Taskfile _cargo build --release. - Deploy the binary from
./target/release/mascarponeto wherever you want that's accessible to you. - In the working directory that you want the server to save its databases in,
- Create a user for yourself with
mascarpone set-password YOUR_USERNAME. This will create ausers.dbfile. - Run
mkdir dbs. - Copy the
hashed_staticdirectory from the code repository.
- Create a user for yourself with
- Run
mascarpone serve [port]from that working directory. The default port is 3000. If you need to be able to bind to a host other than0.0.0.0, contact me directly.
Example systemd service file
[Unit]
Description=Mascarpone CRM
After=network.target
[Service]
Type=simple
WorkingDirectory=/var/local/mascarpone/
ExecStart=/usr/bin/mascarpone serve
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target