[object Object]

← back to Ventura Claw

Migrate canonical hostname to venturaclaw.com

7c714cb5e50f7126ab0c5f01cb47187395e2cc5e · 2026-05-06 11:17:30 -0700 · Steve Abrams

Steve registered venturaclaw.com today and asked to put all builds on it.
Same Express server, new front door:

- Apex A + www CNAME at GoDaddy → 45.61.58.125
- nginx server block + Let's Encrypt SSL on apex + www
- MX/SPF/DKIM/DMARC for venturaclaw.com (mirrors agentabrams.com pattern)
- Domain added to Purelymail; info@venturaclaw.com mailbox provisioned;
  password in secrets-manager as INFO_VENTURACLAW_COM_PASSWORD.
- All venturaclaw.agentabrams.com refs across docs + code swapped to
  venturaclaw.com.
- venturaclaw.agentabrams.com + businessclaw.agentabrams.com both 301
  to venturaclaw.com, except /oauth/* + /healthz which still proxy to
  the app so existing OAuth callback URLs in provider consoles keep
  working.

CC_SECRET note: rotated during this migration after rsync --delete
wiped the .env on Kamatera. Old encrypted credentials.json preserved
as data/credentials.json.pre-rotate-2026-05-06.bak; vault refilled
from secrets-manager via sync-tokens.js (5/14 connectors back, same
as pre-rotation).

Files touched

Diff

commit 7c714cb5e50f7126ab0c5f01cb47187395e2cc5e
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed May 6 11:17:30 2026 -0700

    Migrate canonical hostname to venturaclaw.com
    
    Steve registered venturaclaw.com today and asked to put all builds on it.
    Same Express server, new front door:
    
    - Apex A + www CNAME at GoDaddy → 45.61.58.125
    - nginx server block + Let's Encrypt SSL on apex + www
    - MX/SPF/DKIM/DMARC for venturaclaw.com (mirrors agentabrams.com pattern)
    - Domain added to Purelymail; info@venturaclaw.com mailbox provisioned;
      password in secrets-manager as INFO_VENTURACLAW_COM_PASSWORD.
    - All venturaclaw.agentabrams.com refs across docs + code swapped to
      venturaclaw.com.
    - venturaclaw.agentabrams.com + businessclaw.agentabrams.com both 301
      to venturaclaw.com, except /oauth/* + /healthz which still proxy to
      the app so existing OAuth callback URLs in provider consoles keep
      working.
    
    CC_SECRET note: rotated during this migration after rsync --delete
    wiped the .env on Kamatera. Old encrypted credentials.json preserved
    as data/credentials.json.pre-rotate-2026-05-06.bak; vault refilled
    from secrets-manager via sync-tokens.js (5/14 connectors back, same
    as pre-rotation).
---
 API.md                          | 30 +++++++++++++++---------------
 DEPLOY.md                       | 18 +++++++++---------
 MARKETING.md                    | 10 +++++-----
 relay/server.js                 |  4 ++--
 scripts/populate-credentials.js |  2 +-
 scripts/sync-tokens.js          |  4 ++--
 server/public/homepage.html     | 18 +++++++++---------
 server/public/login.html        | 10 +++++-----
 server/public/oauth-setup.html  |  8 ++++----
 server/server.js                | 10 +++++-----
 10 files changed, 57 insertions(+), 57 deletions(-)

diff --git a/API.md b/API.md
index 2d7ee20..3bb761f 100644
--- a/API.md
+++ b/API.md
@@ -1,6 +1,6 @@
 # VenturaClaw API Reference
 
-Production endpoint: `https://venturaclaw.agentabrams.com`
+Production endpoint: `https://venturaclaw.com`
 
 ---
 
@@ -41,7 +41,7 @@ VenturaClaw uses HMAC-signed cookies for session management. All protected endpo
 
 **curl:**
 ```bash
-curl -X POST https://venturaclaw.agentabrams.com/api/auth/login \
+curl -X POST https://venturaclaw.com/api/auth/login \
   -H "Content-Type: application/json" \
   -d '{"email":"admin@venturaclaw.local","password":"admin"}' \
   -c cookies.txt
@@ -66,7 +66,7 @@ curl -X POST https://venturaclaw.agentabrams.com/api/auth/login \
 
 **curl:**
 ```bash
-curl -X POST https://venturaclaw.agentabrams.com/api/auth/logout \
+curl -X POST https://venturaclaw.com/api/auth/logout \
   -b cookies.txt
 ```
 
@@ -136,7 +136,7 @@ VenturaClaw connectors are pre-built integrations (Stripe, Cloudflare, Shopify,
 
 **curl:**
 ```bash
-curl https://venturaclaw.agentabrams.com/api/connectors \
+curl https://venturaclaw.com/api/connectors \
   -b cookies.txt \
   -H "Accept: application/json"
 ```
@@ -174,7 +174,7 @@ curl https://venturaclaw.agentabrams.com/api/connectors \
 
 **curl:**
 ```bash
-curl https://venturaclaw.agentabrams.com/api/connectors/stripe/health \
+curl https://venturaclaw.com/api/connectors/stripe/health \
   -b cookies.txt
 ```
 
@@ -229,7 +229,7 @@ Users save API keys, OAuth tokens, and other credentials for connectors. All sto
 
 **curl:**
 ```bash
-curl https://venturaclaw.agentabrams.com/api/me/connections \
+curl https://venturaclaw.com/api/me/connections \
   -b cookies.txt
 ```
 
@@ -278,7 +278,7 @@ Fields accepted are defined by the connector's schema in GET /api/me/connections
 
 **curl:**
 ```bash
-curl -X POST https://venturaclaw.agentabrams.com/api/me/connections/stripe \
+curl -X POST https://venturaclaw.com/api/me/connections/stripe \
   -b cookies.txt \
   -H "Content-Type: application/json" \
   -d '{"api_key":"sk_live_...","publishable_key":"pk_live_..."}'
@@ -302,7 +302,7 @@ curl -X POST https://venturaclaw.agentabrams.com/api/me/connections/stripe \
 
 **curl:**
 ```bash
-curl -X DELETE https://venturaclaw.agentabrams.com/api/me/connections/stripe \
+curl -X DELETE https://venturaclaw.com/api/me/connections/stripe \
   -b cookies.txt
 ```
 
@@ -361,7 +361,7 @@ Recognizes 45+ standard environment variables (STRIPE_SECRET_KEY, CLOUDFLARE_API
 
 **curl:**
 ```bash
-curl -X POST https://venturaclaw.agentabrams.com/api/me/connections/import \
+curl -X POST https://venturaclaw.com/api/me/connections/import \
   -b cookies.txt \
   -H "Content-Type: application/json" \
   -d @- << 'EOF'
@@ -396,7 +396,7 @@ VenturaClaw supports 10 OAuth providers (Google, Slack, Stripe Connect, Notion,
       "register_url": "https://console.cloud.google.com/apis/credentials/oauthclient",
       "docs_url": "https://developers.google.com/identity/protocols/oauth2/web-server",
       "note": "Create OAuth 2.0 Client ID · Application type: Web · Authorized redirect URI: paste below.",
-      "redirect_uri": "https://venturaclaw.agentabrams.com/oauth/google/callback",
+      "redirect_uri": "https://venturaclaw.com/oauth/google/callback",
       "has_credentials": true,
       "registered_at": "2026-05-04T10:30:00Z"
     },
@@ -407,7 +407,7 @@ VenturaClaw supports 10 OAuth providers (Google, Slack, Stripe Connect, Notion,
       "registered_at": null
     }
   ],
-  "redirect_uri_pattern": "https://venturaclaw.agentabrams.com/oauth/<vendor>/callback"
+  "redirect_uri_pattern": "https://venturaclaw.com/oauth/<vendor>/callback"
 }
 ```
 
@@ -483,7 +483,7 @@ Creates a temporary cloud browser (expires in 10 min) pre-aimed at the vendor's
   "session_id": "abc-123-def",
   "live_view": "https://api.browserbase.com/debug/abc-123-def",
   "register_url": "https://console.cloud.google.com/apis/credentials/oauthclient",
-  "redirect_uri": "https://venturaclaw.agentabrams.com/oauth/google/callback",
+  "redirect_uri": "https://venturaclaw.com/oauth/google/callback",
   "hint": "Step 1: paste https://console.cloud.google.com/apis/credentials/oauthclient into the cloud browser's address bar. Step 2: register the app, set redirect URI, copy Client ID/Secret. Step 3: paste them back here."
 }
 ```
@@ -537,7 +537,7 @@ User clicks "Connect Google" (or other vendor) on the connections page → this
 ```
 Location: https://accounts.google.com/o/oauth2/v2/auth?
   client_id=...&
-  redirect_uri=https://venturaclaw.agentabrams.com/oauth/google/callback&
+  redirect_uri=https://venturaclaw.com/oauth/google/callback&
   state=<signed-24-byte-token>&
   response_type=code&
   scope=...
@@ -692,7 +692,7 @@ Response:
 
 **curl:**
 ```bash
-curl -X POST https://venturaclaw.agentabrams.com/api/chat \
+curl -X POST https://venturaclaw.com/api/chat \
   -b cookies.txt \
   -H "Content-Type: application/json" \
   -d '{"message":"what is my stripe balance"}'
@@ -1098,7 +1098,7 @@ All data persists to JSON files in `/server/data/`:
 
 ## Public Domain
 
-VenturaClaw is deployed to `https://venturaclaw.agentabrams.com`. All subdomains/paths require SSL. Robots.txt blocks `/admin` and `/api` from search indexing.
+VenturaClaw is deployed to `https://venturaclaw.com`. All subdomains/paths require SSL. Robots.txt blocks `/admin` and `/api` from search indexing.
 
 ---
 
diff --git a/DEPLOY.md b/DEPLOY.md
index 50b188b..be35efe 100644
--- a/DEPLOY.md
+++ b/DEPLOY.md
@@ -1,6 +1,6 @@
 # VenturaClaw — Go-Live Deployment
 
-**Target:** `venturaclaw.agentabrams.com` → Kamatera (45.61.58.125) → port 9788, fronted by nginx + Cloudflare proxy.
+**Target:** `venturaclaw.com` → Kamatera (45.61.58.125) → port 9788, fronted by nginx + Cloudflare proxy.
 
 ## ✅ Done locally
 - Express server live on `127.0.0.1:9788` (pm2 id varies; name `ventura-claw`)
@@ -28,17 +28,17 @@ rsync -av --delete --exclude node_modules --exclude data \
 
 ssh root@45.61.58.125 'cd /root/public-projects/ventura-claw && \
   npm install --omit=dev --silent && \
-  CC_SECRET=$(openssl rand -hex 32) PORT=9788 PUBLIC_DOMAIN=venturaclaw.agentabrams.com \
+  CC_SECRET=$(openssl rand -hex 32) PORT=9788 PUBLIC_DOMAIN=venturaclaw.com \
   pm2 start server.js --name ventura-claw --update-env --time && \
   pm2 save'
 ```
 
 ### 3. nginx site (Kamatera)
 ```bash
-ssh root@45.61.58.125 'cat > /etc/nginx/sites-available/venturaclaw.agentabrams.com <<NGINX
+ssh root@45.61.58.125 'cat > /etc/nginx/sites-available/venturaclaw.com <<NGINX
 server {
   listen 80;
-  server_name venturaclaw.agentabrams.com;
+  server_name venturaclaw.com;
   location / {
     proxy_pass http://127.0.0.1:9788;
     proxy_http_version 1.1;
@@ -50,20 +50,20 @@ server {
   }
 }
 NGINX
-ln -sf /etc/nginx/sites-available/venturaclaw.agentabrams.com /etc/nginx/sites-enabled/
+ln -sf /etc/nginx/sites-available/venturaclaw.com /etc/nginx/sites-enabled/
 nginx -t && systemctl reload nginx'
 ```
 
 ### 4. SSL — Cloudflare proxy = origin doesn't need a real cert (Flexible mode acceptable for v1).
 For Full(Strict) later:
 ```bash
-ssh root@45.61.58.125 'certbot --nginx -d venturaclaw.agentabrams.com -n --agree-tos -m info@agentabrams.com'
+ssh root@45.61.58.125 'certbot --nginx -d venturaclaw.com -n --agree-tos -m info@agentabrams.com'
 ```
 
 ### 5. Smoke test
 ```bash
-curl -sI https://venturaclaw.agentabrams.com/healthz
-curl -s  https://venturaclaw.agentabrams.com/login | grep -o '<title>.*</title>'
+curl -sI https://venturaclaw.com/healthz
+curl -s  https://venturaclaw.com/login | grep -o '<title>.*</title>'
 ```
 
 ### 6. Per Steve's standing rule: dedupe sites-enabled
@@ -73,7 +73,7 @@ ssh root@45.61.58.125 'ls -la /etc/nginx/sites-enabled/ | grep -E "\.(bak|old)$"
 ```
 
 ## Production checklist (Steve's rules)
-- [x] info@<domain> surfaced — footer says `info@agentabrams.com` (umbrella). Add MX/forwarder for `info@venturaclaw.agentabrams.com` if you want a dedicated mailbox.
+- [x] info@<domain> surfaced — footer says `info@agentabrams.com` (umbrella). Add MX/forwarder for `info@venturaclaw.com` if you want a dedicated mailbox.
 - [ ] Verify nginx proxy_pass port 9788 matches pm2 PORT after deploy
 - [ ] Test admin + user login + a chat-triggered approval flow end-to-end
 - [ ] Add to `~/cncp-starter/cncp-config.json` domains[]
diff --git a/MARKETING.md b/MARKETING.md
index ad2847e..7e047b1 100644
--- a/MARKETING.md
+++ b/MARKETING.md
@@ -10,7 +10,7 @@
 >
 > Try the live demo on the homepage — type a command, watch the 56-connector grid light up the matched tile. No login needed for the demo. The classifier runs on my hardware, not OpenAI/Anthropic.
 >
-> https://venturaclaw.agentabrams.com/
+> https://venturaclaw.com/
 >
 > Stack: Express + JSON store (will be PG when user count crosses 5), local Ollama qwen3:14b for routing (zero per-request inference cost), AES-256-GCM at rest, Browserbase for OAuth-app registration sandbox. Single-file HTML pages, no SPA, no SDK to install.
 >
@@ -28,7 +28,7 @@
 
 ## Twitter / X announce (280 chars)
 
-> VenturaClaw is live: type one sentence ("refund order 1234 on shopify"), the local LLM picks the right SaaS tool from 56 wired connectors, runs it. Sensitive actions gated by approval queue. No workflow builder. No third-party LLM. https://venturaclaw.agentabrams.com/
+> VenturaClaw is live: type one sentence ("refund order 1234 on shopify"), the local LLM picks the right SaaS tool from 56 wired connectors, runs it. Sensitive actions gated by approval queue. No workflow builder. No third-party LLM. https://venturaclaw.com/
 
 ---
 
@@ -39,7 +39,7 @@
 **Body:**
 Hey IH,
 
-I just shipped VenturaClaw at https://venturaclaw.agentabrams.com/. Quick summary:
+I just shipped VenturaClaw at https://venturaclaw.com/. Quick summary:
 
 **The problem:** Zapier, Make, n8n all sell you the *canvas*. You drag triggers to actions, wire them up, maintain them. The actual job is one English sentence; the canvas is a tax.
 
@@ -64,12 +64,12 @@ Looking for feedback on: the demo UX (does it feel responsive enough?), the home
 
 After verifying domain ownership in Google Search Console (DNS TXT or HTML meta tag — DNS is cleaner; add at Cloudflare):
 
-1. Search Console → Sitemaps → Add: `https://venturaclaw.agentabrams.com/sitemap.xml`
+1. Search Console → Sitemaps → Add: `https://venturaclaw.com/sitemap.xml`
 2. Bing Webmaster Tools → Sitemaps → same URL
 3. IndexNow (faster Bing/Yandex indexing): the GET below pings them with the changed URLs
 
 ```bash
-curl "https://www.bing.com/indexnow?url=https://venturaclaw.agentabrams.com/&key=KEY-FILE-NAME"
+curl "https://www.bing.com/indexnow?url=https://venturaclaw.com/&key=KEY-FILE-NAME"
 ```
 (IndexNow needs a key file at `/<KEY>.txt` containing the key as proof of ownership — set up later)
 
diff --git a/relay/server.js b/relay/server.js
index b8a91ea..f8d83d0 100644
--- a/relay/server.js
+++ b/relay/server.js
@@ -126,7 +126,7 @@ const HTML = `<!doctype html>
     <p style="font-size:13px;opacity:0.78;line-height:1.6;margin:8px 0 0">
       One paste writes <code>KEY=value</code> lines to <code>~/Projects/secrets-manager/.env</code>
       AND immediately triggers <code>com.steve.venturaclaw-sync</code> so the
-      <a href="https://venturaclaw.agentabrams.com/admin/connectors" style="color:var(--gold)">VenturaClaw connectors page</a>
+      <a href="https://venturaclaw.com/admin/connectors" style="color:var(--gold)">VenturaClaw connectors page</a>
       flips tiles green within seconds. From this moment on, the launchd job keeps everything in sync — no further pasting ever.
     </p>
   </div>
@@ -175,7 +175,7 @@ save.addEventListener("click", async () => {
     html += '<div class="ok">✓ secrets-manager: ' + d.added + ' added · ' + d.updated + ' updated</div>';
     html += '<div class="info">→ launching com.steve.venturaclaw-sync…</div>';
     html += d.synced ? '<div class="ok">✓ launchd triggered</div>' : '<div class="err">✗ launchd: ' + (d.syncError || 'failed') + '</div>';
-    html += '<div class="info" style="margin-top:8px">— now reload <a href="https://venturaclaw.agentabrams.com/admin/connectors" style="color:var(--gold)">/admin/connectors</a> in 5 sec —</div>';
+    html += '<div class="info" style="margin-top:8px">— now reload <a href="https://venturaclaw.com/admin/connectors" style="color:var(--gold)">/admin/connectors</a> in 5 sec —</div>';
     results.innerHTML = html;
     save.textContent = "Saved";
     setTimeout(() => { save.textContent = "Save & sync"; save.disabled = false; }, 2000);
diff --git a/scripts/populate-credentials.js b/scripts/populate-credentials.js
index f205be9..96c46f5 100644
--- a/scripts/populate-credentials.js
+++ b/scripts/populate-credentials.js
@@ -176,7 +176,7 @@ console.log("merged users -> " + stats + "  (backup: " + bak + ")");
       execSync(`ssh root@45.61.58.125 "node -e \\"${mergeScript}\\""`, { stdio: 'inherit' });
       // Restart + post-deploy health check (200 or 401 = healthy; 502 = process didn't bind)
       execSync(`ssh root@45.61.58.125 "pm2 restart ventura-claw --update-env >/dev/null && sleep 8 && S=\\$(curl -o /dev/null -s -w '%{http_code}' http://127.0.0.1:9788/api/connectors); if [ \\"\\$S\\" != \\"200\\" ] && [ \\"\\$S\\" != \\"401\\" ]; then echo \\"DEPLOY HEALTH FAIL: HTTP \\$S\\" >&2; exit 1; fi; echo Health: \\$S"`, { stdio: 'inherit' });
-      console.log(`\n✓ Live on https://venturaclaw.agentabrams.com`);
+      console.log(`\n✓ Live on https://venturaclaw.com`);
     } catch (e) {
       console.error(`\n✗ Deploy failed: ${e.message}`);
       console.error(`  Backup is at /var/backups/ventura-claw/credentials.<ts>.json on Kamatera.`);
diff --git a/scripts/sync-tokens.js b/scripts/sync-tokens.js
index 2535ee7..1178a1f 100755
--- a/scripts/sync-tokens.js
+++ b/scripts/sync-tokens.js
@@ -1,14 +1,14 @@
 #!/usr/bin/env node
 // VenturaClaw — token sync agent.
 // Runs locally on Steve's Mac (launchd com.steve.venturaclaw-sync).
-// Reads ~/.claude.json MCP env + ~/Projects/secrets-manager/.env, POSTs to https://venturaclaw.agentabrams.com
+// Reads ~/.claude.json MCP env + ~/Projects/secrets-manager/.env, POSTs to https://venturaclaw.com
 // Token values NEVER leave Steve's machine except to land in his own VenturaClaw account.
 
 const fs = require("fs");
 const path = require("path");
 const os = require("os");
 
-const PROD  = process.env.BC_URL  || "https://venturaclaw.agentabrams.com";
+const PROD  = process.env.BC_URL  || "https://venturaclaw.com";
 const EMAIL = process.env.BC_USER || "steve@venturaclaw.local";
 const PASS  = process.env.BC_PASS || "149940c2c5b209fb";
 const LOG   = path.join(os.homedir(), "Projects", "ventura-claw", "logs", "sync.log");
diff --git a/server/public/homepage.html b/server/public/homepage.html
index b5c9b31..dd47262 100644
--- a/server/public/homepage.html
+++ b/server/public/homepage.html
@@ -7,19 +7,19 @@
 <meta name="theme-color" content="#0e0e10" />
 <title>VenturaClaw — One AI command runs 56 SaaS tools</title>
 <meta name="description" content="Type one sentence. The AI picks the right SaaS tool — Stripe, Shopify, Slack, Cloudflare, HubSpot — and runs the action. 56 connectors out of the box. Encrypted at rest, audit-trailed, sensitive actions gated by approval." />
-<link rel="canonical" href="https://venturaclaw.agentabrams.com/" />
+<link rel="canonical" href="https://venturaclaw.com/" />
 <meta property="og:type" content="website" />
 <meta property="og:title" content="VenturaClaw — One AI command runs 56 SaaS tools" />
 <meta property="og:description" content="Type one sentence. The AI picks the tool and runs the action. 56 connectors. Zero workflow-building." />
-<meta property="og:url" content="https://venturaclaw.agentabrams.com/" />
-<meta property="og:image" content="https://venturaclaw.agentabrams.com/static/og-cover.svg" />
+<meta property="og:url" content="https://venturaclaw.com/" />
+<meta property="og:image" content="https://venturaclaw.com/static/og-cover.svg" />
 <meta property="og:site_name" content="VenturaClaw" />
 <meta name="twitter:card" content="summary_large_image" />
 <meta name="twitter:title" content="VenturaClaw — One AI command runs 56 SaaS tools" />
 <meta name="twitter:description" content="Type one sentence. The AI picks the tool and runs the action." />
-<meta name="twitter:image" content="https://venturaclaw.agentabrams.com/static/og-cover.svg" />
+<meta name="twitter:image" content="https://venturaclaw.com/static/og-cover.svg" />
 <script type="application/ld+json">
-{"@context":"https://schema.org","@type":"SoftwareApplication","name":"VenturaClaw","applicationCategory":"BusinessApplication","operatingSystem":"Web","description":"AI agent that routes natural-language commands to 56 business connectors including Stripe, Shopify, Slack, Cloudflare, Notion, HubSpot, and Discord. Encrypted at rest, audit-trailed, with a sensitive-action approval queue.","url":"https://venturaclaw.agentabrams.com","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"publisher":{"@type":"Organization","name":"Steve Abrams","email":"info@venturaclaw.agentabrams.com"}}
+{"@context":"https://schema.org","@type":"SoftwareApplication","name":"VenturaClaw","applicationCategory":"BusinessApplication","operatingSystem":"Web","description":"AI agent that routes natural-language commands to 56 business connectors including Stripe, Shopify, Slack, Cloudflare, Notion, HubSpot, and Discord. Encrypted at rest, audit-trailed, with a sensitive-action approval queue.","url":"https://venturaclaw.com","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"publisher":{"@type":"Organization","name":"Steve Abrams","email":"info@venturaclaw.com"}}
 </script>
 <link rel="stylesheet" href="/static/style.css" />
 <link rel="stylesheet" href="/static/homepage.css" />
@@ -62,7 +62,7 @@
     <div class="demo-presets">
       <button type="button" class="demo-preset" data-preset="post in #launch on slack saying we shipped">Slack post</button>
       <button type="button" class="demo-preset" data-preset="refund order 1234 on shopify">Shopify refund</button>
-      <button type="button" class="demo-preset" data-preset="purge cloudflare cache for venturaclaw.agentabrams.com">Cloudflare purge</button>
+      <button type="button" class="demo-preset" data-preset="purge cloudflare cache for venturaclaw.com">Cloudflare purge</button>
       <button type="button" class="demo-preset" data-preset="add a row to my hubspot deals pipeline">HubSpot CRM</button>
       <button type="button" class="demo-preset" data-preset="send a message to the team">Ambiguous (watch it ask)</button>
     </div>
@@ -174,7 +174,7 @@ audit log #4827 written ✓</pre>
     <details class="faq-item"><summary>What if the AI picks the wrong tool?</summary><p>Sensitive actions (refunds, posts, DNS edits, deletions) land in an approval queue with the parsed intent shown in plain English. Read it. Approve or reject. Reads execute immediately because they don't change state.</p></details>
     <details class="faq-item"><summary>How does this differ from Zapier or Make?</summary><p>Those are workflow builders — you wire triggers to actions on a canvas, then maintain the wires. VenturaClaw is the opposite: type one sentence, the AI picks the connector. No canvas, no Zaps to maintain, no per-task pricing.</p></details>
     <details class="faq-item"><summary>What's the pricing?</summary><p>Currently free while in early access. The eventual model will be a flat workspace fee (no per-task metering, no credit math). If pricing changes, you'll get 30 days notice and can export your audit log + connector registrations on the way out.</p></details>
-    <details class="faq-item"><summary>Can I self-host?</summary><p>Not yet packaged for distribution. The architecture is a single Node process + JSON store + local Ollama, so it's straightforward to lift — email <a href="mailto:info@venturaclaw.agentabrams.com" style="color:var(--gold)">info@venturaclaw.agentabrams.com</a> if you want the Docker recipe.</p></details>
+    <details class="faq-item"><summary>Can I self-host?</summary><p>Not yet packaged for distribution. The architecture is a single Node process + JSON store + local Ollama, so it's straightforward to lift — email <a href="mailto:info@venturaclaw.com" style="color:var(--gold)">info@venturaclaw.com</a> if you want the Docker recipe.</p></details>
     <details class="faq-item"><summary>What if I want a connector that's not in the 56?</summary><p>Most modern SaaS tools speak OAuth2 + REST and slot in cleanly. Tell us what you need; new connectors typically ship in 1-3 days. Anything that exposes a webhook can be wired the same week.</p></details>
     <details class="faq-item"><summary>Is this production-ready?</summary><p>Encryption-at-rest, atomic writes with fsync, audit trail, sensitive-action approval queue, CSP+HSTS, rate limits — yes, by mainstream-SaaS standards. We're early-access because the connector matrix and UX are still hardening, not because the security floor is.</p></details>
   </div>
@@ -196,7 +196,7 @@ audit log #4827 written ✓</pre>
   <h2>Skip the canvas. <em>Just type.</em></h2>
   <div class="cta-row">
     <a href="/login" class="btn-cta">Sign in →</a>
-    <a href="mailto:info@venturaclaw.agentabrams.com" class="btn-cta btn-cta-ghost">Talk to Steve</a>
+    <a href="mailto:info@venturaclaw.com" class="btn-cta btn-cta-ghost">Talk to Steve</a>
   </div>
 </section>
 
@@ -208,7 +208,7 @@ audit log #4827 written ✓</pre>
     <a href="/privacy">Privacy</a>
     <a href="/terms">Terms</a>
     <a href="/sitemap.xml">Sitemap</a>
-    <a href="mailto:info@venturaclaw.agentabrams.com">info@venturaclaw.agentabrams.com</a>
+    <a href="mailto:info@venturaclaw.com">info@venturaclaw.com</a>
     <a href="/login">Sign in</a>
   </div>
 </footer>
diff --git a/server/public/login.html b/server/public/login.html
index bd6bfde..3442567 100644
--- a/server/public/login.html
+++ b/server/public/login.html
@@ -5,19 +5,19 @@
 <meta name="theme-color" content="#0e0e10" />
 <title>VenturaClaw — AI agent for 56 business connectors</title>
 <meta name="description" content="Connect Stripe, Shopify, Slack, and 53 more SaaS tools to one AI command line. Run actions across your entire stack with sensitive-action approvals + audit trail." />
-<link rel="canonical" href="https://venturaclaw.agentabrams.com/" />
+<link rel="canonical" href="https://venturaclaw.com/" />
 <meta property="og:type" content="website" />
 <meta property="og:title" content="VenturaClaw — AI agent for 56 business connectors" />
 <meta property="og:description" content="Connect Stripe, Shopify, Slack, and 53 more SaaS tools to one AI command line." />
-<meta property="og:url" content="https://venturaclaw.agentabrams.com/" />
-<meta property="og:image" content="https://venturaclaw.agentabrams.com/static/og-cover.png" />
+<meta property="og:url" content="https://venturaclaw.com/" />
+<meta property="og:image" content="https://venturaclaw.com/static/og-cover.png" />
 <meta property="og:site_name" content="VenturaClaw" />
 <meta name="twitter:card" content="summary_large_image" />
 <meta name="twitter:title" content="VenturaClaw — AI agent for 56 business connectors" />
 <meta name="twitter:description" content="Connect Stripe, Shopify, Slack, and 53 more SaaS tools to one AI command line." />
-<meta name="twitter:image" content="https://venturaclaw.agentabrams.com/static/og-cover.png" />
+<meta name="twitter:image" content="https://venturaclaw.com/static/og-cover.png" />
 <script type="application/ld+json">
-{"@context":"https://schema.org","@type":"SoftwareApplication","name":"VenturaClaw","applicationCategory":"BusinessApplication","description":"AI agent that runs actions across 56 business connectors including Stripe, Shopify, Slack, Cloudflare, Notion, HubSpot, and Discord.","operatingSystem":"Web","url":"https://venturaclaw.agentabrams.com","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"publisher":{"@type":"Organization","name":"Steve Abrams","email":"info@venturaclaw.agentabrams.com"}}
+{"@context":"https://schema.org","@type":"SoftwareApplication","name":"VenturaClaw","applicationCategory":"BusinessApplication","description":"AI agent that runs actions across 56 business connectors including Stripe, Shopify, Slack, Cloudflare, Notion, HubSpot, and Discord.","operatingSystem":"Web","url":"https://venturaclaw.com","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"publisher":{"@type":"Organization","name":"Steve Abrams","email":"info@venturaclaw.com"}}
 </script>
 <link rel="stylesheet" href="/static/style.css" />
 </head><body>
diff --git a/server/public/oauth-setup.html b/server/public/oauth-setup.html
index 3a692d3..6b310e3 100644
--- a/server/public/oauth-setup.html
+++ b/server/public/oauth-setup.html
@@ -55,12 +55,12 @@
     <div class="sub">Register vendor apps · paste credentials · users connect with one click</div>
   </div>
 
-  <p class="setup-lede">Each vendor below needs a one-time <em style="color:var(--gold)">OAuth app registration</em> in their developer portal. Use <code style="font-family:var(--mono);font-size:14px;color:var(--gold)">info@venturaclaw.agentabrams.com</code> as the contact email everywhere. After registering, paste the Client ID + Client Secret here. Users then connect with a single button click.</p>
+  <p class="setup-lede">Each vendor below needs a one-time <em style="color:var(--gold)">OAuth app registration</em> in their developer portal. Use <code style="font-family:var(--mono);font-size:14px;color:var(--gold)">info@venturaclaw.com</code> as the contact email everywhere. After registering, paste the Client ID + Client Secret here. Users then connect with a single button click.</p>
 
   <div class="contact">
     <b>Default contact email →</b>
-    <code style="font-family:var(--mono);font-size:13px;color:var(--ink)">info@venturaclaw.agentabrams.com</code>
-    <button onclick="navigator.clipboard.writeText('info@venturaclaw.agentabrams.com')" class="copy" style="font-family:var(--mono);font-size:9px;padding:4px 10px;background:transparent;border:1px solid var(--rule);color:var(--ink-soft);cursor:pointer;border-radius:2px">Copy</button>
+    <code style="font-family:var(--mono);font-size:13px;color:var(--ink)">info@venturaclaw.com</code>
+    <button onclick="navigator.clipboard.writeText('info@venturaclaw.com')" class="copy" style="font-family:var(--mono);font-size:9px;padding:4px 10px;background:transparent;border:1px solid var(--rule);color:var(--ink-soft);cursor:pointer;border-radius:2px">Copy</button>
   </div>
 
   <div id="providers" role="region" aria-label="OAuth providers" aria-live="polite"></div>
@@ -87,7 +87,7 @@ async function loadProviders() {
 
       <div class="steps">
         <span class="num">1</span>
-        <span class="lbl"><b>Open</b> ${esc(p.name)} developer portal as <code>info@venturaclaw.agentabrams.com</code></span>
+        <span class="lbl"><b>Open</b> ${esc(p.name)} developer portal as <code>info@venturaclaw.com</code></span>
         <span style="display:flex;gap:6px">
           <a href="${escAttr(p.register_url)}" target="_blank" rel="noopener" class="btn btn-primary" style="font-family:var(--mono);font-size:9px;padding:6px 14px">Open ↗</a>
           <button data-vendor="${escAttr(p.id)}" class="btn launch-bb" style="font-family:var(--mono);font-size:9px;padding:6px 14px;border-color:var(--gold);color:var(--gold)" title="Cloud browser — isolated, no cookie pollution, auto-expires in 1hr">☁ Cloud →</button>
diff --git a/server/server.js b/server/server.js
index 7367341..98e6c07 100644
--- a/server/server.js
+++ b/server/server.js
@@ -56,8 +56,8 @@ if (process.env.NODE_ENV === "production" && SECRET === "ventura-claw-dev-secret
   console.error("FATAL: CC_SECRET is the dev default in production — refusing to boot. Set CC_SECRET in env (32+ random chars).");
   process.exit(1);
 }
-const DOMAIN = process.env.PUBLIC_DOMAIN || "venturaclaw.agentabrams.com";
-const SUPPORT_EMAIL = process.env.SUPPORT_EMAIL || "info@venturaclaw.agentabrams.com";
+const DOMAIN = process.env.PUBLIC_DOMAIN || "venturaclaw.com";
+const SUPPORT_EMAIL = process.env.SUPPORT_EMAIL || "info@venturaclaw.com";
 
 // HTML-escape — used in OAuth error pages where vendor responses are echoed
 const esc = (s) => String(s == null ? "" : s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
@@ -526,7 +526,7 @@ app.post("/api/admin/cache/prime", requireAdmin, async (req, res) => {
   const presets = [
     "post in #launch on slack saying we shipped",
     "refund order 1234 on shopify",
-    "purge cloudflare cache for venturaclaw.agentabrams.com",
+    "purge cloudflare cache for venturaclaw.com",
     "add a row to my hubspot deals pipeline",
     "send a message to the team",
   ];
@@ -764,7 +764,7 @@ function _renderConnectorPage(c) {
     crm: [`add John Doe to ${c.name} as a lead`, `find ${c.name} contacts at Acme Corp`, `update deal stage to Closed-Won`],
     email: [`send a welcome email via ${c.name}`, `pause the welcome ${c.name} campaign`, `add subscriber to "VIPs" list`],
     docs: [`create a ${c.name} doc titled "Q4 Plan"`, `find the ${c.name} page about onboarding`, `share doc with team`],
-    infra: [`purge ${c.name} cache for venturaclaw.agentabrams.com`, `list ${c.name} DNS records for example.com`, `add an A record`],
+    infra: [`purge ${c.name} cache for venturaclaw.com`, `list ${c.name} DNS records for example.com`, `add an A record`],
     storage: [`upload report.pdf to ${c.name}`, `list files in ${c.name} /reports/`, `share folder with steve@`],
     analytics: [`show this week's ${c.name} top pages`, `compare last 7d vs prior 7d`, `export the funnel to CSV`],
     social: [`post to ${c.name} with this image`, `schedule a ${c.name} post for Friday 9am`, `find recent ${c.name} comments`],
@@ -2002,7 +2002,7 @@ app.listen(PORT, HOST, () => {
     const presets = [
       "post in #launch on slack saying we shipped",
       "refund order 1234 on shopify",
-      "purge cloudflare cache for venturaclaw.agentabrams.com",
+      "purge cloudflare cache for venturaclaw.com",
       "add a row to my hubspot deals pipeline",
       "send a message to the team",
     ];

← 5f60f03 Purge remaining businessclaw / commerce-claw refs across doc  ·  back to Ventura Claw  ·  Drop the .local pseudo-TLD from demo accounts 3911073 →