← 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
M API.mdM DEPLOY.mdM scripts/sync-tokens.jsM server/connectors/archive.jsM server/public/login.htmlM server/server.jsM server/tests/integration.test.js
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 →