diff --git a/.gitignore b/.gitignore
index dcb7bec..1b73408 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,10 @@
# Environment and secrets
.env
.credentials
+.license-key
-# Docker Compose override (used for marketing site on production VPS only)
+# Docker Compose override (legacy, marketing site moved to websites repo)
/docker-compose.override.yml
-website/deploy/active-marketing.conf
# Persistent data (created by setup.sh)
websitebox-data/
diff --git a/CLAUDE.md b/CLAUDE.md
index d2daba9..d7519b2 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -95,6 +95,30 @@ WordPress depends on db with `condition: service_healthy`.
- nginx entrypoint: On SSL failure, serves HTTP placeholder explaining DNS isn't ready. User retries with `docker compose restart nginx`.
- install.sh: Uses `sg docker` for immediate Docker group activation without logout/login.
+## Marketing Site & License Keys (separate repo)
+
+The marketing site (makeyourown.website) and license key validation server live in a **separate repository**: `https://git.constantprojects.xyz/tankadmin/websites.git` (local: `~/claude/projects/websites`). This is business infrastructure that runs on its own VPS, independent of any WebsiteBox test/product deployments.
+
+### License key validation (client-side)
+- `install.sh` prompts for a license key as the very first step (before any system changes)
+- `setup.sh` has a secondary check (format-only if `.license-key` file exists, server validation if missing)
+- **Endpoint:** `POST https://makeyourown.website/api/validate` with body `key=WBOX-XXXX-XXXX-XXXX-XXXX`
+- **Key format:** `WBOX-XXXX-XXXX-XXXX-XXXX` (uppercase alphanumeric, no ambiguous chars 0/O/1/I/L)
+- **Behavior:** Burn-on-use — keys are consumed on first activation
+- **Storage:** `.license-key` file in project root (gitignored, chmod 600)
+
+### What lives where
+| Concern | Location |
+|---------|----------|
+| Key check in install flow | This repo: `install.sh`, `setup.sh` |
+| Keyserver, key generation, marketing site | `websites` repo: `services/keyserver/`, `scripts/generate-keys.sh`, `sites/makeyourown.website/` |
+| Key storage (keys.txt) | `websites` VPS: `services/keyserver/keys.txt` |
+
+### Business rules
+- WebsiteBox is **not free** and **not "open source"** — code is auditable, buyers can read every line before purchasing
+- Do not say "free" or "open source" in marketing content
+- Pricing tiers: Standard $49 one-time, Lifetime Updates $149 one-time, Managed $25/month (all placeholder amounts)
+
## Non-Goals (v1)
Payment processing, multi-site WordPress, automatic VPS provisioning, built-in CDN, email server (SMTP relay config only).
diff --git a/guide.md b/guide.md
index 6597000..2a8ed0d 100644
--- a/guide.md
+++ b/guide.md
@@ -192,12 +192,13 @@ curl -fsSL https://git.constantprojects.xyz/tankadmin/websitebox/raw/branch/main
This one command does everything needed to prepare your server:
-1. **Updates your system** — installs the latest security patches
-2. **Secures your server** — sets up a firewall ([UFW](https://wiki.ubuntu.com/UncomplicatedFirewall)), brute-force protection ([Fail2ban](https://www.fail2ban.org/)), and automatic security updates ([Unattended Upgrades](https://wiki.debian.org/UnattendedUpgrades))
-3. **Installs Docker** — the software that packages and runs your website (think of it as a container system that keeps everything organized and isolated)
-4. **Configures log rotation** — prevents Docker logs from filling up your disk over time
-5. **Downloads WebsiteBox** — the project files that define your website setup
-6. **Starts the setup wizard** — an interactive questionnaire to configure your site (covered in the next step)
+1. **Verifies your license key** — confirms your purchase with the WebsiteBox server
+2. **Updates your system** — installs the latest security patches
+3. **Secures your server** — sets up a firewall ([UFW](https://wiki.ubuntu.com/UncomplicatedFirewall)), brute-force protection ([Fail2ban](https://www.fail2ban.org/)), and automatic security updates ([Unattended Upgrades](https://wiki.debian.org/UnattendedUpgrades))
+4. **Installs Docker** — the software that packages and runs your website (think of it as a container system that keeps everything organized and isolated)
+5. **Configures log rotation** — prevents Docker logs from filling up your disk over time
+6. **Downloads WebsiteBox** — the project files that define your website setup
+7. **Starts the setup wizard** — an interactive questionnaire to configure your site (covered in the next step)
You'll see output scrolling by as each step completes. Here's roughly what to expect:
@@ -206,6 +207,17 @@ You'll see output scrolling by as each step completes. Here's roughly what to ex
WebsiteBox Installer
═══════════════════════════════════════════════════════════
+───────────────────────────────────────────────────────────
+ License Key
+───────────────────────────────────────────────────────────
+▸ Enter your WebsiteBox license key
+ You received this key in your purchase confirmation email.
+ Format: WBOX-XXXX-XXXX-XXXX-XXXX
+
+ License key: WBOX-A3F7-KN9P-QR4X-8WTB
+▸ Verifying license key...
+ ✓ License key verified and activated.
+
Detected: ubuntu 22.04
───────────────────────────────────────────────────────────
diff --git a/install.sh b/install.sh
index 1765d77..078b77e 100755
--- a/install.sh
+++ b/install.sh
@@ -52,6 +52,41 @@ show_progress() {
header "WebsiteBox Installer"
+# --- License Key ---
+
+section "License Key"
+step "Enter your WebsiteBox license key"
+info "You received this key in your purchase confirmation email."
+info "Format: WBOX-XXXX-XXXX-XXXX-XXXX"
+echo ""
+printf " License key: "
+read -r LICENSE_KEY < /dev/tty
+
+# Validate format
+if ! echo "$LICENSE_KEY" | grep -qE '^WBOX-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'; then
+ err "Invalid key format. Expected: WBOX-XXXX-XXXX-XXXX-XXXX"
+ exit 1
+fi
+
+# Validate with server (burns the key on success)
+step "Verifying license key..."
+VALIDATION_RESPONSE=$(curl -sf -X POST https://makeyourown.website/api/validate \
+ -d "key=${LICENSE_KEY}" 2>/dev/null) || {
+ err "Could not reach the license server."
+ err "Check your internet connection and try again."
+ err "If this persists, contact support@makeyourown.website"
+ exit 1
+}
+
+if echo "$VALIDATION_RESPONSE" | grep -q '"valid": true'; then
+ ok "License key verified and activated."
+else
+ err "Invalid or already-used license key."
+ err "Purchase WebsiteBox at https://makeyourown.website"
+ exit 1
+fi
+echo ""
+
# --- Check for root/sudo ---
if [ "$(id -u)" -eq 0 ]; then
@@ -244,6 +279,10 @@ fi
# Make scripts executable
chmod +x setup.sh install.sh scripts/*.sh
+# Save license key
+echo "${LICENSE_KEY}" > "${INSTALL_DIR}/.license-key"
+chmod 600 "${INSTALL_DIR}/.license-key"
+
# --- Install shell alias ---
# Adds "websitebox" command that auto-cds into the project directory.
# Usage: websitebox up, websitebox logs, websitebox down, etc.
diff --git a/setup.sh b/setup.sh
index 1062faa..e3cb8ed 100755
--- a/setup.sh
+++ b/setup.sh
@@ -23,6 +23,42 @@ printf "\n${WHITE}════════════════════
printf " ${BOLD}WebsiteBox Setup Wizard${RESET}\n"
printf "${WHITE}═══════════════════════════════════════════════════════════${RESET}\n\n"
+# --- License Key Check ---
+
+if [ -f ".license-key" ]; then
+ LICENSE_KEY=$(cat .license-key)
+ if ! echo "$LICENSE_KEY" | grep -qE '^WBOX-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'; then
+ printf "${RED} ✗ Invalid license key in .license-key file.${RESET}\n"
+ printf "${RED} Re-run install.sh or contact support@makeyourown.website${RESET}\n"
+ exit 1
+ fi
+else
+ printf "${YELLOW} ⚠ No license key found.${RESET}\n"
+ printf " Enter your WebsiteBox license key: "
+ read -r LICENSE_KEY
+ if ! echo "$LICENSE_KEY" | grep -qE '^WBOX-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'; then
+ printf "${RED} ✗ Invalid key format. Expected: WBOX-XXXX-XXXX-XXXX-XXXX${RESET}\n"
+ exit 1
+ fi
+ # Validate with server (burns the key)
+ printf " Verifying license key...\n"
+ VALIDATION_RESPONSE=$(curl -sf -X POST https://makeyourown.website/api/validate \
+ -d "key=${LICENSE_KEY}" 2>/dev/null) || {
+ printf "${RED} ✗ Could not reach the license server. Try again later.${RESET}\n"
+ exit 1
+ }
+ if echo "$VALIDATION_RESPONSE" | grep -q '"valid": true'; then
+ printf "${GREEN} ✓ License key verified and activated.${RESET}\n"
+ echo "$LICENSE_KEY" > .license-key
+ chmod 600 .license-key
+ else
+ printf "${RED} ✗ Invalid or already-used license key.${RESET}\n"
+ printf "${RED} Purchase WebsiteBox at https://makeyourown.website${RESET}\n"
+ exit 1
+ fi
+fi
+echo ""
+
# --- Prerequisite Checks ---
check_command() {
diff --git a/website/PLAN.md b/website/PLAN.md
deleted file mode 100644
index c7747d6..0000000
--- a/website/PLAN.md
+++ /dev/null
@@ -1,132 +0,0 @@
-# WebsiteBox Marketing Site — Positioning & Plan
-
-## Brand Positioning
-
-**One-liner:** Own your website. No platform can take it down.
-
-**Elevator pitch:** WebsiteBox gives you a fully working WordPress website on your own server in 45 minutes. No coding required. No content policies to worry about. Fully auditable code — read every line before you buy. One-time purchase options instead of recurring platform fees.
-
-## Target Audiences (Priority Order)
-
-### 1. Adult Content Creators
-- **Pain:** Major platforms (Tumblr, Instagram, Patreon alt sites) routinely deplatform adult content. Even "adult-friendly" hosts have opaque TOS enforcement. Shared hosting providers can shut down accounts with no warning.
-- **Message:** Your content is legal. Your hosting shouldn't be a liability. WebsiteBox deploys on VPS providers with explicit "legal content" policies. You own the server. Nobody can flip a switch.
-- **Proof:** Age verification built in. BuyVM recommendation ($3.50/mo, explicit legal-content policy).
-
-### 2. Journalists & Activists
-- **Pain:** Hosted platforms can be pressured by governments or corporations. Data stored on third-party platforms is subject to subpoena/seizure at the platform level. Content moderation policies are opaque and inconsistently applied.
-- **Message:** Your words on your server. No telemetry, no analytics, no third-party dependencies. Every line of code is auditable. Your data never leaves your server unless you explicitly send it somewhere.
-- **Proof:** Fully auditable code, zero telemetry, all data in one visible directory.
-
-### 3. Privacy-Conscious Individuals
-- **Pain:** WordPress.com, Squarespace, Wix all collect user data, serve tracking scripts, and hold your content hostage behind their platform.
-- **Message:** True privacy means true ownership. WebsiteBox doesn't phone home. No analytics. No tracking. No accounts to create with us. You download the code and run it yourself.
-- **Proof:** No telemetry claim backed by auditable source code.
-
-### 4. Free Speech Advocates / Independent Publishers
-- **Pain:** Content moderation across platforms is inconsistent and expanding. "Acceptable use" policies shift without notice.
-- **Message:** The only content policy is the law. Self-hosting means your site exists as long as your server is paid for.
-- **Proof:** VPS-agnostic (works anywhere), content-permissive provider recommendations.
-
-### 5. Non-Technical Creators Who Want Independence
-- **Pain:** Feel locked into Squarespace/Wix because self-hosting seems hard. Don't want to learn Linux/Docker/nginx.
-- **Message:** One command. 45 minutes. No coding. If you can copy-paste into a terminal, you can own your website.
-- **Proof:** Step-by-step guide walks through every click.
-
-## Competitive Positioning
-
-| Alternative | WebsiteBox Advantage |
-|------------|---------------------|
-| WordPress.com | No content restrictions, no platform fees, you own the data |
-| Squarespace / Wix | No vendor lock-in, no monthly platform tax, full WordPress ecosystem |
-| Shared hosting (GoDaddy, etc.) | Better security defaults, no oversold servers, full root access |
-| Manual server setup | 45 min vs hours/days, security preconfigured, one-command deploys |
-| Ghost / Other CMS | WordPress has 40%+ market share = more themes, plugins, tutorials |
-
-## Messaging Framework
-
-### Primary Message
-**"Your website, your server, your rules."**
-
-### Supporting Messages
-1. **One command to deploy** — No DevOps degree required
-2. **Fully auditable code** — Read every line before you buy. No black boxes.
-3. **Secure by default** — SSL, firewall, backups, brute-force protection out of the box
-4. **Buy once, own forever** — One-time purchase options vs competitors' recurring fees
-5. **No content police** — Self-hosting means the only content policy is the law
-6. **WordPress inside** — 40% of the web runs on it. Thousands of themes and plugins.
-
-## Pricing Strategy
-
-WebsiteBox is a **paid product with auditable code**. It is NOT free and NOT branded as "open source." Buyers can read and verify every line of code before purchasing.
-
-See `PRICING.md` for the detailed pricing reference.
-
-### Tier 1: Standard ($49 one-time) — placeholder price
-- Full WebsiteBox deployment, all current features
-- Buyers can audit the full source code
-- No future updates included
-- Community support via issue tracker
-- **Positioning:** "Buy it, own it, run it forever"
-
-### Tier 2: Lifetime Updates ($149 one-time) — placeholder price
-- Everything in Standard
-- All future updates and improvements forever
-- Security patches
-- Priority issue responses
-- **Positioning:** "Buy once, stay current forever"
-
-### Tier 3: Managed ($25/month) — placeholder price
-- Everything in Lifetime Updates
-- Setup assistance
-- Ongoing technical support
-- Server health monitoring
-- Priority bug fixes
-- **Positioning:** "We handle the technical side so you don't have to"
-
-### Additional costs (separate from WebsiteBox pricing):
-- VPS hosting: $3.50-6/month
-- Domain name: $1-12/year
-
-### Key messaging rules:
-- Do NOT say "free" anywhere
-- Do NOT say "open source"
-- DO say "auditable code" / "read every line before you buy"
-- DO emphasize one-time purchase vs competitors' recurring fees
-
-## Site Structure
-
-Single-page scrolling site with these sections:
-
-1. **Hero** — Headline, subheadline, CTA button
-2. **Problem** — Why self-hosting matters (tabbed for different audiences)
-3. **How It Works** — 3-4 step visual flow
-4. **What's Included** — Feature grid
-5. **Cost** — Transparent pricing breakdown
-6. **Who It's For** — Audience cards
-7. **Security** — Trust signals
-8. **FAQ** — Common objections
-9. **Get Started** — Final CTA with install command
-10. **Footer** — Links, license, source code
-
-## Design Direction
-
-- **Clean, modern, minimal** — Think Stripe/Linear aesthetic
-- **Dark-friendly** — Dark backgrounds with accent colors (not corporate blue)
-- **Typography-forward** — Large, clear type. No decorative clutter.
-- **Color palette:** Dark charcoal/near-black background, white text, green or teal accent for CTAs
-- **No stock photos** — Use icons, code snippets, terminal mockups
-- **Mobile-first** — Many creators browse on phones
-
-## Questions / Uncertainties for Review
-
-1. **Managed hosting tier** — Should the site advertise a managed option? Who would provide it? At what price point?
-2. **Support model** — Is there a paid support offering, or is all support community-based (Git issues)?
-3. **Brand voice** — The brief focuses on adult content as primary use case. Should the marketing site lead with that audience explicitly, or keep it as one of several use cases? (Current plan: keep it content-agnostic on the surface, but make the adult content use case clearly visible to those looking for it.)
-4. **Logo / brand assets** — Does WebsiteBox have a logo? Should one be designed?
-5. **Analytics on the marketing site itself** — Privacy-first product, but do we want analytics to measure conversion? If so, what tool? (Plausible? Self-hosted Umami?)
-6. **Domain for the marketing site** — What domain will this live on? Is it the same as the Git server (constantprojects.xyz)?
-7. **Call-to-action destination** — Should the CTA link to the guide.md hosted version, or directly to the install command?
-8. **Testimonials** — Are there any beta users who could provide quotes?
-9. **Legal disclaimer** — Should there be a disclaimer about content legality varying by jurisdiction?
-10. **Comparison page** — Worth having a dedicated "WebsiteBox vs X" comparison, or keep it in the FAQ?
diff --git a/website/PRICING.md b/website/PRICING.md
deleted file mode 100644
index 3829589..0000000
--- a/website/PRICING.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# WebsiteBox Pricing Model — Reference Document
-
-**IMPORTANT: This is the source of truth for pricing. The site should reflect this.**
-
-## Key Rules
-- WebsiteBox is NOT free
-- Do NOT call it "open source" (even though buyers can audit the code)
-- The code IS auditable — buyers can read every line before running it
-- Do NOT say "free" anywhere on the site
-- The GPLv3 license reference should be removed from public-facing content
-
-## Pricing Tiers
-
-### Tier 1: Standard License — $XX (one-time)
-- Full WebsiteBox deployment system
-- All current features (SSL, firewall, backups, age verification, WordPress)
-- Buyers can audit the full source code
-- No future updates included
-- Community support via issue tracker
-- **Positioning:** "Buy it, own it, run it forever"
-
-### Tier 2: Lifetime Updates — $XX (one-time)
-- Everything in Standard
-- All future updates and improvements included forever
-- Priority issue responses
-- **Positioning:** "Buy once, stay current forever"
-
-### Tier 3: Managed Support — $XX/month (subscription)
-- Everything in Lifetime Updates
-- Setup assistance
-- Ongoing technical support
-- Server monitoring and health checks
-- Priority bug fixes
-- **Positioning:** "We handle the technical side so you don't have to"
-
-## Placeholder Prices (NEEDS USER INPUT)
-- Standard: $49? $79? $99?
-- Lifetime Updates: $149? $199?
-- Managed Support: $19/mo? $25/mo? $29/mo?
-
-**TODO: Get actual prices from project owner**
-
-## Site Messaging Guidelines
-- Lead with "auditable code" not "open source"
-- Emphasize transparency: "read every line before you run it"
-- Emphasize ownership: "your server, your data, your code to verify"
-- VPS costs ($3.50-6/mo) and domain costs ($1-12/yr) are SEPARATE and should be clearly listed as additional requirements
-- Competitors charge $8-52/month recurring for LESS control — our one-time options are a strong value prop
diff --git a/website/QUESTIONS.md b/website/QUESTIONS.md
deleted file mode 100644
index 61c66c1..0000000
--- a/website/QUESTIONS.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Questions & Uncertainties — For Review
-
-These are open questions encountered during the marketing site build. Please review and provide direction.
-
-## Branding
-1. **Logo** — Does WebsiteBox have a logo? The site currently uses a Unicode symbol (▣) as a placeholder. A proper logo/icon would strengthen the brand.
-2. **Brand colors** — I went with dark theme + green accent (similar to terminal green). Is this the right direction, or should the accent be a different color?
-3. **Tagline** — Currently "Your website, your server, your rules." Alternatives considered: "Own your corner of the internet." / "Self-hosting made simple." Feedback?
-
-## Business Model / Pricing
-4. **Exact pricing** — The site currently shows placeholder prices: Standard $49 (one-time, no updates), Lifetime Updates $149 (one-time, all updates), Managed $25/mo (service/support). Are these the right price points? See PRICING.md for the full breakdown.
-5. **Payment processing** — How will purchases be handled? Stripe? Gumroad? LemonSqueezy? A self-hosted solution? This determines what CTAs link to.
-6. **License enforcement** — How will the license be enforced? License key system? Honor system? This affects the install flow.
-7. **Managed tier provider** — Who provides the managed service? Is it you personally, a team, or a partner? This determines capacity and SLA commitments on the site.
-8. **Affiliate links** — Should the VPS provider links (BuyVM, Vultr, OVHcloud) use affiliate/referral codes to generate revenue for the project?
-
-## Content & Positioning
-9. **Adult content prominence** — The brief says adult content creators are the primary audience, but the current site keeps it as one of several use cases ("Content creators" card). Should it be more explicit? E.g., a dedicated section saying "Built for adult content creators" with specific pain points?
-10. **Legal disclaimer** — Should there be a disclaimer about content legality varying by jurisdiction? E.g., "WebsiteBox is content-agnostic. Users are responsible for ensuring their content complies with applicable laws."
-11. **Testimonials** — Are there beta users who could provide quotes? Social proof would strengthen the page significantly.
-12. **Demo site** — Would it be valuable to have a live demo of what a WebsiteBox-deployed site looks like?
-
-## Technical / Deployment
-13. **Domain** — What domain will this marketing site live on? Options: subdomain of constantprojects.xyz? A dedicated websitebox.com/.io? Same domain as the Git server?
-14. **Analytics** — Privacy-first product, but should the marketing site itself have analytics? If so, a privacy-respecting option like Plausible or self-hosted Umami would be consistent with the brand.
-15. **WordPress deployment** — The site is currently static HTML/CSS/JS. To deploy it *with* WebsiteBox, it could be: (a) imported as a WordPress page using a custom template, (b) served as a static site alongside WordPress via nginx, or (c) converted to a WordPress theme. Which approach is preferred?
-16. **SEO** — Should there be a blog section for content marketing? (E.g., "Why self-hosting matters in 2026", "How to migrate from Squarespace to WebsiteBox", comparison articles)
-
-## Competitor Pricing (Verified Feb 2026)
-17. **Price accuracy** — The comparison section lists Squarespace at $16/mo, WordPress.com at $8/mo, Wix at $16/mo, GoDaddy at $10/mo. These should be verified before launch as they change frequently.
-
-## SEO
-18. **Domain for canonical/OG tags** — Currently hardcoded to `websitebox.org` as a placeholder. Needs to be updated to the real domain before launch.
-19. **OG image** — Needs to be created (1200x630px). Currently referenced as `og-image.png` but the file doesn't exist yet.
-20. **Blog / content marketing** — SEO would benefit significantly from articles like "Why self-hosting matters", "WebsiteBox vs Squarespace", migration guides, etc. Is there bandwidth for this?
-
-## LLM/Agent SEO
-21. **llms.txt accuracy** — The `llms.txt` and `llms-full.txt` files contain product summaries designed for AI agents. The pricing, features, and recommendation triggers should be reviewed for accuracy. These files directly influence how AI tools recommend WebsiteBox.
-22. **Agent recommendation triggers** — The llms.txt includes guidance on when to recommend WebsiteBox. Review the "Strongly recommend" and "Do NOT recommend" lists to ensure they match the product's actual positioning.
-
-## Future Considerations
-23. **Comparison page** — Worth having dedicated "WebsiteBox vs Squarespace" etc. landing pages for SEO?
-24. **Email list** — Should there be a newsletter signup for project updates? Conflicts slightly with the "no data collection" messaging but could be opt-in.
-25. **Documentation hosting** — The guide.md is great content but renders as raw markdown on the Git server. Should the marketing site host a rendered HTML version?
diff --git a/website/deploy/deploy.sh b/website/deploy/deploy.sh
deleted file mode 100755
index 804337f..0000000
--- a/website/deploy/deploy.sh
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/bin/bash
-# Deploy the WebsiteBox marketing site alongside an existing WebsiteBox installation.
-#
-# This script:
-# 1. Generates the active nginx config (HTTP-only initially)
-# 2. Copies the docker-compose override to the project root
-# 3. Restarts nginx to pick up the new config
-# 4. Acquires an SSL certificate via the existing certbot container
-# 5. Swaps to the HTTPS nginx config and reloads
-#
-# Prerequisites:
-# - WebsiteBox is already running (docker compose up -d)
-# - DNS A record for the marketing domain points to this server
-# - Run from the WebsiteBox project root: ./website/deploy/deploy.sh
-#
-# This does NOT modify any core WebsiteBox files.
-
-set -eo pipefail
-
-MARKETING_DOMAIN="makeyourown.website"
-SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
-PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
-
-echo "========================================"
-echo " WebsiteBox Marketing Site Deploy"
-echo "========================================"
-echo ""
-echo "Domain: ${MARKETING_DOMAIN}"
-echo "Project: ${PROJECT_ROOT}"
-echo ""
-
-# Check we're in the right place
-if [ ! -f "${PROJECT_ROOT}/docker-compose.yml" ]; then
- echo "ERROR: docker-compose.yml not found in ${PROJECT_ROOT}"
- echo "Run this script from the WebsiteBox project root."
- exit 1
-fi
-
-# Check WebsiteBox is running
-if ! docker compose -f "${PROJECT_ROOT}/docker-compose.yml" ps --status running | grep -q nginx; then
- echo "ERROR: WebsiteBox nginx is not running."
- echo "Start it first: docker compose up -d"
- exit 1
-fi
-
-# Read ADMIN_EMAIL from .env for certbot
-ADMIN_EMAIL=""
-if [ -f "${PROJECT_ROOT}/.env" ]; then
- ADMIN_EMAIL=$(grep '^ADMIN_EMAIL=' "${PROJECT_ROOT}/.env" | cut -d'=' -f2)
-fi
-if [ -z "$ADMIN_EMAIL" ]; then
- echo "ERROR: ADMIN_EMAIL not found in .env"
- exit 1
-fi
-
-# Step 1: Generate HTTP-only nginx config (for ACME challenge)
-echo "[1/5] Generating HTTP nginx config..."
-sed "s/MARKETING_DOMAIN_PLACEHOLDER/${MARKETING_DOMAIN}/g" \
- "${SCRIPT_DIR}/marketing.conf" > "${SCRIPT_DIR}/active-marketing.conf"
-
-# Step 2: Copy docker-compose override to project root
-echo "[2/5] Installing docker-compose override..."
-cp "${SCRIPT_DIR}/docker-compose.override.yml" "${PROJECT_ROOT}/docker-compose.override.yml"
-
-# Step 3: Restart nginx to pick up the new config + volume mount
-echo "[3/5] Restarting nginx with marketing site..."
-cd "${PROJECT_ROOT}"
-docker compose up -d nginx
-sleep 3
-
-# Verify nginx is serving the marketing domain
-echo " Verifying HTTP response..."
-if ! docker compose exec nginx curl -sf -H "Host: ${MARKETING_DOMAIN}" http://localhost/ > /dev/null 2>&1; then
- echo "WARNING: nginx did not respond for ${MARKETING_DOMAIN}. Check the config."
- echo "Continuing anyway — SSL acquisition may still work if DNS is correct."
-fi
-
-# Step 4: Acquire SSL certificate
-echo "[4/5] Acquiring SSL certificate for ${MARKETING_DOMAIN}..."
-if docker compose exec certbot certbot certonly \
- --webroot \
- -w /var/www/certbot \
- -d "${MARKETING_DOMAIN}" \
- --agree-tos \
- --email "${ADMIN_EMAIL}" \
- --non-interactive \
- --no-eff-email; then
-
- echo " SSL certificate acquired!"
-
- # Step 5: Swap to HTTPS config and reload
- echo "[5/5] Activating HTTPS config..."
- sed "s/MARKETING_DOMAIN_PLACEHOLDER/${MARKETING_DOMAIN}/g" \
- "${SCRIPT_DIR}/marketing-ssl.conf" > "${SCRIPT_DIR}/active-marketing.conf"
-
- docker compose exec nginx nginx -s reload
-
- echo ""
- echo "========================================"
- echo " Marketing site is live!"
- echo " https://${MARKETING_DOMAIN}"
- echo "========================================"
-else
- echo ""
- echo "WARNING: SSL certificate acquisition failed."
- echo "The marketing site is running on HTTP at http://${MARKETING_DOMAIN}"
- echo ""
- echo "Common causes:"
- echo " - DNS A record for ${MARKETING_DOMAIN} does not point to this server"
- echo " - DNS hasn't propagated yet (wait a few minutes and re-run)"
- echo ""
- echo "To retry SSL only, re-run this script."
-fi
diff --git a/website/deploy/docker-compose.override.yml b/website/deploy/docker-compose.override.yml
deleted file mode 100644
index 284a772..0000000
--- a/website/deploy/docker-compose.override.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-# Marketing site overlay — adds the static marketing site to the nginx container
-# This file is auto-merged by Docker Compose when placed in the project root.
-# It does NOT modify any core WebsiteBox files.
-#
-# Usage: cp website/deploy/docker-compose.override.yml . && docker compose up -d
-
-services:
- nginx:
- volumes:
- - ./website:/var/www/marketing:ro
- - ./website/deploy/active-marketing.conf:/etc/nginx/conf.d/marketing.conf:ro
diff --git a/website/deploy/marketing-ssl.conf b/website/deploy/marketing-ssl.conf
deleted file mode 100644
index 8553aea..0000000
--- a/website/deploy/marketing-ssl.conf
+++ /dev/null
@@ -1,45 +0,0 @@
-# Marketing site — HTTPS server block
-# Activated after SSL certificate is acquired
-
-server {
- listen 443 ssl;
- http2 on;
- server_name MARKETING_DOMAIN_PLACEHOLDER;
-
- ssl_certificate /etc/letsencrypt/live/MARKETING_DOMAIN_PLACEHOLDER/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/MARKETING_DOMAIN_PLACEHOLDER/privkey.pem;
- include /etc/nginx/snippets/ssl-params.conf;
-
- root /var/www/marketing;
- index index.html;
-
- location / {
- try_files $uri $uri/ =404;
- }
-
- # Static file caching
- location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2|ttf|eot|xml|txt)$ {
- expires 30d;
- add_header Cache-Control "public, immutable";
- add_header Strict-Transport-Security "max-age=63072000" always;
- add_header X-Content-Type-Options nosniff always;
- add_header X-Frame-Options SAMEORIGIN always;
- add_header X-XSS-Protection "1; mode=block" always;
- add_header Referrer-Policy "strict-origin-when-cross-origin" always;
- access_log off;
- }
-}
-
-# HTTP to HTTPS redirect
-server {
- listen 80;
- server_name MARKETING_DOMAIN_PLACEHOLDER;
-
- location /.well-known/acme-challenge/ {
- root /var/www/certbot;
- }
-
- location / {
- return 301 https://$host$request_uri;
- }
-}
diff --git a/website/deploy/marketing.conf b/website/deploy/marketing.conf
deleted file mode 100644
index 1737d80..0000000
--- a/website/deploy/marketing.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-# Marketing site — HTTP server block (pre-SSL)
-# Serves static files and handles ACME challenges for certificate acquisition
-# Replaced by marketing-ssl.conf once SSL is acquired
-
-server {
- listen 80;
- server_name MARKETING_DOMAIN_PLACEHOLDER;
-
- location /.well-known/acme-challenge/ {
- root /var/www/certbot;
- }
-
- location / {
- root /var/www/marketing;
- index index.html;
- try_files $uri $uri/ =404;
- }
-}
diff --git a/website/index.html b/website/index.html
deleted file mode 100644
index 9bcaa85..0000000
--- a/website/index.html
+++ /dev/null
@@ -1,537 +0,0 @@
-
-
-
- $ curl -fsSL https://git.constantprojects.xyz/tankadmin/websitebox/raw/branch/main/install.sh | bash
-
- ═══════════════════════════════════════════════════════
- WebsiteBox Installer
- ═══════════════════════════════════════════════════════
-
- ✓System packages updated
- ✓Firewall configured
- ✓Docker installed
- ✓SSL certificate acquired
- ✓WordPress installed
-
- Your site is live at https://yourdomain.com
-
-
-
-
-
-
-
-
-
Why self-host?
-
Platforms giveth, and platforms taketh away.
-
-
-
🚫
-
Deplatforming risk
-
Hosting platforms change their content policies without warning. One day your site is live, the next it's gone — and so is your audience.
-
-
-
👁
-
No real privacy
-
Your data sits on someone else's servers. They can read it, share it, or hand it over to third parties. Your visitors get tracked by scripts you didn't add.
-
-
-
🔒
-
Vendor lock-in
-
Try exporting your Squarespace site to another platform. Your content, your design, your SEO — all trapped behind a proprietary wall.
-
-
-
💰
-
Platform tax
-
$16/month for Squarespace. $8/month for WordPress.com. And they own the server, the data, and the terms. You're renting.
-
-
-
-
-
-
-
-
-
Live in 45 minutes
-
Four steps. No coding. Copy, paste, done.
-
-
-
1
-
-
Rent a server
-
Sign up with a VPS provider like BuyVM ($3.50/mo) or Vultr ($6/mo). Pick Ubuntu, choose the cheapest plan. Takes 2 minutes.
-
-
-
-
2
-
-
Run one command
-
SSH into your server and paste the install command. It secures your server, installs Docker, and walks you through a setup wizard.
Add an A record in your domain registrar pointing to your server's IP address. The setup wizard tells you exactly what to enter.
-
-
-
-
4
-
-
Launch
-
Run websitebox up. Your site goes live with automatic SSL, a security firewall, and daily backups — all configured for you.
-
-
-
-
-
-
-
-
-
-
Everything included
-
Security, backups, and SSL — preconfigured and automatic.
-
-
-
🔒
-
Automatic SSL
-
Free HTTPS certificate from Let's Encrypt, acquired and renewed automatically. Your visitors always see the padlock.
-
-
-
🛡
-
Security firewall
-
UFW firewall, Fail2ban brute-force protection, Wordfence application firewall, and automatic OS security patches. Hardened out of the box.
-
-
-
💾
-
Automatic backups
-
Daily database backups and weekly full-site backups via UpdraftPlus. Optional remote backup to S3, Backblaze, or Google Drive.
-
-
-
🌐
-
WordPress inside
-
The same CMS that powers 40%+ of all websites. Thousands of themes, plugins, and tutorials. Manage everything from your browser.
-
-
-
👤
-
Age verification
-
Built-in age gate with configurable minimum age. Enable it during setup or toggle it later. Required for some content types.
-
-
-
🔍
-
Fully auditable
-
Every line of code is available for you to read and verify. No telemetry, no analytics, no data collection. Know exactly what's running on your server.
-
-
-
-
-
-
-
-
-
Built for people who need independence
-
WebsiteBox is for anyone who doesn't want a platform between them and their audience.
-
-
-
Content creators
-
Your content is legal but platforms don't want it. Self-host on providers with explicit legal-content policies. Built-in age verification handles compliance.
-
-
-
Journalists & activists
-
Your words, your server. No platform can be pressured to take you down. Zero telemetry means your data stays where you put it.
-
-
-
Privacy advocates
-
No tracking scripts. No third-party analytics. Audit the full source code before you run it. Know exactly what's on your server.
-
-
-
Independent publishers
-
Own your platform instead of renting it. No algorithm changes, no content moderation surprises, no rug pulls. Just your site, running on your terms.
-
-
-
-
-
-
-
-
-
Simple pricing
-
Buy once or subscribe. No hidden fees. Audit the code before you buy.
All plans require a VPS server ($3.50-6/month) and domain name ($1-12/year). You can audit the full source code before purchasing.
-
-
For comparison, platforms that give you less control charge recurring fees: Squarespace $16/mo, WordPress.com $8/mo, Wix $16/mo, GoDaddy $10/mo.
-
-
-
-
-
-
-
-
Frequently asked questions
-
-
- Do I need to know how to code?
-
No. The install process involves copying one command into a terminal and answering a few questions (your domain name, a username, a password). Everything else is automatic. Our step-by-step guide walks you through every click, including how to open a terminal and what SSH is.
-
-
- What can I host on this?
-
Anything legal. WebsiteBox is content-agnostic. It's WordPress under the hood, so you can build portfolios, blogs, galleries, business sites, or anything else WordPress supports. The recommended VPS providers have explicit "legal content" policies — they care about the law, not content type.
-
-
- What if something breaks?
-
Automatic backups run daily. If something goes wrong, restore through the WordPress admin panel. The troubleshooting guide covers common issues, and you can open an issue for help.
-
-
- Can I audit the code before I buy?
-
Yes. Every file is on our Git repository — the install script, Docker configuration, nginx settings, WordPress setup, all of it. Read every line before you purchase. No black boxes.
-
-
- How is this different from WordPress.com?
-
WordPress.com is a hosting service — you rent space on their servers, under their content policies. WebsiteBox puts WordPress on a server you control. No content restrictions beyond the law. No recurring platform fees. No data harvesting. And you can take your site anywhere — it's just a folder on your server.
-
-
- Can I use my own domain?
-
Yes — in fact, you need one. WebsiteBox sets up your site on your own domain (like mysite.com) with a free SSL certificate. If you don't have a domain yet, the guide walks you through buying one from registrars like Porkbun (starting around $1/year).
-
-
- What if my VPS provider shuts me down?
-
Your entire site is in one folder (websitebox-data/). Back it up, spin up a new server with any other provider, restore, and update your DNS. You're not locked into any single host. The recommended providers (BuyVM, Vultr, OVHcloud) have strong track records with diverse content.
-
-
- How do I update WordPress and plugins?
-
WordPress core, themes, and plugins are updated through the normal WordPress admin dashboard — just click "Update" when new versions are available. WebsiteBox infrastructure updates are applied by running ./scripts/update.sh on your server.