github coollabsio/coolify v4.7.0

55 minutes ago

Breaking Changes

  • Cancelled the older queued webhook deployments of an application by default when a newer push arrives, so only the latest commit is built (#10921, #7678)
    • It works per application, pull request and server
    • Advanced > Deployment and is_auto_cancel_queued_deployments_enabled in the applications API turn it off
    • Manual, API, restart and rollback deployments are never cancelled
    • An opt-in setting, is_auto_cancel_building_deployments_enabled in the API, also stops an older webhook deployment that is still building, a deployment that started to replace containers always finishes
    • cancel_previous (none, queued or building) on /api/v1/deploy and the MCP deploy tool cancels the older webhook, API and MCP deployments, the default is none
  • Limited the cloud provider token API to team admins and owners
    • Other members get 403
  • Moved the Resend sender to the new resend_from_address and resend_from_name fields, API clients must use the new fields
    • A migration copies the current values

Security

  • Applied the limits of API tokens to more permission checks
    • A message explains when a token limit blocks a change
  • Built team invitation links from the instance URL instead of the request host, when no instance domain is set
  • Checked that members with access grants can use the selected server and the team credentials
    • A new, cloned or migrated resource needs a server that the member can use, the localhost server needs an instance admin
    • Server lists show only the servers that the member can use
    • Team private keys, GitHub Apps, Gitea Apps and new S3 storages of backup schedules need write access on the whole team, also through the API
    • A message explains when write access on the whole team is needed
  • Checked the deploy permission before a deploy through the API creates a preview or changes its image tag
  • Ended terminal sessions when access to the server is lost
  • Enforced fixed SSH connection options on every connection, also for health checks
  • Generated new SSH keys as Ed25519 and validated private keys more strictly
  • Hardened SMTP and terminal connections
    • SMTP hosts are validated, and Coolify connects only to the checked address
    • The error message explains why an SMTP host is refused
  • Limited the server data in the application, service, and database API responses to tokens that cover the whole team
  • Removed the server details from the response of the get_service MCP tool
  • Kept personal data and credentials out of audit events
    • The audit events of a deleted user are anonymized
  • Kept stored private keys out of the browser
  • Kept the Sentinel token out of process arguments
    • Sentinel reads it from an env file
  • Limited API clients that keep failing to 30 failed requests per minute for one token or IP
    • More failed requests get 429, API_FAILED_REQUEST_RATE_LIMIT sets the limit
    • The team of the token gets one notification a day when the token reaches the limit
  • Pinned the SSH host key of a server on the first connection, the team gets a notification when it changes
    • SSH_HOST_KEY_CHECKING sets the mode: warn, enforce or off
  • Pinned the SSH host keys of Git hosts across deployments
    • Coolify shows the published host keys of GitHub, GitLab and Bitbucket
  • Restricted preview changes, rollbacks and repository URL changes
    • Opening a preview, changing its pull request URL, Git type or Docker tag, or choosing a commit through the API needs write access, a deploy token can only redeploy an existing preview
    • A rollback goes only to a listed rollback image or a successful production deployment
    • A new git_repository of an application is validated like in the UI
    • The docker_tag of /api/v1/deploy is validated like in the preview API
  • Validated webhook URLs, limited DNS lookups and tightened the authorization of team resources

Added

  • A list view on the new resource page
  • A Not used label on the TLS certificates of the Traefik proxy page, and a Delete unused button that deletes them in one step (#12447)
    • A certificate is unused when no route and no resource on the server uses its domain
    • Traefik renews every certificate in acme.json until you delete it and restart the proxy
  • API endpoints and MCP tools that manage image scanning and read the scan results
    • GET and PATCH /api/v1/servers/{uuid}/image-scanning, GET /api/v1/vulnerabilities and GET /api/v1/{applications|databases|services}/{uuid}/vulnerabilities
    • The MCP tools are get_vulnerabilities and manage_image_scanning
  • A Run in a shell option on scheduled tasks, so containers without sh, such as distroless or scratch images, can run them (#8244)
    • Turn it off to split the command into arguments and run it directly
    • The API and the MCP tools set it too
  • A separate notification sender in the instance email settings
    • Team notifications through the instance email settings, the S3 connection error alert and the channel disabled alert use it
    • Account emails keep the default sender
    • The emails artisan command no longer exists
  • A Skip TLS certificate verification setting on S3 storages, for endpoints with a self-signed or private CA certificate (#9762, #4402)
    • It applies to the connection test, backups, restores and the deletion of old backups
    • The S3 storages API sets it with skip_tls_verification
    • Browsers that download files from the storage must still trust the certificate
  • A star button on servers and resources for quick access on the dashboard
    • The button is after the status in the top bar
  • A UI scale option in the appearance settings
  • Automatic update notifications, the root team gets one when an automatic update starts, fails or finishes
    • A manual upgrade that fails before the upgrade script starts shows the error in the upgrade modal
  • A warning when the Docker Compose file of an application is in a subdirectory of the base directory, with a button that moves the directory of the file into the base directory (#9525)
    • Coolify runs Docker Compose in the base directory, so relative paths such as build.context: .. resolve from there
  • Container image vulnerability scanning, opt-in for each server and each application
    • Syft and Grype run on your server, and no data goes to a third party
    • Each resource gets one security status and version recommendations, with an optional deploy gate for each application
    • The team Security page and the notifications show the results
  • Forgejo and Codeberg in the Gitea App source
    • A Provider list fills in the Gitea.com or Codeberg URLs
    • Webhooks accept the X-Forgejo-* headers
  • Gitea App endpoints in the API and the MCP tools, GET /gitea-apps and POST /applications/private-gitea-app (#12459)
    • gitea_app_uuid sets the source when you create or update an application
  • GitHub Deployments sync, each deployment and preview reports to GitHub Deployments with links to the log and the environment
    • It needs a private GitHub App with Deployments: write
  • One email provider list with None, SMTP and Resend, more than one named SMTP server with its own sender, and SMTP templates for common providers
  • Rotate key on private keys, which replaces a key on all servers that use it
    • Coolify adds the new key to authorized_keys, can undo the rotation, and removes the old key
    • A server delete can remove the key from authorized_keys
    • Coolify deletes unused SSH key files every hour
    • The button shows only when a server uses the key
  • Server usage in the server table of the dashboard on mobile
  • SFTP, FTPS and WebDAV backup storages for database and volume backups, with downloads, retention and restores
    • SFTP restores and downloads need a host key that an admin saved with a validation
  • The finish time of recent deployments on the dashboard
  • The logo and name of the resource on the resource creation screen
  • The Orbit service template, a self-hosted workspace for teams with tasks, docs, chat and an MCP server for AI clients
  • Valkey as an image of the Redis database type
    • A new step of a new Redis database asks for Redis or Valkey
    • Global search accepts "new valkey"

Changed

  • Import Backup from the resource menu to an Import backup button on the Backups page of databases and services (#11818)
    • The button opens the import in a dialog
    • Old Import Backup links open the Backups page
  • Maintenance mode to its own Maintenance page of applications and services, and you must confirm the toggle
  • The data retention of unsubscribed teams on Coolify Cloud from 30 to 60 days
    • The cleanup saves the deleted users to cloud-deleted-users.csv on the backups disk
  • The default image of new Redis databases to valkey/valkey:9-alpine
    • Existing databases keep their image
  • The default images of new databases to PostgreSQL 18, MongoDB 9, MySQL 9.7, MariaDB 12.3 and ClickHouse 26.8
    • Existing databases keep their image
  • The default images on the new resource page to Supabase PostgreSQL 17.11.0.018 and PostGIS 18-3.7-alpine
  • The notifications of scheduled jobs that keep failing, to the first failure and then at most once a day
    • This covers scheduled tasks, database backups, storage backups and Docker cleanup
    • The first successful run after a failure sends one "works again" notification to the failure channels
    • A database backup whose S3 upload keeps failing also notifies at most once a day
    • A scheduled task disables itself after 10 failures in a row when the first failure is more than 24 hours old, one notification and the task page give the reason, and enabling the task again clears it
    • The scheduled tasks API returns consecutive_failures, failing_since and disabled_reason
    • Backups and Docker cleanup are never disabled automatically, so they start again by themselves after an outage
    • A scheduled task skips a run when the application or service has no running container, without a notification and without a count toward the automatic disable
  • The security settings of a server to one Security page with patches, terminal access, SSH host key and image scanning
  • The Sentinel version to 1.1.5

Removed

  • Copy from instance settings from the email notification page, select Use system-wide settings instead
  • The unused MinIO client from the Coolify image

Fixed

  • API token search out of sync after you create, edit or revoke a token (#12465)
  • Applications and databases removed from the Docker Compose file of a service showing as Exited and keeping the service degraded (#9591)
    • They show Not in Compose file and do not count in the service status
    • Coolify keeps their settings and uses them again when you add the service back under the same name
    • To remove one, delete it in its settings
    • Existing ones are marked at the next deployment or save of the service
  • Applications deleted on all their servers when you delete a server that they use only as an additional destination
    • This applies to Delete all resources and DELETE /api/v1/servers/{uuid}?force=true
    • Coolify removes the application only from the deleted server and stops its containers there
    • A server that has only such applications can be deleted without Delete all resources
    • The delete confirmation lists the resources it deletes and the applications that keep running on another server
  • Bugsink service template filling the disk with MySQL binary logs until Bugsink stopped (#10626)
    • New services use PostgreSQL 17 and Bugsink 2
    • To stop the growth in an existing service, run PURGE BINARY LOGS BEFORE NOW(); in MySQL, then add command: ['--disable-log-bin'] to the mysql service and restart it
  • Builds that failed with x509 errors behind a TLS-inspecting proxy, although the server trusts the proxy CA (#7568)
    • The helper container mounts the CA bundle of the server read-only
  • Compose services that could not reach each other by name in preview deployments and failed to start (#8030)
    • The original name is an alias on the preview network
  • Copy logs not changing the clipboard on iPhone and iPad, in the runtime and deployment logs (#9408)
    • Coolify starts the clipboard write during the tap and adds the logs when they load
  • Cut-off descriptions of PostgreSQL, MongoDB and ClickHouse on the new resource page
  • Database backup executions table that did not fit the page and was hard to read (#7188)
    • It shows the file name of the archive, with a button that copies its path
    • It shows All databases for a backup of all databases
  • Database backups saved to S3 when an API request does not send save_s3
    • The backup page resets the S3 selection when a change is not allowed
  • Database backups that passed the worker timeout, stayed running, and left the upload container and the dump file on the server
    • Each step gets only the time that is left of the backup timeout, so a run that takes too long fails and cleans up
    • An SSH retry does not start a second dump
    • The backup log explains exit code 124, and the timeout help says that it covers the complete run
    • The daily helper container cleanup removes the upload containers of executions that are not running
  • Data that looked lost after you changed the name of a persistent volume, because a new name points to a new, empty Docker volume (#8816)
    • A dialog asks for confirmation and tells you to copy the data into the new volume
  • Deleted coolify.yaml and an unreachable dashboard on a server with the IP host.docker.internal that is not the default localhost server (#12444)
    • Coolify keeps treating this server as localhost after a save, for example after a proxy restart
  • Deleted volume coming back after a redeploy when the image declares VOLUME at its path (#6875)
    • Coolify removes containers that still mount a deleted volume before it starts the new ones
    • The stale volume delete dialog warns when a container still uses the volume
  • Deploy canvas cards with another border than the resource tiles
  • Deployments started through the MCP server saved as API deployments
    • The deployment list shows them with the MCP source and filter
    • The API and MCP deployment data have a new is_mcp field
  • Deployments that failed on one 502 or one timeout from the GitHub API (#9785)
    • GitHub API reads retry up to three times on a 5xx error or a failed connection
    • Writes, such as pull request comments, are not retried
  • Deployments that failed with cURL error 28 on https://api.github.com/zen, because Coolify compared its clock with GitHub before each token request (#9785)
    • Coolify compares the clocks only when GitHub rejects a request, from the Date header of that response
  • Deployments that failed with "The container name ... is already in use" when Use build secrets is on (#9363)
    • Coolify removes the old helper container and waits until Docker frees the name
  • Deployments that stopped on a broken .env file, because multi-line JSON values saved before exact escaping had no quotes (#8279)
    • These values use exact escaping, which gives the container the same value as before beta.463
  • Deployments to additional servers losing the source of the main deployment
    • The audit log records actions that MCP tools do through the API as MCP events
  • Different COOLIFY_BRANCH values in the parts of a preview deployment (#9572)
    • All parts use pull/<pull request number>/head
  • Disabled self-hosted servers that stayed disabled after a validation that connects (#12475)
    • The unreachable cleanup skips the localhost server
    • The server page explains why a server is disabled
    • Coolify Cloud servers and transferred servers stay disabled
  • DNS matches on a domain in a connected Cloudflare zone that goes through Cloudflare to a different server, which then failed with Cloudflare error 526 and a Let's Encrypt error (#12436)
    • The domain shows DNS mismatch
    • CNAME records, for example of a Cloudflare Tunnel, are still accepted
    • A clone of an application or a service, or a new one through the API, gets a Cloudflare DNS record for each domain in a zone with automatic DNS, a clone only for the domains that the source does not use
  • Docker builds that failed with "BuildKit is enabled but the buildx component is missing or broken" when an application has a build-time variable HOME or DOCKER_CONFIG (#9726)
    • The Docker CLI in the helper container always uses /root/.docker
    • A HOME build argument keeps its value
  • Docker Compose previews sharing one project with the application and the other previews, so Docker Compose treated their containers as orphans (#9014)
    • Each preview has its own Compose project, and the networks that the Compose file declares are not shared
  • Dockerfile HEALTHCHECK options not imported as Docker reads them, zero and sub-second values became 0 seconds (#12455)
    • Coolify reads compound and fractional durations, quoted values, only the flags before CMD, the escape directive and NONE with flags
  • Dockerfile HEALTHCHECK read from a stage that is not built (#9475)
  • Domains showing Not checked when an existing Cloudflare DNS record of a new domain has a different IP
    • Coolify replaces the record when it created the record and no other resource uses it
    • Otherwise it opens the Configure DNS dialog, where you can replace the record, and the domain shows the conflict
  • Duplicate and empty rows in the audit log
  • Duplicate environment variables, and extra copies that could not be removed (#8041)
  • Empty database backups of Odoo services, which backed up only the empty postgres database (#7555)
    • New backup schedules of Odoo services back up all databases by default
  • Empty disk usage on the Metrics tab, the Fleet page and in the MCP get_server_metrics tool when Sentinel reports the Coolify data disk under another mount point than /, /data or /data/coolify (#12448)
    • This occurs for example on a NAS where /data is a symlink into a data volume
  • Empty list of the commit images of Docker Compose applications on the Rollback page and in GET /api/v1/applications/{uuid}/rollback-images, since v4.5.0 (#12446)
    • The page also shows the running commit when the Compose file has services from other images
  • Exact start time in service backup executions that is hard to read
    • The table shows the relative time, with the exact date in a tooltip
  • Expired sessions kept for the retention days of the database cleanup (#7394)
    • The cleanup deletes sessions older than the session lifetime
  • Failed backups to S3 endpoints with a path, such as /storage/v1/s3 of Supabase Storage (#8530)
    • Database backups, volume backups and S3 restores use curl with a presigned URL for these endpoints
  • Failed clone of an application with a fixed preview URL template, with a duplicate preview domain error and a stopped, partial clone
    • A clone does not copy preview deployments and gets its own from new pull requests
  • Failed Docker install on Ubuntu derivatives such as Pop!_OS and Linux Mint, and on Raspbian 13 (Trixie) (#9455)
    • The fallback uses the Ubuntu repository with UBUNTU_CODENAME on Ubuntu derivatives
    • It uses the Debian repository on Raspbian 13, which has no Docker repository of its own
  • Failed image pull in the Convex service template, after the rename to the ghcr.io/convex namespace (#12449)
  • Failed parse of a Docker Compose file whose services key is empty or is not a map, and unexplained exit code 255 in failed commands
    • The message explains that the SSH connection to the server closed before the command finished
  • Failed S3 uploads of backups larger than about 15.6 GiB on providers that accept only 1000 parts, such as Scaleway (#8411)
  • Failed sign-up and login in the Rybbit service template, /api requests got a 404 error (#9055)
    • The template routes /api on the same domain to the backend on port 3001 and keeps the /api prefix
    • For an existing service, add SERVICE_URL_RYBBIT_3001=/api to rybbit_backend, move it above rybbit in the Docker Compose file, set Path prefixes to Keep prefixes in the advanced settings of the backend and redeploy
  • Failed startup and broken public album links in the Ente service templates (#7405)
    • An albums service with its own domain serves public links
    • The images come from ghcr.io/ente, and the JWT secret is URL-safe so that Museum can decode it
    • With S3, the template uses the routed MINIO_SERVER_URL as the S3 endpoint and allows all CORS origins
  • Generic error when a new private key cannot connect to a server (#7980)
    • The message shows the SSH error
  • Health checks in their start period shown as unknown, not as running:starting (#9411)
  • High CPU use of dockerd while you stream the logs of a container with a large log file (#7693)
  • Ignored concurrent build limit of build servers (#7649)
    • Each build counts on the server that runs it, and a deployment reserves a build server with a free slot when it starts
    • A freed build server slot starts the waiting deployments of other servers
  • Inconsistent status badges and S3 storage names in service backup tables
  • Instance database backups running on the wrong server when the destination of coolify-db points to another one (#8139)
    • The backup always runs on the Coolify host
    • A failed pre-update backup shows why it failed
    • The pre-update backup skips a disabled schedule
  • LiteLLM service template with a master key that did not start with sk- (#10521)
    • The admin API key is sk- followed by the value of SERVICE_PASSWORD_MASTERKEY
    • A separate LITELLM_SALT_KEY keeps stored model credentials readable when the master key changes
    • STORE_MODEL_IN_DB is True by default, so you can add models in the LiteLLM UI
  • Live updates, such as proxy restart logs, that did not reach the browser, because the WebSocket handshake failed with 413 with large cookie headers
  • Localhost server page that did not refresh after its connection is validated
  • Locked environment variables that could not be changed, unlocked or deleted when Docker Compose uses them (#6803)
    • A locked value can be replaced without showing it
    • The lock is permanent in the UI, the API and MCP, and Lock asks for confirmation
  • Lost audit events
    • Coolify writes audit events at commit time
  • Lost Telegram notifications when Telegram rejects a button URL, for example localhost or an IP address without a domain (#8269)
    • Coolify then sends the links as text
  • Lost trailing newline of multiline environment variables, so OpenSSH rejected an SSH private key with "error in libcrypto" (#9438)
    • A value with more than one line is saved exactly as you enter it, in the UI and in the API
    • Single-line values still lose their edge whitespace
    • Save a variable again to add the newline that Coolify removed
  • Lost update channel in Settings > Updates and lost healthcheck Check type when one of them is the only change
    • The Save changes bar opens for them
  • Missing check of the closest Cloudflare wildcard record for deeper domain names, such as app.apps.example.com through *.example.com (#12436)
  • Missing Cloudflare DNS record when you edit a domain to a hostname in a connected Cloudflare zone, for example a generated domain changed to your own domain
    • Coolify adds the record automatically or opens the Configure DNS dialog, as it did only for new domains
    • This applies to the Domains pages, the application and service application settings and the service application API
  • Missing disabled server message on the localhost server page (#12475)
  • Missing Git error reason when Coolify cannot read a repository
  • Missing links to the provider dashboards on the secret manager token forms
  • Missing project, environment and service in Fluent Bit log drains for containers without the Coolify default variables (#8415)
    • The fluentd driver also sends the Coolify container labels, and the built-in configurations use them as a fallback
  • Missing Resource status changes notification when an application, preview, service or database stops unexpectedly, for example after a crash or docker kill (#9493)
    • Coolify waits 2 minutes and notifies only when the resource is still stopped
    • A stop, restart or redeploy from Coolify sends no notification
    • The same resource sends at most one notification in 15 minutes
  • Missing Traefik Proxy Outdated notification when a newer Traefik patch version of the running branch is available (#9727)
    • Coolify sends one notification for each new patch version, not one for each hourly check
  • Names and descriptions saved through the API and the MCP server that the UI rejects, so the resource could not be saved in the UI afterwards (#12466)
    • Applications, services, databases, servers and private keys use the rules and the error messages of the UI
  • Nested test key in the api service when you update the image of a service named like api.test (#12456)
    • A service name that Docker cannot use as a container name prefix gets a clear error on save
  • "Network error" when you sign in with email in AppFlowy Web (#10545)
    • The template sets GOTRUE_CORS_ALLOWED_HEADERS=redirect_to
    • For an existing service, add this variable to the gotrue service in the Docker Compose file and restart the service
  • New RSA deploy keys that GitHub rejected, because Coolify made 2048-bit keys (#12461)
    • New RSA keys are 4096 bits
  • OAuth redirect URIs that silently sent the user back to the login page
    • A redirect URI must point at the callback route of the provider, any other path gets a validation error
  • Old cached image in the Usesend service template, which used latest (#12443)
    • The template pins usesend/usesend:v1.10.0, which has the Next.js, Node.js 24 and nodemailer security updates
  • Outline service template restarting in a loop with syntax error at or near "TRIGGER" on postgres:12-alpine (#12345)
    • New services use PostgreSQL 16
    • An existing service keeps PostgreSQL 12, the Outline service documentation has the steps to upgrade it
  • Paid Coolify Cloud subscriptions that lost their link to Stripe staying active after the customer cancels them
    • cloud:sync-stripe-subscriptions reports them
  • Port warning on a service domain without a port, although Coolify routes it to the required port
    • The edit dialog shows the effective port, and the warning buttons name the ports
  • Rebuilt Docker layers when a preview comes or goes, and unreachable hosts on a build server (#12452)
    • Preview containers and the hosts of the deployment server stay out of --add-host on a build server
    • A setting of the application turns off the network hosts during the build
  • Rebuilt Docker layers when a short-lived container joins or leaves the network between two builds (#12452)
    • Database backup and S3 import helpers, Sentinel and the proxy error page container stay out of --add-host
  • Redis health check that always passed, because it did not ping the database
    • The check pings with the password and requires PONG
  • Refused servers with the same IP and different SSH ports (#7573)
  • Resource limits shown for Docker Compose applications
  • Sentinel that kept pushing after its server was deleted or its team stopped paying
    • Coolify removes the Sentinel container of unpaid servers once a day and before a server is deleted
  • Server error when a backup was uploaded in Import Backup for a database that the team cannot open
    • The upload now answers with Database not found
  • Server page that did not refresh after a background validation
    • The validation dialog that a background job opens closes when the job finishes
  • Server shared variables that did not resolve in Docker Compose files
    • Their values are redacted in the rendered Compose file
  • Servers that refused new SSH logins with "Maximum number of sessions (8192) reached", because each connection check opened three SSH logins (#9148)
    • The Docker and Docker Compose version checks use the multiplexed SSH connection, so each check opens one login
    • To remove the stuck sessions, run systemctl restart systemd-logind on the server
  • Service backup path that could not be copied, and an S3 badge on runs that are not stored in S3
  • Service backup tables that were not aligned or sortable by column
  • Service resource cards showing a starting health check as success (#9411)
    • The card shows it as a warning
  • Service resource cards that did not update their status together with the heading badge
  • Services that stopped and stayed down after a Restart when an image could not be pulled (#12485)
    • Coolify pulls the missing images before it stops the containers. If an image cannot be pulled, the restart fails and the service keeps running
  • Startup and the nightly cleanup of stuck resources stopping with "Allowed memory size exhausted" on instances with many large deployment logs (#12435)
    • Stuck deployments, tasks and backups are marked as failed, and the proxy configuration is set up
    • Database backup pages and Settings > Backup do not load all executions on each request
  • Supabase Studio showing the API logs of another stack when two Supabase services run on one server (#10324)
    • The Vector container of the template reads only the logs of its own stack
    • An existing service keeps its vector.yml, to fix it add include_labels: ['com.docker.compose.project=${COOLIFY_RESOURCE_UUID}'] under sources.docker_host in /data/coolify/services/<service-uuid>/volumes/logs/vector.yml and restart the service
  • Tooltips on close and dismiss buttons that stayed visible
  • Two deployments of one application running at once when started from the MCP deploy tool or the MCP control start action, which could stop the application (#12442)
    • They queue behind a deployment in progress, as the API and the Deploy button do
    • A deployment of the same commit is skipped, and the response gives the UUID of the deployment in progress
    • A rolling update removes only the containers that ran before it started
  • Unexplained UUID prefix on the names of new volumes (#8620)
    • The dialog explains that Coolify adds the prefix so that the volume name is unique on the server
  • Unreadable accent text and fills in custom themes (#12468)
    • Accent text reaches a contrast of 4.5:1 on the page and in the sidebar, and the preview shows the real fill
  • Unreadable account menu entries, such as Log out, when a custom theme sidebar uses the other light or dark scheme than the page (#12467)
  • Unreadable subscription and server limit banners in light mode (#12494)
    • The banners now use a light background with dark text in light mode
  • Upgrade modal that did not finish when the new version answered (#8024)
    • The modal shows success as soon as the new version is up
    • Livewire error pages stay hidden while an upgrade runs
  • Volume data checkboxes that were not next to their labels
  • WebSockets closed by Caddy on every configuration reload (#7942)
    • The application, service and dashboard routes set stream_close_delay
  • White flash of the dark theme during page loads and wire:navigate (#7866)
  • Wrong Docker Compose file not found error for an empty Compose file (#12477)
    • An empty Compose file now gives an error that says that the file is empty

Don't miss a new coolify release

NewReleases is sending notifications on new releases.