Detect AI/LLM referrers and classify them as an "Organic AI (AI)"
source. Adds a REFERRER_DOMAINS_FOR_ORGANIC_AI list and branching logic
to set attributionDetails.sourceChannelDetails and
attributionDetails.campaign based on the referring AI platform (ChatGPT,
Claude, Gemini, or Other) in
website/api/helpers/salesforce/update-or-create-contact-and-account.js.
<!-- Add the related story/sub-task/bug number, like Resolves#123, or
remove if NA -->
**Related issue:**
resolvesfleetdm/confidential#16034
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Improved contact attribution: traffic from AI/LLM platforms (ChatGPT,
Claude, Gemini, etc.) is now labeled "Organic AI (AI)" and assigned
platform-specific default campaigns.
* Refined organic search detection to better identify Bing search
referrals.
* Other non-digital/non-event referrers now default to "Web referral
(WR)".
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46182?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
<!-- Add the related story/sub-task/bug number, like Resolves#123, or
remove if NA -->
**Related issue:** Resolves #
# Checklist for submitter
If some of the following don't apply, delete the relevant line.
- [ ] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.
- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [ ] Timeouts are implemented and retries are limited to avoid infinite
loops
- [ ] If paths of existing endpoints are modified without backwards
compatibility, checked the frontend/CLI for any necessary changes
## Testing
- [ ] Added/updated automated tests
- [ ] Where appropriate, [automated tests simulate multiple hosts and
test for host
isolation](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/reference/patterns-backend.md#unit-testing)
(updates to one hosts's records do not affect another)
- [ ] QA'd all new/changed functionality manually
For unreleased bug fixes in a release candidate, one of:
- [ ] Confirmed that the fix is not expected to adversely impact load
test results
- [ ] Alerted the release DRI if additional load testing is needed
## Database migrations
- [ ] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [ ] Confirmed that updating the timestamps is acceptable, and will not
cause unwanted side effects.
- [ ] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).
## New Fleet configuration settings
- [ ] Setting(s) is/are explicitly excluded from GitOps
If you didn't check the box above, follow this checklist for
GitOps-enabled settings:
- [ ] Verified that the setting is exported via `fleetctl
generate-gitops`
- [ ] Verified the setting is documented in a separate PR to [the GitOps
documentation](https://github.com/fleetdm/fleet/blob/main/docs/Configuration/yaml-files.md#L485)
- [ ] Verified that the setting is cleared on the server if it is not
supplied in a YAML file (or that it is documented as being optional)
- [ ] Verified that any relevant UI is disabled when GitOps mode is
enabled
## fleetd/orbit/Fleet Desktop
- [ ] Verified compatibility with the latest released version of Fleet
(see [Must
rule](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/workflows/fleetd-development-and-release-strategy.md))
- [ ] If the change applies to only one platform, confirmed that
`runtime.GOOS` is used as needed to isolate changes
- [ ] Verified that fleetd runs on macOS, Linux and Windows
- [ ] Verified auto-update works from the released version of component
to the new version (see [tools/tuf/test](../tools/tuf/test/README.md))
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added support for Joplin application installation and management on
macOS via Homebrew.
* Added support for Joplin application installation and management on
Windows via Winget.
* Integrated Joplin icon into the application interface for visual
identification.
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46424?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This pull request adds support for several new applications to the
maintained apps catalog, including their metadata, installation, and
uninstallation scripts for Windows and macOS. The changes ensure these
apps can be managed and deployed via the system, with appropriate
detection queries and categorization.
**New application support:**
* Added support for **Azul Zulu JDK 25** and **Azul Zulu JRE 25** on
Windows, including metadata, detection queries, and
installer/uninstaller scripts.
[[1]](diffhunk://#diff-e73703dde6f54dcc3362e12c0134707b6eb766427950dc1b6201b456646c2441R1-R11)
[[2]](diffhunk://#diff-f067c62ed110f736685711c61f01ff5d326530e602236b2ff4464cb12b320efbR1-R11)
[[3]](diffhunk://#diff-03d5e12f29ca434396eb8d95529351cdc1e37e937a0234d5d0f799ce32d99270R1-R22)
[[4]](diffhunk://#diff-69d0bc65a28bab22f22868659439314badb0f1d8576512b7a04184db0d5f04d2R1-R22)
[[5]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R256-R269)
* Added support for **Tableau Desktop** on Windows, including metadata,
install/uninstall PowerShell scripts for handling the WiX Burn bundle,
and catalog entries.
[[1]](diffhunk://#diff-da26f57894495ab515b6f07452f5bdf475e038e32dcd9235e2c461a2c50fe4c6R1-R13)
[[2]](diffhunk://#diff-ae3d9cdef4ee9b23a394bdd72ac9c1669d09f5e8cd63716c746ee862f3f1ab2eR1-R22)
[[3]](diffhunk://#diff-23116d8521375f8c07d973cb4a8424664511622be2f8054ff883762325a9fccaR1-R35)
[[4]](diffhunk://#diff-52b261b49349ced82dcec614b525537af74fb76b2b80d5b86bf47997dcc602a5R1-R94)
[[5]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R2090-R2096)
* Added support for **TeamViewer Host** on both Windows and macOS,
including metadata, install/uninstall scripts for Windows, and catalog
entries.
[[1]](diffhunk://#diff-cc1d69139e4cfc23694e1a7c911484b847730d6c989e3ef6e0a868ebb446f088R1-R13)
[[2]](diffhunk://#diff-957c90f066b977cb7909a37633955b9cd003bf6cb54d5571513509470a8da023R1-R8)
[[3]](diffhunk://#diff-6f0503390a74ce160c8cf97e8a21f6be441d96e8d7a7725b7fcd977020275208R1-R26)
[[4]](diffhunk://#diff-26c9cfc3f13dbdb9ad1e12ac786d8a8937bd88521a05c4024ee027edcf4338cbR1-R91)
[[5]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R2125-R2138)
* Added support for **VNC Server** on macOS, including metadata and
catalog entry.
[[1]](diffhunk://#diff-a5aa18a7d0dd174295ce8a65738eb9d499a3b22a810a9a566cdedfefea3eecb6R1-R8)
[[2]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R2328-R2334)
**Supporting scripts and catalog updates:**
* Implemented robust PowerShell scripts for silent installation and
uninstallation of **Tableau Desktop** and **TeamViewer Host** on
Windows, handling edge cases such as process termination and registry
parsing.
[[1]](diffhunk://#diff-23116d8521375f8c07d973cb4a8424664511622be2f8054ff883762325a9fccaR1-R35)
[[2]](diffhunk://#diff-52b261b49349ced82dcec614b525537af74fb76b2b80d5b86bf47997dcc602a5R1-R94)
[[3]](diffhunk://#diff-6f0503390a74ce160c8cf97e8a21f6be441d96e8d7a7725b7fcd977020275208R1-R26)
[[4]](diffhunk://#diff-26c9cfc3f13dbdb9ad1e12ac786d8a8937bd88521a05c4024ee027edcf4338cbR1-R91)
* Updated `apps.json` outputs to include the new applications with
descriptions and platform information.
[[1]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R256-R269)
[[2]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R2090-R2096)
[[3]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R2125-R2138)
[[4]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R2328-R2334)
Changes:
- Replaced the dropdown comparison switcher with tabs on the homepage
desktop comparison table.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Replaced the dropdown selector with a horizontal tabs interface in the
"Moving to Fleet?" comparison table, enabling users to easily switch
between vendor options. The tabs feature a visual indicator for the
active selection. Added responsive styling that adapts seamlessly to
smaller screen sizes, maintaining readability and usability across all
devices.
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46407?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Resolves https://github.com/fleetdm/confidential/issues/16119
- Re-orders and removes rows
- Replaces platform icons for easier-to-scan checkmarks
- Adds additional context in tooltips
I decided against adding tabs. They added visual weight without enough
benefit. The dropdown is clear enough on its own, and it's already the
second-most-clicked button on the page.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Updated product comparison tables (desktop and mobile) with reordered
rows and clearer layout
* Added distinct "Complete device inventory" and "Cloud or self-host"
entries with competitor-specific outcomes
* Renamed and clarified features: "Software updates"; "Configuration,
scripting, and diagnostics"; "Single API"; "Infrastructure as code"
* Revised competitor status displays and tooltip copy, including
standardized timing labels and outcome mappings
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46319?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
<!-- Add the related story/sub-task/bug number, like Resolves#123, or
remove if NA -->
**Related issue:** Resolves #
# Checklist for submitter
If some of the following don't apply, delete the relevant line.
- [ ] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.
- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [ ] Timeouts are implemented and retries are limited to avoid infinite
loops
- [ ] If paths of existing endpoints are modified without backwards
compatibility, checked the frontend/CLI for any necessary changes
## Testing
- [ ] Added/updated automated tests
- [ ] Where appropriate, [automated tests simulate multiple hosts and
test for host
isolation](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/reference/patterns-backend.md#unit-testing)
(updates to one hosts's records do not affect another)
- [ ] QA'd all new/changed functionality manually
For unreleased bug fixes in a release candidate, one of:
- [ ] Confirmed that the fix is not expected to adversely impact load
test results
- [ ] Alerted the release DRI if additional load testing is needed
## Database migrations
- [ ] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [ ] Confirmed that updating the timestamps is acceptable, and will not
cause unwanted side effects.
- [ ] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).
## New Fleet configuration settings
- [ ] Setting(s) is/are explicitly excluded from GitOps
If you didn't check the box above, follow this checklist for
GitOps-enabled settings:
- [ ] Verified that the setting is exported via `fleetctl
generate-gitops`
- [ ] Verified the setting is documented in a separate PR to [the GitOps
documentation](https://github.com/fleetdm/fleet/blob/main/docs/Configuration/yaml-files.md#L485)
- [ ] Verified that the setting is cleared on the server if it is not
supplied in a YAML file (or that it is documented as being optional)
- [ ] Verified that any relevant UI is disabled when GitOps mode is
enabled
## fleetd/orbit/Fleet Desktop
- [ ] Verified compatibility with the latest released version of Fleet
(see [Must
rule](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/workflows/fleetd-development-and-release-strategy.md))
- [ ] If the change applies to only one platform, confirmed that
`runtime.GOOS` is used as needed to isolate changes
- [ ] Verified that fleetd runs on macOS, Linux and Windows
- [ ] Verified auto-update works from the released version of component
to the new version (see [tools/tuf/test](../tools/tuf/test/README.md))
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Power BI Desktop (Windows) added to the app catalog with automated
install/uninstall support, including graceful shutdown and robust
cleanup of leftover installations and registry entries.
* New package input definition for Windows package management to enable
automated deployments.
* Added a Power BI icon in the software management interface for easier
identification.
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46284?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Allen Houchins <32207388+allenhouchins@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Changes:
- Updated the `<scrollable-tweets>` component to set a toggleable max
height on cards with longer quotes. Users can click the "see full quote"
button beneath the truncated quote to expand the card and view the full
quote.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added a "Show full quote" link to expand tweet quotes that exceed the
display area.
* **Style**
* Gradient fade for overflowing quote content with an expanded state to
reveal full text.
* Refined video link appearance for improved visual consistency.
* **Bug Fixes**
* Improved overflow detection on initial load and window resize for more
reliable quote truncation/expansion behavior.
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46343?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Add WinSCP to maintained apps: introduce winget input metadata
(winscp.json) and add installer/uninstaller PowerShell scripts
(winscp_install.ps1 uses Inno Setup silent flags; winscp_uninstall.ps1
locates UninstallString/QuietUninstallString from registry and runs it
with silent args). Update outputs: add app entry in apps.json and add
winscp/windows.json with version, installer URL, checksums and embedded
script refs. Add frontend icon component and image, and register the
icon in the icons index.
Changes:
- Simplified the feature comparison table on the homepage (Removed the
switch and "For CISOs" table, and reduced the list to 8 features)
- Cleaned up unused methods and variables in the homepage page script
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Updates**
* Streamlined the homepage comparison tables by removing several vendor
and feature rows
* Simplified vendor selection dropdowns on desktop and mobile for easier
browsing
* Removed the mobile/desktop mode switch for the IT comparison view
* Adjusted homepage ticker behavior so the bottom ticker always animates
(hero ticker removed)
* Condensed IT comparison content, preserving the simplified "Open
source" indicator
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46293?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Introduce GoToMeeting to maintained apps: add homebrew and winget input
manifests, darwin and windows output metadata (with installers,
checksums, and install/uninstall script refs), and frontend icon asset.
Include Windows install/uninstall PowerShell scripts (MSI machine-wide
install and uninstall via hard-coded UpgradeCode) and macOS DMG
install/uninstall refs and scripts. Update
ee/maintained-apps/outputs/apps.json to register GoToMeeting for darwin
and windows.
Also adjust Windows validation logic to special-case GoToMeeting version
checks: winget reports a package version (10.19.0.19950) that contains
an extra ".0" segment compared to the installed MSI/registry version
(10.19.19950), so the validator falls back to existence-only validation
and logs the difference.
Add Genesys Cloud to maintained apps: create input manifests for
Homebrew (darwin dmg) and Winget (windows msi), add output metadata
files for darwin (v2.49.25) and windows (v2.49.903.0) including
installer URLs, checksums, install/uninstall script refs and a Windows
upgrade code. Register the app in ee/maintained-apps/outputs/apps.json
and add a frontend SVG icon component, mapping entry, and PNG asset for
the software page.
Add support for Amazon Corretto 25 across the repo: new winget input
definition, Windows output metadata (version 25.0.3.9) including
installer/uninstaller PowerShell scripts, SHA256 and upgrade_code, and
register the app in ee/maintained-apps/outputs/apps.json. Also add a
frontend SVG icon component, map it in the icons index, and include the
2x PNG asset so the app is displayed in the UI. This enables Fleet to
install and uninstall Amazon Corretto 25 on Windows.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
## Release Notes
* **New Features**
* Added complete Amazon Corretto 25 support for Windows including
detection, installation, and lifecycle management capabilities
* Enhanced Windows application detection to support matching by multiple
registry identifiers, improving detection accuracy for installed
programs
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46220?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Add BlueJ as a maintained Windows app: new winget input manifest
(ee/maintained-apps/inputs/winget/bluej.json), PowerShell install and
uninstall scripts
(ee/maintained-apps/inputs/winget/scripts/bluej_install.ps1 and
bluej_uninstall.ps1), and output metadata
(ee/maintained-apps/outputs/bluej/windows.json). Also update apps index
(ee/maintained-apps/outputs/apps.json) to include BlueJ. The install
script passes ALLUSERS=2 so the per-user WiX MSI installs per-machine
when run elevated; the uninstall script finds related product codes for
the app's upgrade code and uninstalls each with a timeout. The outputs
include version 5.5.0, installer URL, checksum, and embedded script
refs.
Register TortoiseGit as a maintained app: add winget input
(ee/maintained-apps/inputs/winget/tortoisegit.json), add app metadata to
outputs/apps.json, and create a platform-specific output with version,
installer URL, sha256, install/uninstall PowerShell scripts, and MSI
upgrade code (ee/maintained-apps/outputs/tortoisegit/windows.json). Also
add a frontend icon component and asset
(frontend/pages/SoftwarePage/components/icons/Tortoisegit.tsx and
website/assets/images/app-icon-tortoisegit-60x60@2x.png) and wire it
into the icons index mapping.
Following the pattern we have for Clay updating historical events with
the campaign name, this updates the historical event to include the
campaign name for website events.
After the contact is created/updated, we now include the campaign name
as a parameter for the historical event to update/populate the existing
field on the sfdc historical event object.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Historical events for signups, newsletter subscriptions, contact/quote
requests, whitepaper downloads, workshop requests, and page views now
include campaign association to improve marketing analytics.
* **Bug Fixes / Reliability**
* Webhooks now fall back to the most recent campaign when none is
provided.
* **Chores**
* Backend responses now expose a mostRecentCampaign field to support
campaign attribution.
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/45750?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Eric <eashaw@sailsjs.com>
Not seeing referrer data in SFDC, making this code consistent to
troubleshoot
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Refactor**
* Standardized referrer attribution so referrer URLs are consistently
captured from attribution data and applied for both new and existing
contacts in the Salesforce integration, improving accuracy of marketing
attribution and recent referrer tracking.
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46096?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Co-authored-by: Eric <eashaw@sailsjs.com>
## Summary
- Adds 16px gap between the "AUTONOMOUS ENDPOINT MANAGEMENT" kicker (h4)
and the headline (h1) to increase whitespace between them
- Adds negative margin-bottom on the hero section to reduce the
excessive whitespace below the subtitle paragraph ("Humans approve every
change.") at all responsive breakpoints
Fixes spacing issues visible on mobile where there was too little space
after the kicker title and too much empty space below the hero text.
## Changes
-
`website/assets/styles/pages/landing-pages/autonomous-endpoint-management.less`
- Added `display: flex; flex-direction: column; gap: 16px;` to
`[purpose='page-hero-headings']`
- Added `margin-bottom: -80px` to `[purpose='landing-page-hero']`
(desktop)
- Added `margin-bottom: -40px` at 991px and 768px breakpoints
---
Built for [Mike
McNeil](https://fleetdm.slack.com/archives/D0AFASLRHNU/p1779395766217859?thread_ts=1779227314.466229&cid=D0AFASLRHNU)
by [Kilo for Slack](https://kilo.ai/slack)
---------
Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
Co-authored-by: Eric <eashaw@sailsjs.com>
Closes: https://github.com/fleetdm/fleet/issues/45689
Changes:
- Updated the layout and content of the Linux management page to match
the latest wireframes
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added comprehensive FAQ accordion (10 items) and a “Couldn’t find an
answer?” prompt.
* New content sections: distro checklist, feature rows (visibility,
control, IaC, lightweight deployment), testimonial/brand logos, and an
AI workflow.
* Updated hero copy and reinforced primary/secondary CTAs (contact and
workshop).
* **Style**
* Redesigned page layout with improved spacing, left-aligned hero, and
updated typography.
* Reworked responsive behavior across breakpoints; adjusted CTA/button
sizing and mobile spacing.
* Refined logo grid, quote layouts, and bottom call-to-action
presentation.
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46090?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Changes:
- Fixed an error in the build-static-content script that was preventing
a validation error related to article images stored outside the website
folder from being logged.
- Moved an image used in the enroll hosts guide to the
website/assets/images/articles folder, and updated the name to match
website conventions.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved the overall stability and reliability of the article markdown
build process with enhanced error handling for image link processing.
The build system now gracefully manages edge cases when processing
various image link patterns and formats, preventing unexpected build
failures that could previously occur during content compilation.
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46093?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
A small bug in our attribution logic. R
Replace exact equality checks with startsWith() (via Array.some).
The classification uses Array.includes(), which requires an **exact
string match**.
The lists contain bare root domains: for example
> 'https://www.linkedin.com/'
> 'https://www.reddit.com/'
> 'https://x.com/'
The stored referrer is always the full URL of the specific page the
visitor came from, including path.
So - if an Organic Social URL was https://www.linkedin.com/feed/
It does not equal https://www.linkedin.com/
and
The match fails, and the visit falls through to Web Referral. (this
would be incorrect)
Also - Expand search engine list (generalized Google domain, added
Startpage, Brave, Kagi, Yandex entries) and significantly extend social
referrer list (LinkedIn variants, lnkd.in, Hacker News, X/Twitter
variants, Facebook mobile/l.facebook, Instagram, Threads, Bsky, Mastodon
instances, YouTube, Reddit variants, Pinterest, Quora, etc.).
These changes make Organic search/social detection more accurate across
country TLDs, subdomains and shortened links.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved Salesforce traffic attribution by expanding organic referrer
allowlists and enhancing matching to better detect organic search and
social sources.
* Normalized referrer values when absent or malformed to prevent
misclassification, yielding more accurate traffic categorization and
attribution reporting.
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/45803?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->