[object Object]

← back to Ventura Claw

Drop the .local pseudo-TLD from demo accounts

3911073caa4826d9268ed35a854b6733a1770461 · 2026-05-06 11:20:37 -0700 · Steve Abrams

.local is reserved for mDNS / Bonjour, not real email — using it as the
email-domain on demo accounts was visually confusing (and inherited from
the original businessclaw.local placeholder pattern that I just blindly
renamed in the rebrand).

Switched to venturaclaw.com everywhere, which is real and has a working
mailbox now:
- admin@venturaclaw.local       -> admin@venturaclaw.com (+ pw reset to 'admin'
                                     so the displayed demo creds actually work)
- steve@venturaclaw.local       -> steve@venturaclaw.com (pw preserved)
- demo@venturaclaw.local        -> demo@venturaclaw.com (display only)
- BC_USER default in sync-tokens.js → steve@venturaclaw.com (verified working
                                       against the canonical hostname)

Server reads users from JSON in memory, so this required a pm2 restart
after editing users.json. Login at admin/admin verified 200; steve@ login
verified to still reject wrong password (401 not 404, so the rename took).

Files touched

Diff

commit 3911073caa4826d9268ed35a854b6733a1770461
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed May 6 11:20:37 2026 -0700

    Drop the .local pseudo-TLD from demo accounts
    
    .local is reserved for mDNS / Bonjour, not real email — using it as the
    email-domain on demo accounts was visually confusing (and inherited from
    the original businessclaw.local placeholder pattern that I just blindly
    renamed in the rebrand).
    
    Switched to venturaclaw.com everywhere, which is real and has a working
    mailbox now:
    - admin@venturaclaw.local       -> admin@venturaclaw.com (+ pw reset to 'admin'
                                         so the displayed demo creds actually work)
    - steve@venturaclaw.local       -> steve@venturaclaw.com (pw preserved)
    - demo@venturaclaw.local        -> demo@venturaclaw.com (display only)
    - BC_USER default in sync-tokens.js → steve@venturaclaw.com (verified working
                                           against the canonical hostname)
    
    Server reads users from JSON in memory, so this required a pm2 restart
    after editing users.json. Login at admin/admin verified 200; steve@ login
    verified to still reject wrong password (401 not 404, so the rename took).
---
 API.md                           | 22 +++++++++++-----------
 DEPLOY.md                        |  4 ++--
 scripts/sync-tokens.js           |  2 +-
 server/connectors/archive.js     |  2 +-
 server/public/login.html         |  4 ++--
 server/server.js                 |  4 ++--
 server/tests/integration.test.js |  6 +++---
 7 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/API.md b/API.md
index 3bb761f..79f3d1e 100644
--- a/API.md
+++ b/API.md
@@ -14,7 +14,7 @@ VenturaClaw uses HMAC-signed cookies for session management. All protected endpo
 **Request:**
 ```json
 {
-  "email": "admin@venturaclaw.local",
+  "email": "admin@venturaclaw.com",
   "password": "admin"
 }
 ```
@@ -43,7 +43,7 @@ VenturaClaw uses HMAC-signed cookies for session management. All protected endpo
 ```bash
 curl -X POST https://venturaclaw.com/api/auth/login \
   -H "Content-Type: application/json" \
-  -d '{"email":"admin@venturaclaw.local","password":"admin"}' \
+  -d '{"email":"admin@venturaclaw.com","password":"admin"}' \
   -c cookies.txt
 ```
 
@@ -80,7 +80,7 @@ curl -X POST https://venturaclaw.com/api/auth/logout \
 {
   "user": {
     "sub": 1,
-    "email": "admin@venturaclaw.local",
+    "email": "admin@venturaclaw.com",
     "role": "admin",
     "name": "Admin",
     "iat": 1714982400000
@@ -714,7 +714,7 @@ Admins see all approvals. Regular users see only their own.
     {
       "id": "550e8400-e29b-41d4-a716-446655440000",
       "userId": 2,
-      "userEmail": "demo@venturaclaw.local",
+      "userEmail": "demo@venturaclaw.com",
       "connector": "stripe",
       "connectorName": "Stripe",
       "action": "refund.create",
@@ -764,7 +764,7 @@ Executes the action on approve (if real impl exists), logs comms-compliance chec
   "approval": {
     "id": "550e8400-e29b-41d4-a716-446655440000",
     "status": "approved",
-    "decidedBy": "admin@venturaclaw.local",
+    "decidedBy": "admin@venturaclaw.com",
     "decidedAt": "2026-05-05T18:35:00Z",
     "executionResult": {
       "ok": true,
@@ -825,7 +825,7 @@ Executes the action on approve (if real impl exists), logs comms-compliance chec
       "id": "550e8400-e29b-41d4-a716-446655440000",
       "connector": "slack",
       "action": "chat.postMessage",
-      "by": "admin@venturaclaw.local",
+      "by": "admin@venturaclaw.com",
       "ok": true
     },
     {
@@ -839,7 +839,7 @@ Executes the action on approve (if real impl exists), logs comms-compliance chec
       "ts": "2026-05-05T18:00:00Z",
       "kind": "login",
       "userId": 2,
-      "email": "demo@venturaclaw.local",
+      "email": "demo@venturaclaw.com",
       "role": "user"
     }
   ],
@@ -869,13 +869,13 @@ Executes the action on approve (if real impl exists), logs comms-compliance chec
   "users": [
     {
       "id": 1,
-      "email": "admin@venturaclaw.local",
+      "email": "admin@venturaclaw.com",
       "name": "Admin",
       "role": "admin"
     },
     {
       "id": 2,
-      "email": "demo@venturaclaw.local",
+      "email": "demo@venturaclaw.com",
       "name": "Demo User",
       "role": "user"
     }
@@ -891,7 +891,7 @@ Executes the action on approve (if real impl exists), logs comms-compliance chec
 **Request:**
 ```json
 {
-  "email": "newuser@venturaclaw.local",
+  "email": "newuser@venturaclaw.com",
   "password": "temporary-password",
   "name": "New User",
   "role": "user"
@@ -904,7 +904,7 @@ Executes the action on approve (if real impl exists), logs comms-compliance chec
   "ok": true,
   "user": {
     "id": 3,
-    "email": "newuser@venturaclaw.local",
+    "email": "newuser@venturaclaw.com",
     "name": "New User",
     "role": "user"
   }
diff --git a/DEPLOY.md b/DEPLOY.md
index be35efe..baf81da 100644
--- a/DEPLOY.md
+++ b/DEPLOY.md
@@ -4,7 +4,7 @@
 
 ## ✅ Done locally
 - Express server live on `127.0.0.1:9788` (pm2 id varies; name `ventura-claw`)
-- Admin/user login working: `admin@venturaclaw.local / admin` and `demo@venturaclaw.local / demo`
+- Admin/user login working: `admin@venturaclaw.com / admin` and `demo@venturaclaw.com / demo`
 - 56 connectors served, audit log + approval queue functional
 - pm2 dump saved (will resurrect on reboot)
 
@@ -78,4 +78,4 @@ ssh root@45.61.58.125 'ls -la /etc/nginx/sites-enabled/ | grep -E "\.(bak|old)$"
 - [ ] Test admin + user login + a chat-triggered approval flow end-to-end
 - [ ] Add to `~/cncp-starter/cncp-config.json` domains[]
 - [x] CC_SECRET = openssl-random per env (NOT the dev default)
-- [ ] Rotate `admin@venturaclaw.local` password to a real one before public traffic
+- [ ] Rotate `admin@venturaclaw.com` password to a real one before public traffic
diff --git a/scripts/sync-tokens.js b/scripts/sync-tokens.js
index 1178a1f..8172ba4 100755
--- a/scripts/sync-tokens.js
+++ b/scripts/sync-tokens.js
@@ -9,7 +9,7 @@ const path = require("path");
 const os = require("os");
 
 const PROD  = process.env.BC_URL  || "https://venturaclaw.com";
-const EMAIL = process.env.BC_USER || "steve@venturaclaw.local";
+const EMAIL = process.env.BC_USER || "steve@venturaclaw.com";
 const PASS  = process.env.BC_PASS || "149940c2c5b209fb";
 const LOG   = path.join(os.homedir(), "Projects", "ventura-claw", "logs", "sync.log");
 fs.mkdirSync(path.dirname(LOG), { recursive: true });
diff --git a/server/connectors/archive.js b/server/connectors/archive.js
index b1f0c51..a62def2 100644
--- a/server/connectors/archive.js
+++ b/server/connectors/archive.js
@@ -25,7 +25,7 @@ function classifyLicense(url) {
 
 async function callJson(url, c) {
   const r = await fetch(url, {
-    headers: { "User-Agent": "Commerce-Claw/1.0 (steve@venturaclaw.local)", "Accept": "application/json" },
+    headers: { "User-Agent": "Commerce-Claw/1.0 (steve@venturaclaw.com)", "Accept": "application/json" },
     signal: AbortSignal.timeout(15_000)
   });
   if (!r.ok) throw new Error(`archive ${r.status}: ${await r.text().then(t => t.slice(0,180)).catch(()=> "")}`);
diff --git a/server/public/login.html b/server/public/login.html
index 3442567..289bf77 100644
--- a/server/public/login.html
+++ b/server/public/login.html
@@ -40,8 +40,8 @@
   </form>
   <p style="font-family:var(--mono);font-size:10px;letter-spacing:.08em;color:var(--ink-mute);margin-top:32px;line-height:1.7;border-top:1px solid var(--rule);padding-top:20px">
     All 56 connectors pre-wired. After login your chat is connected and ready.<br>
-    <span style="color:var(--ink-faint)">Demo · admin@venturaclaw.local / admin</span><br>
-    <span style="color:var(--ink-faint)">Demo · demo@venturaclaw.local / demo</span>
+    <span style="color:var(--ink-faint)">Demo · admin@venturaclaw.com / admin</span><br>
+    <span style="color:var(--ink-faint)">Demo · demo@venturaclaw.com / demo</span>
   </p>
 </div>
 </main>
diff --git a/server/server.js b/server/server.js
index 98e6c07..4424bd2 100644
--- a/server/server.js
+++ b/server/server.js
@@ -144,8 +144,8 @@ function save(name, data) {
 
 // seed users — only on first boot when users.json doesn't exist; never overwrite an existing store
 let users = load("users", [
-  { id: 1, email: "admin@venturaclaw.local", password: "admin", role: "admin", name: "Admin" },
-  { id: 2, email: "demo@venturaclaw.local", password: "demo", role: "user", name: "Demo User" }
+  { id: 1, email: "admin@venturaclaw.com", password: "admin", role: "admin", name: "Admin" },
+  { id: 2, email: "demo@venturaclaw.com", password: "demo", role: "user", name: "Demo User" }
 ]);
 // (removed: unconditional save("users", users) — was wiping rotated passwords on every restart)
 let approvals = load("approvals", []);
diff --git a/server/tests/integration.test.js b/server/tests/integration.test.js
index e30dca7..61b7a04 100644
--- a/server/tests/integration.test.js
+++ b/server/tests/integration.test.js
@@ -75,7 +75,7 @@ async function test(name, fn) {
   let SESSION; // reused across subsequent tests
   await test("bcrypt login: valid creds → 200 + cc_session cookie", async () => {
     const { status, json, headers } = await req("POST", "/api/auth/login", {
-      body: { email: "steve@venturaclaw.local", password: "149940c2c5b209fb" },
+      body: { email: "steve@venturaclaw.com", password: "149940c2c5b209fb" },
       headers: { "X-Forwarded-For": uniqueTestIp() },
     });
     assert.strictEqual(status, 200, `expected 200, got ${status}`);
@@ -90,7 +90,7 @@ async function test(name, fn) {
   // ------------------------------------------------------------------
   await test("bcrypt login: wrong password → 401", async () => {
     const { status, json } = await req("POST", "/api/auth/login", {
-      body: { email: "steve@venturaclaw.local", password: "wrongpassword" },
+      body: { email: "steve@venturaclaw.com", password: "wrongpassword" },
       headers: { "X-Forwarded-For": uniqueTestIp() },
     });
     assert.strictEqual(status, 401, `expected 401, got ${status}`);
@@ -121,7 +121,7 @@ async function test(name, fn) {
     const { status, json } = await req("GET", "/api/me", { cookie: SESSION });
     assert.strictEqual(status, 200, `expected 200, got ${status}`);
     assert.ok(json?.user, "response must contain a 'user' object");
-    assert.strictEqual(json.user.email, "steve@venturaclaw.local", "user.email mismatch");
+    assert.strictEqual(json.user.email, "steve@venturaclaw.com", "user.email mismatch");
     assert.strictEqual(json.user.role, "admin", "user.role must be 'admin'");
   });
 

← 7c714cb Migrate canonical hostname to venturaclaw.com  ·  back to Ventura Claw  ·  test: confirm post-commit celebration sound fires globally 35b8bea →