{"id":14957530,"url":"https://github.com/worklenz/worklenz","last_synced_at":"2026-02-09T10:13:23.820Z","repository":{"id":240031571,"uuid":"801379289","full_name":"Worklenz/worklenz","owner":"Worklenz","description":"All in one project management tool for efficient teams","archived":false,"fork":false,"pushed_at":"2025-05-14T11:37:09.000Z","size":8096,"stargazers_count":1620,"open_issues_count":36,"forks_count":134,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-05-14T12:25:20.590Z","etag":null,"topics":["angular","expressjs","postgresql","project-management","react","resource-management","rest-api","scheduler","task-management","time-tracking","typescript"],"latest_commit_sha":null,"homepage":"https://worklenz.com","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Worklenz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-05-16T05:51:01.000Z","updated_at":"2025-05-13T20:22:21.000Z","dependencies_parsed_at":"2024-11-19T11:42:11.346Z","dependency_job_id":"f7030db9-3b33-4fc1-9c65-99f9de485ecb","html_url":"https://github.com/Worklenz/worklenz","commit_stats":{"total_commits":18,"total_committers":7,"mean_commits":"2.5714285714285716","dds":0.6111111111111112,"last_synced_commit":"5cce1f2d2cbc7358fcaf819e5ad315b2c174c3e8"},"previous_names":["worklenz/worklenz"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Worklenz%2Fworklenz","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Worklenz%2Fworklenz/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Worklenz%2Fworklenz/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Worklenz%2Fworklenz/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Worklenz","download_url":"https://codeload.github.com/Worklenz/worklenz/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254198514,"owners_count":22030965,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","expressjs","postgresql","project-management","react","resource-management","rest-api","scheduler","task-management","time-tracking","typescript"],"created_at":"2024-09-24T13:15:05.438Z","updated_at":"2026-02-09T10:13:23.784Z","avatar_url":"https://github.com/Worklenz.png","language":"JavaScript","readme":"\u003ch1 align=\"center\"\u003e\n    \u003ca href=\"https://worklenz.com\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n        \u003cimg src=\"https://s3.us-west-2.amazonaws.com/worklenz.com/assets/icon-144x144.png\" alt=\"Worklenz Logo\" width=\"75\"\u003e\n    \u003c/a\u003e\n    \u003cbr\u003e\n    Worklenz    \n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/Worklenz/worklenz/blob/main/LICENSE\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/license-AGPL--3.0-blue.svg\" alt=\"License\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/Worklenz/worklenz/releases\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/v/release/Worklenz/worklenz\" alt=\"Release\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/Worklenz/worklenz/stargazers\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/stars/Worklenz/worklenz\" alt=\"Stars\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/Worklenz/worklenz/network/members\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/forks/Worklenz/worklenz\" alt=\"Forks\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/Worklenz/worklenz/issues\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/issues/Worklenz/worklenz\" alt=\"Issues\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://discord.gg/AVbkGXHA\"\u003e\n        \u003cimg src=\"https://img.shields.io/discord/1202616582757556276?style=flat\u0026logo=discord\u0026logoColor=white\u0026label=Discord\u0026color=5865F2\" alt=\"Issues\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://worklenz.com/task-management/\"\u003eTask Management\u003c/a\u003e |\n    \u003ca href=\"https://worklenz.com/time-tracking/\"\u003eTime Tracking\u003c/a\u003e |\n    \u003ca href=\"https://worklenz.com/analytics/\"\u003eAnalytics\u003c/a\u003e |\n    \u003ca href=\"https://worklenz.com/resource-management/\"\u003eResource Management\u003c/a\u003e |\n    \u003ca href=\"https://worklenz.com/templates/\"\u003eProject Templates\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://worklenz.com\" target=\"_blank\"\u003e\n      \u003cimg\n        src=\"https://worklenz.s3.amazonaws.com/assets/screenshots/hero-view.png\"\n        alt=\"Worklenz\"\n        width=\"1200\"\n      /\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\nWorklenz is a project management tool designed to help organizations improve their efficiency. It provides a\ncomprehensive solution for managing projects, tasks, and collaboration within teams.\n\n## Table of Contents\n\n- [Features](#features)\n- [Tech Stack](#tech-stack)\n- [Getting Started](#getting-started)\n  - [Quick Start (Docker)](#-quick-start-docker---recommended)\n  - [Manual Installation](#️-manual-installation-for-development)\n- [Deployment](#deployment)\n  - [Local Development](#local-development-with-docker)\n  - [Remote Server Deployment](#remote-server-deployment)\n- [Configuration](#configuration)\n- [MinIO Integration](#minio-integration)\n- [Security](#security)\n- [Analytics](#analytics)\n- [Screenshots](#screenshots)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Features\n\n- **Project Planning**: Create and organize projects, assign tasks to team members.\n- **Task Management**: Break down projects into smaller tasks, set due dates, priorities, and track progress.\n- **Collaboration**: Share files, leave comments, and communicate seamlessly with your team members.\n- **Time Tracking**: Monitor time spent on tasks and projects for better resource allocation and billing.\n- **Reporting**: Generate detailed reports on project status, team workload, and performance metrics.\n\n## Tech Stack\n\nThis repository contains the frontend and backend code for Worklenz.\n\n- **Frontend**: Built using React with Ant Design as the UI library.\n- **Backend**: Built using TypeScript, Express.js, with PostgreSQL as the database.\n\n## Requirements\n\n- Node.js version v18 or newer\n- PostgreSQL version v15 or newer\n- Docker and Docker Compose (for containerized setup)\n\n## Getting Started\n\nChoose your preferred setup method below. Docker is recommended for quick setup and testing.\n\n### 🚀 Quick Start (Docker - Recommended)\n\nThe fastest way to get Worklenz running locally with all dependencies included. This setup includes **production-ready features** like nginx reverse proxy, SSL/TLS support, Redis caching, and automated backups.\n\n**Prerequisites:**\n- Docker and Docker Compose installed on your system\n- Git\n\n**Steps:**\n\n#### Option 1: Automated Setup (Easiest)\n```bash\n# Clone the repository\ngit clone https://github.com/Worklenz/worklenz.git\ncd worklenz\n\n# Run the automated setup script\n./quick-setup.sh\n```\n\nThis script will:\n- Create `.env` file with auto-generated security secrets\n- Configure URLs based on your domain (localhost or production)\n- Set up SSL certificates (self-signed for localhost, Let's Encrypt for production)\n- Install and start all services\n\n#### Option 2: Manual Setup\n```bash\n# Clone the repository\ngit clone https://github.com/Worklenz/worklenz.git\ncd worklenz\n\n# Copy and configure environment file\ncp .env.example .env\n# Edit .env and set required values (DB_PASSWORD, SESSION_SECRET, etc.)\n\n# Start services (Express mode - includes PostgreSQL, Redis, MinIO)\ndocker compose --profile express up -d\n```\n\n**Access the application:**\n- **Application**: https://localhost (or http://localhost)\n- **MinIO Console**: http://localhost:9001 (login: minioadmin/minioadmin)\n\n**Management:**\n```bash\n# Use the management script for common operations\n./manage.sh status    # View service status\n./manage.sh logs      # View logs\n./manage.sh backup    # Create database backup\n./manage.sh stop      # Stop all services\n./manage.sh start     # Start all services\n```\n\n**For detailed documentation**, see [DOCKER_SETUP.md](DOCKER_SETUP.md)\n\n**Video Guide**: For a visual walkthrough of the local Docker deployment process, check out our [step-by-step video guide](https://www.youtube.com/watch?v=AfwAKxJbqLg).\n\n### 🛠️ Manual Installation (For Development)\n\nFor developers who want to run the services individually or customize the setup.\n\n**Prerequisites:**\n- Node.js (version 18 or higher)\n- PostgreSQL (version 15 or higher)\n- An S3-compatible storage service (like MinIO) or Azure Blob Storage\n\n**Steps:**\n\n1. Clone the repository:\n```bash\ngit clone https://github.com/Worklenz/worklenz.git\ncd worklenz\n```\n\n2. Set up environment variables:\n```bash\ncp worklenz-backend/.env.template worklenz-backend/.env\n# Update the environment variables with your configuration\n```\n\n3. Install dependencies:\n```bash\n# Backend dependencies\ncd worklenz-backend\nnpm install\n\n# Frontend dependencies\ncd ../worklenz-frontend\nnpm install\n```\n\n4. Set up the database:\n```bash\n# Create a PostgreSQL database named worklenz_db\ncd worklenz-backend\n\n# Execute the SQL setup files in the correct order\npsql -U your_username -d worklenz_db -f database/sql/0_extensions.sql\npsql -U your_username -d worklenz_db -f database/sql/1_tables.sql\npsql -U your_username -d worklenz_db -f database/sql/indexes.sql\npsql -U your_username -d worklenz_db -f database/sql/4_functions.sql\npsql -U your_username -d worklenz_db -f database/sql/triggers.sql\npsql -U your_username -d worklenz_db -f database/sql/3_views.sql\npsql -U your_username -d worklenz_db -f database/sql/2_dml.sql\npsql -U your_username -d worklenz_db -f database/sql/5_database_user.sql\n```\n\n5. Start the development servers:\n```bash\n# Backend (single command for build, watch, and auto-restart)\ncd worklenz-backend\nnpm run dev:all\n\n# Frontend (in another terminal)\ncd worklenz-frontend\nnpm run dev\n```\n\n6. Access the application at http://localhost:5000\n\n## Deployment\n\n### Local Development\n\nFor local development, follow the [Quick Start (Docker)](#-quick-start-docker---recommended) section above.\n\n### Production Deployment\n\nThe new Docker setup includes production-ready features for secure and scalable deployments.\n\n#### Quick Production Setup\n\n```bash\n# Clone and navigate to the repository\ngit clone https://github.com/Worklenz/worklenz.git\ncd worklenz\n\n# Run the automated setup\n./quick-setup.sh\n# When prompted, enter your production domain (e.g., worklenz.example.com)\n# The script will configure SSL with Let's Encrypt automatically\n```\n\n#### Manual Production Setup\n\n1. **Configure environment for your domain:**\n   ```bash\n   cp .env.example .env\n   # Edit .env and set:\n   # - DOMAIN=your-domain.com\n   # - VITE_API_URL=https://your-domain.com\n   # - VITE_SOCKET_URL=wss://your-domain.com\n   # - ENABLE_SSL=true\n   # - LETSENCRYPT_EMAIL=your-email@domain.com\n   # - Generate secure secrets for DB_PASSWORD, SESSION_SECRET, etc.\n   ```\n\n2. **Point your domain's DNS A record to your server IP**\n\n3. **Start services with SSL:**\n   ```bash\n   docker compose --profile express --profile ssl up -d\n   ```\n\n4. **Access your application at:** https://your-domain.com\n\n#### Management Commands\n\n```bash\n./manage.sh install    # Interactive installation\n./manage.sh upgrade    # Upgrade to latest version\n./manage.sh backup     # Create database backup\n./manage.sh restore    # Restore from backup\n./manage.sh ssl        # Manage SSL certificates\n./manage.sh status     # View service status\n```\n\n#### Deployment Modes\n\n- **Express Mode** (default): All services bundled (PostgreSQL, Redis, MinIO)\n  ```bash\n  docker compose --profile express up -d\n  ```\n\n- **Advanced Mode**: Use external services (AWS S3, Azure Blob, external PostgreSQL)\n  ```bash\n  # Set DEPLOYMENT_MODE=advanced in .env\n  docker compose up -d\n  ```\n\n**For complete deployment documentation**, see [DOCKER_SETUP.md](DOCKER_SETUP.md)\n\n**Video Guide**: For a complete walkthrough of deploying Worklenz to a remote server, check out our [deployment video guide](https://www.youtube.com/watch?v=CAZGu2iOXQs\u0026t=10s).\n\n## Configuration\n\n### Environment Variables\n\nWorklenz uses a comprehensive environment configuration system. Copy `.env.example` to `.env` and configure according to your needs.\n\n**Key Configuration Areas:**\n\n- **Deployment Mode**: `express` (all services bundled) or `advanced` (external services)\n- **Domain \u0026 URLs**: Configure for localhost or production domain\n- **Database**: PostgreSQL credentials and connection settings\n- **Security Secrets**: Session, cookie, and JWT secrets (auto-generated by setup scripts)\n- **Storage**: MinIO (default), AWS S3, or Azure Blob Storage\n- **Redis**: Cache configuration (Express mode)\n- **SSL/TLS**: Let's Encrypt for production, self-signed for localhost\n- **Backups**: Automated backup retention settings\n- **Optional Features**: Google OAuth, reCAPTCHA, email notifications\n\n**Quick Configuration:**\n\n```bash\n# Auto-generate all secrets and configure based on domain\n./manage.sh auto-configure\n\n# Or manually generate secrets\nopenssl rand -hex 32  # Use for SESSION_SECRET, COOKIE_SECRET, JWT_SECRET\n```\n\n**Important Variables:**\n\n- `DOMAIN`: Your domain (localhost for local testing)\n- `DEPLOYMENT_MODE`: express or advanced\n- `STORAGE_PROVIDER`: s3 (MinIO/AWS) or azure\n- `ENABLE_SSL`: true/false for SSL/TLS\n- `BACKUP_RETENTION_DAYS`: Days to keep backups (default: 30)\n\nFor a complete list of variables with detailed documentation, see `.env.example`.\n\n## MinIO Integration\n\nThe project uses MinIO as an S3-compatible object storage service, which provides an open-source alternative to AWS S3 for development and production.\n\n### Working with MinIO\n\nMinIO provides an S3-compatible API, so any code that works with S3 will work with MinIO by simply changing the endpoint URL. The backend has been configured to use MinIO by default, with no additional configuration required.\n\n- **MinIO Console**: http://localhost:9001\n  - Username: minioadmin\n  - Password: minioadmin\n\n- **Default Bucket**: worklenz-bucket (created automatically when the containers start)\n\n### Backend Storage Configuration\n\nThe backend is pre-configured to use MinIO with the following settings:\n\n```javascript\n// S3 credentials with MinIO defaults\nexport const REGION = process.env.AWS_REGION || \"us-east-1\";\nexport const BUCKET = process.env.AWS_BUCKET || \"worklenz-bucket\";\nexport const S3_URL = process.env.S3_URL || \"http://minio:9000/worklenz-bucket\";\nexport const S3_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID || \"minioadmin\";\nexport const S3_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY || \"minioadmin\";\n```\n\n### Security Features\n\nThe new Docker setup includes enterprise-grade security features:\n\n**Built-in Security:**\n- ✅ Non-root containers (all services run as non-privileged users)\n- ✅ Network isolation (backend network is internal-only)\n- ✅ SSL/TLS support (Let's Encrypt for production, self-signed for localhost)\n- ✅ Rate limiting on API and login endpoints\n- ✅ Security headers (HSTS, CSP, X-Frame-Options, etc.)\n- ✅ Auto-generated secure secrets (using `openssl rand -hex 32`)\n\n**Best Practices for Production:**\n\n1. **Use the automated setup** to generate strong, unique passwords and keys\n2. **Never commit `.env` files** to version control\n3. **Enable SSL/TLS** for production deployments (`ENABLE_SSL=true`)\n4. **Configure automated backups** with appropriate retention\n5. **Review and update** dependencies regularly\n6. **Use strong passwords** for all services (DB, Redis, MinIO)\n7. **Restrict network access** using firewall rules\n8. **Monitor logs** regularly using `./manage.sh logs`\n\n**Automated Backups:**\n```bash\n# Enable automated daily backups\ndocker compose --profile express --profile backup up -d\n\n# Manual backup\n./manage.sh backup\n\n# Restore from backup\n./manage.sh restore\n```\n\n## Security\n\nIf you believe you have found a security vulnerability in Worklenz, we encourage you to responsibly disclose this and not open a public issue. We will investigate all legitimate reports.\n\nEmail [info@worklenz.com](mailto:info@worklenz.com) to disclose any security vulnerabilities.\n\n## Analytics\n\nWorklenz uses Google Analytics to understand how the application is being used. This helps us improve the application and make better decisions about future development.\n\n### What We Track\n- Anonymous usage statistics\n- Page views and navigation patterns\n- Feature usage\n- Browser and device information\n\n### Privacy\n- Analytics is opt-in only\n- No personal information is collected\n- Users can opt-out at any time\n- Data is stored according to Google's privacy policy\n\n### How to Opt-Out\nIf you've previously opted in and want to opt-out:\n1. Clear your browser's local storage for the Worklenz domain\n2. Or click the \"Decline\" button in the analytics notice if it appears\n\n## Screenshots\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://worklenz.com/features/task-management/\" target=\"_blank\"\u003e\n    \u003cimg\n      src=\"https://worklenz.s3.amazonaws.com/assets/screenshots/task-views-view.png\"\n      alt=\"Worklenz task views\"\n      width=\"1024\"\n    /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://worklenz.com/features/time-tracking/\" target=\"_blank\"\u003e\n    \u003cimg\n      src=\"https://worklenz.s3.amazonaws.com/assets/screenshots/time-tracking-view.png\"\n      alt=\"Worklenz time tracking\"\n      width=\"1024\"\n    /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://worklenz.com/features/analytics/\" target=\"_blank\"\u003e\n    \u003cimg\n      src=\"https://worklenz.s3.amazonaws.com/assets/screenshots/analytics-view.png\"\n      alt=\"Worklenz analytics\"\n      width=\"1024\"\n    /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://worklenz.com/features/resource-management/\" target=\"_blank\"\u003e\n    \u003cimg\n      src=\"https://worklenz.s3.amazonaws.com/assets/screenshots/schedule-view.png\"\n      alt=\"Worklenz scheduler\"\n      width=\"1024\"\n    /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://worklenz.com/features/templates/\" target=\"_blank\"\u003e\n    \u003cimg\n      src=\"https://worklenz.s3.amazonaws.com/assets/screenshots/templates-view.png\"\n      alt=\"Worklenz templates\"\n      width=\"1024\"\n    /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Contributing\n\nWe welcome contributions from the community! If you'd like to contribute, please follow our [contributing guidelines](CONTRIBUTING.md).\n\n## License\n\nWorklenz is open source and released under the [GNU Affero General Public License Version 3 (AGPLv3)](LICENSE).\n\nBy contributing to Worklenz, you agree that your contributions will be licensed under its AGPL.\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworklenz%2Fworklenz","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fworklenz%2Fworklenz","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworklenz%2Fworklenz/lists"}