This PR represents a major milestone in Coolify's evolution, bringing comprehensive Hetzner Cloud integration, custom webhook notifications, enhanced Docker image handling, onboarding redesign, and numerous stability and security improvements.
π Major Features
Hetzner Cloud Integration (#6817, #6840, #6842, #6843, #6863, #6866)
Complete integration with Hetzner Cloud, enabling users to create and manage servers directly from Coolify.
Core Features:
- β¨ Server creation and deletion via Hetzner API
- β¨ Automatic server status synchronization with retry mechanism
- β¨ Deletion failure notification system with email alerts
- β¨ Rate limit handling for API requests
- β¨ Retry functionality for server validation process
Cloud-Init Script Support:
- β¨ Cloud-init script support for Hetzner server creation
- β¨ Cloud-init scripts management UI in Security section
- β¨ YAML validation for cloud-init scripts
- β¨ Dropdown selection for existing scripts
- β¨ Global search integration for cloud-init scripts
- π Documentation clarifying cloud-init script compatibility
Network & Configuration:
- β¨ IPv4/IPv6 network configuration for server creation
- β¨ Support for selecting additional SSH keys from Hetzner
- β¨ Modal support for creating private keys in server creation flow
- β¨ Pricing display on server creation button (e.g., "β¬12.99/mo")
- β¨ CPU vendor information for server types
UI Improvements:
- β¨ Hetzner affiliate link in token form to support Coolify
- β¨ Enhanced datalist component with unified input container
- β¨ Improved placeholder text for token name input
Implementation Details:
- π¨ Implement ValidHostname validation rule
- π Improved error logging and handling in ServerConnectionCheckJob
- π Update Hetzner server status handling to prevent unnecessary database calls
- π Correct dispatch logic for Hetzner server status refresh
π Statistics: 55 commits, 4,452 additions, 411 deletions, 104 files changed
Custom Webhook Notifications (#6837)
Complete webhook notification system allowing users to receive real-time notifications about events via HTTP POST requests.
Core Features:
- Custom Webhook Notifications: Send POST requests to user-defined HTTP/HTTPS endpoints when events occur
- Database Schema: New
webhook_notification_settings
table with encrypted URL storage and per-event toggles - Event Toggles: Fine-grained control over 12+ notification types (deployments, backups, scheduled tasks, server events)
- Webhook Delivery: Queued job system with retry logic (5 attempts, 10s backoff)
- Rich Payloads: All webhook payloads include resource UUIDs and direct URLs to Coolify resources
UI/UX Enhancements:
- Dedicated Webhook Page: Full settings interface with form validation and test notification
- Password-Protected URLs: Webhook URLs displayed as password fields for security
- POST Badge Indicator: Visual HTTP method indicator positioned before the URL input
- Responsive Layout: Organized notification settings in categorized cards
Supported Events:
- Deployments: success, failed, status_changed
- Backups: success, failed, success_with_s3_warning
- Scheduled Tasks: success, failed
- Server: docker_cleanup, high_disk_usage, reachable/unreachable, server_patch_check
π Statistics: 14 commits, 32 files changed, +900 additions / -15 deletions
Enhanced User Onboarding (#6855)
Complete redesign of the user onboarding experience with a modern, centered UI, enhanced UX flow, and Hetzner Cloud integration.
Core Features:
- Modern UI Redesign: Centered, card-based layout with clean design
- 3-Step Progress Indicator: Visual progress component showing completed, current, and upcoming steps
- Hetzner Cloud Integration: Users can now create Hetzner servers directly from onboarding
- Separate SSH Key Input Modes: Distinct textareas for "Generate with Coolify" (readonly) vs "Add your own" (editable)
Bug Fixes:
- Project Loading on Refresh: Projects now load correctly when refreshing the Project Setup page
- Browser Back Button: Removed aggressive redirects to welcome page
- SSH Key Auto-Selection: First SSH key is auto-selected by default
- State Persistence: Livewire URL binding enables proper browser navigation
π Statistics: 4 commits, 5 files changed, +851 additions / -428 deletions
β¨ Core Features
Docker & Container Management
Docker Image Enhancements
-
SHA256 Hash Support for Deployments (#6472)
- Enhanced DockerImageParser to detect and handle image hashes
- Updated UI forms with better guidance for hash input
- Modified deployment logic to use @sha256: format
- Comprehensive test coverage for all hash scenarios
-
Auto-Parse Docker Image References (#6879)
- Users can paste complete Docker image references (e.g.,
nginx:stable@sha256:abc123...
) - Automatically parses and populates image name, tag, and SHA256 fields
- Smart behavior: only auto-parses when fields are empty
- Handles all formats: registries with ports, digests, tags
- Users can paste complete Docker image references (e.g.,
-
Fix Docker Image Digest Handling (#6878, #6879)
- Fixed double-decoration bug in Docker image names
- Replaced manual regex with robust DockerImageParser utility
- Prevents malformed image names like
nginx:abc123@sha256
Service & Template Improvements
- Elasticsearch with Kibana (#6470) - Service template with token-based authentication
- Ente Photos (#6511) - Self-hosted photo service template
- pgAdmin (#6563) - PostgreSQL admin interface with auto-network connection (#6861)
- Swetrix Analytics (#6735) - Privacy-focused analytics alternative
- Rybbit (#6631) - Service template
- Lobe Chat (#6655) - AI chat interface with local DB
- Gotify (#6793) - Self-hosted notification service
- NewAPI (#6753) - API template
- Once Campfire (#6557) - Basecamp's Campfire app
- Gramps Web (#6559) - Genealogy web application
Template Updates & Fixes
- Homarr (#6778) - Updated to new image version 1.40.0
- Convex (#6576) - Updated documentation URL and image
- Docmost (#6710) - Added mail environment variables
- Bluesky PDS (#6636) - Fixed JWT generation and email envs
- Ente Photos (#6802) - Fixed PostgreSQL connection and MinIO CORS issues
- Mattermost (#6538) - Removed healthcheck command (shell not available)
- Filebrowser (#6589) - Corrected healthcheck for wget vs curl
- Traccar (#6721) - Fixed "no available server" error
- Moodle (#6806) - Added healthcheck
- Documenso (#6831) - Added missing Resend API environment variables
- Bitnami to BitnamileLegacy (#6764) - Updated image references across all templates
Deployment & Build System
-
Environment Variable Management
- Standardized .env file handling across all deployment methods (#6826)
- Fixed environment variable cache refresh after adding new variables (#6790)
- Save build-time .env file before build to prevent inclusion in images (#6826)
- Fixed API validation to allow all environment variable fields (#6860)
- Save runtime environment variables when skipping build (#6845)
-
Build Process Improvements
- Docker build commands wrapped with environment variable exports (#6826)
- Fixed static site publish directory double slash in build logs (#6871)
- Added default NIXPACKS_NODE_VERSION for Nixpacks applications (#6770)
- Warning for NIXPACKS_NODE_VERSION in Node.js configurations (#6844)
- Fixed base_directory default and inclusion in submit method (#6843)
-
Deployment Fixes
Git Integration
- Git Redirect Handling (#6869)
- Fixed deployment failures when Git repositories use redirects (e.g., tangled.sh β tangled.org)
- Replaced line-based parsing with regex pattern matching for commit SHA extraction
- Added security improvement with escapeshellarg() for repository URLs
- Comprehensive test coverage for all redirect scenarios
- Universal fix for all Git hosting services with redirects
Database Management
-
Database Security & Stability
-
Backup Enhancements (#6791)
- Enhanced backup job with S3 upload handling
- New
BackupSuccessWithS3Warning
notification class - Track local backup success and S3 upload errors separately
- Added
s3_uploaded
boolean field to track S3 status - Fixed backup job to use backup_log_uuid for container naming (#6844)
Proxy & Network
-
Proxy Configuration (#6787)
- Enhanced proxy configuration regeneration by extracting custom commands
- Added function to preserve custom Traefik commands during regeneration
- Unit tests to validate custom command extraction
-
Read-Only Volume Handling (#6774)
- Introduced
isReadOnlyVolume
method for volume models - Enhanced UI to display notifications for read-only volumes
- Prevent modification actions for read-only volumes
- Introduced
π¨ UI/UX Enhancements
Global Search & Navigation
-
Searchable Terminal Selector (#6854)
- Replaced standard dropdown with advanced searchable datalist component
- Real-time search filtering for servers/containers
- Visual improvements with smooth animations
-
Global Search Improvements (#6787)
- Enhanced resource creation functionality in search modal
- Create mode for projects, servers, teams, storage, private keys, GitHub apps
- Artisan command to clear global search cache
- Allow typing while data loads
- Hide 'No results found' message during loading
- Fixed 'new image' quick action not progressing (#6880)
Dashboard & Project Management
-
Enhanced Project Management (#6849)
- Project index with resource creation capabilities
- Display resource creation option for each project
- Generate route for adding resources based on first environment
-
Dashboard Improvements (#6850)
- Modal input components for adding new projects and servers
- Conditional rendering for modal buttons
- Improved layout with flex container alignment
-
UI Fixes
Form Components & Styling
- Enhanced Form Components
- Enhanced datalist component with unified input container
- Improved focus styles for Checkbox, input, button, and modal components
- Update success color to match design specifications
- Simplified wire:dirty class bindings for input/select components
- Clear button for cloud-init script dropdown
π Bug Fixes
Storage & Backups
- S3 Storage Enhancements (#6792)
- Transaction handling in storage settings submission
- Connection testing within transaction before finalizing save
- Enhanced error handling with model state refresh after rollback
Service Management
- Docker Compose Services (#6867)
- Fixed duplicate services created when changing image
- UI now refreshes after compose file or domain changes
- Remove image from firstOrCreate() queries (only use name and service_id)
- Added event listeners to Configuration component
Validation & Error Handling
- Validation Improvements
π¨ Refactoring & Code Quality
Component Modernization
-
Database Components
-
Livewire Components
- Streamlined environment variable generation in ApplicationDeploymentJob (#6778)
- Replace direct SslCertificate queries with server relationships
- Streamline proxy status handling in StartProxy and Navbar components
Code Cleanup
- Remove Unused Code
- Removed redundant logic for merging COOLIFY_* variables
- Simplified environment variable adding process
- Enhanced clarity and maintainability
π Documentation & Testing
Documentation Improvements
-
AI Instructions Synchronization Guide (#6788)
- Created
.AI_INSTRUCTIONS_SYNC.md
for cross-reference - Updated CLAUDE.md and .cursor/rules/ with sync instructions
- Enhanced consistency across documentation
- Created
-
Testing Guidelines (#6787)
- Clarified execution rules for unit tests (mocking, no database)
- Specified feature tests must run inside Docker
- Added design principles for testable code
Test Coverage
- New Test Files
tests/Unit/ProxyCustomCommandsTest.php
- Proxy configuration teststests/Unit/GitLsRemoteParsingTest.php
- Git redirect handling teststests/Unit/DockerImageParserTest.php
- Docker image parsing teststests/Unit/DockerImageAutoParseTest.php
- Auto-parse feature teststests/Unit/ServiceParserImageUpdateTest.php
- Service parser teststests/Unit/ServiceConfigurationRefreshTest.php
- Configuration refresh teststests/Unit/GlobalSearchNewImageQuickActionTest.php
- Search teststests/Unit/HetznerServerCreationTest.php
- Hetzner API tests
β‘ Performance & Infrastructure
-
Database Optimization
- Fixed concurrent index creation to run outside transaction (#6841)
- Force deletion of stuck servers and orphaned SSL certificates
- Improved query efficiency with proper eager loading
-
Cache Management
- Clear computed property cache after adding environment variables
- Cache clearing for environment variables and preview
- Improved cache control for global search modal
π Security & Validation
-
Authorization Enhancements
- Added authorization checks to database Livewire components (#6872)
- Enhanced form component authorization system
- Webhook URLs encrypted at rest in database
-
Input Validation
- Implement ValidHostname validation rule
- YAML validation for cloud-init scripts
- Enhanced DockerImageFormat validation rule
π Other Updates
Sponsors & Community
- Sponsors Update (#6849)
- Added 6 new sponsors: 23M, Brand.dev, ByteBase, Formbricks, Mobb, Ramnode
- Removed 6 inactive sponsors
- Reorganized sponsors in alphabetical order
API Improvements
- OpenAPI Specification (#6852)
- Added 422 error code to spec
- Changed return types for /version and /healthcheck
GitHub Integration
- Claude Code GitHub Workflow (#6787)
- Added GitHub Actions workflow for Claude Code integration
- Enables @claude mentions in PR and issue comments
- Automated AI assistance for code reviews and improvements
π Overall Statistics
- 100 commits from multiple contributors
- 18,631 additions / 10,291 deletions
- 267 files changed
- 52 Merged PRs (#6470, #6472, #6511, #6538, #6557, #6559, #6563, #6576, #6589, #6631, #6636, #6655, #6710, #6721, #6735, #6753, #6764, #6778, #6784, #6787, #6793, #6802, #6806, #6817, #6831, #6837, #6840, #6841, #6842, #6843, #6846, #6849, #6852, #6854, #6855, #6858, #6859, #6860, #6861, #6863, #6866, #6867, #6868, #6869, #6870, #6871, #6872, #6873, #6878, #6879, #6880)
π Credits
Thank you to all contributors who made this release possible:
@andrasbacsai, @ShadowArcanist, @saurabhraghuvanshii, @djsisson, @Blaumaus, @mario-neuhold, @seefs001, @abdia3, @thesloppyguy, @elmariss, @zehjotkah, @victor, @Sahil, @neeku, @scan, @hoΓ ng TrαΊ§n NhαΊt Minh, @Romain ROCHAS, @amir Hossein Karimi, @vishwanath Martur, @evan Schleret, @halil ΓzgΓΌr, and the entire Coolify community!
Special thanks to the testing community for reporting issues and helping improve stability.
Generated by Andras & Jean-Claude, hand-in-hand.
What's Changed
- Feat: Ente Template by @thesloppyguy in #6511
- feat: Add Ente Photos service template by @vishwamartur in #6515
- [Enhancement]: allow deploy from container image hash by @saurabhraghuvanshii in #6472
- feat(service): add Elasticsearch with Kibana (Closes issue #6449) by @ShadowArcanist in #6470
- update bitnami to bitnamilegacy by @djsisson in #6764
- Add Claude Code GitHub Workflow by @andrasbacsai in #6787
- fix(ui): make the deployments indicator toast in the bottom-left above the sidebar by @abdia3 in #6784
- fix(service): Ente Photos with s3 (Closes #6789) by @ShadowArcanist in #6802
- feat: add IPv4/IPv6 network configuration for Hetzner server creation by @andrasbacsai in #6840
- feat: add pricing display to Hetzner server creation button by @andrasbacsai in #6842
- refactor(backup): make backup_log_uuid initialization lazy by @andrasbacsai in #6846
- fix(migration): disable transaction for concurrent index creation by @andrasbacsai in #6841
- feat: add cloud-init script support for Hetzner server creation + CI workflow fix by @andrasbacsai in #6843
- Update sponsors list in README by @andrasbacsai in #6849
- Hetzner integration by @andrasbacsai in #6817
- feat: add custom webhook notification support by @andrasbacsai in #6837
- feat: replace terminal dropdown with searchable datalist component by @andrasbacsai in #6854
- feat(onboarding): redesign user onboarding flow with modern UI/UX by @andrasbacsai in #6855
- fix: prevent container name conflict when updating database port mappings by @andrasbacsai in #6858
- fix(openapi): missing 422 error code in openapi spec by @YaRissi in #6852
- fix: allow all environment variable fields in API endpoints by @andrasbacsai in #6860
- refactor: migrate database components from legacy model binding to explicit properties by @andrasbacsai in #6859
- fix(service): added missing resend env for documenso by @ShadowArcanist in #6831
- chore(service): Added healthcheck to moodle by @ShadowArcanist in #6806
- feat(template): Adding Gotify service by @YaRissi in #6793
- feat (template): use new homarr image by @mario-neuhold in #6778
- feat(template): NewAPI template by @seefs001 in #6753
- feat(service): add Swetrix template by @Blaumaus in #6735
- fix(service): traccar no available server error by @ShadowArcanist in #6721
- feat: Add mail environment variables to docmost.yaml by @EvanSchleret in #6710
- fix: Bluesky PDS template by @scanash00 in #6636
- added rybbit service template by @zehjotkah in #6631
- feat(templates): added Lobe Chat service by @yipfram in #6655
- feat(service): add pgAdmin by @ShadowArcanist in #6563
- fix(template/filebrowser): correct healthcheck for Filebrowser by @htnminh in #6589
- chore(service): update convex template and image by @itsneeku in #6576
- feat(service): add Gramps Web template by @halilim in #6559
- feat(campfire): add template for Once Campfire by @elalemanyo in #6557
- fix(templates): remove mattermost healthcheck command according to lack of shell in new version by @AmirHosseinKarimi in #6538
- fix: enable docker network connection for pgadmin service by @andrasbacsai in #6861
- feat: add Hetzner affiliate link to token form by @andrasbacsai in #6866
- fix: prevent duplicate services on image change and enable real-time UI refresh by @andrasbacsai in #6867
- Handle all ProcessStatus values in PR updates by @andrasbacsai in #6868
- fix: prevent TypeError in database General components with null server by @andrasbacsai in #6870
- fix: add authorization checks to database Livewire components by @andrasbacsai in #6872
- Fix: Pure Dockerfile deployment failing due to missing .env file by @andrasbacsai in #6873
- Fix static site publish directory double slash in build logs by @andrasbacsai in #6871
- feat(hetzner): add CPU vendor information to server types in Hetzner integration by @YaRissi in #6863
- fix(git): handle Git redirects and improve URL parsing for tangled.sh and other Git hosts by @andrasbacsai in #6869
- fix: use computed imageTag variable for digest-based Docker images by @andrasbacsai in #6878
- fix: improve Docker image digest handling and add auto-parse feature by @andrasbacsai in #6879
- fix: 'new image' quick action not progressing to resource selection by @andrasbacsai in #6880
- v4.0.0-beta.435 by @andrasbacsai in #6758
New Contributors
- @thesloppyguy made their first contribution in #6511
- @saurabhraghuvanshii made their first contribution in #6472
- @abdia3 made their first contribution in #6784
- @mario-neuhold made their first contribution in #6778
- @seefs001 made their first contribution in #6753
- @Blaumaus made their first contribution in #6735
- @EvanSchleret made their first contribution in #6710
- @zehjotkah made their first contribution in #6631
- @yipfram made their first contribution in #6655
- @htnminh made their first contribution in #6589
- @itsneeku made their first contribution in #6576
- @halilim made their first contribution in #6559
- @elalemanyo made their first contribution in #6557
- @AmirHosseinKarimi made their first contribution in #6538
Full Changelog: v4.0.0-beta.434...v4.0.0-beta.435