Sysad · Internal Documentation

Beelink → WholeTech Network

How the home-office Beelink runs Claude Code and updates the live WholeTech network unattended, and how to replicate it on a second Beelink in Cedar Creek, TX so the two boxes can talk to each other and the same server.

Contents

  1. What's running where (current state)
  2. How a typical change flows (the loop)
  3. Why this design is good
  4. What's installed on the Hot Springs Beelink
  5. Step-by-step replication on the Cedar Creek Beelink
  6. How the two Beelinks communicate (unattended)
  7. Day-to-day life with two Beelinks
  8. Critical security note
  9. Quick reference card

01 What's running where (current state)

There are two physical pieces and one cloud piece:

ComponentWhereWhat it does
Beelink mini-PC #1
(Hot Springs home office)
Your deskRuns Windows 11 + Claude Code CLI. This is where you and Claude write code, edit files, draft emails, and plan changes. Nothing on this box serves the public web — it's a workshop, not a server.
DigitalOcean droplet
143.198.182.180
Cloud, NYC datacenterRuns Ubuntu Linux + nginx + every WholeTech site (118+ domains). This is what visitors actually hit. All HTML, all backups, all SSL certs, all systemd services live here.
Local working dirBeelink local filesC:\Users\walhus\websites\wholetech.com\ holds all the Python build scripts. They get scp'd to the droplet and run there.
The Beelink is the brain. The droplet is the body. The internet is the delivery system.

02 How a typical change flows (the loop)

When you ask Claude to do something like "build a new site" or "lock down the family pages," here's the actual mechanical sequence:

  1. You type a request to Claude Code on the Beelink.
  2. Claude writes or edits a Python file locally in C:\Users\walhus\websites\wholetech.com\ (e.g. build-askemai.py).
  3. Claude runs scp over SSH to copy that file from the Beelink to the droplet:
    scp build-askemai.py root@143.198.182.180:/tmp/
  4. Claude runs ssh + python remotely to execute the script:
    ssh root@143.198.182.180 "python3 /tmp/build-askemai.py"
    The script writes new HTML files into /var/www/<site>/ on the droplet.
  5. nginx is already running and immediately serves the new files to visitors with no restart needed (for static HTML changes).
  6. For backend service changes (askemai, today-stats, wholetech-rss, wholetech-chat), Claude runs systemctl restart <service> after editing the Python source.
  7. Claude verifies with curl from inside the same SSH session — checks HTTP status codes, sample content, log lines.
  8. Claude reports back to you in chat with what changed.

The Beelink never serves traffic itself. It only originates commands. The droplet does all the public-facing work.

03 Why this design is good

04 What's installed on the Hot Springs Beelink

Replicating this on Beelink #2 in Cedar Creek, TX means installing this same stack:

Required software

SoftwareWhy
Windows 11 (or Windows 10)OS. WSL2 also works if you prefer Linux feel.
Git for WindowsProvides bash, ssh, scp, ssh-keygen, and a working Unix shell on Windows. Critical — Claude Code uses bash syntax.
Python 3.11+A few of the local utility scripts run in Python locally before being shipped to the server.
Claude Code CLIThe agent itself. Install from claude.ai/code.
Node.js (LTS)Some Claude Code features need Node. Install the LTS version.
Visual Studio Code (optional)Nice-to-have for editing files outside of Claude Code chat.

Required configuration

ItemWhere it livesPurpose
SSH private keyC:\Users\<you>\.ssh\id_ed25519The Beelink's identity. The droplet must have the matching public key in /root/.ssh/authorized_keys for password-less SSH.
SSH configC:\Users\<you>\.ssh\configOptional shorthand: a Host wholetech block. Lets Claude type ssh wholetech instead of the full IP.
Working directoryC:\Users\<you>\websites\wholetech.com\Holds all the build scripts. Mirror this from the Hot Springs Beelink.
Memory directoryC:\Users\<you>\.claude\projects\C--Users-<you>-websites\memory\Claude's persistent memory across sessions. Copy this from the Hot Springs box on day one so Cedar Creek Claude knows everything Hot Springs Claude knows.
Anthropic API keySet during Claude Code first-runThe login that lets Claude Code work.

05 Step-by-step replication on the Cedar Creek Beelink

Do this once when you arrive in Cedar Creek, TX with the new box.

Day 1 — get the Beelink talking to the droplet

  1. Boot the new Beelink. Update Windows. Install Chrome or Edge.
  2. Install Git for Windows from git-scm.com. Accept the defaults. This gives you bash, ssh, scp, and ssh-keygen.
  3. Install Node.js LTS from nodejs.org. Default install.
  4. Install Python 3.12 from python.org. Check "Add to PATH" during install.
  5. Install Claude Code following the instructions at claude.ai/code. Sign in with the same Anthropic account you use on Hot Springs.
  6. Generate an SSH key for the Cedar Creek box. Open Git Bash:
    ssh-keygen -t ed25519 -C "beelink-texas"
    Press Enter through the prompts. This creates ~/.ssh/id_ed25519 and ~/.ssh/id_ed25519.pub.
  7. Copy the public key to the droplet so Cedar Creek Beelink can SSH in. The simplest way: from the Hot Springs Beelink (which already has access), tell Claude:
    "Add this public key to /root/.ssh/authorized_keys on the droplet: ssh-ed25519 AAAA... beelink-texas"
    Paste the contents of ~/.ssh/id_ed25519.pub from the Cedar Creek box. Hot Springs Claude will append it. Now the Cedar Creek box can SSH in too.
  8. Test the SSH connection from Cedar Creek Bash:
    ssh root@143.198.182.180 "echo hello from texas"
    You should see hello from texas. If you get permission denied, the public key wasn't added correctly. Re-do the previous step.

Day 1 evening — mirror the working directory and memory

  1. Before leaving Hot Springs, ask Hot Springs Claude to tar up the working dir and memory dir and park them on the droplet:
    tar czf /tmp/wholetech-working-dir.tar.gz -C /c/Users/walhus/websites wholetech.com
    tar czf /tmp/claude-memory.tar.gz -C /c/Users/walhus/.claude/projects/C--Users-walhu-websites memory
  2. On Cedar Creek, scp them down and extract:
    scp root@143.198.182.180:/tmp/wholetech-working-dir.tar.gz .
    scp root@143.198.182.180:/tmp/claude-memory.tar.gz .
    tar xzf wholetech-working-dir.tar.gz -C /c/Users/<you>/websites/
    mkdir -p /c/Users/<you>/.claude/projects/C--Users-<you>-websites
    tar xzf claude-memory.tar.gz -C /c/Users/<you>/.claude/projects/C--Users-<you>-websites/
  3. Open Claude Code on Cedar Creek and cd into the working dir:
    cd /c/Users/<you>/websites/wholetech.com
    claude
    Test it: ask Claude to read MEMORY.md and tell you about the project. If it answers correctly, you're done. The Cedar Creek box is now functionally identical to Hot Springs.

06 How the two Beelinks communicate (unattended)

The two boxes never talk to each other directly. They communicate through the droplet, which is the always-on intermediary in the cloud.

Pattern A — The droplet as the bulletin board

Anything Hot Springs needs to share with Cedar Creek (or vice versa) gets dropped onto the droplet:

# Hot Springs pushes a note for Cedar Creek
ssh root@143.198.182.180 "echo 'Reminder for Cedar Creek Claude' >> /var/wholetech-shared/notes.md"

# Cedar Creek pulls it later
ssh root@143.198.182.180 "cat /var/wholetech-shared/notes.md"

I recommend creating one dedicated directory on the droplet for cross-machine state:

ssh root@143.198.182.180 "mkdir -p /var/wholetech-shared && chmod 755 /var/wholetech-shared"

Pattern B — A bare git repo on the droplet (recommended)

To keep build scripts in sync without manual scp every time, set up a bare git repository on the droplet:

ssh root@143.198.182.180 "mkdir -p /var/git/wholetech.git && cd /var/git/wholetech.git && git init --bare"

Then on each Beelink:

cd /c/Users/<you>/websites/wholetech.com
git init
git remote add origin root@143.198.182.180:/var/git/wholetech.git
git add -A && git commit -m "snapshot from <wisconsin or texas>"
git push -u origin master

Now either box can git pull to get the latest scripts. Either box can git push to share its work. The droplet hosts the central truth. Whichever Beelink you happen to be sitting at, your build scripts are always current.

Pattern C — The droplet's cron handles all unattended work

Anything that needs to happen unattended (without a human or Claude pressing a button) runs on the droplet, not the Beelinks. The Beelinks can be off, asleep, traveling, or unplugged — the droplet keeps doing its thing.

WhenWhat
04:10 dailyAdSense profitability dashboard regenerates
04:30 dailyFull backup of /var/www + nginx configs (14-day rotation)
02:00 dailyLet's Encrypt cert renewal check
continuouswholetech-stats, wholetech-rss, wholetech-chat, askemai backend services

07 Day-to-day life with two Beelinks

Imagine you're spending part of the year in Hot Springs and part of the year in Cedar Creek, TX. Here's how the workflow looks:

The night before you leave Hot Springs

  1. Tell Hot Springs Claude: "I'm flying to Cedar Creek tomorrow. Push my latest working dir and memory to the droplet."
  2. Claude tarballs the working directory + memory directory + drops them in /var/wholetech-shared/.
  3. Optionally: Claude commits and pushes the build scripts to the bare git repo.

The first morning in Cedar Creek, TX

  1. Boot the Cedar Creek Beelink. Open Git Bash. git pull the build scripts (or scp the tarballs).
  2. Open Claude Code. The memory directory is already populated, so Claude has full context — it knows about Alice, the family sites, AdSense, askemai.com, the Gmail draft workflow, everything.
  3. Pick up exactly where Hot Springs Claude left off.

Mid-day in Cedar Creek, TX, you make a change

  1. Edit a build script with Claude.
  2. Claude scp's it to the droplet and runs it. Site updates immediately.
  3. Optionally: Claude commits and pushes to the bare git repo.

The next time you boot the Hot Springs box

  1. git pull to get whatever Cedar Creek changed.
  2. For important changes, ask Claude to write a short memory file under memory/ so the next session on either box knows what happened.
Either Beelink can be off for weeks and the public sites keep running, get backed up, get their certs renewed, regenerate the AdSense dashboard daily, and serve traffic. The Beelinks are workshops; the droplet is the factory floor.

08 Critical security note

The SSH private key on each Beelink is the master key to the droplet. Anyone who gets the file ~/.ssh/id_ed25519 can become root on 143.198.182.180. Treat it like a physical house key:

Reminder: This Sysad page is locked behind paul / ally with the family password. It contains the droplet IP, SSH user, and infrastructure details. Don't link to it from any public page.

09 Quick reference card

Droplet IP:
143.198.182.180
Droplet user:
root
SSH command:
ssh root@143.198.182.180
Working dir:
C:\Users\<you>\websites\wholetech.com\
Memory dir:
C:\Users\<you>\.claude\projects\C--Users-<you>-websites\memory\
Shared bulletin:
/var/wholetech-shared/ (on droplet)
Bare git repo:
root@143.198.182.180:/var/git/wholetech.git
Family auth:
paul or ally / testpass1944
WholeTech hub:
https://wholetech.com
Stats dashboard:
https://wholetech.com/stats/
AdSense dash:
https://wholetech.com/stats/adsense.html
Domain audit:
https://wholetech.com/stats/getdomains.html
Backup location:
/var/backups/wholetech/ (on droplet)
Backup schedule:
daily 04:30 AM, 14-day rotation