WholeTech README

The complete guide to creating, managing, and deploying websites across the WholeTech domain portfolio.

Last updated: March 15, 2026 — Private reference, not linked from site navigation

Table of Contents
  1. System Overview
  2. Local Machine Setup
  3. Creating a New Site (Step by Step)
  4. LiquidWeb Server Setup
  5. Uploading with WinSCP
  6. DNS & Domain Pointing
  7. WordPress Coexistence
  8. Working with Claude
  9. Claude Best Practices
  10. Google Sheets Integration
  11. Archive.org Notes
  12. Standard File Structure
  13. Theme System (Light/Dark/Spring)
  14. Launch Checklist
  15. Troubleshooting

01System Overview

ComponentWhat
Local machineBeelink mini PC, Windows 11 Pro, bash shell available
Local directoryC:\Users\walhu\websites\ — one folder per site
Web serverLiquidWeb shared/VPS hosting, Apache, PHP available
Server files/home/wholetec/ on the LiquidWeb server
File transferWinSCP (SFTP/FTP to LiquidWeb)
AI assistantClaude Code (Anthropic CLI, runs in terminal)
TechnologyPure static HTML + CSS + vanilla JS — no Node, no npm, no frameworks
Previewpython -m http.server 8081 on localhost
Domains112 domains, managed through LiquidWeb and/or registrar

02Local Machine Setup

Directory structure

C:\Users\walhu\websites\
  austen.com\
  firth.com\
  tvreviewer.com\
  wholetech.com\
    static\         ← the actual site files
      index.html
      springnet.html
      activesites.html
      archive.html
    index.html       ← redirect to static/ (or copy of static/index.html)
  [newsite]\          ← create a new folder for each new site

Starting a local preview server

# Navigate to the site's folder and start the server
cd C:\Users\walhu\websites\wholetech.com\static
python -m http.server 8081

# Then open http://localhost:8081 in your browser
# Use a different port for each site if running multiple
Tip: Background server Claude can start the server in the background for you. Just say "let's look at it on localhost:8081" and Claude will start it.

03Creating a New Site (Step by Step)

This is the complete process for taking a domain from "parked" to "live static site."

1
Create local folder

Create C:\Users\walhu\websites\domainname.com\ on your machine. If the domain has WordPress, create a static\ subfolder inside it to keep files separate.

2
Ask Claude to build it

Open Claude Code in the terminal. Tell Claude what you want: "Build me a site for domainname.com. It should be about [topic]. Use the same design system as wholetech.com" (or whatever style you want). Claude will create the HTML/CSS/JS files.

3
Preview locally

Ask Claude to start a local server: "Let's look at it on localhost:8082." Review in your browser, request changes until you're happy.

4
Set up the domain on LiquidWeb

Log into LiquidWeb → cPanel → add the domain as an Addon Domain or Alias (see LiquidWeb section below).

5
Point DNS to LiquidWeb

At your domain registrar, set the nameservers or A record to point to your LiquidWeb server IP (see DNS section).

6
Upload via WinSCP

Connect WinSCP to LiquidWeb, navigate to the domain's document root, upload your files (see WinSCP section).

7
Test live

Visit the domain in your browser. Verify all pages load, links work, and themes toggle correctly.

04LiquidWeb Server Setup

Logging in

  1. Go to manage.liquidweb.com and log in with your LiquidWeb credentials
  2. Navigate to your server/hosting account
  3. Open cPanel (usually accessible from the LiquidWeb dashboard)

Adding a new domain (Addon Domain)

  1. In cPanel, find "Domains" or "Addon Domains"
  2. Enter the domain name (e.g., austinblogger.com)
  3. cPanel will auto-fill the document root — typically /home/wholetec/public_html/austinblogger.com
  4. Click Add Domain
  5. The server now knows to serve files from that directory when someone visits the domain

SSL Certificate (HTTPS)

  1. In cPanel, find "SSL/TLS Status" or "Let's Encrypt"
  2. Select the new domain
  3. Click Issue or Run AutoSSL
  4. Wait a few minutes — the certificate will auto-install
  5. Verify by visiting https://yourdomain.com
Important: DNS must be pointed first SSL certificates won't issue if DNS isn't pointing to your server yet. Do the DNS step before requesting SSL.

Server file locations

/home/wholetec/
  public_html/              ← primary domain's document root
  public_html/domainname.com/  ← addon domain document roots
  backups/                  ← your old backup files (need external drive to download)

05Uploading with WinSCP

Connection settings

FieldValue
ProtocolSFTP (preferred) or FTP
Host nameYour LiquidWeb server hostname or IP
Port22 (SFTP) or 21 (FTP)
User nameYour cPanel username
PasswordYour cPanel password

Upload workflow

  1. Left panel (local): Navigate to C:\Users\walhu\websites\domainname.com\
  2. Right panel (server): Navigate to /home/wholetec/public_html/domainname.com/
  3. Select all files on the left → drag to the right (or press F5 to upload)
  4. Click OK to confirm
Tip: Save the session In WinSCP, click "Save" on the login dialog to store your connection. Name it "LiquidWeb" so you can reconnect with one click.

Updating an existing site

Just upload the changed files — WinSCP will ask if you want to overwrite. Click Yes. No build step, no deploy pipeline. Upload and it's live.

06DNS & Domain Pointing

Option A: Nameservers (easiest)

At your domain registrar (GoDaddy, Namecheap, etc.), set the nameservers to LiquidWeb's nameservers. These are usually something like:

ns1.liquidweb.com
ns2.liquidweb.com

(Check your LiquidWeb dashboard for the exact nameservers for your account.)

Option B: A Record (more control)

If you want to keep DNS at your registrar but point the domain to LiquidWeb:

  1. Find your LiquidWeb server's IP address (in cPanel → "Server Information")
  2. At your registrar's DNS settings, create an A record:
    Type: A
    Host: @
    Value: [your server IP]
    TTL: 3600
  3. Also create a CNAME for www:
    Type: CNAME
    Host: www
    Value: yourdomain.com
    TTL: 3600
DNS propagation takes time After changing DNS, it can take 15 minutes to 48 hours for the change to propagate worldwide. Usually it's under an hour. Use nslookup yourdomain.com in terminal to check.

07WordPress Coexistence

Some domains (like wholetech.com) still have WordPress installed. Here's how to run a static site alongside WordPress without breaking either:

The static/ subdirectory approach

  1. Put your static files in a static/ subfolder inside the domain's document root
  2. Create an index.html in the root that redirects to static/, OR copy your homepage to the root as index.html
  3. Add this line to the top of .htaccess in the domain root:
    DirectoryIndex index.html index.php
    This tells Apache to serve index.html before WordPress's index.php

Fully replacing WordPress

When you're ready to ditch WordPress entirely:

  1. Back up the WordPress files and database (just in case)
  2. Move or delete WordPress files from the document root
  3. Move your static files from static/ up to the root
  4. Update any internal links that pointed to static/whatever.html
  5. Done — no more PHP, no more database, no more plugin updates

08Working with Claude

Starting Claude Code

# Open terminal (bash or PowerShell)
# Navigate to the site's directory
cd C:\Users\walhu\websites\domainname.com

# Start Claude Code
claude

What Claude can do

What Claude cannot do

Giving Claude context

Claude remembers things within a conversation but starts fresh each new session. To help Claude pick up where you left off:

09Claude Best Practices

How to get the best results

  1. Be specific about what you want — "make the background blue" works better than "make it look better"
  2. Show examples — "make it look like tvreviewer.com" gives Claude a concrete reference
  3. Review before deploying — always preview on localhost before uploading to the server
  4. Ask Claude to explain — if you don't understand a change, ask "what did you just do?"
  5. Course correct early — if it's going in the wrong direction, say so immediately rather than letting it continue
  6. Save your Claude.md — keep it up to date with conventions so Claude stays consistent across sessions

Effective prompts for building sites

# Starting a new site
"Build a static site for austinblogger.com. It should be a modern Austin
culture blog. Use a warm color palette, not the typical dark-theme-with-gold
look. Include a search/filter, dark mode toggle, and responsive design."

# Modifying an existing site
"On the activesites.html page, add a new domain called example.com.
It's a tech site. Give it the tech category and find a good archive.org
snapshot from before June 2007."

# Bulk operations
"Add a nav bar to all the pages in the wholetech static directory
with links to Home, Archive, and Active Sites."

# Debugging
"The page isn't loading on the server. Here's what I see: [describe].
What might be wrong?"

Things to tell Claude at the start of a session

Tip: Claude remembers across sessions Claude has a memory system. If you tell it something important (like "always use pre-June 2007 archive snapshots for Spring Network sites"), it will remember this in future conversations. You can say "remember this" to make sure it saves.
Warning: Always check the output Claude is very capable but not infallible. Always preview on localhost before uploading. Pay special attention to links, dates, and facts about real people — Claude can occasionally get details wrong.

10Google Sheets Integration

You can use Google Sheets as a live data source for any page. The sheet data loads fresh every time a visitor opens the page.

Setup

  1. Create or open your Google Sheet
  2. Go to File → Share → Publish to web
  3. Choose Entire Document and click Publish
  4. This is separate from the normal sharing settings — the sheet must be published, not just shared

Fetching sheet data in JavaScript

// Use the JSON endpoint (avoids CSV comma-parsing issues)
var SHEET_ID = 'your-sheet-id-here';
var url = 'https://docs.google.com/spreadsheets/d/'
        + SHEET_ID + '/gviz/tq?tqx=out:json';

fetch(url)
  .then(r => r.text())
  .then(text => {
    // Strip the wrapper: google.visualization.Query.setResponse({...})
    var json = text.replace(/^[^(]*\(/, '').replace(/\);?\s*$/, '');
    var data = JSON.parse(json);
    // data.table.rows is your row array
    // data.table.rows[0].c[0].v is the value of cell A1
  });
Important: Use JSON, not CSV The CSV endpoint breaks on cells that contain commas (like "Austin, TX"). Always use the JSON endpoint (tqx=out:json).

When to use Google Sheets vs. hardcoded data

Use Google Sheets whenUse hardcoded data when
Data changes frequentlyData is stable
Non-technical people need to edit itOnly you/Claude edit it
You want live updates without re-deployingYou want the page to work offline
Example: a calendar, a directoryExample: a portfolio, a domain list

11Archive.org Notes

The LiquidWeb attack (Summer 2007)

Your LiquidWeb server was attacked between June and October 2007. Archive.org snapshots from after this date may show compromised or garbage content for sites that were hosted on that server.

Rule: Always use pre-June 2007 snapshots When selecting archive.org links for Spring Network domains, prefer snapshots with timestamps before 20070607. Post-attack snapshots are unreliable.

Finding archive.org snapshots

# Check if a snapshot exists (returns JSON)
https://archive.org/wayback/available?url=domainname.com

# Request a snapshot near a specific date
https://archive.org/wayback/available?url=domainname.com&timestamp=20060601

# Browse all snapshots (calendar view)
https://web.archive.org/web/*/domainname.com

Your backups on LiquidWeb

Old site backups exist at /home/wholetec/ on the LiquidWeb server. You'll need an external drive attached to the Beelink to download them (the internal drive is small). Use WinSCP to download the backup files, then Claude can help you restore and rebuild from them.

12Standard File Structure

Every WholeTech static site follows this pattern:

domainname.com/
  index.html          ← homepage (inline styles or linked CSS)
  [other-page].html   ← additional pages
  style.css           ← shared styles (optional, can be inline)
  images/             ← site images (optional)

Standard HTML template

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Page Title — Site Name</title>
  <meta name="description" content="...">
  <!-- Google Fonts -->
  <!-- Early theme detection script -->
  <style>
    /* CSS variables for light/dark/spring */
    /* All styles inline */
  </style>
</head>
<body>
  <nav>...</nav>
  <header>...</header>
  <main>...</main>
  <footer>...</footer>
  <script>
    /* Theme toggle + page logic */
  </script>
</body>
</html>

13Theme System (Light / Dark / Spring)

WholeTech sites use a three-theme system: light (default), dark, and spring.

How it works

  1. CSS variables defined on :root (light), html.dark, and html.spring
  2. An early <script> in <head> checks localStorage and applies the class before paint (prevents flash)
  3. A toggle button cycles: light → dark → spring → light
  4. Choice saved to localStorage as wt-theme
  5. Respects prefers-color-scheme: dark on first visit

Early detection script (put in <head>)

<script>
(function(){
  var t = localStorage.getItem('wt-theme');
  if (t === 'dark' || (!t && matchMedia('(prefers-color-scheme:dark)').matches))
    document.documentElement.classList.add('dark');
  else if (t === 'spring')
    document.documentElement.classList.add('spring');
})();
</script>

Toggle script (put before </body>)

document.getElementById('theme-toggle').addEventListener('click', function() {
  var el = document.documentElement;
  var themes = ['light', 'dark', 'spring'];
  var current = el.classList.contains('dark') ? 'dark'
              : el.classList.contains('spring') ? 'spring' : 'light';
  var next = themes[(themes.indexOf(current) + 1) % themes.length];
  el.classList.remove('dark', 'spring');
  if (next !== 'light') el.classList.add(next);
  localStorage.setItem('wt-theme', next);
});

14Launch Checklist

Before going live with any new site:

15Troubleshooting

Site shows "Redirecting..." instead of the real page

The root index.html is the redirect stub, not your real homepage. Either copy your real homepage to the root as index.html, or make sure the meta refresh redirect is working.

WordPress shows instead of static site

Apache is serving index.php (WordPress) instead of index.html. Add DirectoryIndex index.html index.php to the top of your .htaccess file in the domain root.

SSL certificate won't issue

DNS isn't pointing to LiquidWeb yet. Point DNS first, wait for propagation (check with nslookup), then request SSL.

Google Sheets data not loading

The sheet needs to be published to the web (File → Share → Publish to web), which is different from the normal sharing settings. Also make sure you're using the JSON endpoint, not CSV.

Archive.org snapshot shows garbage

You're looking at a post-attack snapshot. Find a snapshot from before June 2007. Use the Wayback API with a timestamp: ?url=domain.com&timestamp=20060601

WinSCP can't connect

Page looks different on server vs. localhost

Usually a caching issue. Hard-refresh with Ctrl+Shift+R. If using Cloudflare or another CDN, purge the cache there too.