A simple, personal CRM application that allows users to manage their sales pipeline using a Kanban-style board. Track leads through customizable stages, automatically sync meetings from Fireflies.ai, and receive automated email reminders to follow up with leads.
- 🎯 Kanban Board - Visual pipeline management with drag-and-drop functionality
- 📅 Meeting Tracking - Automatic sync with Fireflies.ai meeting recordings
- 📧 Email Reminders - Automated follow-up reminders via email
- 🏷️ Color Labels - Organize leads with customizable color coding
- 📬 Gmail Integration - Track email interactions with leads
- 🔔 Smart Notifications - Get notified when follow-ups are needed
- React with TypeScript and Vite
- React Router for navigation
- Tailwind CSS for styling
- shadcn/ui component library
- @dnd-kit for drag-and-drop functionality
- Node.js with Express
- TypeScript for type safety
- MongoDB with Mongoose ODM
- JWT for authentication
- Node-cron for scheduled jobs
- Postmark for email notifications
- Fireflies.ai - Meeting transcription sync
- Gmail API - Email tracking
- Postmark - Transactional emails
Before you begin, ensure you have the following installed:
- Node.js (v18 or higher)
- npm (v9 or higher)
- MongoDB (v6 or higher)
You'll also need accounts and API keys for:
- Fireflies.ai (optional)
- Google Cloud Console for Gmail OAuth (optional)
- Postmark for email notifications
git clone <repository-url>
cd PipelineRemindThe project uses a monorepo structure with client, server, and shared packages. Install all dependencies with:
npm installThis will automatically install dependencies for all packages (client, server, and shared).
Make sure MongoDB is running locally:
# Using mongod directly
mongod --dbpath /path/to/your/data
# Or using MongoDB service
sudo systemctl start mongod # Linux
brew services start mongodb-community # macOSThe server requires environment variables. These are already configured in server/.env:
# Server Configuration
PORT=3000
# Database
DATABASE_URL=mongodb://localhost/PipelineRemind
# Authentication
JWT_SECRET=your-jwt-secret-here
REFRESH_TOKEN_SECRET=your-refresh-token-secret-here
# Email Service (Postmark)
POSTMARK_API_KEY=your-postmark-api-key
FROM_EMAIL=[email protected]
# Application
APP_URL=http://localhost:5173
# Gmail OAuth (Optional)
GMAIL_CLIENT_ID=your-gmail-client-id
GMAIL_CLIENT_SECRET=your-gmail-client-secret
GMAIL_REDIRECT_URI=http://localhost:5173/api/gmail/callbackNote: For production, update these values with your actual credentials.
Create a test user and sample data:
npm run seedThis creates:
- Test user:
[email protected]/password123 - Default columns (New Leads, In Progress, Closed)
- Sample leads with meetings
Start both client and server in development mode:
npm startThis runs:
- Client on
http://localhost:5173 - Server on
http://localhost:3000
# Run only the client
npm run client
# Run only the server
npm run server# Build all packages
cd server && npm run build
# Run production server
cd server && npm run start# Seed database with test data
npm run seed
# Initialize default columns for existing users
npm run init-columns
# Clean database (remove all data)
npm run clean-db
# Clean database and reseed
npm run clean-db && npm run seed# Create an admin user
npm run create-admin# Test Gmail integration
npm run test-gmail
# Run linting
npm run lintPipelineRemind/
├── client/ # React frontend
│ ├── src/
│ │ ├── api/ # API client functions
│ │ ├── components/ # React components
│ │ ├── contexts/ # React contexts
│ │ ├── hooks/ # Custom hooks
│ │ ├── pages/ # Page components
│ │ └── types/ # TypeScript types
│ └── package.json
│
├── server/ # Express backend
│ ├── config/ # Configuration files
│ ├── jobs/ # Scheduled jobs (cron)
│ ├── models/ # Mongoose models
│ ├── routes/ # API routes
│ ├── scripts/ # Utility scripts
│ ├── services/ # Business logic
│ ├── utils/ # Helper functions
│ ├── server.ts # Entry point
│ └── package.json
│
├── shared/ # Shared code (types, configs)
│ ├── config/ # Shared configurations
│ ├── types/ # Shared TypeScript types
│ └── package.json
│
├── package.json # Root package.json
└── README.md
POST /api/auth/register- Register new userPOST /api/auth/login- Login userPOST /api/auth/logout- Logout userPOST /api/auth/refresh- Refresh access tokenGET /api/auth/me- Get current user
GET /api/columns- Get all columnsPOST /api/columns- Create new columnPUT /api/columns/:id- Update columnDELETE /api/columns/:id- Delete columnPUT /api/columns/reorder- Reorder columns
GET /api/leads- Get all leadsPOST /api/leads- Create new leadPUT /api/leads/:id- Update leadDELETE /api/leads/:id- Delete leadPUT /api/leads/:id/move- Move lead to different column
GET /api/leads/:leadId/meetings- Get meetings for leadPOST /api/leads/:leadId/meetings- Create meetingPUT /api/meetings/:id- Update meetingDELETE /api/meetings/:id- Delete meetingPOST /api/leads/:leadId/meetings/sync- Sync Fireflies meetings
GET /api/settings- Get user settingsPUT /api/settings- Update user settingsPOST /api/settings/fireflies/connect- Connect FirefliesPOST /api/settings/fireflies/disconnect- Disconnect FirefliesPOST /api/settings/test-reminder- Send test reminder email
GET /api/gmail/auth-url- Get OAuth URLGET /api/gmail/callback- OAuth callbackGET /api/gmail/status- Check connection statusPOST /api/gmail/disconnect- Disconnect Gmail
The application runs two scheduled background jobs:
-
Reminder Check Job - Runs every 6 hours
- Checks for overdue meeting reminders
- Sends email notifications
- Respects user notification preferences
-
Fireflies Sync Job - Runs every 2 hours
- Syncs new meetings from Fireflies
- Matches meetings to existing leads
- Updates meeting records
| Variable | Description | Required | Default |
|---|---|---|---|
PORT |
Server port | No | 3000 |
DATABASE_URL |
MongoDB connection string | Yes | - |
JWT_SECRET |
JWT signing secret | Yes | - |
REFRESH_TOKEN_SECRET |
Refresh token secret | Yes | - |
POSTMARK_API_KEY |
Postmark API key | For emails | - |
FROM_EMAIL |
Sender email address | For emails | - |
APP_URL |
Application URL | Yes | - |
GMAIL_CLIENT_ID |
Google OAuth client ID | For Gmail | - |
GMAIL_CLIENT_SECRET |
Google OAuth secret | For Gmail | - |
GMAIL_REDIRECT_URI |
OAuth redirect URI | For Gmail | - |
# Check if MongoDB is running
sudo systemctl status mongod # Linux
brew services list # macOS
# Check MongoDB logs
tail -f /var/log/mongodb/mongod.logIf ports 3000 or 5173 are in use:
# Find and kill process using port 3000
lsof -ti:3000 | xargs kill -9
# Or change the port in server/.env
PORT=3001# Clear all node_modules and reinstall
rm -rf node_modules client/node_modules server/node_modules shared/node_modules
npm install- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
For issues, questions, or contributions, please open an issue on GitHub.
- shadcn/ui for the beautiful component library
- Fireflies.ai for meeting transcription API
- Postmark for reliable email delivery