A modern, real-time collaborative task management application designed for teams, featuring multilingual support, ticketing system integrations, and email client extensions.
π Live Demo: https://task-manager.digitaldream.work
- 3 Languages: π¬π§ English, π«π· FranΓ§ais, π³π± Nederlands
- Automatic browser language detection
- User preference persistence
- Complete UI translations
- Theme System: Light, Dark, and System modes
- Real-time synchronization via WebSocket (< 100ms)
- Responsive design for mobile and desktop
- Modern interface with Radix UI components
- Persistent user preferences
- Create, edit, delete tasks with rich metadata
- User assignment and due dates
- Priority levels (Low, Medium, High, Urgent)
- Status tracking (To Do, Doing, Done)
- Comments system with timestamps
- File attachments via Cloudinary (10MB max)
- Recurring tasks with RRULE standard
- iCalendar subscription (not just download)
- Permanent subscription URL for auto-sync
- Compatible with Google Calendar, Outlook, Apple Calendar
- Task-to-event conversion with reminders
- Create tasks directly from Outlook (Desktop/Web)
- Auto-extract email subject, sender, body
- Available at
/outlook/manifest.xml
- Full-featured Thunderbird 102+ add-on
- Multi-language support (EN/FR/NL)
- 3 ways to create tasks:
- Context menu on emails
- Toolbar button
- Message display action
- Configurable server URL
- Install:
thunderbird-addon/task-manager-thunderbird.xpi
Connect your task manager with enterprise ticketing systems:
- Zammad - Full REST API integration
- osTicket - Complete CRUD support
- Freshdesk - API v2 implementation
- Bidirectional sync (tasks β tickets)
- Create tickets from tasks
- Import tickets as tasks
- Connection testing
- Custom field mapping
- Priority and status synchronization
- Real-time dashboard with KPIs
- Completion rate tracking
- Average completion time
- Task distribution by user/status/priority
- Meeting mode for critical tasks display
- Helmet.js security headers
- CORS configuration
- Rate limiting (100 req/15min per IP)
- Input sanitization
- Gzip compression
- Health check endpoint
# Complete installation (client + server + database)
npm run setup
# Start development servers
npm run dev
Access:
- Frontend: http://localhost:5173
- Backend: http://localhost:3001
- Dashboard: http://localhost:5173/dashboard
- Analytics: http://localhost:5173/analytics
# Build and start
docker-compose up -d
# Access
# http://localhost:3001
- Configure environment variables in CapRover:
NODE_ENV=production
PORT=80
CLIENT_URL=https://task-manager.digitaldream.work
DATABASE_URL=file:/app/data/dev.db
CORS_ORIGINS=https://task-manager.digitaldream.work
-
Set up persistent directory:
- Path in App:
/app/data
- Label:
task-manager-db
- Path in App:
-
Enable:
- β HTTPS
- β Force HTTPS
- β Websocket Support (critical for Socket.IO)
-
Deploy:
./deploy.sh
# or
caprover deploy
See CAPROVER-DEPLOY.md for detailed instructions.
- Framework: React 18 + Vite
- Styling: TailwindCSS + Radix UI
- i18n: i18next + react-i18next
- Routing: React Router v7
- Icons: Lucide React
- Real-time: Socket.IO Client
- Runtime: Node.js 20
- Framework: Express
- Real-time: Socket.IO
- Database: SQLite + Prisma ORM
- File Upload: Cloudinary + Multer
- Email: Nodemailer
- Security: Helmet, CORS, Rate Limiting
- Container: Docker (multi-stage build)
- Deployment: CapRover compatible
- Database: SQLite with persistent volume
- CDN: Cloudinary for file storage
βββ client/ # React Frontend
β βββ src/
β β βββ components/ # React components
β β β βββ TaskList.jsx
β β β βββ UserProfile.jsx
β β β βββ LanguageSwitcher.jsx
β β β βββ ThemeSwitcher.jsx
β β β βββ CalendarSubscription.jsx
β β β βββ IntegrationsSettings.jsx
β β β βββ ...
β β βββ hooks/ # Custom hooks
β β βββ locales/ # i18n translations
β β β βββ en.json
β β β βββ fr.json
β β β βββ nl.json
β β βββ i18n.js # i18n configuration
β β βββ App.jsx
β βββ package.json
β
βββ server/ # Node.js Backend
β βββ src/
β β βββ routes/ # API routes
β β β βββ tasks.js
β β β βββ users.js
β β β βββ integrations.js # Ticketing integrations
β β β βββ ical.js # Calendar endpoints
β β βββ integrations/ # Ticketing system integrations
β β β βββ ticketing-base.js # Base class
β β β βββ zammad.js
β β β βββ osticket.js
β β β βββ freshdesk.js
β β β βββ index.js
β β βββ services/ # Business logic
β β β βββ cloudinary.js
β β β βββ recurring.js
β β β βββ notifications.js
β β βββ middleware/ # Express middleware
β β βββ server.js # Entry point
β βββ prisma/
β βββ schema.prisma # Database schema
β
βββ outlook-addin/ # Outlook Extension
β βββ manifest.xml
β βββ taskpane.html
β βββ README.md
β
βββ thunderbird-addon/ # Thunderbird Extension (NEW)
β βββ manifest.json
β βββ background.js
β βββ popup.html
β βββ popup.js
β βββ _locales/ # i18n for extension
β βββ README.md
β
βββ Dockerfile # Multi-stage build
βββ docker-compose.yml
βββ start.sh # Container startup script
βββ deploy.sh # Deployment helper
βββ README.md # This file
GET /api/tasks # List all tasks
POST /api/tasks # Create task
PATCH /api/tasks/:id # Update task
DELETE /api/tasks/:id # Delete task
POST /api/tasks/:id/comments # Add comment
GET /api/users # List users
POST /api/users # Create user
GET /api/users/export # Export data
GET /api/ical/user/:id/subscribe.ics # Subscribe to user calendar
GET /api/ical/tasks/subscribe.ics # Subscribe to all tasks
GET /api/integrations?userId={id} # List integrations
POST /api/integrations/configure # Configure integration
POST /api/integrations/test # Test connection
POST /api/integrations/create-ticket # Create ticket from task
POST /api/integrations/import-ticket # Import ticket as task
DELETE /api/integrations/:provider?userId={id} # Remove integration
GET /api/attachments/:taskId # List attachments
POST /api/attachments/:taskId # Upload file
DELETE /api/attachments/file/:id # Delete file
// Client β Server
socket.emit('user:join', userId)
socket.emit('task:create', taskData)
socket.emit('task:update', { id, updates })
socket.emit('task:delete', taskId)
// Server β Client
socket.on('task:created', (task) => {})
socket.on('task:updated', (task) => {})
socket.on('task:deleted', (taskId) => {})
socket.on('users:online', (users) => {})
- Create translation file:
# client/src/locales/de.json
{
"common": { "save": "Speichern", ... },
"tasks": { "title": "Aufgaben", ... },
...
}
- Register in i18n config:
// client/src/i18n.js
import de from './locales/de.json'
const resources = {
en: { translation: en },
fr: { translation: fr },
nl: { translation: nl },
de: { translation: de } // Add this
}
- Update LanguageSwitcher component to include new flag
{
provider: "zammad",
apiUrl: "https://your-zammad.com",
apiKey: "your-api-token",
customConfig: {
defaultGroup: "Support",
customerEmail: "customer@example.com"
}
}
{
provider: "osticket",
apiUrl: "https://your-osticket.com",
apiKey: "your-api-key",
customConfig: {
defaultTopicId: "1",
defaultName: "Task Manager",
defaultEmail: "support@example.com"
}
}
{
provider: "freshdesk",
apiUrl: "https://yourdomain.freshdesk.com",
apiKey: "your-api-key",
customConfig: {
defaultEmail: "support@example.com"
}
}
-
Host the manifest file:
- Production:
https://task-manager.digitaldream.work/outlook/manifest.xml
- Production:
-
Install in Outlook:
- Desktop: File β Manage Add-ins β My Add-ins β Add from URL
- Web: Settings β Manage Add-ins β Add from URL
Development:
# Thunderbird β Tools β Developer Tools β Debug Add-ons
# Load Temporary Add-on β Select manifest.json
Production:
cd thunderbird-addon
zip -r task-manager-thunderbird.xpi * -x "*.git*" "*.DS_Store"
# Install .xpi via Tools β Add-ons
# Application
NODE_ENV=production
PORT=3001
CLIENT_URL=https://task-manager.digitaldream.work
# Database
DATABASE_URL=file:/app/data/dev.db
# Security
CORS_ORIGINS=https://task-manager.digitaldream.work
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX_REQUESTS=100
# Cloudinary (File uploads)
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
# Email (Notifications)
EMAIL_PROVIDER=dev # dev, postmark, sendgrid, smtp
EMAIL_FROM=dev@digitaldream.work
SMTP_HOST=smtp.example.com
SMTP_PORT=587
POSTMARK_API_TOKEN=your_token
SENDGRID_API_KEY=your_key
VITE_SERVER_URL=http://localhost:3001
# Root
npm run setup # Complete setup (client + server + db)
npm run dev # Start both client and server
# Client
cd client
npm run dev # Vite dev server
npm run build # Production build
npm run preview # Preview production build
# Server
cd server
npm run dev # Start with nodemon
npm run start # Production start
npm run db:generate # Generate Prisma client
npm run db:push # Apply schema changes
npm run db:seed # Seed demo data
model User {
id String @id @default(cuid())
name String
email String?
avatar String?
isOnline Boolean @default(false)
tasks Task[]
comments Comment[]
}
model Task {
id String @id @default(cuid())
title String
status String @default("todo")
priority String?
dueDate DateTime?
assigneeId String?
assignee User? @relation(fields: [assigneeId], references: [id])
isRecurring Boolean @default(false)
recurrenceRule String?
comments Comment[]
attachments Attachment[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Attachment {
id String @id @default(cuid())
taskId String
task Task @relation(fields: [taskId], references: [id])
fileName String
fileType String
fileSize Int
url String
publicId String
uploaderId String
uploader User @relation(fields: [uploaderId], references: [id])
createdAt DateTime @default(now())
}
- WebSocket latency: < 100ms for real-time updates
- Max file upload: 10MB per file
- Rate limiting: 100 requests per 15 minutes per IP
- Recommended users: < 100 active users (SQLite limitation)
- Browser support: Chrome, Firefox, Safari, Edge (latest 2 versions)
- Helmet.js for HTTP headers
- CORS with configurable origins
- Input sanitization on all endpoints
- Rate limiting for API routes
- XSS protection
- CSRF token support (optional)
- Secure WebSocket connections (WSS in production)
- API keys stored server-side only
- TODO: Migrate to database with encryption
- Never expose credentials to client
- HTTPS required for production
- New Features Guide - Complete feature documentation (FR)
- CapRover Deployment - Deployment guide
- Deployment Config - Environment configuration
- Thunderbird Extension - Extension setup
- Outlook Add-in - Outlook integration
- Clear browser cache and localStorage
- Ensure
ThemeSwitcher
component is properly initialized - Check browser console for errors
- Verify WebSocket support is enabled in CapRover
- Check CORS configuration
- Ensure firewall allows WebSocket connections
- Test connection using the "Test Connection" button
- Verify API credentials
- Check API URL format (include protocol: https://)
- Review server logs for detailed error messages
- Use the full subscription URL with
webcal://
orhttps://
- Check that the iCalendar endpoint is accessible
- Verify user ID in the subscription URL
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature
- Commit changes:
git commit -m 'Add amazing feature'
- Push to branch:
git push origin feature/amazing-feature
- Open a Pull Request
MIT License - see LICENSE file for details
- Website: https://task-manager.digitaldream.work
- Email: dev@digitaldream.work
- Issues: GitHub Issues
- Built with React
- UI components from Radix UI
- Icons by Lucide
- Database ORM by Prisma
- Real-time by Socket.IO
- File storage by Cloudinary
Made with β€οΈ by Digital Dream
π€ Enhanced with Claude Code