548 Commits
Author SHA1 Message Date
peaklabs-dev 6c17c29925 Merge remote-tracking branch 'origin/main' into next 2026-11-02 01:01:41 +01:00
Andras Bacsai faf0b6fac4 fix(runners): preserve unsaved settings during Sysbox checks
Move Sysbox checks and installation into a lazy Livewire component so its requests do not reset the runner form's unsaved state. Update tests to cover the separate component.
2026-11-01 21:03:26 +01:00
Andras Bacsai 23eebbf2ad fix(servers): refresh provider status with server details action 2026-11-01 15:49:13 +01:00
Andras Bacsai 6f1905b7b0 fix(access): enforce member grants on more actions
- Require write access on the target environment to clone or move a resource
- Check read access on shared variables before a reference is added or resolved
- Limit team credentials, git sources, and imports of other backups to team-wide writers
- Require the delete level for backup, volume, storage, and task deletes
- Require create access for previews, new projects, and git sources
- Use the token team for the access scope, and check team-wide access on Livewire updates
- Require instance admin to toggle the API and MCP server
- Hide server pickers and broadcast details from members without access
2026-10-30 16:11:10 +01:00
b85a9197a1 chore: merge main into next (#12382)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 21:10:39 +01:00
Andras Bacsai af28ba8bbc feat(tables): sort tables by clicking a column header 2026-10-29 10:53:54 +01:00
github-actions[bot] 9d0b6a5054 Merge remote-tracking branch 'origin/main' into next 2026-10-28 13:28:51 +00:00
Andras BacsaiandClaude Opus 5.5 597a878d80 fix(hetzner): validate over SSH when the Hetzner API call fails
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 14:16:22 +01:00
62b2a99a70 chore: merge main into next (#12351)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Aditya Tripathi <aditya@climactic.co>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 22:25:43 +01:00
fe6c73726d chore: merge main into next (#12344)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Aditya Tripathi <aditya@climactic.co>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 20:25:53 +01:00
Andras BacsaiandClaude Opus 5.5 56d0cf0e27 fix(servers): validate new cloud servers automatically when they are running
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:58:34 +01:00
Andras BacsaiandClaude Opus 5.5 28f44d3aa0 fix(hetzner): show out-of-stock server types as disabled in the server form
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:44:34 +01:00
Andras Bacsai 101444b8ca fix(log-drains): support Axiom edge domains and update Fluent Bit to 5.1
- Add an Axiom edge domain setting (default us-east-1) and use the /v1/ingest endpoint, so EU datasets work
- Remove the Highlight drain (service ended) and stop its running containers
- Update Fluent Bit from 2.0 to 5.1 and use the warn log level
- Restart running drains when the generated files change, with the new image pulled before the old container stops
- Show log drain validation errors under their fields

Closes #9898
2026-10-27 17:41:50 +01:00
Andras Bacsai 16c6de823b fix(cloud-providers): show why Hetzner, DigitalOcean, and Vultr API requests fail
Provider errors now return 502 with a safe message, the provider status, and
the provider error code instead of a bare 500. Hetzner no longer sends a create
request again after a 5xx, and a VPS that Coolify did not save is deleted.
2026-10-27 16:35:57 +01:00
Andras Bacsai 1a2a5362ad fix(security): secure remote command secrets and clone volume data 2026-10-27 09:47:18 +01:00
Andras Bacsai 2be4f259b8 Merge remote-tracking branch 'origin/main' into automation/sync-main-to-next 2026-10-26 12:41:43 +01:00
Andras Bacsai 8eb33ddf31 Merge remote-tracking branch 'origin/next' into automation/sync-main-to-next 2026-10-26 12:12:20 +01:00
Andras BacsaiandClaude Opus 5.5 d8d33c69ce fix(auth): hide locked and admin-only secrets in forms, compose, and the API
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 21:46:58 +02:00
Andras Bacsai 6fc14f3615 fix(auth): enforce resource permissions for stored secrets 2026-10-24 18:26:55 +02:00
Andras BacsaiandClaude Opus 5.5 7e612422b6 fix(proxy): keep proxy status current and stop auto-start during restarts
- Refresh the navbar proxy status on the 30 s poll
- Skip Sentinel and server check auto-start while a proxy start or restart runs
- Use the StartProxy commands in RestartProxyJob, so Caddy restarts keep the
  maintenance blocks and remove the Traefik logrotate sidecar

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:02:17 +02:00
Andras BacsaiandClaude Opus 5.5 1527917523 feat(ui): make live refresh a toggle for any metrics and analytics range
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 13:24:52 +02:00
Andras Bacsai 18f74536e4 fix(server): validate servers without a proxy
Closes #11048
2026-10-24 00:45:06 +02:00
Andras BacsaiandClaude Opus 5.5 2ea1afb811 fix(server): explain why the Docker Engine version check failed
When "docker version --format json" did not return clean JSON (for
example, text from a shell startup file), validation stored 0.0.0 and
said that Docker was older than version 24. Validation now stores no
version and tells the user to run the command on the server. When the
version is too old, the message shows the detected version.

Closes #11089

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:32:14 +02:00
Andras BacsaiandClaude Opus 5.5 9d82a76fc4 perf(metrics): fetch all Sentinel metric types in one SSH command
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:07:37 +02:00
Andras BacsaiandClaude Opus 5.5 cf9f254507 fix(server-transfer): close security holes in import, claim, and archives
Import:
- Check every uuid in a bundle against a strict id format before any
  write, and quote the SSH mux socket and key paths in local shell
  commands. A bundle uuid could run commands in the Coolify container.
- Validate bundle fqdns, git source URLs, paths, networks, cron
  expressions, and database ports; cap the number of items.
- Do not confirm that another team has a uuid.
- Refuse a project icon path with a uuid that is not a plain id.

Claim, finish, and migrate:
- Pass checklist step keys to wire:click with Js::from (stored XSS).
- Link only to https target server URLs.
- Validate target_instance_url in /transfer/complete; never prefill an
  unverified URL for a transfer back; scope the transfer-back token to
  write+deploy for 1 hour.
- Release on an owner marker only when it is newer than the own claim.
- Do not touch apps that only use the server as an additional
  destination when an archive is released or deleted.
- Give Sentinel a new token on claim.
- Add a checklist step to remove the previous instance's SSH key.
- Block a transfer while backups or scheduled tasks run.
- Authorize refreshMigration and PrivateKey checkConnection, clear
  tokens from Livewire state, hide migration log/error from members.

Archives:
- Refuse ip, user, port, private key, and Cloudflare tunnel changes.
- Throttle Enable management and require a free server slot for it and
  for a transfer back.
- Skip cloud provider calls.
- Re-read force_disabled before each SSH command, so running jobs stop.
- Probe the import check target at the resolved address only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 21:02:32 +02:00
Andras Bacsai 6012232e97 fix(server): rate limit failed server validations on cloud 2026-10-23 11:10:02 +02:00
Andras Bacsai c454f84545 fix(server-transfer): keep imported data exact and guard archived servers
- Skip TrimStrings and ConvertEmptyStringsToNull on the import route; an empty shared variable failed the whole import
- Keep compose parser versions, static ports, legacy variable keys, and only the bundle's variables and destinations
- Give the transfer back token the deploy permission that the import needs
- Move the Cloudflare tunnel DNS record with the server and park it on the source
- Refuse cloud server deletes, power on, tunnel and DNS changes, and scp for archives; skip their backup alerts and provider polling
- Add a column-level round-trip test, archive guard tests, and a live full-coverage transfer test
- Advance the GitLab App sequence in the dev seeder
2026-10-22 15:52:20 +02:00
Andras Bacsai c465371356 Merge remote-tracking branch 'origin/main' into fix/secret-manager-request-timeout
# Conflicts:
#	other/nightly/versions.json
#	tests/Feature/Security/IntegrationTokenFormTest.php
#	versions.json
2026-10-21 22:44:50 +02:00
Andras BacsaiandClaude Opus 5.5 64b748008e fix(server): list the active private key first
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:28:48 +02:00
Andras Bacsai dd456625ec Merge remote-tracking branch 'origin/release/v4.5' into release/v4.5 2026-10-19 15:03:38 +02:00
Andras BacsaiandClaude Opus 5.5 f9e4323839 fix(patches): turn on automatic updates with the time in the Maintenance window field
Turn on used the saved time and the confirmation showed the time from
page load, so an unsaved new time was ignored. Turn on now validates
and saves the time in the field, and the confirmation refers to the
field instead of a fixed time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:54:46 +02:00
Andras BacsaiandClaude Opus 5.5 3bc7e47a86 feat(patches): confirm before turning automatic security updates on or off
Automatic security updates now have their own "Turn on" / "Turn off"
action with a confirmation, instead of a field that the Save bar
applied. The confirmation explains what can stop:

- Docker from the operating system packages (docker.io, moby-engine)
  restarts on a security update, so all containers stop and start.
- Docker CE from the Docker repository is not updated: its repository
  has no security origin (apt) and no security advisories (dnf).
  Checked on Debian 12 (unattended-upgrade --dry-run skips docker-ce)
  and CentOS Stream 9.
- Services that use an updated library can restart; a new kernel is
  installed without a reboot.

The on/off state is locked, so only the confirmed action can change it.
A new maintenance window is applied to the server on Save only when the
updates are on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:51:21 +02:00
Andras BacsaiandClaude Opus 5.5 f32ecca44c feat(patches): record package updates, reboots, and auto-update changes in the audit log
- ui.server.packages_update_requested: user, server, packages (or all),
  package manager, and the activity of the update.
- ui.server.packages_update_finished: written when the remote process
  finishes (also when it fails), with the result and the exit code of
  the activity. The update gets a fresh type_uuid (an indexed activity
  property), so the listener finds exactly this activity. The actor
  comes from the request, because the listener runs in the queue.
- ui.server.reboot_requested with result started or failed.
- ui.server.auto_security_updates_updated (enabled, time, package
  manager, result) and ui.server.patch_settings_updated for a changed
  check frequency.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:44:03 +02:00
Andras BacsaiandClaude Opus 5.5 4ca0b4415c feat(patches): add automatic security updates per server
- New server settings: is_auto_security_updates_enabled and
  auto_security_updates_time (maintenance window, HH:MM in the time zone
  of the server). Both move with a server transfer.
- Debian/Ubuntu: install unattended-upgrades and write
  52coolify-unattended-upgrades. `#clear` drops the distro origin lists,
  so only the security origins stay (Debian <codename>-security, Ubuntu
  <codename>-security, and the Ubuntu Pro ESM security origins). A
  drop-in for apt-daily-upgrade.timer sets the time.
  https://manpages.debian.org/bookworm/apt/apt.conf.5.en.html
  https://github.com/mvo5/unattended-upgrades/blob/master/README.md
- RHEL family: install dnf-automatic (dnf5-plugin-automatic on dnf5),
  set upgrade_type = security and apply_updates = yes in
  /etc/dnf/automatic.conf, and add a drop-in for dnf-automatic.timer
  (dnf4) or dnf5-automatic.timer (dnf5).
  https://dnf.readthedocs.io/en/latest/automatic.html
  https://dnf5.readthedocs.io/en/latest/dnf5_plugins/automatic.8.html
- Off removes the Coolify files, so the operating system default comes
  back. Other package managers show "not supported".
- The schedule and the automatic updates share one form and one
  unsaved bar. The remote commands run only when the automatic update
  settings change; a failure keeps the old setting.
- Commands are written for non-root SSH users (tee and single sh -c
  scripts) and were run in Debian 12, Ubuntu 24.04, Rocky 9, and Fedora
  containers as root and as a sudo user.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:41:42 +02:00
Andras BacsaiandClaude Opus 5.5 3da85e2c07 feat(patches): mark security updates, reboot state, and risky packages
- Security updates: apt marks a package from a "-security" suite (Debian
  12 now reports oldstable-security). dnf reads `dnf updateinfo list
  --security` (dnf5 keeps updateinfo as an alias of advisory). zypper
  uses `zypper -x patch --dry-run --category security`, because
  `zypper -x list-patches` ignores --category and has no package names.
  pacman and apk cannot tell, so they show no security count.
  https://dnf5.readthedocs.io/en/latest/commands/advisory.8.html
  https://github.com/openSUSE/zypper/blob/master/doc/zypper.8.txt
- Reboot required: /var/run/reboot-required, `needrestart -b` (KSTA 2
  or 3), `dnf needs-restarting -r` (matched by text, because a missing
  plugin also exits 1), and `zypper needs-rebooting` (exit 102).
  https://github.com/liske/needrestart/blob/master/README.batch.md
  https://dnf-plugins-core.readthedocs.io/en/latest/needs_restarting.html
- An explicit risk list per package manager (Docker engine, kernels,
  libc/glibc/musl, systemd, dbus, openssh) replaces the "name contains
  docker/kernel" guess on the page and in every notification channel.
- The page shows security and reboot badges, a security count, and the
  risk of each package. "Reboot server" (with confirmation, update
  policy on the loaded server) schedules the reboot with systemd-run and
  checks the server again five minutes later. Archived (transferred)
  servers are never touched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:39:51 +02:00
Andras BacsaiandClaude Opus 5.5 6806ed31fa feat(patches): save check results and run checks in a queued job
- server_settings gets patch_check_result (JSON), patch_check_error,
  patch_checked_at, and patch_check_frequency.
- The patches page shows the saved result and "Last checked" on load.
  "Check for updates" queues ServerPatchCheckJob (manual) instead of
  running SSH in the Livewire request. The job saves the result and
  broadcasts ServerPatchCheckFinished on the server team channel; the
  page reloads the saved result (with a 10 s poll as a fallback).
- A finished package update (callEventOnFinish) queues a new check on
  the server side, so the page no longer depends on the browser.
  ServerPackageUpdated is removed.
- The check frequency is a server setting (cron or preset, at most once
  per hour). Empty keeps the staggered weekly default.
- The failure notification is sent only when the state changes from ok
  to error, not on every check.
- Page access needs viewSecurity and every action needs update on the
  loaded server; a member gets 403. Updates accept only a package from
  the saved result.
- Server transfer: the frequency moves, the last result stays on the
  source (runtime).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:28:51 +02:00
Andras BacsaiandClaude Opus 5.5 df17797d8f fix(patches): run apt without prompts, check pacman safely, show dnf versions
- apt: use apt-get with DEBIAN_FRONTEND=noninteractive and keep changed
  configuration files (--force-confdef/--force-confold). A single package
  uses install --only-upgrade, so it is never installed when missing.
- pacman: do not run `pacman -Sy` on the live database during the check.
  Use checkupdates (with fakeroot) or a temporary sync database, the same
  method checkupdates uses. pacman 7 downloads as the alpm user, so the
  temporary directory is 755. Arch allows only "Update all" (-Syu), because
  partial upgrades are unsupported.
  https://man.archlinux.org/man/checkupdates.8
  https://wiki.archlinux.org/title/System_maintenance#Partial_upgrades_are_unsupported
- dnf: list upgrades with `repoquery --upgrades --latest-limit 1 --qf`
  (dnf5 needs the explicit \n, dnf4 prints empty lines) and read the
  current versions from `rpm -qa`. The package name has no .arch suffix.
  https://dnf5.readthedocs.io/en/latest/changes_from_dnf4.html

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:21:59 +02:00
22a8c09dd6 Next (#12202)
Co-authored-by: Aditya Tripathi <aditya@climactic.co>
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: rosslh <ross@rosshill.ca>
Co-authored-by: Abdulfetah Suudi <suudiabdulfetah@gmail.com>
Co-authored-by: Dharmveer <51308779+dharmveer97@users.noreply.github.com>
Co-authored-by: Maxwell <136101+mxswd@users.noreply.github.com>
2026-10-19 10:07:23 +02:00
Andras Bacsai 32096d53f1 Merge remote-tracking branch 'origin/release/v4.5' into pr-12202-next
# Conflicts:
#	.ai/lessons.md
#	app/Actions/Server/CleanupDocker.php
#	app/Http/Controllers/Api/DatabasesController.php
#	app/Http/Controllers/Api/ServerCanvasController.php
#	app/Http/Controllers/Api/ServicesController.php
#	app/Http/Middleware/ApiIpAllowed.php
#	app/Jobs/VolumeBackupJob.php
#	app/Livewire/Concerns/RemembersCanvasView.php
#	app/Livewire/Fleet/Metrics.php
#	app/Livewire/Project/Database/BackupEdit.php
#	app/Livewire/Project/Service/BackupExecutions.php
#	app/Livewire/Project/Shared/EnvironmentVariable/All.php
#	app/Livewire/Project/Shared/Storages/VolumeBackups.php
#	app/Livewire/Security/ApiTokens.php
#	app/Livewire/Tags/Show.php
#	app/Models/ApplicationSetting.php
#	app/Models/Service.php
#	app/Rules/ValidGitRepositoryUrl.php
#	app/Services/EnvironmentCanvas.php
#	app/Services/ProjectCanvas.php
#	app/Services/ServerCanvas.php
#	app/Services/ServerTransfer/ServerTransferExporter.php
#	app/Services/ServerTransfer/ServerTransferImporter.php
#	app/Services/ServerTransfer/ServerTransferMigrator.php
#	app/Services/SharedVariableCanvas.php
#	app/Traits/ExecutesDatabaseStartCommands.php
#	app/Traits/HasS3Replicas.php
#	bootstrap/helpers/shared.php
#	config/constants.php
#	other/nightly/versions.json
#	resources/css/app.css
#	resources/js/canvas-core.js
#	resources/js/canvas/deploy/DeployCanvas.svelte
#	resources/js/canvas/deploy/state.svelte.js
#	resources/js/canvas/deploy/styles.js
#	resources/js/canvas/environment/Card.svelte
#	resources/js/canvas/environment/EnvironmentCanvas.svelte
#	resources/js/canvas/environment/Panel.svelte
#	resources/js/canvas/environment/StatusDot.svelte
#	resources/js/canvas/environment/Toolbar.svelte
#	resources/js/canvas/environment/Zone.svelte
#	resources/js/deploy-canvas.test.js
#	resources/js/environment-canvas.js
#	resources/js/environment-canvas.test.js
#	resources/views/components/canvas-view-toggle.blade.php
#	resources/views/components/navbar.blade.php
#	resources/views/components/server/sidebar.blade.php
#	resources/views/components/shared-variables/layout.blade.php
#	resources/views/components/shared-variables/sidebar.blade.php
#	resources/views/components/top-user-menu.blade.php
#	resources/views/layouts/app.blade.php
#	resources/views/livewire/fleet/metrics.blade.php
#	resources/views/livewire/project/database/backup-edit/s3.blade.php
#	resources/views/livewire/project/database/backup-executions.blade.php
#	resources/views/livewire/project/environment-canvas.blade.php
#	resources/views/livewire/project/new/select.blade.php
#	resources/views/livewire/project/project-canvas.blade.php
#	resources/views/livewire/project/projects-canvas.blade.php
#	resources/views/livewire/project/shared/environment-variable/all.blade.php
#	resources/views/livewire/project/shared/storages/volume-backups/s3.blade.php
#	resources/views/livewire/security/api-tokens.blade.php
#	resources/views/livewire/server/canvas.blade.php
#	resources/views/livewire/server/index.blade.php
#	resources/views/livewire/server/navbar.blade.php
#	resources/views/livewire/server/partials/localhost-general.blade.php
#	resources/views/livewire/server/show.blade.php
#	resources/views/livewire/settings/advanced.blade.php
#	resources/views/livewire/shared-variables/canvas.blade.php
#	resources/views/livewire/tags/canvas.blade.php
#	resources/views/livewire/tags/show.blade.php
#	routes/web.php
#	tests/Feature/ApiDisabledCalloutTest.php
#	tests/Feature/BackupS3DestinationsFormTest.php
#	tests/Feature/DatabaseStartContentFilesTest.php
#	tests/Feature/DockerCleanupJobTest.php
#	tests/Feature/EnvironmentCanvasTest.php
#	tests/Feature/InstanceBackupMultipleS3DestinationsTest.php
#	tests/Feature/Livewire/Fleet/MetricsChartPayloadTest.php
#	tests/Feature/Livewire/Fleet/MetricsDataTest.php
#	tests/Feature/Mcp/McpEndpointTest.php
#	tests/Feature/Mcp/McpToggleApiTest.php
#	tests/Feature/ProjectCanvasTest.php
#	tests/Feature/ServerCanvasTest.php
#	tests/Feature/SharedVariableCanvasTest.php
#	tests/Feature/VolumeBackupTest.php
#	tests/Unit/ScpStyleGitUrlTest.php
#	tests/Unit/ServerTransfer/ServerTransferS3DestinationsTest.php
#	tests/v4/Browser/DeployCanvasTest.php
#	versions.json
2026-10-19 10:00:21 +02:00
Andras BacsaiandClaude Opus 5.5 a82d32c946 chore: merge main into release/v4.5
Resolve conflicts between main's security fixes and v4.5 features:
- Keep v4.5 features (log redaction, multi-S3 backups, transfer flow,
  scheduled task modal, sidebar) and port main's fixes into them.
- Reuse RequiresDeployAbility for the Hostinger create endpoint.
- Align MCP tool abilities and descriptions with main's new deploy
  requirements, and use deploy tokens in the affected MCP tests.
- Drop the duplicate DockerCleanupJobTest helper and tests, and the
  exportBundle test for a method v4.5 removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:00:05 +02:00
Andras Bacsai 9355728d03 fix(log-drains): validate custom log drain configuration (#12197) 2026-10-18 23:40:54 +02:00
Andras Bacsai c781cddbab fix(server-transfer): require update access to export bundles 2026-10-18 23:21:16 +02:00
MaxwellandAndras Bacsai 0bc1288e81 Added docker awslogs driver to log drains (#11972)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
2026-10-18 23:20:42 +02:00
Andras BacsaiandClaude Opus 5.5 7c14c0098e feat(server-transfer): run instance migration as a background job (#12180)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 22:03:45 +02:00
6b07f03107 feat(terminal): interactive console mode for containers (docker attach) (#11538)
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com>
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: rosslh <ross@rosshill.ca>
2026-10-14 14:32:02 +02:00
Andras Bacsai 33ee09fa87 feat(canvas): add interactive resource views and team avatars (#12160) 2026-10-14 09:28:10 +02:00
Andras Bacsai 448dc8ea0a feat(logging): strengthen secret redaction and add admin controls (#12151) 2026-10-13 20:43:19 +02:00
Andras Bacsai f63726279c Merge remote-tracking branch 'origin/release/v4.5' into sentinel-metrics-sidebar-page 2026-10-13 11:57:47 +02:00
Andras Bacsai f37761253d feat(server): set up Cloudflare tunnels with API tokens (#12157) 2026-10-13 11:32:26 +02:00
github-actions[bot] 8f5bb11bee Merge remote-tracking branch 'origin/main' into release/v4.5 2026-10-13 08:04:48 +00:00