diff --git a/website/api/controllers/landing-pages/view-patch-faster.js b/website/api/controllers/landing-pages/view-patch-faster.js new file mode 100644 index 0000000000..a1b7d26fc0 --- /dev/null +++ b/website/api/controllers/landing-pages/view-patch-faster.js @@ -0,0 +1,28 @@ +module.exports = { + + + friendlyName: 'View patch faster', + + + description: 'Display "Patch faster" landing page.', + + + exits: { + + success: { + viewTemplatePath: 'pages/landing-pages/patch-faster' + }, + badConfig: { responseType: 'badConfig' }, + + }, + + + fn: async function () { + + // Respond with view. + return {}; + + } + + +}; diff --git a/website/assets/js/pages/landing-pages/patch-faster.page.js b/website/assets/js/pages/landing-pages/patch-faster.page.js new file mode 100644 index 0000000000..543a865a79 --- /dev/null +++ b/website/assets/js/pages/landing-pages/patch-faster.page.js @@ -0,0 +1,68 @@ +parasails.registerPage('patch-faster', { + // ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗ + // ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣ + // ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝ + data: { + syncing: false, + formData: { /* … */ }, + formErrors: { /* … */ }, + cloudError: '', + cloudSuccess: false, + demoFormRules: { + emailAddress: { isEmail: true, required: true }, + firstName: { required: true }, + lastName: { required: true }, + organization: { required: true }, + numberOfHosts: { required: true }, + }, + }, + + // ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗ + // ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣ + // ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝ + beforeMount: function() { + //… + }, + mounted: async function() { + //… + }, + + // ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗ + // ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗ + // ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝ + methods: { + + handleSubmittingDemoForm: async function(argins) { + this.syncing = true; + // Supply fields not collected from the form. + argins.primaryBuyingSituation = 'it-misc'; + if(typeof window.lintrk !== 'undefined') { + window.lintrk('track', { conversion_id: 18587089 });// eslint-disable-line camelcase + } + let report = await Cloud.deliverTalkToUsFormSubmission.with(argins); + if(report.icp) { + if(typeof gtag !== 'undefined') { gtag('event', 'fleet_website__contact_forms__demo__icp'); } + if(typeof window.lintrk !== 'undefined') { window.lintrk('track', { conversion_id: 27493081 }); }// eslint-disable-line camelcase + } else { + if(typeof gtag !== 'undefined') { gtag('event', 'fleet_website__contact_forms__demo'); } + } + if(typeof gtag !== 'undefined') { + gtag('event', 'conversion', { + 'send_to': 'AW-10788733823/aNrhCNSYrPobEP-GvJgo', + 'value': 1.0, + 'currency': 'USD' + }); + } + if(typeof qualified !== 'undefined') { + qualified('saveFormData', { + email: this.formData.emailAddress, + name: this.formData.firstName, + company: this.formData.organization, + }); + qualified('showFormExperience', 'experience-1772126772950'); + } + this.goto(report.eventUrl); + }, + + } +}); diff --git a/website/assets/styles/importer.less b/website/assets/styles/importer.less index d2d9bf4f87..b49fc5e5c6 100644 --- a/website/assets/styles/importer.less +++ b/website/assets/styles/importer.less @@ -106,5 +106,6 @@ @import 'pages/landing-pages/on-premise.less'; @import 'pages/articles/basic-whitepaper.less'; @import 'pages/landing-pages/replace-jamf.less'; +@import 'pages/landing-pages/patch-faster.less'; @import 'pages/partners.less'; @import 'pages/articles/basic-webinar.less'; diff --git a/website/assets/styles/pages/landing-pages/patch-faster.less b/website/assets/styles/pages/landing-pages/patch-faster.less new file mode 100644 index 0000000000..a21f1a73b3 --- /dev/null +++ b/website/assets/styles/pages/landing-pages/patch-faster.less @@ -0,0 +1,525 @@ +#patch-faster { + @primary: #009A7D; + @primary-dark: #5654d4; + @text-dark: #192147; + @text-secondary: #515774; + @border: #E5E7EB; + @green: #16A348; + @bg-page: #F8F9FA; + @bg-dark: #1C1D21; + @max-content: 1072px; + @max-narrow: 720px; + @max-medium: 800px; + + @heading-lineheight: 120%; + @text-lineheight: 150%; + @section-gap: 80px; + @inner-gap: 32px; + + p { + margin-bottom: 0; + } + + h1, h2, h3, h4, h5 { + margin-bottom: 0; + } + + // ─── NAV OVERRIDE ──────────────────────────────────────────── + // The site nav is already rendered by the layout; no overrides needed. + + // ─── PAGE CONTAINER (white hero + content sections) ────────── + [purpose='page-container'] { + background: #FFFFFF; + padding-left: 64px; + padding-right: 64px; + display: flex; + flex-direction: column; + align-items: center; + gap: @section-gap; + padding-bottom: @section-gap; + } + + // ─── HERO ───────────────────────────────────────────────────── + [purpose='hero'] { + display: grid; + grid-template-columns: 1fr 420px; + gap: 64px; + align-items: center; + max-width: @max-content; + width: 100%; + padding-top: 64px; + } + + [purpose='hero-copy'] { + display: flex; + flex-direction: column; + gap: 20px; + } + + [purpose='eyebrow'] { + font-size: 11px; + font-weight: 600; + letter-spacing: 0.1em; + text-transform: uppercase; + color: @primary; + } + + [purpose='hero'] h1 { + color: @text-dark; + font-family: Inter; + font-size: 48px; + font-weight: 800; + line-height: @heading-lineheight; + letter-spacing: -0.02em; + } + + [purpose='hero-subhead'] { + font-size: 17px; + line-height: 1.65; + color: @text-secondary; + max-width: 540px; + } + + // ─── FORM CARD ───────────────────────────────────────────────── + [purpose='hero-form-col'] { + display: flex; + flex-direction: column; + } + + [purpose='form-card'] { + background: #FFFFFF; + border: 1px solid @border; + border-radius: 12px; + padding: 32px; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.07); + display: flex; + flex-direction: column; + gap: 0; + scroll-margin-top: 90px; + h2 { + font-size: 20px; + font-weight: 600; + color: @text-dark; + margin-bottom: 24px; + text-align: left; + } + } + + [purpose='form-success'] { + background: #FFFFFF; + border: 1px solid @border; + border-radius: 12px; + padding: 40px 32px; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.07); + text-align: center; + display: flex; + flex-direction: column; + gap: 16px; + align-items: center; + h2 { + font-size: 20px; + font-weight: 600; + color: @text-dark; + text-align: center; + } + p { + color: @text-secondary; + font-size: 15px; + } + [purpose='cta-button'] { + display: inline-block; + margin-top: 8px; + padding: 12px 24px; + background: @primary; + color: #FFFFFF; + font-weight: 600; + font-size: 15px; + border-radius: 7px; + text-decoration: none; + transition: background 0.15s ease; + &:hover { + background: @primary-dark; + } + } + } + + [purpose='form-group'] { + margin-bottom: 16px; + display: flex; + flex-direction: column; + label { + font-size: 13px; + font-weight: 500; + color: @text-dark; + margin-bottom: 6px; + } + .form-control { + height: 42px; + font-size: 14px; + border-radius: 7px; + border-color: @border; + &:focus { + border-color: @primary; + box-shadow: 0 0 0 3px rgba(106, 103, 254, 0.12); + } + } + } + + [purpose='required-star'] { + color: @primary; + } + + [purpose='submit-button'] { + display: block; + width: 100%; + margin-top: 8px; + padding: 13px 24px; + font-size: 15px; + font-weight: 600; + border-radius: 7px; + } + + [purpose='fine-print'] { + font-size: 12px; + color: @text-secondary; + text-align: center; + margin-top: 12px; + } + + [purpose='trust-signals'] { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 20px; + padding-top: 20px; + border-top: 1px solid @border; + } + + [purpose='trust-signal'] { + display: flex; + align-items: center; + gap: 8px; + font-size: 13px; + color: @text-secondary; + img { + flex-shrink: 0; + } + } + + // ─── SECTION SHARED ──────────────────────────────────────────── + [purpose='section-divider'] { + width: 48px; + height: 3px; + background: @primary; + border-radius: 2px; + margin: 0 auto 28px; + } + + // ─── PROBLEM SECTION ─────────────────────────────────────────── + [purpose='problem-section'] { + max-width: @max-narrow; + width: 100%; + text-align: center; + h2 { + font-family: Inter; + font-size: 32px; + font-weight: 800; + line-height: @heading-lineheight; + color: @text-dark; + margin-bottom: 24px; + } + } + + [purpose='prose'] { + font-size: 16px; + line-height: 1.75; + color: @text-secondary; + text-align: left; + p + p { + margin-top: 20px; + } + } + + // ─── SOLUTION SECTION ────────────────────────────────────────── + [purpose='solution-section'] { + max-width: @max-content; + width: 100%; + display: flex; + flex-direction: column; + gap: 48px; + } + + [purpose='section-intro'] { + text-align: center; + h2 { + font-family: Inter; + font-size: 32px; + font-weight: 800; + line-height: @heading-lineheight; + color: @text-dark; + } + } + + [purpose='features-grid'] { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 32px; + } + + [purpose='feature-row'] { + display: flex; + gap: 20px; + align-items: flex-start; + } + + [purpose='feature-icon'] { + flex-shrink: 0; + width: 44px; + height: 44px; + background: rgba(106, 103, 254, 0.08); + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + color: @primary; + } + + [purpose='feature-label'] { + font-size: 15px; + font-weight: 600; + color: @text-dark; + margin-bottom: 6px; + } + + [purpose='feature-desc'] { + font-size: 14px; + line-height: 1.65; + color: @text-secondary; + } + + // ─── PROOF STRIP ─────────────────────────────────────────────── + [purpose='proof-strip'] { + background: @bg-dark; + padding: 64px; + } + + [purpose='proof-inner'] { + max-width: @max-content; + margin: 0 auto; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 40px; + text-align: center; + } + + [purpose='proof-highlight'] { + font-size: 20px; + font-weight: 700; + color: #FFFFFF; + margin-bottom: 8px; + } + + [purpose='proof-detail'] { + font-size: 14px; + line-height: 1.6; + color: rgba(255, 255, 255, 0.6); + } + + // ─── BELOW FOLD CONTAINER ────────────────────────────────────── + [purpose='below-fold-container'] { + background: #F8F9FA; + padding: 80px 64px; + display: flex; + flex-direction: column; + align-items: center; + gap: 80px; + } + + // ─── PLATFORM SECTION ────────────────────────────────────────── + [purpose='platform-section'] { + max-width: @max-medium; + width: 100%; + text-align: center; + h2 { + font-family: Inter; + font-size: 32px; + font-weight: 800; + line-height: @heading-lineheight; + color: @text-dark; + margin-bottom: 20px; + } + } + + [purpose='platform-body'] { + font-size: 16px; + line-height: 1.75; + color: @text-secondary; + margin-bottom: 28px; + } + + [purpose='os-pills'] { + display: flex; + justify-content: center; + gap: 12px; + flex-wrap: wrap; + } + + [purpose='os-pill'] { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 8px 18px; + background: #FFFFFF; + border: 1px solid @border; + border-radius: 999px; + font-size: 14px; + font-weight: 500; + color: @text-dark; + svg { + opacity: 0.7; + } + } + + // ─── INTEGRATIONS SECTION ────────────────────────────────────── + [purpose='integrations-section'] { + max-width: @max-medium; + width: 100%; + text-align: center; + h2 { + font-family: Inter; + font-size: 32px; + font-weight: 800; + line-height: @heading-lineheight; + color: @text-dark; + margin-bottom: 20px; + } + } + + [purpose='integrations-body'] { + font-size: 16px; + line-height: 1.75; + color: @text-secondary; + margin-bottom: 28px; + } + + [purpose='integration-pills'] { + display: flex; + justify-content: center; + gap: 12px; + flex-wrap: wrap; + } + + [purpose='integration-pill'] { + display: inline-flex; + align-items: center; + padding: 8px 18px; + background: #FFFFFF; + border: 1px solid @border; + border-radius: 7px; + font-size: 14px; + font-weight: 500; + color: @text-dark; + } + + // ─── CLOSING CTA ─────────────────────────────────────────────── + [purpose='closing-cta'] { + background: linear-gradient(180deg, #F8F9FA 0%, #E9F4F4 100%); + padding: 80px 64px; + } + + [purpose='closing-cta-inner'] { + max-width: @max-medium; + margin: 0 auto; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; + h2 { + font-family: Inter; + font-size: 32px; + font-weight: 800; + line-height: @heading-lineheight; + } + } + + [purpose='closing-cta-sub'] { + font-size: 17px; + line-height: 1.6; + max-width: 520px; + } + + [purpose='closing-cta'] [purpose='cta-button'] { + .cta-button(); + padding: 13px 32px; + } + + // ─── RESPONSIVE: 1199px ──────────────────────────────────────── + @media (max-width: 1199px) { + [purpose='hero'] { + grid-template-columns: 1fr; + gap: 40px; + padding-top: 48px; + } + [purpose='hero-subhead'] { + max-width: 100%; + } + [purpose='hero'] h1 { + font-size: 40px; + } + [purpose='page-container'] { + padding-left: 40px; + padding-right: 40px; + } + [purpose='proof-strip'] { + padding: 64px 40px; + } + [purpose='below-fold-container'] { + padding: 64px 40px; + } + [purpose='closing-cta'] { + padding: 64px 40px; + } + } + + // ─── RESPONSIVE: 991px ───────────────────────────────────────── + @media (max-width: 991px) { + [purpose='features-grid'] { + grid-template-columns: 1fr; + } + [purpose='proof-inner'] { + grid-template-columns: 1fr; + gap: 40px; + } + } + + // ─── RESPONSIVE: 767px ───────────────────────────────────────── + @media (max-width: 767px) { + [purpose='page-container'] { + padding-left: 24px; + padding-right: 24px; + } + [purpose='hero'] h1 { + font-size: 32px; + } + [purpose='problem-section'] h2 { font-size: 26px; } + [purpose='section-intro'] h2 { font-size: 26px; } + [purpose='platform-section'] h2 { font-size: 26px; } + [purpose='integrations-section'] h2 { font-size: 26px; } + [purpose='closing-cta-inner'] h2 { font-size: 26px; } + [purpose='proof-strip'] { + padding: 48px 24px; + } + [purpose='below-fold-container'] { + padding: 48px 24px; + gap: 48px; + } + [purpose='closing-cta'] { + padding: 56px 24px; + } + [purpose='trust-signals'] { + flex-direction: column; + } + } + +} diff --git a/website/config/routes.js b/website/config/routes.js index d9d48b0d9a..1d6089e6cb 100644 --- a/website/config/routes.js +++ b/website/config/routes.js @@ -605,6 +605,16 @@ module.exports.routes = { } }, + 'GET /lp/patch-faster': { + action: 'landing-pages/view-patch-faster', + locals: { + currentSection: 'platform', + hideHeaderLinks: true, + pageTitleForMeta: 'Stop waiting on your MDM catalog. Fleet automated patch management.', + pageDescriptionForMeta: 'Fleet\'s maintained app catalog and automated patch policies push updates to every device on a regular, predictable cadence — no manual repackaging, no osquery queries to write.' + } + }, + 'GET /replace-jamf': { action: 'landing-pages/view-replace-jamf', locals: { diff --git a/website/views/layouts/layout.ejs b/website/views/layouts/layout.ejs index 5e18e603d9..358fe256d2 100644 --- a/website/views/layouts/layout.ejs +++ b/website/views/layouts/layout.ejs @@ -941,6 +941,7 @@ + diff --git a/website/views/pages/landing-pages/patch-faster.ejs b/website/views/pages/landing-pages/patch-faster.ejs new file mode 100644 index 0000000000..1086203cf5 --- /dev/null +++ b/website/views/pages/landing-pages/patch-faster.ejs @@ -0,0 +1,196 @@ +
+
+ + <%/* ─── HERO ─────────────────────────────────────────── */%> +
+
+

Software management

+

Stop waiting on your MDM.

+

When a critical patch drops, the bottleneck isn't your team. It's your toolchain. Fleet's maintained app catalog and automated patch policies push updates to your devices on a regular, predictable cadence. No manual repackaging. No osquery queries to write. No waiting.

+
+
+
+

See how it works.

+ +
+ + +
Please enter your first name.
+
+
+ + +
Please enter your last name.
+
+
+ + +
Please enter a valid work email address.
+ +

Please enter a valid work email address.

+
+
+
+ + +
Please enter the name of your organization.
+
+
+ + +
Please enter the number of employees.
+
+ + Book a demo +
+
+
+ + Fleet-maintained app catalog +
+
+ + Automated patch policies +
+
+ + macOS, Windows, and Linux +
+
+
+
+
<%/* hero */%> + + <%/* ─── PROBLEM ──────────────────────────────────────── */%> +
+
+

Manual patching doesn't scale.

+
+

When a critical CVE drops, the clock starts. But for most IT and security teams, the bottleneck isn't awareness, it's the toolchain. Someone has to download the new version, validate it, package it, and get it into the catalog before a single device gets updated. If you're doing that manually, you're burning engineering time on work that doesn't have to be manual.

+

The alternative is a catalog that's maintained for you, and policies that trigger automatically when a device falls behind. That's the difference between patching as a project and patching as a background process.

+
+
<%/* problem-section */%> + + <%/* ─── SOLUTION ─────────────────────────────────────── */%> +
+
+
+

Fleet automates the parts that slow you down.

+
+
+ +
+ +
+

Fleet maintained apps: no uploads, no extra configuration

+

Fleet maintains installation metadata for a growing catalog of apps. Add them to your Fleet instance and install on your hosts without any additional configuration. Chrome, Firefox, Slack, Zoom, Office, and more, across macOS and Windows.

+
+
+ +
+ +
+

Patch policies that run automatically

+

A patch policy checks whether each Fleet maintained app is up to date on your hosts. Fleet auto-generates the correct osquery query for each app, so you don't write or update them. When a host fails the policy, Fleet automatically sends an install request.

+
+
+ +
+ +
+

Policy checks run on a regular cadence

+

Fleet runs policy checks on a typical one-hour cadence across all online hosts. The first time a host fails a patch policy, Fleet triggers the software install. No manual intervention needed.

+
+
+ +
+ +
+

Bring your own packages too

+

Not everything is in the Fleet catalog yet. Upload your own custom packages, configure custom installation scripts if needed, or let Fleet handle it. The same policy automation applies either way.

+
+
+ +
<%/* features-grid */%> +
<%/* solution-section */%> + +
<%/* page-container */%> + + <%/* ─── PROOF STRIP ───────────────────────────────────── */%> +
+
+
+

No osquery queries to write

+

Fleet auto-generates the correct query for each Fleet-maintained app.

+
+
+

One-hour policy cadence

+

Policy checks run on a typical one-hour cadence on all online hosts.

+
+
+

macOS, Windows, and Linux

+

One platform for your entire device fleet, regardless of OS mix.

+
+
+
<%/* proof-strip */%> + +
+ + <%/* ─── PLATFORM CALLOUT ───────────────────────────────── */%> +
+
+

One platform. Every OS.

+

Fleet manages software across macOS, Windows, and Linux from a single place. The same patch policies, the same catalog, the same automation, whether you're supporting a Mac-first team, a Windows shop, or a mixed environment with Linux servers.

+
+ + + macOS + + + + Windows + + + + Linux + +
+
<%/* platform-section */%> + + <%/* ─── INTEGRATIONS ───────────────────────────────────── */%> +
+
+

Works with the tools you already use.

+

Use policy automations to trigger app updates, create tickets in Jira or Zendesk, or generate webhooks to connect Fleet to your existing workflows. Patching fits into the process you already have.

+
+ Jira + Zendesk + Webhooks + GitOps +
+
<%/* integrations-section */%> + +
<%/* below-fold-container */%> + + <%/* ─── CLOSING CTA ─────────────────────────────────────── */%> +
+
+

See what automated patching looks like in Fleet.

+

Book a 30-minute demo. We'll walk you through the Fleet-maintained catalog and automated patch policies. Live.

+ Book a demo +
+
<%/* closing-cta */%> + + <%/* Cloud city banner */%> + + +
+<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>