Added a read-only API endpoint to retrieve preview deployment runtime logs by application UUID and pull request ID, with line limits and optional timestamps. (#11884)
Fixes
Fixed deployment status and metadata processing when remote command output contained leading or trailing whitespace.
What's Changed
feat(api): expose runtime logs for preview deployments by @andrasbacsai in #11884
Made restart limits opt-in for applications, preview deployments, and service applications. Existing resources that still used the previous limit of 10 restarts were reset to unlimited.
Fixes
Hid application names, server names, deployment URLs, team member emails, and job IDs from the Helper deployment check unless detailed output was explicitly requested.
Improvements
Updated the supported Traefik patch releases to 3.7.13, 3.6.25, and 2.11.57.
Added an All option to the log viewer and accepted lines=all across application, database, and service log APIs. The existing -1 value remained available for compatibility.
Fixes
Fixed scheduled backup deletion for service databases so it kept the database context and returned to the correct backup page.
Preserved each service componentβs stored application or database type when generating Traefik labels.
Restored hourly Sentinel version checks for enabled, eligible servers while continuing to exclude build servers.
Improvements
Ran Traefik version checks whenever Coolify checked for updates instead of only once a week.
Updated Coolify Helper to 1.0.17 and moved the bundled MinIO client to a pinned AIStor release.
Breaking Changes (well not breaking, but kinda, not sure haha)
Made Sentinel mandatory on regular servers. Existing regular servers were enabled automatically, and the enable or disable setting became read-only in the UI and API. This is mandatory for upcoming features. Sentinel will have a bigger responsibility.
Features
Restored each user's last active team after login and added a team picker when no saved team was available. (#11503)
Moved service application and database settings into a modal and added Docker restart-limit settings, including API support for max_restart_count.
Added indexing, redirect, and hostname regeneration controls to application, preview, and service domain editors.
Fixes
Prevented duplicate two-factor challenge submissions and redirected stale authenticated submissions instead of returning HTTP 419. (#11223, closed #10670 and #10731)
Accepted custom usernames in SCP-style SSH Git URLs across source setup, API creation, webhooks, clones, and repository links. (#11685, closed #11686)
Accepted uppercase letters in existing S3-compatible bucket names. (closed #11536)
Detected Docker Compose domain conflicts across service domains and treated HTTP and HTTPS forms as the same routing identity.
Preserved inherited service ports instead of saving them as overrides, and ignored hostless URLs when deployments calculated port overrides.
Saved Compose environment files atomically to prevent partial writes and truncated files.
Made the "Restart Limit Reached" email notification toggle work. (closed #11705)
Distinguished same-named application containers on different servers in the terminal.
Fixed sidebar preference handling, application domain display, two-factor status display, and duplicate metrics status badges.
Improvements
Pulled image-based Docker Compose services before stopping the current deployment, which reduced downtime and stopped deployments early when an image pull failed.
Improved domain editing and queued DNS checks across applications, previews, and services. DNS checks now ran only after relevant hostname or scheme changes.
Improved mobile application settings navigation, pinned domain save controls, compacted service domain cards, and made view controls consistent.
Improved the environment variable editor, modal scrolling, button loading states, and backup settings layouts.
Upgraded Sentinel from 0.0.22 to 1.0.1.
What's Changed
fix: prevent duplicate 2FA challenge submissions causing HTTP 419 by @PRSFM in #11223
feat(teams): persist active team and add team selection screen by @adiologydev in #11503
Added configurable alerts when scheduled database backups missed a set number of days. #11433 closed #11425.
Streamed S3-only volume archives directly to S3 so those backups no longer needed temporary local disk space. #11642
Added an instance setting for the CDN URL used to serve stored images such as profile avatars and project icons.
Improvements
Refreshed the UI with WCAG-compliant contrast, a unified surface system, a full-height settings rail, and a rebuilt mobile navigation drawer. #11659 closed #11532.
Preserved in-progress domain edits across refreshes, stacked domain rows on small screens, and moved preview deployment settings onto the Previews page.
Paginated service backup history, showed S3 destination details, disabled Backup Now unless the database was running, added search on server resources, and let operators enable Sentinel from its logs page.
Fixes
Allowed General application settings to be saved when an existing domain used a wildcard. #11683 closed #11641.
Prevented duplicate Coolify Cloud subscription checkouts and recovered subscriptions after missed or out-of-order Stripe webhooks. #11666
Preserved PATH in terminal sessions so SSH proxy commands such as cloudflared worked. #11638 closed #11611.
Stopped the persistent storage PR suffix dropdown from clipping inside the volumes table. #11637 closed #11605.
Returned scheduled task execution duration as a JSON number so the CLI could parse listings. #11636 closed #11616.
Persisted S3 storage settings when creating a new volume backup schedule. #11635 closed #11627.
Cleaned up preview deployments when a pull request closed after its base branch changed. #11634 closed #11609.
Persisted the Make publicly available setting for service databases. #11633 closed #11345.
Restored webhook delivery for always-send notifications, including SSL renewal, API token expiry, server force-enable/disable, and Hetzner deletion failures. #11528 closed #11507.
Raised nginx request header buffers so large Cookie headers no longer returned HTTP 400 before reaching Coolify. #11404 closed #11403.
Kept modal contents intact across Livewire re-renders instead of dropping the body and leaving a click-blocking overlay. #11294
Routed Docker Compose domains using each service's ports, stored explicit ports as overrides through the API, and stopped multi-service Compose domains from inheriting the application port.
Applied the same domain validation rules to the service API as the UI, including wildcards and oversized URLs.
Limited instance public IP DNS hints to the localhost server so remote servers showed their own addresses.
Preserved shell negation in sudo-wrapped commands on servers that use a non-root SSH user.
Deferred inspection of PostgreSQL custom-format backup archives to pg_restore so valid dumps were not rejected.
What's Changed
fix(notifications): add missing toWebhook methods to notifications by @ousamabenyounes in #11528
fix(docker): raise nginx request header buffers above the 8k default by @bosund in #11404
fix(service): persist service database public access by @peaklabs-dev in #11633
Corrected internal routing and proxy labels for Docker Compose applications and previews to use each service's configured port, with the application port as a fallback.
Restored the unsaved-changes indicator when switching label management to manual mode by updating Livewire. (#11612, closes #11265)
Routed Telegram alerts for outdated Traefik versions to the configured topic instead of the main chat. (#11526)
Corrected the file and directory deletion confirmation text. (#11541)
Improvements
Ran stuck-resource cleanup in the background at 03:17 each day so it no longer blocked other scheduled tasks.
Displayed the API token's one-time visibility warning directly beside the generated token.
What's Changed
fix: update livewire to fix wire:dirty reactivity by @peaklabs-dev in #11612
Added per-domain internal port overrides for applications, Docker Compose services, and preview deployments across Traefik and Caddy. Public domain URLs remained portless, while the UI showed effective ports and warned about unrecognized ports. (#11594)
Consolidated service database, volume, and directory backups into one page with schedule editing, on-demand runs, combined history, live status, downloads, and imports. (#11574)
Added domain management and DNS status checks for preview deployments.
Fixes
Blocked read-only team members from directly invoking protected Livewire mutations for credentials, servers, applications, databases, and security resources. (#11596)
Preserved every application domain in COOLIFY_URL and COOLIFY_FQDN, including multi-domain configurations with ports. (#11527, fixes #10824)
Kept stopped containers visible after they reached their restart limit, prevented further automatic restarts, and added retry deployment and container removal actions. (#11566, closes #10624, #10906, and #11521)
Rejected invalid build-time environment variable names before builds started and reported the offending key with rename guidance. (#11575)
Prevented unauthorized users from receiving stored private keys and GitHub App secrets in Livewire state.
Restricted web terminal SSH commands to approved hosts, keys, ports, and options.
Preserved existing domains when switching an application to Docker Compose and waited for confirmation before loading its Compose file.
Redirected immediately after resource deletion while cleanup continued after the response.
Improvements
Improved the Docker Compose editor layout on mobile screens.
Warned before removing a port required by a service domain.
Warned that full PostgreSQL restores could overwrite administrator passwords.
Reduced the remotely callable Livewire API and kept authorization checks on user-facing write actions. (#11578)
What's Changed
fix(deployments): keep every domain intact in COOLIFY_URL and COOLIFY⦠by @DiyRex in #11527
fix(applications): persist restart limit state for stopped containers by @andrasbacsai in #11566
Fixed standalone Docker destination setup on non-Swarm servers by creating networks with Docker's default bridge driver instead of the Swarm-only overlay driver.
Added a one-click Executor service template with persistent storage and health checks (#11530).
Improvements
Served profile avatars and project icons directly from configured S3 storage or an optional CDN, with local routes as a fallback.
Fixes
Fixed missing service logos in global search and the service catalog by retrying a remote source before showing the default icon.
Gave Sentinel startup migrations enough time to finish before Docker health checks could restart the container.
Fixed stale Livewire keys and refresh races that could leave domain, storage, file, log, proxy, and scheduled job controls unresponsive after list changes.
Preserved PostgreSQL init script identity when files were renamed.
Rejected single-label hostnames in application and service domains while continuing to accept IP addresses.
Preserved custom application container names during consistent deployments and removed containers left under legacy generated names.
Fixed navigation after deleting or converting services, backups, scheduled tasks, sources, storage, and destinations.
What's Changed
feat(services): add Executor one-click deployment template by @andrasbacsai in #11530
Applied authentication rate limits per real client behind reverse proxies and Cloudflare, preventing visitors from sharing one rate-limit bucket (#11515).
Reset a server's unreachable counter after a successful connection check, preventing stale failures and false unreachable alerts (#11417, closes #11416).
Corrected placeholder alignment in code editor fields (#11514, closes #11420).
Queued Cloud registration verification emails with retries, making delivery more reliable.
What's Changed
fix(server): reset unreachable_count after successful connection check by @mrcleanandfresh in #11417
Added configurable SMTP EHLO domains for instance and team email delivery (#11398, closes #11388).
Added API endpoints for viewing and updating instance-wide SMTP and Resend settings.
Added manual upgrade controls to the Updates page and mobile navigation.
Fixes
Applied the configured sender name and address to SMTP, Resend, test, transactional, and password-reset emails (#11393, closes #6073).
Respected disabled SMTP encryption in test emails (#11384, closes #5877 and #6442).
Prevented Proton SMTP from folding long From headers (#11400, closes #11380).
Restricted API token visibility and revocation to the active team, and stopped expiration warnings for users who had left that team (#11396, closes #11390).
Persisted the target image and version before container recreation so upgrades kept the installed version aligned (#11401, closes #11389).
Restored generated Caddy labels for applications with configured domains (#11397, closes #11394).
Allowed domains to be added to services with an empty Compose environment section (#11407, closes #11381).
Marked failed or timed-out Docker cleanup executions as finished and recorded their errors (#11408, closes #11383).
Required explicit confirmation before invitation magic links were redeemed, preventing link scanners and previews from consuming invitations (#11413, closes #11375).
Aligned team-scoped API responses and project access checks across sources, servers, projects, and environments (#11405).
Prevented newly introduced static settings from appearing as pending deployment changes after upgrades (#11430, closes #11426).
Completed local resource deletion even when remote Docker or backup cleanup failed.
Made team membership, invitation, token revocation, and source deletion changes roll back safely when part of the operation failed.
Released page scroll locking before destructive confirmation actions ran, preventing stuck interfaces.
Improvements
Preserved the current page and query parameters when switching teams.
Showed warnings for pending proxy updates and unavailable Sentinel instances in server status indicators.
Limited team deletion to owners, assigned an owner to existing ownerless teams, and made blocking resources easier to find from the danger zone.
Added an instance setting to control forced HTTPS redirects for the dashboard.
Fixes
Prevented DNS validation from hanging on unresponsive resolvers by adding five-second query timeouts (#11378, closes #11351).
Preserved active deployments when shared SSH multiplexing connections were refreshed or cleaned up (#11377, closes #11372).
Restored GitLab push and merge-request deployments that could fail with an HTTP 500 response (#11284, closes #11262).
Allowed long-running volume backups to run for up to ten hours while preserving custom timeouts on existing schedules (#11358, closes #11273).
Prevented SSL-enabled database containers from being left stopped during certificate ownership repair and container replacement (#11315, #11352, closes #11312).
Prevented OAuth provider settings from being erased when OAuth settings were re-seeded (#8210).
Enforced team-scoped authorization for scheduled tasks, preventing cross-team access and execution (#11239, closes #11238).
Prevented large bind-mounted files and oversized remote output from exhausting memory while services, tasks, logs, volumes, and configuration were read (#10960).
Made upgrades recover correctly when status data was temporarily unavailable after restart (#11350, closes #11347).
Prevented stuck container removal from blocking deployments; cleanup was deferred and retried instead.
Enabled compression for the dashboard over HTTPS (#10828, closes #10802).
Corrected S3 error email links so they pointed to the configured instance instead of localhost (#8633).
Fixed highlighted-button, spinner, and keyboard-shortcut contrast across custom themes (#11279).
Fixed account menus remaining open after clicking outside an expanded Appearance panel (#11374, closes #11373).
Centered icon tooltips over their triggers (#11382).
Improvements
Surfaced pending proxy configuration and outdated Traefik states with actionable warning indicators.
Made server warnings clearer, improved deployment-log scrolling, and corrected spacing in database backup settings.
Created complete PostgreSQL, MySQL, and MariaDB dumps when βAll databasesβ was selected, preserved multi-database selections, and honored the chosen storage when deleting backups (#11331, closes #11325).
Restored backup pages for applications configured with directory-only backup targets (#11332, closes #11307).
Made deployment cancellation reliable across the API, MCP, and preview cleanup flows, and advanced the next queued deployment after cancellation (#11330, closes #11327).
Fixed PostgreSQL and volume backups to S3-compatible storage on servers using non-root SSH users (#11329, closes #11304).
Preserved ports and existing entries when editing application and service domains or S3 endpoint URLs (#11328, closes #11320).
Prevented Docker cleanup from accidentally deleting images marked with the coolify.managed=true label (#8831, closes #8822).
Kept table dropdowns visible and correctly positioned inside scrolling or overflowing containers.
Improvements
Stored locally uploaded profile pictures and project icons in persistent private storage so they survived upgrades.
Improved clipboard copying for API tokens and other read-only fields.
What's Changed
fix(docker): docker cleanup correctly checks the coolify.managed label by @dionvanhecke in #8831
Fixed listboxes and table menus losing their Alpine and Livewire scope during UI updates, preventing dropdown positioning errors and broken menus (#11311; closed #11308, #11309, and #11310).
What's Changed
fix(ui): prevent floating dropdown Alpine scope errors by @andrasbacsai in #11311
Fixed an error that prevented eligible teamsβ danger zones from loading (#11305; closed #11303).
Added subscription access for Coolify Cloud team admins, correctly positioned the mobile account menu, and preserved the server-limit adjustment modal during updates.
Improvements
Standardized pagination, page-size controls, and responsive filter and sorting menus across resource lists.
Constrained the deployment log viewerβs desktop height for easier navigation.
What's Changed
fix(team): prevent danger zone source loading error by @andrasbacsai in #11305
fix(deployment): restore deployment log download actions by @andrasbacsai in #11306
Added persistent βChanges pendingβ warnings to the desktop and mobile navigation bars, including change counts and direct access to configuration differences.
Fixes
Ensured HTTP Basic Auth updates made through the Applications API regenerated managed deployment labels while preserving custom labels (#11196, closed #11191).
Fixed a 500 error on volume backup pages when database backup execution logs were present (#11210).
Removed duplicate borders from CPU and memory metrics tooltips (#11213, closed #11212).
Repaired environment and project settings page headers (#11204).
Corrected the German password-reset email translation (#9680).
Updated error pages to use the correct Coolify-branded background glow.
Improvements
Redesigned terminal target selection and improved filtering and mobile controls (#11203).
What's Changed
fix(release): preserve tags when publishing draft releases by @andrasbacsai in #11199
feat(workflows): add pull request branch management workflow by @ShadowArcanist in #11193
fix(lang): correct german translation for password reset email by @EchterTimo in #9680
fix(ui): remove duplicate metrics tooltip border by @nexmoe in #11213
fix(models): add datetime cast for finished_at in ScheduledDatabaseBackupExecution by @ejscheepers in #11210
fix(ui): environment settings broken header & project settings header by @yk-sgr in #11204
Let us know what you think about the new UI here: #11195
Breaking Changes
Team members with the Member role became read-only. They could still view team resources and configuration, but could no longer create, update, delete, deploy, start, stop, or otherwise modify resources. Review team roles and promote users who still require write access (v4.2.0).
State-changing API endpoints began requiring POST; legacy GET requests now return 405 Method Not Allowed. This affected /enable, /disable, /deploy, server validation, application/database/service lifecycle actions, and service-application lifecycle actions (v4.2.0).
Changed proxy router names for Compose services containing dots or hyphens to use a stable suffix; custom references to previous router names must be updated (#11040).
Removed confirmation dialogs for deploy, redeploy, and force-deploy actions; these actions began immediately when selected (#11023).
Features
Added a redesigned interface with clearer navigation, improved domain management, DNS checks, and automatic Cloudflare DNS setup (#11119).
Added scheduled backups for persistent volumes and directory mounts, with local or S3-compatible storage, retention controls, on-demand runs, history, and API management (#10946, closed #7701).
Team members with the Member role now have read-only access. They can continue to view team resources and configuration, but can no longer create, update, delete, deploy, start, stop, or otherwise modify resources. Review your team roles before upgrading and promote users who still require write access.
State-changing API endpoints now require POST. Legacy GET requests return 405 Method Not Allowed. Update API clients and deploy webhooks that use these endpoints:
/enable
/disable
/deploy
/servers/{uuid}/validate
/applications/{uuid}/start
/applications/{uuid}/restart
/applications/{uuid}/stop
/databases/{uuid}/start
/databases/{uuid}/restart
/databases/{uuid}/stop
/services/{uuid}/start
/services/{uuid}/restart
/services/{uuid}/stop
/services/{uuid}/applications/{app_uuid}/start
/services/{uuid}/applications/{app_uuid}/restart
/services/{uuid}/applications/{app_uuid}/stop
Features
Added scheduled persistent-volume and application-storage backups, including retention controls, manual execution, and API schedule deletion. (#10946, fixes #7701)
Added API endpoints for database, service, and container logs, including optional timestamps. (#6293)
Added API endpoints to move applications, databases, and services between authorized environments. (#8968)
Added scheduled ClickHouse backups and cloud administration commands.
Added dedicated server, cloud credential, cloud-init, and private-key management flows.
Added application settings to application API responses.
Fixes
Enforced authorization policies consistently across the API and Livewire, restricted sensitive operations to admins, and protected secrets from team members. (#8628)
Populated Docker Compose domains correctly for applications created through the API. (#9300, fixes #9211)
Hid sensitive API fields by default while allowing privileged tokens with sensitive-read access to retrieve them. (#9893)
Prevented force=false deployment requests from incorrectly forcing cache-busting rebuilds. (#9909)
Ensured closed pull-request previews were cleaned up even when status updates failed. (#10180, fixes #9495)
Preserved full public Git repository URLs for non-GitHub hosts. (#10274)
Allowed the source-commit build setting through the application API. (#10551, fixes #10280)
Limited Grafana-specific service fields to Grafana images. (#10562, fixes #10556)
Required POST for state-changing API operations such as start, stop, restart, deploy, enable, disable, and server validation; equivalent GET requests now return 405 Method Not Allowed.
Added Railpack as a beta build pack option with build-time environment support, config merging, examples, and deployment smoke coverage (#9117, resolves #5282).
Added configurable application stop grace periods for manual stops, previews, and deployments (#9746, fixes #5620).
Added structured audit logging for API mutations, webhook events, authentication, and authorization outcomes (#9842).
Added per-server configurable SSH connection timeouts and exposed the setting through the API and UI (#9844).
Added deployment skipping for webhook commits and PR/MR titles containing [skip ci] or [skip cd] (#9861).
Added instance-level MCP support with read-only tools for Coolify resources and API/UI enablement controls (#9862).
Added application deployment configuration diff tracking so pending changes and build-impacting changes are surfaced before redeploy (#10183, fixes #8357).
Added a collapsible sidebar with persisted state, tooltips, and a compact team menu (#9945).
It was long overdue because we have been in beta for a long time. Thousands of companies and people have been using Coolify in production for 1-2 years.
Of course, this does not mean it has no bugs, it has many, but we fix them every day.
v5 is coming together, but we are not rushing it.
The biggest feature will be full scalability in the core, so you will have cloud infrastructure, but with your own servers.
I already have a working solution for the core and it is soo cool. Can't wait to start showing them to you.
By the way, doing v5 does not mean we won't continue to support v4.
We just want to push what is possible with servers and automations.
Thank you to everyone who helped me reach this point π
Let's make cool stuff! π«°
So the release notes:
What's Changed
Security & Fixes
Fixed Rallly service environment variable defaults (#9041, fixes #9615)