This release reworks the first sign-in and keeps an installer's pairing code alive while a new user signs up. Cloud also starts refusing disposable email addresses.
Onboarding survey, asked once
The onboarding survey now runs once per user, on their first sign-in. It shows one question per screen and has a skip button on each one (#7738, #7747). The server records whether each user answered or skipped, so the survey no longer depends on browser storage and does not come back on another device. If the survey fails to load, the user goes straight to the console and a later sign-in asks again. Enterprise never shows the survey.
When an administrator uses "Login as", the resulting session is marked as impersonated, and it stays marked after the token renews. That session skips the survey and cannot answer it on the user's behalf (#7747).
Upgrading? A migration adds
users.onboarding_surveywith a default ofpending. On instances that have an onboarding survey configured, existing users see it once, on their next sign-in.
Sign up from an installer's accept-device link
Someone who opens an installer's accept-device link without an account can now sign up from that page. They can confirm the email on any device and then go straight to accepting the device (#7726). While this happens, the agent keeps polling and the server renews the pairing code each time it does: the code lives for 10 minutes from the last poll, up to 1 hour. Opening the link to preview the device does not renew the code. The agent's message while it waits follows what the server reports about renewal (#7738).
Clearer email errors
The server now has a hook that can refuse an email address before it is saved, on sign-up or on a profile update (#7722). Community and Enterprise register no hook, so nothing changes for them. On Cloud, the sign-up and profile forms show the reason next to the field: "Use a permanent email address" for a disposable domain, or "This domain cannot receive email" for a domain without mail servers.
Also in this release
Features
- The SSH confirmation code has a copy button (#7733)
Fixes
- Parallel requests can no longer push an owner past their namespace limit (#7731)
- Session retention now deletes the recordings of every expired session. Before, it skipped some of them and left their recordings in storage (#7713)
- The console hides Delete and holds back playback for the recording of a session that is still active (#7713, #7737)
- The Registrations link stays neutral when no device is pending (#7735)
- A confirmation link remembers its device only once the account is confirmed (#7738)
Performance
- A new index on
session_events (session_id, type, seat)answers a session's event types and seats. It is built concurrently during the upgrade (#7742) - User reads no longer count owned namespaces, a provisioning event finds its device by primary key, and the telemetry usage queries are faster (#7739, #7740, #7741)
Cloud
- Sign-up and profile updates refuse disposable and unreachable email domains. The check can use a configured DNS server
- The confirmation email says when a device is waiting to be accepted, and its link carries the device code
- The recording of an active session can no longer be fetched
- Card management in billing refuses to detach a card the customer does not own, handles customers without a default card, and reports a failed card list when setting the default
Under the hood
- Namespace creation and survey code in the console go through shared hooks (#7746)
- Dependency updates via Dependabot and Renovate (Alpine 3.24.3, Node 24.22.1, Docker 29.9.2, and others)
Full Changelog: v0.28.0...v0.29.0