Skip to content

dev-digitaldream/task-manager

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

20 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Task Manager - Collaborative Todo Application

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


✨ Key Features

🌍 Internationalization (i18n)

  • 3 Languages: πŸ‡¬πŸ‡§ English, πŸ‡«πŸ‡· FranΓ§ais, πŸ‡³πŸ‡± Nederlands
  • Automatic browser language detection
  • User preference persistence
  • Complete UI translations

🎨 Advanced UI/UX

  • 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

βœ… Task Management

  • 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

πŸ“… Calendar Integration

  • iCalendar subscription (not just download)
  • Permanent subscription URL for auto-sync
  • Compatible with Google Calendar, Outlook, Apple Calendar
  • Task-to-event conversion with reminders

πŸ“§ Email Client Extensions

Outlook Add-in

  • Create tasks directly from Outlook (Desktop/Web)
  • Auto-extract email subject, sender, body
  • Available at /outlook/manifest.xml

Thunderbird Extension (NEW)

  • 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

🎫 Ticketing System Integrations

Connect your task manager with enterprise ticketing systems:

Supported Platforms

  • Zammad - Full REST API integration
  • osTicket - Complete CRUD support
  • Freshdesk - API v2 implementation

Features

  • Bidirectional sync (tasks ↔ tickets)
  • Create tickets from tasks
  • Import tickets as tasks
  • Connection testing
  • Custom field mapping
  • Priority and status synchronization

πŸ“Š Analytics & Reporting

  • Real-time dashboard with KPIs
  • Completion rate tracking
  • Average completion time
  • Task distribution by user/status/priority
  • Meeting mode for critical tasks display

πŸ”’ Security & Performance

  • Helmet.js security headers
  • CORS configuration
  • Rate limiting (100 req/15min per IP)
  • Input sanitization
  • Gzip compression
  • Health check endpoint

πŸš€ Quick Start

Development Setup

# Complete installation (client + server + database)
npm run setup

# Start development servers
npm run dev

Access:

Production with Docker

# Build and start
docker-compose up -d

# Access
# http://localhost:3001

CapRover Deployment

  1. 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
  1. Set up persistent directory:

    • Path in App: /app/data
    • Label: task-manager-db
  2. Enable:

    • βœ… HTTPS
    • βœ… Force HTTPS
    • βœ… Websocket Support (critical for Socket.IO)
  3. Deploy:

./deploy.sh
# or
caprover deploy

See CAPROVER-DEPLOY.md for detailed instructions.


πŸ“¦ Tech Stack

Frontend

  • Framework: React 18 + Vite
  • Styling: TailwindCSS + Radix UI
  • i18n: i18next + react-i18next
  • Routing: React Router v7
  • Icons: Lucide React
  • Real-time: Socket.IO Client

Backend

  • 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

Infrastructure

  • Container: Docker (multi-stage build)
  • Deployment: CapRover compatible
  • Database: SQLite with persistent volume
  • CDN: Cloudinary for file storage

πŸ“ Project Structure

β”œβ”€β”€ 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

πŸ”Œ API Reference

Tasks

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

Users

GET    /api/users                    # List users
POST   /api/users                    # Create user
GET    /api/users/export             # Export data

Calendar

GET    /api/ical/user/:id/subscribe.ics    # Subscribe to user calendar
GET    /api/ical/tasks/subscribe.ics       # Subscribe to all tasks

Integrations (Ticketing)

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

File Attachments

GET    /api/attachments/:taskId            # List attachments
POST   /api/attachments/:taskId            # Upload file
DELETE /api/attachments/file/:id           # Delete file

WebSocket Events

// 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) => {})

🌐 Internationalization

Adding a New Language

  1. Create translation file:
# client/src/locales/de.json
{
  "common": { "save": "Speichern", ... },
  "tasks": { "title": "Aufgaben", ... },
  ...
}
  1. 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
}
  1. Update LanguageSwitcher component to include new flag

🎫 Setting Up Ticketing Integrations

Zammad Configuration

{
  provider: "zammad",
  apiUrl: "https://your-zammad.com",
  apiKey: "your-api-token",
  customConfig: {
    defaultGroup: "Support",
    customerEmail: "customer@example.com"
  }
}

osTicket Configuration

{
  provider: "osticket",
  apiUrl: "https://your-osticket.com",
  apiKey: "your-api-key",
  customConfig: {
    defaultTopicId: "1",
    defaultName: "Task Manager",
    defaultEmail: "support@example.com"
  }
}

Freshdesk Configuration

{
  provider: "freshdesk",
  apiUrl: "https://yourdomain.freshdesk.com",
  apiKey: "your-api-key",
  customConfig: {
    defaultEmail: "support@example.com"
  }
}

πŸ“§ Email Extensions

Outlook Add-in Installation

  1. Host the manifest file:

    • Production: https://task-manager.digitaldream.work/outlook/manifest.xml
  2. Install in Outlook:

    • Desktop: File β†’ Manage Add-ins β†’ My Add-ins β†’ Add from URL
    • Web: Settings β†’ Manage Add-ins β†’ Add from URL

Thunderbird Extension Installation

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

πŸ”§ Configuration

Environment Variables

Server (.env)

# 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

Client (.env)

VITE_SERVER_URL=http://localhost:3001

πŸ› οΈ Development

Available Commands

# 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

Database Schema

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())
}

πŸ“Š Performance & Limits

  • 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)

πŸ” Security

Built-in Security Features

  • 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)

Ticketing Integration Security

  • API keys stored server-side only
  • TODO: Migrate to database with encryption
  • Never expose credentials to client
  • HTTPS required for production

πŸ“ Documentation


πŸ› Troubleshooting

Dark mode not working

  • Clear browser cache and localStorage
  • Ensure ThemeSwitcher component is properly initialized
  • Check browser console for errors

WebSocket connection fails

  • Verify WebSocket support is enabled in CapRover
  • Check CORS configuration
  • Ensure firewall allows WebSocket connections

Ticketing integration errors

  • Test connection using the "Test Connection" button
  • Verify API credentials
  • Check API URL format (include protocol: https://)
  • Review server logs for detailed error messages

Calendar subscription not working

  • Use the full subscription URL with webcal:// or https://
  • Check that the iCalendar endpoint is accessible
  • Verify user ID in the subscription URL

🀝 Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Commit changes: git commit -m 'Add amazing feature'
  4. Push to branch: git push origin feature/amazing-feature
  5. Open a Pull Request

πŸ“„ License

MIT License - see LICENSE file for details


πŸ“ž Support


πŸ™ Acknowledgments


Made with ❀️ by Digital Dream

πŸ€– Enhanced with Claude Code

About

Open source collaborative task management with real-time sync

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •