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
| Component | What |
|---|---|
| Local machine | Beelink mini PC, Windows 11 Pro, bash shell available |
| Local directory | C:\Users\walhu\websites\ — one folder per site |
| Web server | LiquidWeb shared/VPS hosting, Apache, PHP available |
| Server files | /home/wholetec/ on the LiquidWeb server |
| File transfer | WinSCP (SFTP/FTP to LiquidWeb) |
| AI assistant | Claude Code (Anthropic CLI, runs in terminal) |
| Technology | Pure static HTML + CSS + vanilla JS — no Node, no npm, no frameworks |
| Preview | python -m http.server 8081 on localhost |
| Domains | 112 domains, managed through LiquidWeb and/or registrar |
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
# 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
This is the complete process for taking a domain from "parked" to "live static site."
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.
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.
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.
Log into LiquidWeb → cPanel → add the domain as an Addon Domain or Alias (see LiquidWeb section below).
At your domain registrar, set the nameservers or A record to point to your LiquidWeb server IP (see DNS section).
Connect WinSCP to LiquidWeb, navigate to the domain's document root, upload your files (see WinSCP section).
Visit the domain in your browser. Verify all pages load, links work, and themes toggle correctly.
austinblogger.com)/home/wholetec/public_html/austinblogger.comhttps://yourdomain.com/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)
| Field | Value |
|---|---|
| Protocol | SFTP (preferred) or FTP |
| Host name | Your LiquidWeb server hostname or IP |
| Port | 22 (SFTP) or 21 (FTP) |
| User name | Your cPanel username |
| Password | Your cPanel password |
C:\Users\walhu\websites\domainname.com\/home/wholetec/public_html/domainname.com/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.
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.)
If you want to keep DNS at your registrar but point the domain to LiquidWeb:
Type: A Host: @ Value: [your server IP] TTL: 3600
Type: CNAME Host: www Value: yourdomain.com TTL: 3600
nslookup yourdomain.com in terminal to check.
Some domains (like wholetech.com) still have WordPress installed. Here's how to run a static site alongside WordPress without breaking either:
static/ subfolder inside the domain's document rootindex.html in the root that redirects to static/, OR copy your homepage to the root as index.html.htaccess in the domain root:
DirectoryIndex index.html index.phpThis tells Apache to serve
index.html before WordPress's index.php
When you're ready to ditch WordPress entirely:
static/ up to the rootstatic/whatever.html# Open terminal (bash or PowerShell) # Navigate to the site's directory cd C:\Users\walhu\websites\domainname.com # Start Claude Code claude
Claude remembers things within a conversation but starts fresh each new session. To help Claude pick up where you left off:
~/.claude/projects/)# 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?"
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.
// 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
});
tqx=out:json).
| Use Google Sheets when | Use hardcoded data when |
|---|---|
| Data changes frequently | Data is stable |
| Non-technical people need to edit it | Only you/Claude edit it |
| You want live updates without re-deploying | You want the page to work offline |
| Example: a calendar, a directory | Example: a portfolio, a domain list |
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.
20070607. Post-attack snapshots are unreliable.
# 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×tamp=20060601 # Browse all snapshots (calendar view) https://web.archive.org/web/*/domainname.com
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.
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)
<!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>
WholeTech sites use a three-theme system: light (default), dark, and spring.
:root (light), html.dark, and html.spring<script> in <head> checks localStorage and applies the class before paint (prevents flash)localStorage as wt-themeprefers-color-scheme: dark on first visit<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>
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);
});
Before going live with any new site:
<title> and <meta description> are sethttps://yourdomain.com.htaccess updated with DirectoryIndex index.html index.phpThe 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.
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.
DNS isn't pointing to LiquidWeb yet. Point DNS first, wait for propagation (check with nslookup), then request SSL.
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.
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×tamp=20060601
Usually a caching issue. Hard-refresh with Ctrl+Shift+R. If using Cloudflare or another CDN, purge the cache there too.