---
title: "Ship SEO fixes at the CDN edge when the backend cannot change"
description: "Use Cloudflare Workers, Fastly, Lambda@Edge, or Akamai EdgeWorkers to add markup, set canonicals, and redirect URLs without a backend release."
canonical: "https://scalewithsearch.com/articles/edge-seo-cdn-workers"
date: "2026-03-20"
modified: "2026-09-25"
---
## Site navigation

- [Scale With Search](https://scalewithsearch.com/)
- Real estate
  - Real estate
    - [Real estate](https://scalewithsearch.com/for/real-estate)
- Work
  - Start here
    - [Send your brief](https://scalewithsearch.com/work#send-your-brief)
    - [Prepare your six-question brief](https://scalewithsearch.com/work#prepare-your-six-question-brief)
  - Build
    - [Site build, content library with SEO, signal desk](https://scalewithsearch.com/work)
- For your business
  - Trades and home services
    - [Auto body and collision shops](https://scalewithsearch.com/for/auto-body-and-collision-shops)
    - [Foundation and home repair contractors](https://scalewithsearch.com/for/foundation-and-home-repair)
    - [Garage door and fencing contractors](https://scalewithsearch.com/for/garage-door-and-fencing-contractors)
    - [HVAC contractors](https://scalewithsearch.com/for/hvac-contractors)
    - [Janitorial and commercial cleaning companies](https://scalewithsearch.com/for/janitorial-and-commercial-cleaning)
    - [Locksmiths](https://scalewithsearch.com/for/locksmiths)
    - [Moving companies](https://scalewithsearch.com/for/moving-companies)
    - [Pest control companies](https://scalewithsearch.com/for/pest-control-companies)
    - [Plumbing and electrical contractors](https://scalewithsearch.com/for/plumbing-and-electrical-contractors)
    - [Restoration and water or fire damage companies](https://scalewithsearch.com/for/restoration-and-water-fire-damage)
    - [Roofing companies](https://scalewithsearch.com/for/roofing-companies)
    - [Towing companies](https://scalewithsearch.com/for/towing-companies)
    - [Tree services and landscaping companies](https://scalewithsearch.com/for/tree-services-and-landscaping)
    - [Solar installers](https://scalewithsearch.com/for/solar-installation)
    - [General contractors](https://scalewithsearch.com/for/general-contractors-and-construction)
    - [Paving, concrete, and flooring contractors](https://scalewithsearch.com/for/paving)
  - Practices and professional services
    - [Bookkeeping and tax practices](https://scalewithsearch.com/for/bookkeeping-and-tax-practices)
    - [Dental practices](https://scalewithsearch.com/for/dental-practices)
    - [Family and criminal defense law firms](https://scalewithsearch.com/for/family-and-criminal-defense-law-firms)
    - [Med spas and aesthetics practices](https://scalewithsearch.com/for/med-spas-and-aesthetics)
    - [Personal injury law firms](https://scalewithsearch.com/for/personal-injury-law-firms)
    - [Veterinary clinics](https://scalewithsearch.com/for/veterinary-clinics)
    - [Gyms and fitness studios](https://scalewithsearch.com/for/fitness)
    - [Therapy and outpatient health practices](https://scalewithsearch.com/for/therapy-and-outpatient-health)
    - [Medical billing companies](https://scalewithsearch.com/for/medical-billing)
    - [Insurance agencies](https://scalewithsearch.com/for/insurance-agencies)
    - [Financial advisors](https://scalewithsearch.com/for/financial-advisors)
    - [Property management companies](https://scalewithsearch.com/for/property-management)
    - [Recruiting and staffing agencies](https://scalewithsearch.com/for/recruiting-and-staffing)
    - [Architects and interior designers](https://scalewithsearch.com/for/architects-and-interior-designers)
    - [Logistics and supply chain companies](https://scalewithsearch.com/for/logistics-and-supply-chain)
  - Agencies, MSPs, and manufacturing
    - [IT and managed service providers](https://scalewithsearch.com/for/it-and-managed-service-providers)
    - [Machine shops and precision manufacturers](https://scalewithsearch.com/for/machine-shops-and-precision-manufacturing)
    - [Marketing agencies and freelancers](https://scalewithsearch.com/for/marketing-agencies-and-freelancers)
    - [SEO agencies and consultants](https://scalewithsearch.com/for/seo-agencies-and-consultants)
    - [Small manufacturers and fabricators](https://scalewithsearch.com/for/small-manufacturers-and-fabricators)
  - Restaurants, shops, studios, and nonprofits
    - [Restaurants and hospitality businesses](https://scalewithsearch.com/for/restaurants-and-hospitality)
    - [Retail stores and ecommerce sellers](https://scalewithsearch.com/for/retail-and-ecommerce)
    - [Photographers, event planners, and travel agents](https://scalewithsearch.com/for/photographers)
    - [Churches and nonprofits](https://scalewithsearch.com/for/churches-and-nonprofits)
  - [All industries](https://scalewithsearch.com/for/)
- Learn
  - For your office
    - [Office job guides](https://scalewithsearch.com/guides/)
    - [Browser calculators](https://scalewithsearch.com/tools/)
  - Start here
    - [How it works](https://scalewithsearch.com/how-it-works)
    - [Free Starter Kit](https://scalewithsearch.com/kit/business-memory-starter-kit.zip)
    - [Synthetic specimen](https://scalewithsearch.com/specimen/working-session-specimen.zip)
  - Guides
    - [The Complete Guide to Business Memory for AI Agents](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [The Complete Small-Business Guide to AI Agent Governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [The Complete Guide to Leaving Vendor AI Memory](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - Articles by cluster
    - [Business memory](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [Agent governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [Migration and ownership](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - For machines
    - [llms.txt](https://scalewithsearch.com/llms.txt)
    - [llms-full.txt](https://scalewithsearch.com/llms-full.txt)
    - [Machine view](https://scalewithsearch.com/?view=machine)
- Company
  - Evidence
    - [Proof](https://scalewithsearch.com/proof)
  - Company
    - [About](https://scalewithsearch.com/about)

# Ship SEO fixes at the CDN edge when the backend cannot change.

Some SEO fixes wait months. The content management system (CMS) cannot set a title per product variant. The template strips structured data. The URL structure shipped years ago, and nobody owns it now. The engineering queue is full.

Edge SEO moves the fix to the Content Delivery Network (CDN). A small program runs after the origin server answers and before the browser or Googlebot receives the page. The program changes the response, and the origin code stays as it is.

This article covers the four common platforms, five patterns with code, a test and release workflow, the failure modes, and the metrics. Use it when the normal route is blocked. When the CMS can make the change natively, make it there.

## What an edge transform can change

An edge function sees each request and each response. It can change:

- the HTML body, for example to add JSON-LD structured data or to rewrite a `<title>`;
- the response headers, for example to add `X-Robots-Tag` or a `Link` header with `rel="canonical"`;
- the request path, for example to return a 301 redirect or to route a request to a different origin path;
- the query string, for example to drop tracking parameters before the cache lookup.

Common jobs include structured data, meta tags, `hreflang` links, legacy redirects, parameter cleanup, and Open Graph tags. The change reaches the edge network quickly. A bad change spreads at the same speed. The release workflow later in this article exists for that reason.

## Choose a platform

### Cloudflare Workers

Cloudflare Workers run JavaScript on the V8 engine across Cloudflare's network. A Worker receives the request, fetches the origin response, changes it, and returns it. Workers include `HTMLRewriter`, a streaming HTML parser, and Workers KV for stored data. There is a free plan with limits on daily requests and CPU time per request. Check the current figures on the Cloudflare Workers limits page before you plan a heavy transform. Workers support browser-style APIs, not every Node.js module.

This Worker adds `LocalBusiness` markup to every HTML page:

```javascript
const schema = {
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Acme Coffee",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main St",
    "addressLocality": "Portland",
    "addressRegion": "OR"
  }
};

class SchemaInjector {
  element(head) {
    head.append(
      `<script type="application/ld+json">${JSON.stringify(schema)}</script>`,
      { html: true }
    );
  }
}

export default {
  async fetch(request, env, ctx) {
    ctx.passThroughOnException();
    const response = await fetch(request);
    const type = response.headers.get("content-type") || "";
    if (!type.includes("text/html")) return response;
    return new HTMLRewriter().on("head", new SchemaInjector()).transform(response);
  }
};
```

Deploy it with the Wrangler command-line tool:

```bash
wrangler deploy
```

Older guides show `wrangler publish`. Wrangler version 3 replaced it with `wrangler deploy`.

### Fastly

Fastly offers two products. Fastly VCL uses the Varnish Configuration Language, a domain-specific language that Fastly compiles and runs with very low overhead. VCL runs in subroutines such as `vcl_recv`, `vcl_backend_response`, and `vcl_deliver`. It is strong at routing, redirects, cache keys, and headers.

Fastly VCL does not rewrite the HTML body of an origin response. For title, meta, or markup changes on Fastly, use Fastly Compute, which runs your own compiled code against the response.

This VCL adds a `noindex` header to print pages:

```vcl
sub vcl_deliver {
  if (req.url.path ~ "^/print/") {
    set resp.http.X-Robots-Tag = "noindex";
  }
}
```

VCL has a steeper learning curve than JavaScript and weaker string handling than a general language. Choose it when the site already runs on Fastly and the change is a header, a redirect, or a cache rule.

### Lambda@Edge and CloudFront Functions

Lambda@Edge runs Node.js or Python functions at Amazon CloudFront locations. It gives a full language runtime, npm packages, and access to other AWS services such as S3, DynamoDB, and Parameter Store. It has more cold-start delay than Workers or VCL, and deploys replicate across regions more slowly.

Lambda@Edge suits request-side work: redirects, path rewrites, and routing. A response trigger does not expose the origin's HTML body to the function. A body rewrite on CloudFront needs a function that fetches the page and builds a new response. For simple header changes and redirects, CloudFront Functions are a lighter option.

### Akamai EdgeWorkers

Akamai EdgeWorkers run JavaScript at Akamai's edge, with EdgeKV for stored data. It connects to Akamai's Property Manager and security products. If the site already runs on Akamai, EdgeWorkers is the native route. It needs an Akamai contract. Its community is smaller than the Cloudflare community. Enterprise change control can slow releases.

### Pick by where the site already runs

| Situation | Platform |
|---|---|
| Fast start, JavaScript team, body rewrites | Cloudflare Workers |
| Site on Fastly, header or redirect work | Fastly VCL |
| Site on Fastly, body rewrites | Fastly Compute |
| Site on AWS, redirects and routing | Lambda@Edge or CloudFront Functions |
| Enterprise site on Akamai | Akamai EdgeWorkers |

Without an existing CDN contract, start on Cloudflare Workers. The free plan supports a prototype.

## Five patterns

### 1. Add structured data at scale

A catalog has 50,000 products. The CMS does not output `Product` markup, and engineering will not add it this quarter. A Worker can read product values from the page itself, for example from `data-` attributes, or fetch them from a product API. It then builds the JSON-LD and appends it to `<head>`.

```javascript
function productSchema(product) {
  return {
    "@context": "https://schema.org",
    "@type": "Product",
    "name": product.title,
    "sku": product.sku,
    "offers": {
      "@type": "Offer",
      "price": product.price,
      "priceCurrency": product.currency,
      "availability": "https://schema.org/InStock"
    }
  };
}
```

Build every value from data the page shows. Markup that states a price or stock state the shopper cannot see breaks Google's structured data guidelines. Validate the output in Google's Rich Results Test, which is a separate tool from Search Console. The [JSON-LD guide for developers](/articles/structured-data-jsonld-developers) covers the markup itself.

### 2. Test an SEO change on page groups

An SEO test does not split users. Googlebot does not keep a test cookie, so a cookie split shows Googlebot one version and tells you nothing about search results. Split pages instead.

Hash each URL into a bucket. Pages in the test bucket get the change, for example a longer meta description. Pages in the control bucket keep the original. Both buckets must be similar in traffic and template.

```javascript
async function bucketFor(path) {
  const data = new TextEncoder().encode(path);
  const hash = await crypto.subtle.digest("SHA-256", data);
  return new Uint8Array(hash)[0] % 2 === 0 ? "control" : "test";
}
```

Measure clicks and click-through rate per bucket in Search Console, not in Google Analytics 4. Compare the test bucket with the control bucket over the same weeks. The [SEO A/B testing guide](/articles/seo-ab-testing-methods) covers group size and duration.

### 3. Add hreflang without a CMS change

A site runs in several countries on subdomains such as `uk.example.com`, `fr.example.com`, and `de.example.com`. The CMS does not output `hreflang` links. A Worker can add them from a map.

```javascript
const hreflangMap = {
  "uk.example.com": "en-GB",
  "fr.example.com": "fr-FR",
  "de.example.com": "de-DE",
  "example.com": "en-US"
};

function hreflangTags(path) {
  return Object.entries(hreflangMap)
    .map(([host, lang]) => `<link rel="alternate" hreflang="${lang}" href="https://${host}${path}" />`)
    .join("\n");
}
```

This map assumes each page exists at the same path on every subdomain. If a page is missing in one market, the tag points to a 404, so check the path list first. Search Console retired its International Targeting report in 2022. Validate `hreflang` coverage with a crawler instead. The [hreflang implementation guide](/articles/hreflang-implementation-guide) covers return links and `x-default`.

### 4. Redirect legacy URLs at the edge

A migration moved `/old-blog/post-name` to `/resources/post-name`, and the migration script missed 500 URLs. An edge redirect answers before the request reaches the origin.

```javascript
const redirectMap = {
  "/old-blog/seo-guide": "/resources/seo-guide",
  "/old-blog/link-building": "/resources/link-building"
};

exports.handler = async (event) => {
  const request = event.Records[0].cf.request;
  const target = redirectMap[request.uri];
  if (target) {
    return {
      status: "301",
      statusDescription: "Moved Permanently",
      headers: { location: [{ key: "Location", value: target }] }
    };
  }
  return request;
};
```

Attach the function to the CloudFront viewer request trigger. If the map grows past the function size limit, store it in DynamoDB or S3. Load it once per cold start and keep it in memory. Point every entry at the final URL, not at another redirect. The guide to [redirect chains](/articles/redirect-chains-301-developers) covers the chain problem.

### 5. Set one canonical for parameter URLs

An ecommerce site creates duplicate product URLs with `utm_source`, `color`, and `size` parameters. Search Console's Page indexing report, which replaced the Coverage report in 2022, lists thousands of duplicates. A Worker can point each parameter URL at the clean URL.

```javascript
const dropParams = ["utm_source", "utm_medium", "color", "size"];

export default {
  async fetch(request, env, ctx) {
    ctx.passThroughOnException();
    const url = new URL(request.url);
    dropParams.forEach((p) => url.searchParams.delete(p));
    const canonical = `<link rel="canonical" href="${url.toString()}" />`;
    const response = await fetch(request);
    return new HTMLRewriter()
      .on('link[rel="canonical"]', { element(e) { e.remove(); } })
      .on("head", { element(e) { e.append(canonical, { html: true }); } })
      .transform(response);
  }
};
```

The first handler removes any canonical the origin already sent. Google can ignore every canonical on a page that sends two conflicting ones. Remove `color` and `size` from the list if those variants are real landing pages with their own search demand.

## Build, test, and release

Treat edge code as production code. Keep it in version control, test it in staging, and keep a rollback.

1. Test the transform locally against saved HTML responses.
2. Deploy to a staging subdomain on the same CDN.
3. Crawl staging with Screaming Frog or Sitebulb.
4. Validate markup in the Rich Results Test and the Schema.org validator.
5. Release to production behind a flag or to a share of paths.
6. Watch Core Web Vitals, crawl errors, and rankings in Search Console.

For Cloudflare, `wrangler dev` starts a local server that runs the Worker. Check the result with `curl`:

```bash
curl -s http://localhost:8787/test-page | grep "application/ld+json"
```

Confirm the markup, the canonical, and the meta changes before you deploy. Workers analytics shows requests, CPU time, and errors. Fastly real-time stats show cache hit rate and origin requests. If the cache hit rate drops after a release, check whether the transform bypasses the cache.

## Failure modes

**Broken HTML.** A string replace on `</head>` assumes the string appears once. A comment or an inline script that contains `</head>` breaks the page. Use a parser: `HTMLRewriter` on Cloudflare, or a library such as Cheerio where you control the full body.

**A crash with no fallback.** By default, an uncaught exception in a Cloudflare Worker returns an error page, not the origin page. Call `ctx.passThroughOnException()` so that a failed transform falls back to the untransformed origin response. Alert on the Worker error rate.

**Wrong cache keys.** If the edge serves different HTML to different visitors, for example a prerendered page to crawlers, the cache key must separate those versions. Otherwise users get the crawler version or crawlers get the user version.

**Slow transforms.** A transform that calls an API on every request adds delay. Cache the data in edge storage and refresh it on a schedule:

```javascript
async function schemaTemplate(env) {
  let template = await env.SCHEMA_KV.get("product-schema-template");
  if (!template) {
    const res = await fetch("https://api.example.com/schema-template");
    template = await res.text();
    await env.SCHEMA_KV.put("product-schema-template", template, { expirationTtl: 3600 });
  }
  return template;
}
```

**Cloaking.** An edge function can show Googlebot different content from users. Do not. Google Search Essentials, the 2022 successor to the Webmaster Guidelines, treats that as a spam policy violation. Google's JavaScript documentation also calls dynamic rendering for crawlers a workaround, not a long-term solution, and recommends server-side or static rendering.

## Measure the effect

Edge changes are mostly invisible to users and visible to crawlers. Measure in Search Console:

- impressions and click-through rate for the changed pages;
- the Page indexing report for duplicate URLs after canonical work;
- the rich result reports after markup work;
- Crawl Stats for pages crawled per day and for 5xx errors that a broken transform causes.

Measure speed too. A slow transform raises server response time and delays Largest Contentful Paint. Content added above the fold can cause Cumulative Layout Shift. Run Lighthouse on the same URL with and without the transform. The guide to [CDN configuration for SEO](/articles/cdn-configuration-seo) covers cache and header settings around these tests.

## Know when to stop

Edge SEO is a workaround. Each transform is code to maintain, a failure mode to monitor, and a tie to one CDN vendor. Skip it when the CMS supports the change. Skip it when engineering can fix the root cause this quarter. Skip it for a one-time edit. Use it when the platform is frozen and the fix cannot wait. Write down the backend ticket that will retire the transform.

----

```text
                  .|########||.                                       .|########||.                                       .|########||.
               |##||.      .||##|.                                 |##||.      .||##|.                                 |##||.      .||##|.
             |#|.              .|#|.                             |#|.              .|#|.                             |#|.              .|#|.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
        .#.                          .#|                    .#.                          .#|                    .#.                          .#|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
      |#             ......             #|                |#             ......             #|                |#             ......             #|
     .#           ||#########|           #|              .#           ||#########|           #|              .#           ||#########|           #|
    .#.         |######||######|.        .#.            .#.         |######||######|.        .#.            .#.         |######||######|.        .#.
    #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#
   ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||
   #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #
 ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||
 #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#
 #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.
.|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||
||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||
#.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#
#    .||####|###########################|.     #    #    .||####|###########################|.     #    #    .||####|###########################|.     #
#      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #
#      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #
#      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #
#      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #
#   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #
#. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#
|| |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||
|| ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||
.# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.
 #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#
 ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||
  #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.
   ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||
    #.        .######|#|#########|        .#            #.        .######|#|#########|        .#            #.        .######|#|#########|        .#
    .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.
     |#           ||########||           #.              |#           ||########||           #.              |#           ||########||           #.
      |#             ......             #|                |#             ......             #|                |#             ......             #|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
        |#.                          .#.                    |#.                          .#.                    |#.                          .#.
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
            .|#|.              .|#|.                            .|#|.              .|#|.                            .|#|.              .|#|.
               |##||.      .||##|                                  |##||.      .||##|                                  |##||.      .||##|
                 .||########||.                                      .||########||.                                      .||########||.

Scale With Search  2026  [scalewithsearch.com](https://scalewithsearch.com)
```
