Deploying Digibunch
Digibunch is a comprehensive team collaboration and project management platform that brings together everything your team needs to stay organized and productive. Built on Laravel and designed with modern teams in mind, it combines project tracking, task management, file sharing, team communication, and time tracking into one unified workspace. Instead of juggling multiple tools and subscriptions—one for chat, another for files, a third for tasks—Digibunch consolidates these essential functions into a single, self-hosted application that you control completely.
What sets Digibunch apart from heavyweight enterprise solutions is its focus on simplicity without sacrificing power. The interface feels intuitive from day one, with a clean design that puts your work front and center. Create projects and immediately start adding tasks, uploading files, and inviting team members. The built-in Kanban boards give you visual task management, while the calendar view helps you track deadlines and milestones. Real-time notifications keep everyone in the loop, and the activity feed provides transparency into what’s happening across all your projects. File version control ensures you never lose important work, and the time tracking features help teams understand how they’re spending their hours. Whether you’re a small startup coordinating remote workers or an established company looking to break free from expensive SaaS subscriptions, Digibunch provides the tools you need without the complexity you don’t.
Why Deploy Digibunch on Klutch.sh?
Deploying Digibunch on Klutch.sh offers several compelling advantages for team collaboration:
- Complete Data Ownership: Your team’s projects, files, and communications stay on infrastructure you control
- Always-On Access: Keep your workspace available 24/7 without maintaining local servers
- Automatic HTTPS: Secure team communications with built-in SSL certificates
- Persistent Storage: All projects, files, and data persist safely across deployments
- Scalable Infrastructure: Grow from small teams to large organizations on the same platform
- Cost Effective: Eliminate per-user SaaS fees with self-hosted collaboration
- Quick Deployment: Go from code to productive workspace in minutes
Prerequisites
Before deploying Digibunch to Klutch.sh, ensure you have:
- A Klutch.sh account (sign up here)
- A GitHub account with a repository for your Digibunch deployment
- Basic understanding of Docker and containerization
- Familiarity with PHP and Laravel applications
- Understanding of team collaboration workflows
- Git installed on your local development machine
- MySQL or PostgreSQL database knowledge (optional but helpful)
Understanding Digibunch Architecture
Digibunch follows a traditional LAMP/LEMP stack architecture optimized for team collaboration:
Core Components
Laravel Backend
Digibunch is built on the Laravel PHP framework, which provides a robust foundation for the application. Laravel’s elegant syntax and comprehensive feature set handle everything from database operations to authentication, task scheduling, and real-time events. The backend manages all business logic including user permissions, project hierarchies, task dependencies, file storage, and notification delivery. Laravel’s Eloquent ORM makes database interactions efficient and secure, while the built-in queue system handles resource-intensive operations like email sending and file processing asynchronously.
Key backend responsibilities:
- User authentication and authorization with role-based access control
- Project and task CRUD operations with relationship management
- File upload, storage, and version control
- Real-time notification system via Laravel Echo
- Task scheduling for recurring events and reminders
- API endpoints for mobile and third-party integrations
- Background job processing for heavy operations
- Database migrations and seeding
Frontend Interface
The frontend uses a combination of Blade templates and Vue.js components for a responsive, interactive experience. Blade provides server-side rendering for initial page loads and SEO, while Vue.js handles dynamic interactions like drag-and-drop task management, real-time updates, and inline editing. The interface adapts seamlessly across devices—desktop, tablet, and mobile—ensuring team members can stay productive regardless of how they access Digibunch.
Interface features:
- Dashboard showing recent activity across all projects
- Project list with filtering and search capabilities
- Kanban-style task boards with drag-and-drop
- Calendar view for deadline tracking
- File browser with folder organization
- Team directory with availability status
- Activity timeline showing recent changes
- Real-time notifications without page refresh
Database Layer
Digibunch supports both MySQL and PostgreSQL, with MySQL being the default choice. The database schema is carefully designed to handle complex relationships:
Core Tables:
users: Team member accounts with profiles and settingsprojects: Project metadata, descriptions, and settingstasks: Task details including title, description, assignee, due date, statusfiles: File metadata with references to storage locationscomments: Discussions on tasks and projectsteams: Team/workspace groupingsactivity_logs: Comprehensive audit trail of all actions
Relationship Tables:
project_user: Team member assignments to projectstask_dependencies: Dependencies between tasksfile_versions: Version history for uploaded filesnotifications: User notification queue
The schema uses proper indexing for performance and foreign key constraints for data integrity.
Storage System
Digibunch handles file storage flexibly:
Local Storage: Files stored on the server filesystem in the storage/app directory. Organized by project and file type for easy management. Suitable for small to medium teams with moderate file storage needs.
Cloud Storage: Supports AWS S3, DigitalOcean Spaces, and other S3-compatible storage. Recommended for larger deployments or when horizontal scaling is needed. Configured via environment variables with automatic failover to local storage if cloud storage is unavailable.
File Features:
- Automatic file type detection and icon assignment
- Version control with diff viewing for text files
- Direct file serving or download options
- Thumbnail generation for images
- Preview generation for documents
- Access control based on project permissions
Queue System
Laravel’s queue system handles asynchronous tasks:
Queue Workers: Process background jobs including:
- Email notifications to team members
- File processing (thumbnail generation, format conversion)
- Large data exports (project reports, time sheets)
- Webhook deliveries to external services
- Database cleanup and optimization tasks
Queue Drivers: Supports multiple backends:
- Database queue (default, simple setup)
- Redis queue (recommended for production, better performance)
- Beanstalkd queue (alternative high-performance option)
Workers run continuously, picking up jobs as they’re queued and processing them asynchronously.
Real-Time Features
Digibunch uses Laravel Echo with WebSocket connections for real-time updates:
Broadcasting Events:
- New task assignments appear immediately
- Comment notifications show in real-time
- File upload completions broadcast to project members
- User presence indicators (online/offline status)
- Typing indicators in comment threads
Technical Stack:
- Laravel Broadcasting for event firing
- Pusher or Laravel WebSockets for WebSocket server
- Socket.io client library for frontend connections
- Redis for pub/sub message distribution
Request Flow
Understanding how requests move through Digibunch helps with deployment and troubleshooting:
- User Action: Team member creates task, uploads file, or posts comment
- Web Server: Nginx receives request and passes to PHP-FPM
- Laravel Router: Routes request to appropriate controller
- Controller Logic: Validates input, performs business logic
- Database Operation: Eloquent saves changes to database
- Event Broadcasting: Laravel fires event for real-time updates
- Queue Jobs: Asynchronous tasks queued (emails, notifications)
- Response: JSON or HTML response returned to user
- Frontend Update: Vue.js components update interface
- WebSocket Push: Other team members receive real-time updates
Permission System
Digibunch implements a flexible permission model:
Roles:
- Owner: Full control over workspace, billing, and all projects
- Admin: Can manage projects, users, and settings
- Member: Can create projects and participate in assigned projects
- Guest: Limited access to specific projects only
Project Permissions:
- Project Manager: Full control within project
- Member: Can create and manage own tasks
- Viewer: Read-only access to project
Permissions cascade from workspace level to project level, with more restrictive permissions taking precedence.
Storage Requirements
Digibunch’s storage needs depend on team size and usage:
- Application: 200-300MB for Laravel, dependencies, and assets
- Database: 100MB-1GB depending on team size and activity
- Files: Highly variable based on team file usage (plan 5-50GB typically)
- Logs: 50-200MB with rotation enabled
- Cache: 50-100MB for application and session cache
Typical deployment scenarios:
- Small Team (5-10 users): 10GB total
- Medium Team (10-50 users): 30GB total
- Large Team (50+ users): 100GB+ total
Installation and Setup
Let’s walk through setting up Digibunch for deployment on Klutch.sh.
Step 1: Create the Project Structure
First, create a new directory for your Digibunch deployment:
mkdir digibunch-deploymentcd digibunch-deploymentgit initStep 2: Create the Dockerfile
Create a Dockerfile in the root directory:
FROM php:8.2-fpm-alpine
# Install system dependenciesRUN apk add --no-cache \ nginx \ supervisor \ mysql-client \ postgresql-client \ nodejs \ npm \ git \ curl \ zip \ unzip \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ libzip-dev \ oniguruma-dev \ icu-dev
# Install PHP extensionsRUN docker-php-ext-configure gd --with-freetype --with-jpeg && \ docker-php-ext-install -j$(nproc) \ pdo \ pdo_mysql \ pdo_pgsql \ mbstring \ zip \ exif \ pcntl \ bcmath \ gd \ intl
# Install ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directoryWORKDIR /var/www/html
# Copy application filesCOPY . .
# Install PHP dependenciesRUN composer install --no-dev --optimize-autoloader --no-interaction
# Install Node dependencies and build assetsRUN npm ci && npm run build
# Set permissionsRUN chown -R www-data:www-data /var/www/html && \ chmod -R 755 /var/www/html/storage /var/www/html/bootstrap/cache
# Copy configuration filesCOPY docker/nginx.conf /etc/nginx/nginx.confCOPY docker/php-fpm.conf /usr/local/etc/php-fpm.d/www.confCOPY docker/supervisord.conf /etc/supervisord.conf
# Create necessary directoriesRUN mkdir -p /var/www/html/storage/logs \ /var/www/html/storage/framework/cache \ /var/www/html/storage/framework/sessions \ /var/www/html/storage/framework/views \ /var/www/html/storage/app/public
# Expose portEXPOSE 8080
# Health checkHEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1
# Start supervisordCMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]Step 3: Create Nginx Configuration
Create docker/nginx.conf:
user www-data;worker_processes auto;pid /run/nginx.pid;
events { worker_connections 1024; use epoll;}
http { include /etc/nginx/mime.types; default_type application/octet-stream;
access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;
sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; client_max_body_size 100M;
gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
server { listen 8080; server_name _; root /var/www/html/public; index index.php index.html;
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; }
location ~ /\.ht { deny all; }
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; } }}Step 4: Create PHP-FPM Configuration
Create docker/php-fpm.conf:
[www]user = www-datagroup = www-datalisten = 127.0.0.1:9000listen.owner = www-datalisten.group = www-datapm = dynamicpm.max_children = 50pm.start_servers = 5pm.min_spare_servers = 5pm.max_spare_servers = 35pm.max_requests = 500
; PHP settingsphp_admin_value[error_log] = /var/log/php-fpm/error.logphp_admin_flag[log_errors] = onphp_admin_value[memory_limit] = 256Mphp_value[upload_max_filesize] = 100Mphp_value[post_max_size] = 100Mphp_value[max_execution_time] = 300Step 5: Create Supervisor Configuration
Create docker/supervisord.conf:
[supervisord]nodaemon=trueuser=rootlogfile=/var/log/supervisord.logpidfile=/var/run/supervisord.pid
[program:nginx]command=/usr/sbin/nginx -g "daemon off;"autostart=trueautorestart=truestdout_logfile=/dev/stdoutstdout_logfile_maxbytes=0stderr_logfile=/dev/stderrstderr_logfile_maxbytes=0
[program:php-fpm]command=/usr/local/sbin/php-fpm -Fautostart=trueautorestart=truestdout_logfile=/dev/stdoutstdout_logfile_maxbytes=0stderr_logfile=/dev/stderrstderr_logfile_maxbytes=0
[program:queue-worker]process_name=%(program_name)s_%(process_num)02dcommand=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --max-time=3600autostart=trueautorestart=truenumprocs=2redirect_stderr=truestdout_logfile=/var/www/html/storage/logs/worker.log
[program:scheduler]command=/bin/sh -c "while [ true ]; do php /var/www/html/artisan schedule:run --verbose --no-interaction; sleep 60; done"autostart=trueautorestart=truestdout_logfile=/var/www/html/storage/logs/scheduler.logStep 6: Create Laravel Environment Configuration
Create .env.example:
# ApplicationAPP_NAME=DigibunchAPP_ENV=productionAPP_KEY=APP_DEBUG=falseAPP_URL=https://example-app.klutch.sh
# DatabaseDB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=digibunchDB_USERNAME=digibunchDB_PASSWORD=
# Cache & SessionCACHE_DRIVER=fileSESSION_DRIVER=fileQUEUE_CONNECTION=database
# Redis (optional, for better performance)REDIS_HOST=127.0.0.1REDIS_PASSWORD=nullREDIS_PORT=6379
# MailMAIL_MAILER=smtpMAIL_HOST=smtp.mailtrap.ioMAIL_PORT=2525MAIL_USERNAME=MAIL_PASSWORD=MAIL_ENCRYPTION=tlsMAIL_FROM_ADDRESS=no-reply@digibunch.comMAIL_FROM_NAME="${APP_NAME}"
# FilesystemFILESYSTEM_DISK=local
# AWS S3 (optional)AWS_ACCESS_KEY_ID=AWS_SECRET_ACCESS_KEY=AWS_DEFAULT_REGION=us-east-1AWS_BUCKET=AWS_USE_PATH_STYLE_ENDPOINT=false
# Broadcasting (for real-time features)BROADCAST_DRIVER=logPUSHER_APP_ID=PUSHER_APP_KEY=PUSHER_APP_SECRET=PUSHER_APP_CLUSTER=mt1
# StorageSTORAGE_PATH=/var/www/html/storage
# LoggingLOG_CHANNEL=stackLOG_LEVEL=error
# SecuritySESSION_LIFETIME=120SESSION_SECURE_COOKIE=trueStep 7: Create Application Bootstrap Script
Create docker/bootstrap.sh:
#!/bin/shset -e
echo "Bootstrapping Digibunch..."
# Wait for database to be readyecho "Waiting for database..."until php artisan migrate:status 2>/dev/null; do echo "Database not ready, waiting..." sleep 2done
# Run migrationsecho "Running database migrations..."php artisan migrate --force
# Clear and cache configecho "Optimizing application..."php artisan config:cachephp artisan route:cachephp artisan view:cache
# Create storage linkphp artisan storage:link
# Set permissionschown -R www-data:www-data /var/www/html/storagechmod -R 775 /var/www/html/storage
echo "Bootstrap complete!"Step 8: Create Composer Configuration
Create composer.json (if not exists in Digibunch):
{ "name": "digibunch/digibunch", "type": "project", "description": "Team collaboration and project management platform", "keywords": ["framework", "laravel", "project management", "collaboration"], "license": "MIT", "require": { "php": "^8.1", "laravel/framework": "^10.0", "laravel/sanctum": "^3.2", "laravel/tinker": "^2.8", "intervention/image": "^2.7", "spatie/laravel-permission": "^5.10", "spatie/laravel-activitylog": "^4.7", "laravel/horizon": "^5.15", "pusher/pusher-php-server": "^7.2" }, "require-dev": { "fakerphp/faker": "^1.9.1", "laravel/pint": "^1.0", "laravel/sail": "^1.18", "mockery/mockery": "^1.4.4", "nunomaduro/collision": "^7.0", "phpunit/phpunit": "^10.0", "spatie/laravel-ignition": "^2.0" }, "autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" } }, "autoload-dev": { "psr-4": { "Tests\\": "tests/" } }, "scripts": { "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" ], "post-update-cmd": [ "@php artisan vendor:publish --tag=laravel-assets --ansi --force" ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "post-create-project-cmd": [ "@php artisan key:generate --ansi" ] }, "extra": { "laravel": { "dont-discover": [] } }, "config": { "optimize-autoloader": true, "preferred-install": "dist", "sort-packages": true, "allow-plugins": { "pestphp/pest-plugin": true, "php-http/discovery": true } }, "minimum-stability": "stable", "prefer-stable": true}Step 9: Create Package.json for Frontend
Create package.json:
{ "private": true, "scripts": { "dev": "vite", "build": "vite build", "watch": "vite build --watch" }, "devDependencies": { "@vitejs/plugin-vue": "^4.0.0", "axios": "^1.1.2", "laravel-vite-plugin": "^0.7.2", "vite": "^4.0.0", "vue": "^3.2.31" }, "dependencies": { "@fortawesome/fontawesome-free": "^6.4.0", "bootstrap": "^5.2.3", "chart.js": "^4.2.1", "vue-router": "^4.1.6", "vuex": "^4.1.0", "vue-draggable": "^4.1.0", "dayjs": "^1.11.7", "lodash": "^4.17.21" }}Step 10: Create Health Check Endpoint
Create routes/web.php addition:
// Health check endpointRoute::get('/health', function () { try { // Check database connection DB::connection()->getPdo();
// Check storage is writable $testFile = storage_path('framework/cache/health-check.txt'); file_put_contents($testFile, time()); unlink($testFile);
return response()->json([ 'status' => 'healthy', 'timestamp' => now()->toIso8601String(), 'database' => 'connected', 'storage' => 'writable' ]); } catch (\Exception $e) { return response()->json([ 'status' => 'unhealthy', 'error' => $e->getMessage() ], 503); }});Step 11: Create Docker Ignore File
Create .dockerignore:
.git.gitignore.env.env.backup.phpunit.result.cachenode_modules/vendor/storage/logs/*.logstorage/framework/cache/*storage/framework/sessions/*storage/framework/views/*!storage/framework/.gitignorebootstrap/cache/*!bootstrap/cache/.gitignorepublic/hotpublic/storagenpm-debug.logyarn-error.log*.mdREADME.md.vscode.idea.DS_StoreThumbs.dbtests/Step 12: Create Documentation
Create README.md:
# Digibunch Deployment
This repository contains a Digibunch deployment configured for Klutch.sh.
## Features
- **Project Management**: Create and manage multiple projects- **Task Tracking**: Kanban boards, lists, and calendar views- **File Sharing**: Upload and organize files with version control- **Team Collaboration**: Comments, mentions, and activity feeds- **Time Tracking**: Track time spent on tasks and projects- **Role-Based Access**: Flexible permissions for teams- **Real-Time Updates**: Live notifications and activity updates- **Mobile Responsive**: Access from any device
## Default Credentials
After first deployment, create an admin account via Artisan:
```bashphp artisan make:admin --email=admin@example.com --password=changemeIMPORTANT: Change the default password immediately!
Quick Start
- Deploy to Klutch.sh
- Set environment variables (database, mail, etc.)
- Access application at your deployment URL
- Create admin account via console
- Login and start creating projects
Configuration
Database Setup
Digibunch requires MySQL or PostgreSQL:
DB_CONNECTION=mysqlDB_HOST=your-database-hostDB_PORT=3306DB_DATABASE=digibunchDB_USERNAME=digibunch_userDB_PASSWORD=secure_passwordMail Configuration
Configure email for notifications:
MAIL_MAILER=smtpMAIL_HOST=smtp.example.comMAIL_PORT=587MAIL_USERNAME=your-usernameMAIL_PASSWORD=your-passwordMAIL_ENCRYPTION=tlsMAIL_FROM_ADDRESS=no-reply@yourdomain.comStorage Configuration
For production, use S3-compatible storage:
FILESYSTEM_DISK=s3AWS_ACCESS_KEY_ID=your-access-keyAWS_SECRET_ACCESS_KEY=your-secret-keyAWS_DEFAULT_REGION=us-east-1AWS_BUCKET=your-bucket-nameArtisan Commands
Create Admin User
php artisan make:admin --email=admin@example.com --password=secure_passwordRun Database Migrations
php artisan migrateClear Cache
php artisan cache:clearphp artisan config:clearphp artisan view:clearOptimize Application
php artisan config:cachephp artisan route:cachephp artisan view:cacheAPI Endpoints
GET /api/projects- List all projectsPOST /api/projects- Create new projectGET /api/projects/{id}- Get project detailsGET /api/projects/{id}/tasks- Get project tasksPOST /api/tasks- Create new taskPUT /api/tasks/{id}- Update taskPOST /api/files- Upload file
Deployment
This application is configured to deploy on Klutch.sh with automatic Docker detection.
### Step 13: Initialize Git Repository
```bashgit add .git commit -m "Initial Digibunch setup for Klutch.sh deployment"git branch -M mastergit remote add origin https://github.com/yourusername/digibunch-deployment.gitgit push -u origin masterDeploying to Klutch.sh
Now that your Digibunch application is configured, let’s deploy it to Klutch.sh.
-
Log in to Klutch.sh
Navigate to klutch.sh/app and sign in with your GitHub account.
-
Create a New Project
Click “New Project” and select “Import from GitHub”. Choose the repository containing your Digibunch deployment.
-
Configure Build Settings
Klutch.sh will automatically detect the Dockerfile in your repository. The platform will use this for building your container.
-
Configure Traffic Settings
Select “HTTP” as the traffic type. Digibunch’s web interface runs on port 8080, and Klutch.sh will route HTTPS traffic to this port.
-
Set Environment Variables
In the project settings, add the following environment variables:
APP_NAME:DigibunchAPP_ENV:productionAPP_KEY: Generate withphp artisan key:generate --showAPP_DEBUG:falseAPP_URL: Your Klutch.sh deployment URL
Database configuration:
DB_CONNECTION:mysqlorpgsqlDB_HOST: Your database hostDB_PORT:3306(MySQL) or5432(PostgreSQL)DB_DATABASE:digibunchDB_USERNAME: Your database usernameDB_PASSWORD: Your database password
Mail configuration:
MAIL_MAILER:smtpMAIL_HOST: Your SMTP hostMAIL_PORT:587MAIL_USERNAME: Your SMTP usernameMAIL_PASSWORD: Your SMTP passwordMAIL_FROM_ADDRESS:no-reply@yourdomain.com
Optional Redis configuration (recommended):
REDIS_HOST: Your Redis hostREDIS_PORT:6379REDIS_PASSWORD: Your Redis password (if applicable)CACHE_DRIVER:redisSESSION_DRIVER:redisQUEUE_CONNECTION:redis
-
Configure Persistent Storage
Digibunch requires persistent storage for user uploads and application data:
- Storage Volume:
- Mount path:
/var/www/html/storage - Size:
20GB(adjust based on expected file storage)
- Mount path:
- Public Files Volume:
- Mount path:
/var/www/html/public/storage - Size:
10GB
- Mount path:
- Logs Volume (optional):
- Mount path:
/var/www/html/storage/logs - Size:
2GB
- Mount path:
These volumes ensure your uploaded files, user data, and application state persist across deployments.
- Storage Volume:
-
Deploy the Application
Click “Deploy” to start the build process. Klutch.sh will:
- Clone your repository
- Build the Docker image using your Dockerfile
- Install PHP dependencies via Composer
- Install Node.js dependencies and build frontend assets
- Configure Nginx and PHP-FPM
- Start queue workers and scheduler
- Deploy the container
- Provision an HTTPS endpoint
The build process typically takes 5-8 minutes.
-
Run Database Migrations
After deployment, access the container terminal and run:
Terminal window php artisan migrate --forceThis creates all necessary database tables.
-
Create Admin Account
Create your first admin user:
Terminal window php artisan make:admin --email=admin@example.com --password=SecurePassword123Replace the email and password with your desired credentials.
-
Access Digibunch
Navigate to your deployment URL (e.g.,
example-app.klutch.sh) and login with your admin credentials.
Getting Started with Digibunch
Once your Digibunch instance is deployed, here’s how to set up your team workspace:
Initial Configuration
First Login
Access your deployment URL and login with the admin credentials you created.
Update Profile
- Click your avatar in top-right corner
- Select “Profile Settings”
- Upload profile photo
- Update display name
- Set timezone
- Configure notification preferences
Workspace Settings
Configure workspace-wide settings:
- Navigate to Settings → Workspace
- Set workspace name and logo
- Configure default project permissions
- Set up email domains for auto-join
- Configure file upload limits
- Set default timezone
Creating Projects
Create Your First Project
// Via APIPOST /api/projects{ "name": "Website Redesign", "description": "Redesign company website with modern UI", "color": "#3498db", "is_private": false, "start_date": "2025-01-01", "end_date": "2025-03-31"}Or use the web interface:
- Click “New Project” button
- Enter project details:
- Name: Descriptive project name
- Description: Project goals and scope
- Color: Visual identifier
- Privacy: Public (all team members) or Private (invited only)
- Dates: Start and end dates
- Click “Create Project”
Project Structure
Each project includes:
- Overview: Project dashboard with recent activity
- Tasks: Task management with multiple views
- Files: File storage and organization
- Team: Project member management
- Activity: Complete activity log
- Settings: Project-specific configuration
Managing Tasks
Create Tasks
Add tasks to your project:
// Via APIPOST /api/tasks{ "project_id": 1, "title": "Design homepage mockup", "description": "Create high-fidelity mockup of new homepage design", "assignee_id": 5, "due_date": "2025-01-15", "priority": "high", "status": "todo", "tags": ["design", "homepage"], "estimated_hours": 8}Web interface:
- Navigate to project
- Click “New Task”
- Fill in task details:
- Title and description
- Assignee
- Due date
- Priority level
- Status column
- Tags and labels
- Time estimate
- Click “Create Task”
Kanban Board View
Manage tasks visually:
- Switch to “Board” view
- Drag tasks between columns:
- To Do: Pending tasks
- In Progress: Active work
- In Review: Awaiting review
- Done: Completed tasks
- Customize columns for your workflow
- Filter by assignee, priority, or tags
List View
For detailed task management:
- Switch to “List” view
- Sort by due date, priority, or assignee
- Bulk select tasks for batch operations
- Apply filters for focused views
- Export tasks to CSV
Calendar View
Track deadlines:
- Switch to “Calendar” view
- See tasks by due date
- Drag tasks to reschedule
- View monthly, weekly, or daily
- Color-coded by project or priority
File Management
Upload Files
// Via JavaScriptconst uploadFile = async (file, projectId) => { const formData = new FormData(); formData.append('file', file); formData.append('project_id', projectId); formData.append('folder', 'Design Assets');
const response = await fetch('/api/files', { method: 'POST', headers: { 'Authorization': `Bearer ${token}` }, body: formData });
return response.json();};Web interface:
- Navigate to project Files tab
- Click “Upload” button
- Select files or drag-and-drop
- Choose destination folder
- Add description (optional)
- Click “Upload”
Organize Files
Create folder structure:
- Click “New Folder”
- Name the folder (e.g., “Design Assets”, “Documents”, “Marketing”)
- Drag files into folders
- Create sub-folders for hierarchy
File Versions
Track file changes:
- Click on any file
- Select “Upload New Version”
- Choose replacement file
- Add version notes
- Previous versions remain accessible
File Sharing
Share files with external users:
- Right-click file
- Select “Generate Share Link”
- Set expiration date (optional)
- Set password protection (optional)
- Copy link and share
Team Collaboration
Invite Team Members
Add people to your workspace:
// Via APIPOST /api/invitations{ "email": "colleague@example.com", "role": "member", "message": "Welcome to our team workspace!"}Web interface:
- Navigate to Settings → Team
- Click “Invite Member”
- Enter email address
- Select role (Admin, Member, or Guest)
- Add personal message
- Click “Send Invitation”
Assign to Projects
Add members to specific projects:
- Open project
- Go to “Team” tab
- Click “Add Member”
- Select team member
- Choose project role
- Set permissions
- Click “Add”
Task Comments
Discuss tasks with team:
// Add comment via APIPOST /api/tasks/123/comments{ "content": "I've updated the mockup based on the feedback. Please review!", "mentions": ["@john", "@sarah"]}Web interface:
- Open task
- Scroll to comments section
- Type comment
- Use @ to mention team members
- Attach files if needed
- Click “Post Comment”
Real-Time Notifications
Stay updated on activity:
- New task assignments
- Comments and mentions
- File uploads
- Due date reminders
- Project updates
- Status changes
Notifications appear in:
- In-app notification center
- Email (configurable)
- Browser push notifications (optional)
Time Tracking
Track Time on Tasks
Start timer for active work:
// Start time trackingPOST /api/tasks/123/time-entries{ "started_at": "2025-01-10T09:00:00Z", "description": "Working on homepage mockup"}
// Stop time trackingPUT /api/time-entries/456{ "ended_at": "2025-01-10T11:30:00Z"}Web interface:
- Open task
- Click “Start Timer”
- Work on task
- Click “Stop Timer” when done
- Edit time entry if needed
Manual Time Entry
Add time retroactively:
- Navigate to task
- Click “Add Time”
- Enter date and duration
- Add description
- Click “Save”
Time Reports
Generate time reports:
- Navigate to Reports
- Select “Time Report”
- Choose date range
- Filter by project, user, or task
- Export to CSV or PDF
Advanced Configuration
Database Optimization
Configure Connection Pooling
For better performance with MySQL:
DB_CONNECTION=mysqlDB_HOST=your-mysql-hostDB_PORT=3306DB_DATABASE=digibunchDB_USERNAME=digibunch_userDB_PASSWORD=secure_password
# Connection pool settingsDB_POOL_MIN=2DB_POOL_MAX=10Add Database Indexes
Optimize common queries:
-- Index frequently queried columnsCREATE INDEX idx_tasks_project_status ON tasks(project_id, status);CREATE INDEX idx_tasks_assignee_duedate ON tasks(assignee_id, due_date);CREATE INDEX idx_files_project ON files(project_id);CREATE INDEX idx_comments_task ON comments(task_id);CREATE INDEX idx_activity_project ON activity_logs(project_id, created_at DESC);Redis Configuration
Enable Redis Caching
Improve performance with Redis:
CACHE_DRIVER=redisSESSION_DRIVER=redisQUEUE_CONNECTION=redis
REDIS_HOST=your-redis-hostREDIS_PASSWORD=your-redis-passwordREDIS_PORT=6379REDIS_DB=0
# Redis configurationREDIS_CLIENT=phpredisREDIS_CLUSTER=falseConfigure Redis Queues
For better queue performance:
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => null, 'after_commit' => false,],Email Configuration
Configure SMTP
Set up email notifications:
MAIL_MAILER=smtpMAIL_HOST=smtp.sendgrid.netMAIL_PORT=587MAIL_USERNAME=apikeyMAIL_PASSWORD=your-sendgrid-api-keyMAIL_ENCRYPTION=tlsMAIL_FROM_ADDRESS=notifications@yourdomain.comMAIL_FROM_NAME="Digibunch Notifications"Queue Email Sending
Improve performance by queuing emails:
// In your notification classpublic function via($notifiable){ return ['mail', 'database'];}
// Queue the emailpublic function viaQueues(){ return [ 'mail' => 'emails', ];}File Storage Configuration
AWS S3 Storage
Use S3 for scalable file storage:
FILESYSTEM_DISK=s3
AWS_ACCESS_KEY_ID=your-access-key-idAWS_SECRET_ACCESS_KEY=your-secret-access-keyAWS_DEFAULT_REGION=us-east-1AWS_BUCKET=digibunch-filesAWS_USE_PATH_STYLE_ENDPOINT=falseAWS_URL=https://your-bucket.s3.amazonaws.com
# Optional: CloudFront CDNAWS_CLOUDFRONT_DOMAIN=your-distribution.cloudfront.netDigitalOcean Spaces
Alternative S3-compatible storage:
FILESYSTEM_DISK=s3
AWS_ACCESS_KEY_ID=your-spaces-keyAWS_SECRET_ACCESS_KEY=your-spaces-secretAWS_DEFAULT_REGION=nyc3AWS_BUCKET=digibunch-filesAWS_ENDPOINT=https://nyc3.digitaloceanspaces.comAWS_USE_PATH_STYLE_ENDPOINT=falseReal-Time Features
Configure Laravel WebSockets
Self-hosted WebSocket server:
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=localPUSHER_APP_KEY=localPUSHER_APP_SECRET=localPUSHER_HOST=127.0.0.1PUSHER_PORT=6001PUSHER_SCHEME=httpPUSHER_APP_CLUSTER=mt1Start WebSocket server:
php artisan websockets:serveConfigure Pusher
Use hosted Pusher service:
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=your-app-idPUSHER_APP_KEY=your-app-keyPUSHER_APP_SECRET=your-app-secretPUSHER_APP_CLUSTER=us2Security Hardening
Enable CSRF Protection
Ensure CSRF tokens are validated:
// Middleware already included in Laravel// Verify it's in app/Http/Kernel.phpprotected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\VerifyCsrfToken::class, // other middleware... ],];Configure CORS
Allow specific domains:
return [ 'paths' => ['api/*', 'broadcasting/auth'], 'allowed_methods' => ['*'], 'allowed_origins' => [ 'https://yourdomain.com', 'https://app.yourdomain.com', ], 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 0, 'supports_credentials' => true,];Rate Limiting
Protect against abuse:
Route::middleware(['throttle:60,1'])->group(function () { // API routes limited to 60 requests per minute});
// config/sanctum.php'limiter' => 'api', // Use the 'api' limiter for SanctumPerformance Optimization
Enable OPcache
Cache PHP bytecode:
; php.ini or docker/php-fpm.confopcache.enable=1opcache.memory_consumption=256opcache.interned_strings_buffer=16opcache.max_accelerated_files=10000opcache.validate_timestamps=0opcache.revalidate_freq=0opcache.fast_shutdown=1Configure Query Caching
Cache database queries:
// In your models or controllers$projects = Cache::remember('user.'.$userId.'.projects', 3600, function () use ($userId) { return Project::where('user_id', $userId)->with('tasks')->get();});Lazy Load Relationships
Optimize database queries:
// Eager load relationships to avoid N+1 queries$projects = Project::with(['tasks', 'files', 'members'])->get();
// Lazy eager loading when needed$projects = Project::all();if ($needTasks) { $projects->load('tasks');}Asset Optimization
Minimize frontend assets:
import { defineConfig } from 'vite';import laravel from 'laravel-vite-plugin';
export default defineConfig({ plugins: [ laravel({ input: ['resources/css/app.css', 'resources/js/app.js'], refresh: true, }), ], build: { minify: 'terser', terserOptions: { compress: { drop_console: true, }, }, rollupOptions: { output: { manualChunks: { vendor: ['vue', 'axios', 'lodash'], }, }, }, },});Production Best Practices
Follow these recommendations for running Digibunch in production:
Security
Secure Environment Variables
Never commit sensitive data:
# Generate secure APP_KEYphp artisan key:generate --show
# Use strong database passwordsDB_PASSWORD=$(openssl rand -base64 32)
# Secure session configurationSESSION_SECURE_COOKIE=trueSESSION_SAME_SITE=strictRegular Backups
Automate database backups:
#!/bin/bashDATE=$(date +%Y%m%d_%H%M%S)BACKUP_DIR="/backups"DB_NAME="digibunch"
# Backup databasemysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME | gzip > "$BACKUP_DIR/db_$DATE.sql.gz"
# Backup storagetar -czf "$BACKUP_DIR/storage_$DATE.tar.gz" /var/www/html/storage/app
# Keep only last 7 daysfind $BACKUP_DIR -name "db_*.sql.gz" -mtime +7 -deletefind $BACKUP_DIR -name "storage_*.tar.gz" -mtime +7 -delete
echo "Backup completed: $DATE"Schedule with cron:
0 2 * * * /usr/local/bin/backup.shUpdate Dependencies
Keep packages current:
# Update Composer dependenciescomposer update
# Update npm packagesnpm update
# Check for security vulnerabilitiescomposer auditnpm auditPerformance Monitoring
Enable Laravel Telescope
Monitor application performance:
composer require laravel/telescope --devphp artisan telescope:installphp artisan migrateAccess at: https://example-app.klutch.sh/telescope
Configure Logging
Set up structured logging:
'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['single', 'slack'], 'ignore_exceptions' => false, ],
'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), ],
'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Digibunch Logger', 'emoji' => ':boom:', 'level' => 'error', ],],Application Monitoring
Track key metrics:
// Track custom metricsuse Illuminate\Support\Facades\Log;
class TaskController extends Controller{ public function store(Request $request) { $startTime = microtime(true);
$task = Task::create($request->all());
$duration = microtime(true) - $startTime;
Log::info('Task created', [ 'task_id' => $task->id, 'duration_ms' => round($duration * 1000, 2), 'user_id' => auth()->id(), ]);
return response()->json($task); }}Reliability
Health Checks
Implement comprehensive health monitoring:
Route::get('/health', function () { $health = [ 'status' => 'healthy', 'timestamp' => now()->toIso8601String(), 'checks' => [] ];
// Database check try { DB::connection()->getPdo(); $health['checks']['database'] = 'ok'; } catch (\Exception $e) { $health['checks']['database'] = 'error'; $health['status'] = 'unhealthy'; }
// Redis check try { Cache::store('redis')->get('health'); $health['checks']['redis'] = 'ok'; } catch (\Exception $e) { $health['checks']['redis'] = 'error'; }
// Storage check try { Storage::disk('local')->put('health-check.txt', 'ok'); Storage::disk('local')->delete('health-check.txt'); $health['checks']['storage'] = 'ok'; } catch (\Exception $e) { $health['checks']['storage'] = 'error'; $health['status'] = 'unhealthy'; }
// Queue check $failedJobsCount = DB::table('failed_jobs')->count(); $health['checks']['queue'] = [ 'status' => $failedJobsCount < 10 ? 'ok' : 'warning', 'failed_jobs' => $failedJobsCount ];
$statusCode = $health['status'] === 'healthy' ? 200 : 503; return response()->json($health, $statusCode);});Graceful Degradation
Handle service outages:
// Fallback to local storage if S3 failstry { Storage::disk('s3')->put($filename, $content);} catch (\Exception $e) { Log::warning('S3 upload failed, falling back to local', ['error' => $e->getMessage()]); Storage::disk('local')->put($filename, $content);}
// Queue emails with fallback to synctry { Mail::to($user)->queue(new TaskAssigned($task));} catch (\Exception $e) { Log::error('Queue failed, sending email synchronously', ['error' => $e->getMessage()]); Mail::to($user)->send(new TaskAssigned($task));}Troubleshooting
Common Issues
Problem: 500 Internal Server Error on deployment
Solutions:
- Check APP_KEY is set:
php artisan key:generate - Verify storage permissions:
chmod -R 775 storage bootstrap/cache - Check logs:
tail -f storage/logs/laravel.log - Clear cache:
php artisan config:clear && php artisan cache:clear - Verify database connection in .env
Problem: Database connection errors
Solutions:
- Verify database credentials in .env
- Check database server is accessible:
telnet DB_HOST DB_PORT - Ensure database exists:
mysql -h DB_HOST -u DB_USER -p -e "SHOW DATABASES;" - Check firewall rules allow database connections
- Verify SSL requirements if using secure connection
Problem: File uploads failing
Solutions:
- Check storage directory is writable:
ls -la storage/ - Verify
upload_max_filesizeandpost_max_sizein PHP config - Check disk space:
df -h - Verify volume mounted correctly
- Check Nginx
client_max_body_sizesetting - Review storage/logs/laravel.log for errors
Performance Issues
Problem: Slow page loads
Solutions:
- Enable OPcache in PHP configuration
- Clear and rebuild cache:
php artisan optimize - Check database query performance: Use Laravel Telescope
- Add database indexes for slow queries
- Enable Redis for cache and sessions
- Optimize assets:
npm run build
Problem: Queue jobs not processing
Solutions:
- Check queue workers are running:
ps aux | grep queue:work - Verify queue connection in .env
- Check failed jobs table:
php artisan queue:failed - Restart queue workers:
php artisan queue:restart - Review worker logs in supervisor
Problem: High memory usage
Solutions:
- Check for memory leaks in custom code
- Optimize database queries (avoid N+1 problems)
- Increase PHP memory_limit if needed
- Use chunk() for large dataset processing
- Monitor with:
php artisan queue:work --memory=512
Configuration Issues
Problem: Real-time notifications not working
Solutions:
- Verify BROADCAST_DRIVER is set correctly
- Check WebSocket server is running
- Test WebSocket connection in browser console
- Verify Pusher credentials if using Pusher
- Check firewall allows WebSocket connections
- Review broadcasting configuration in config/broadcasting.php
Problem: Emails not sending
Solutions:
- Verify MAIL_ environment variables
- Test SMTP connection manually
- Check mail queue:
php artisan queue:work --queue=emails - Review failed jobs:
php artisan queue:failed - Check spam folders
- Verify sender domain SPF/DKIM records
Additional Resources
- Laravel Documentation
- Digibunch GitHub Repository
- Vue.js Documentation
- Eloquent ORM Guide
- Laravel Queue Documentation
- Klutch.sh Documentation
- Persistent Volumes Guide
Conclusion
Digibunch provides everything modern teams need to collaborate effectively without the complexity and cost of enterprise project management suites. By combining project tracking, task management, file sharing, and team communication in one unified platform, it eliminates the need to juggle multiple tools and subscriptions. Teams can focus on their work instead of wrestling with software, while retaining complete control over their data.
Deploying Digibunch on Klutch.sh gives you a production-ready team workspace without the operational overhead of managing servers. Your team collaboration platform runs 24/7 with automatic HTTPS, persistent file storage, and the scalability to grow from a small team to a large organization. Whether you’re coordinating a remote team, managing multiple projects, or looking to consolidate your team’s tools, Digibunch on Klutch.sh provides a solid foundation that you control completely.
Start building your team’s collaborative workspace with Digibunch today and experience the freedom of self-hosted project management done right.