---
title: "Run Claude Code on a VPS so scheduled work continues while your laptop is closed"
description: "Move Claude Code to an always-on server: VPS setup, vault sync, context hooks, systemd timers, Telegram access, and the safety rules for unattended runs."
canonical: "https://scalewithsearch.com/articles/claude-code-production-deployment"
date: "2026-03-23"
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)

# Run Claude Code on a VPS so scheduled work continues while your laptop is closed.

You built a `CLAUDE.md`. Claude Code knows your business, your clients, and your voice. During the workday, it works well. Then you close the laptop.

A lead submits a form at 2 a.m., and nobody triages it until 9. A CRM audit should run each morning before you sit down, but it waits for you to open a terminal. The semantic index of your Obsidian vault goes stale because reindexing runs only when you remember it. Weekend monitoring does not exist, because the machine that runs the work is in a bag.

An assistant responds when prompted. An operator runs without you at the desk. If your context files, domain routing, and memory layer depend on an open laptop, they are a daytime resource. The fix has four layers: a server that stays on, hooks that load context, timers that start work, and a messaging interface on your phone. A fifth layer, safety, bounds all four.

## Set up the always-on server

A virtual private server (VPS) is a machine in a data center that runs all day, every day. In March 2026, a Hetzner CAX21 (ARM64, 4 vCPU, 8 GB RAM) cost less per month than one paid Claude plan. That size runs Claude Code, Syncthing, a SQLite database, and several automation processes at once.

1. Provision the server. Hetzner's cloud console creates an ARM64 Ubuntu instance in under two minutes. Connect with SSH, update the packages, and create a non-root user.
2. Install Claude Code and authenticate it for unattended use.
3. Sync your vault to the server.
4. Copy your project folder, including `.claude/`, your hooks, and your scripts.

For step 2, avoid an interactive login on a headless server. Generate a long-lived token instead:

```
# Install Claude Code with the native installer (recommended in the docs)
curl -fsSL https://claude.ai/install.sh | bash

# Generate a long-lived OAuth token for unattended sessions
claude setup-token

# Store the token for automated sessions
echo "CLAUDE_CODE_OAUTH_TOKEN=your-token-here" >> ~/.env.automation
```

The token persists across sessions and reboots. Keep it in an environment file that your automation scripts read, and exclude that file from sync and version control. The token expires after about one year, so put a renewal reminder on the calendar.

For step 3, Syncthing creates an encrypted peer-to-peer sync between the Obsidian vault on your laptop and the copy on the VPS. No cloud provider sits in the middle. Changes reach the server in seconds, so the VPS always has the current context files.

```
# Install Syncthing on the VPS
apt install syncthing

# Let user services run without an open login session
loginctl enable-linger operator

# Enable Syncthing as a user service
systemctl --user enable syncthing
systemctl --user start syncthing

# The web UI listens on localhost:8384. Reach it through an SSH tunnel,
# add your laptop as a peer, and share the vault folder.
```

After step 4, Claude Code on the VPS reads the same `CLAUDE.md`, the same hook configuration, and the same context as your laptop. You have two matching environments. One travels with you. One stays on.

## Load context automatically with hooks

Hooks are scripts that run at set points in the Claude Code lifecycle. Examples are session start, prompt submission, the moment before a tool runs, and the end of a response. They add context and enforce limits. Three hooks change daily use the most.

You do not need a VPS for hooks. They run on your laptop whenever Claude Code is active. The VPS matters only when work must start while the laptop is closed.

### The domain router

Each prompt carries signals about its domain. A message about a lead list routes to the sales CRM context. "Deliverable" or "retainer" routes to client operations. "Course" or "hook" routes to build work. The router detects the keywords and loads the matching `_context.md` before Claude Code handles the prompt. Register it for the `UserPromptSubmit` event.

```
// .claude/hooks/domain-router.js
// Hook event: UserPromptSubmit

const DOMAIN_MAP = {
  SALES: {
    triggers: ["crm", "lead list", "pipeline", "follow-up",
               "quote request", "renewal"],
    context: "02 - Sales/_context.md"
  },
  CLIENTS: {
    triggers: ["client report", "deliverable", "retainer",
               "onboarding", "scope change"],
    context: "03 - Clients/_context.md"
  },
  BUILD: {
    triggers: ["course", "catalog", "module", "automation",
               "hook"],
    context: "01 - Build/_context.md"
  }
};

function route(prompt) {
  const lower = prompt.toLowerCase();
  for (const [domain, config] of Object.entries(DOMAIN_MAP)) {
    if (config.triggers.some(t => lower.includes(t))) {
      return { domain, file: config.context };
    }
  }
  return null;
}
```

Without the router, you type "load my sales context" in front of each sales prompt. With it, the context arrives before the model writes its first token. The [guide to separate business contexts](/articles/separate-business-contexts-ai-agents) shows how to keep each domain's files apart.

### The semantic memory hook

Your vault holds thousands of files, and no context window holds them all. The semantic memory hook runs a vector search against the vault's QMD index for the current task. It returns the three to five most relevant documents, and Claude Code reads them as added evidence. That is how a session recalls what you wrote six months ago about the same client.

### The voice calibration hook

When Claude Code drafts an email, a proposal, or an article, it uses its own default register. The voice calibration hook detects a writing task and loads your samples, style rules, and vocabulary preferences. The draft then follows examples of how you write.

The hooks run in sequence. The router loads the sales context. The memory hook finds the client file from six weeks ago. The voice hook loads your email style. You typed one prompt, and three retrieval methods assembled the context before Claude Code wrote a word.

## Schedule work with timers

Hooks respond to your interaction. Timers start work on their own. On macOS, `launchd` runs scheduled jobs. On the Linux VPS, `systemd` timers do the same job with finer control. A typical deployment runs both: local timers for jobs that need your Mac, and VPS timers for headless jobs.

A `systemd` timer has two files. The `.timer` file sets the schedule. The `.service` file defines the work.

```
# /etc/systemd/system/morning-report.timer
[Unit]
Description=Generate morning operations report

[Timer]
OnCalendar=Mon..Fri *-*-* 05:00:00
Persistent=true

[Install]
WantedBy=timers.target
```

```
# /etc/systemd/system/morning-report.service
[Unit]
Description=Morning report via Claude Code

[Service]
Type=oneshot
User=operator
EnvironmentFile=/home/operator/.env.automation
WorkingDirectory=/home/operator/vault
ExecStart=/usr/local/bin/claude -p "Generate the morning operations report. Check the CRM for overnight leads, audit the pipeline, and summarize Telegram messages received after 10 PM. Write it to 02 - Sales/Reports/ as morning-YYYY.MM.DD.md with today's date."
TimeoutStartSec=300
```

Do not put a `%` date pattern in `ExecStart`. `systemd` reads `%` as the start of its own specifiers, so write the date rule in words or escape it as `%%`. A headless run also cannot answer a permission prompt. Pre-approve only the tools the job needs, in the project settings or with the `--allowedTools` flag.

Enable and start the timer:

```
systemctl daemon-reload
systemctl enable morning-report.timer
systemctl start morning-report.timer

# Confirm the schedule
systemctl list-timers | grep morning
```

A mature setup can run 15 to 25 timers across the two machines. These examples come from one working deployment:

| Timer | Schedule | What it does |
|---|---|---|
| Morning report | 5:00 a.m. on weekdays | CRM audit, overnight lead triage, pipeline summary |
| QMD reindex | Each hour | Re-embeds changed vault files for semantic search |
| CRM compliance | 10:00 a.m. on weekdays | Checks sales response times and flags overdue leads |
| Vault backup | 2:00 a.m. each day | Encrypted snapshot to offsite storage |
| Stale context sweep | Sunday, 8:00 p.m. | Lists `_context.md` files not updated in 14 or more days |
| Transcript capture | 6:00 a.m. each day | Pulls new podcast transcripts and extracts sources and data |
| Session ledger prune | First day of each month | Moves sessions older than 90 days to cold storage |

Each timer is a text file, so you can version it, audit it, and rebuild it. If the VPS fails, provision a new one, clone the repository, and run `systemctl daemon-reload`. Every scheduled job resumes. A timer that can fire twice after a restart needs a safe rerun, which the [idempotency test](/articles/test-ai-agent-idempotency-and-retries) checks.

## Reach the stack from your phone with Telegram

A VPS that runs timers produces output. You need to see it without an SSH session. Telegram fills that gap: its bot API is strong enough for a production notice and chat layer.

A Telegram bot runs on the VPS and connects to Claude Code through a Python wrapper. You send a text or a voice message from your phone. The bot transcribes voice on the VPS with an open-source speech model such as `faster-whisper`. It passes the text to Claude Code with the vault context and returns the answer in the same chat.

Take a roofing contractor as an example. On a drive at 7:15 a.m., the owner sends a voice message: "What leads came in overnight, and which ones need callbacks before 9?" The bot replies with three leads since 10 p.m.

Lead A came from a quote form at 11:43 p.m. and asks for a roof inspection. Lead B is a commercial inquiry from the web form at 2:17 a.m. Lead C came in at 6:02 a.m. with photos of storm damage. Leads A and C name a repair window, so the bot marks them hot and queues callback reminders in the CRM. The commercial inquiry can wait for the 10 a.m. block.

The bot keeps a 2-hour resume window. A message within two hours continues the same Claude Code session. After two hours of silence, the next message starts a new session with a clean context load. This stops stale context from building up over days and keeps the flow inside one work block.

Quiet hours hold non-urgent notices from 10 p.m. to 6 a.m. Timer output during those hours waits in a queue and arrives as one batch at 6:01 a.m. Urgent alerts, such as a hot lead, a system error, or an authentication failure, go out at once.

Separate bots can serve separate domains: one for sales operations, one for client work, and one for personal operations. Each bot has its own token, context scope, and notification rules. Lead alerts never land in the thread with grocery budget updates. The [comparison of Claude Code Channels and a custom bot](/articles/claude-code-channels-vs-custom-telegram-bot) covers this layer in detail.

## Put safety gates in front of every unattended action

Everything above gives an AI unattended access to live systems: your CRM, client data, vault, and scheduled operations. Without limits, that access is a liability. Seven rules govern the unattended runs.

1. **Dry run by default.** Any write to an outside system, such as a CRM update, an email, or a file deletion, runs in preview first. The preview lists the exact field values and record IDs that would change. The real write needs explicit confirmation or a pre-approved rule.
2. **Global write blocks on sensitive systems.** The CRM deals pipeline, for example, is blocked with no scoped exceptions and no batch runs. The AI writes a dry-run report, and a person reviews and executes it. One malformed API call can reassign a large deal.
3. **An audit trail for every automated action.** Each timer run, hook run, and Telegram exchange logs to a session ledger in SQLite with full-text search. One deployment held more than 37,000 indexed messages by March 2026. When something fails, you can rebuild the exact sequence.
4. **Confirmation for bulk operations.** An action that touches three or more files needs a stated plan and an approval. The AI describes what it will change, you confirm, and then it executes.
5. **No inference on unclear data.** If a contact name appears in several contexts, the AI asks which one. If a deal stage looks wrong, it flags the stage and does not change it. When uncertain, report; do not resolve.
6. **Scoped permissions.** The VPS user account and the Claude Code permission rules set the scope. The session can read files, run searches, and execute approved scripts. It cannot push to Git remotes, change system configuration, or read credentials outside its environment file.
7. **Permanent corrections.** When you correct an error, the fix applies to every file, reference, and cached value. No partial fixes remain.

Most operations are read-only or safe to reverse, and those run at automation speed. The writes that matter go through a person. As you approve repeated patterns, they become standing rules, but the default stays cautious. The [approval article](/articles/who-approves-what-an-ai-agent-sends) shows how to assign each checkpoint, and the [run receipt template](/articles/ai-agent-run-receipt-template) shows what each unattended run should record.

## See the assembled stack

The finished deployment has five layers:

| Layer | Parts | Role |
|---|---|---|
| Knowledge | Obsidian vault, Syncthing, QMD index | The memory: context files, domain documents, CRM records, session history |
| Reasoning | Claude Code on both machines, `CLAUDE.md`, hooks | Identity, rules, and context loaded before each prompt |
| Automation | `systemd` timers on the VPS, `launchd` on the Mac | Reports, audits, reindexing, and transcript capture on a schedule |
| Interface | Telegram bots | Voice and text access, session continuity, quiet hours, domain channels |
| Safety | Dry runs, write blocks, audit log, bulk confirmation, scoped permissions | A boundary around every automated action |

Each layer depends on the one below it. Without knowledge, the reasoning layer guesses. Without reasoning, the timers are plain cron jobs. Without automation, you remain the bottleneck. Without the interface, you lose access when you leave the desk. Without safety, the rest is a hazard.

Cost follows the same split, as observed in March 2026. The VPS is a small fixed cost. Syncthing, `systemd`, and `faster-whisper` cost nothing to license. Model usage for scheduled jobs is the largest cost, several times the VPS each month. It grows with the number and size of the jobs you schedule.


## Related: AI memory

- [When Not to Use an AI Agent in a Small Business](/articles/when-not-to-use-ai-agents)
- [Compare Claude Code Channels with a custom Telegram bot before you build either one](/articles/claude-code-channels-vs-custom-telegram-bot)
- [Run three business workflows with Claude Code and a context file](/articles/how-to-use-claude-code-for-business)

----

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

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