diff --git a/crewvoice/.env.example b/crewvoice/.env.example
new file mode 100644
index 0000000..7d61ca2
--- /dev/null
+++ b/crewvoice/.env.example
@@ -0,0 +1,24 @@
+# CrewVoice configuration — copy to .env and fill in.
+
+# Anthropic API key — powers construction-aware translation (Claude Opus 4.8).
+# Get one at https://console.anthropic.com/
+ANTHROPIC_API_KEY=sk-ant-...
+
+# ElevenLabs API key — powers voice cloning, text-to-speech, and speech-to-text.
+# Get one at https://elevenlabs.io/
+ELEVENLABS_API_KEY=...
+
+# Port the local server listens on.
+PORT=3000
+
+# --- Delivery (Twilio) — optional; needed to send texts/voicemails to phones ---
+# Get these from https://console.twilio.com/
+TWILIO_ACCOUNT_SID=
+TWILIO_AUTH_TOKEN=
+# The Twilio phone number messages are sent from, in E.164 format.
+TWILIO_FROM_NUMBER=+1...
+
+# Public base URL of THIS server, reachable by Twilio, so it can fetch generated
+# audio for voicemail playback (e.g. an ngrok URL in dev, or your deployed domain).
+# Only needed for the "voicemail" channel.
+PUBLIC_BASE_URL=https://your-domain.example.com
diff --git a/crewvoice/.gitignore b/crewvoice/.gitignore
new file mode 100644
index 0000000..daf1dd0
--- /dev/null
+++ b/crewvoice/.gitignore
@@ -0,0 +1,4 @@
+node_modules/
+.env
+*.log
+.DS_Store
diff --git a/crewvoice/README.md b/crewvoice/README.md
new file mode 100644
index 0000000..25c5152
--- /dev/null
+++ b/crewvoice/README.md
@@ -0,0 +1,97 @@
+# CrewVoice
+
+**Your voice. Every worker's language.**
+
+A contractor records their voice once. Then they type a message in English, pick a
+crew member or a customer, and CrewVoice delivers it as a **voicemail or text in the
+recipient's language — in the contractor's own cloned voice.**
+
+Built for construction: dispatch a job to a Spanish-speaking crew, or follow up on a
+bid with a homeowner who doesn't speak English — all in the voice they already know.
+It also ships as an **MCP server**, so it plugs straight into the ChatGPT or Claude
+you already use.
+
+> CrewVoice by Allerion · $149/mo · early access.
+
+---
+
+## How it works
+
+| Agent | What it does | Tech |
+|-------|-------------|------|
+| **Voice Cloner** | 30-second sample → a voice model that speaks any language as that person | ElevenLabs |
+| **Translator** | English → the recipient's language, preserving trade terms (TPO, flashing, drip edge) | Claude Opus 4.8 |
+| **Dispatcher** | Speaks the translation in the cloned voice; delivers as voicemail or text | ElevenLabs TTS + Twilio |
+| **Two-way** | Crew/customer replies in their language → contractor gets English | ElevenLabs STT + Claude |
+
+## Setup
+
+```bash
+cd crewvoice
+npm install
+cp .env.example .env # fill in ANTHROPIC_API_KEY and ELEVENLABS_API_KEY (Twilio optional)
+npm start # http://localhost:3000
+```
+
+- **`ANTHROPIC_API_KEY`** and **`ELEVENLABS_API_KEY`** are required for the core demo
+ (clone → translate → speak).
+- **Twilio** vars are optional — needed only to deliver texts/voicemails to real phones.
+- For the **voicemail** channel, Twilio must be able to reach this server, so set
+ `PUBLIC_BASE_URL` (an ngrok URL in dev, or your deployed domain).
+
+## Web demo
+
+Open `http://localhost:3000`:
+
+1. **Clone your voice** — record ~30s.
+2. **Send a dispatch** — type in English, pick a language, hear it back in *your* voice.
+3. **Two-way** — record a reply in any language, get it back in English.
+
+## HTTP API
+
+| Endpoint | Body | Returns |
+|----------|------|---------|
+| `POST /api/clone` | multipart `sample` (audio) | `{ voiceId }` |
+| `POST /api/dispatch` | `{ text, targetLanguage, voiceId }` | `{ translation, audio (base64 mp3) }` |
+| `POST /api/send` | `{ text, targetLanguage, to, channel: "text"\|"voicemail", voiceId? }` | `{ translation, sid }` |
+| `POST /api/transcribe` | multipart `reply` (audio) | `{ original, languageCode, english }` |
+
+## Use it inside Claude / ChatGPT (MCP)
+
+CrewVoice ships as an MCP server (`mcp-server.js`) exposing three tools:
+`clone_voice`, `translate_dispatch`, and `send_text_dispatch`.
+
+Register it with any MCP client. For **Claude Code**:
+
+```bash
+claude mcp add crewvoice -- node /absolute/path/to/crewvoice/mcp-server.js
+```
+
+Or add it to a client's MCP config manually:
+
+```json
+{
+ "mcpServers": {
+ "crewvoice": {
+ "command": "node",
+ "args": ["/absolute/path/to/crewvoice/mcp-server.js"],
+ "env": {
+ "ANTHROPIC_API_KEY": "sk-ant-...",
+ "ELEVENLABS_API_KEY": "...",
+ "TWILIO_ACCOUNT_SID": "...",
+ "TWILIO_AUTH_TOKEN": "...",
+ "TWILIO_FROM_NUMBER": "+1..."
+ }
+ }
+ }
+}
+```
+
+Then, from chat: *"Send the crew this in Spanish: start the south elevation, underlayment
+down before noon"* — and CrewVoice translates and texts it.
+
+## Notes
+
+- This is an early-access MVP. Voice cloning uses ElevenLabs instant cloning; for
+ production, get consent from anyone whose voice you clone.
+- Numbers and vendor choices are illustrative — validate before committing spend.
diff --git a/crewvoice/lib.js b/crewvoice/lib.js
new file mode 100644
index 0000000..14174af
--- /dev/null
+++ b/crewvoice/lib.js
@@ -0,0 +1,139 @@
+// CrewVoice core — shared by the web server (server.js) and the MCP server (mcp-server.js).
+//
+// Capabilities:
+// translate(text, lang) — construction-aware translation (Claude Opus 4.8)
+// cloneVoice(name, buffer, mime) — ElevenLabs instant voice clone -> voice_id
+// speak(voiceId, text) — ElevenLabs TTS in the cloned voice -> mp3 Buffer
+// transcribe(buffer, mime) — ElevenLabs speech-to-text -> { text, language_code }
+// sendText(to, body) — Twilio SMS delivery
+// placeVoicemailCall(to, audioUrl)— Twilio call that plays a hosted mp3 (voicemail in your voice)
+
+import Anthropic from "@anthropic-ai/sdk";
+
+const ELEVENLABS = "https://api.elevenlabs.io/v1";
+const TTS_MODEL = "eleven_multilingual_v2"; // multilingual so the cloned voice speaks the target language
+
+let _anthropic;
+function anthropic() {
+ if (!_anthropic) _anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
+ return _anthropic;
+}
+
+function elevenKey() {
+ const key = process.env.ELEVENLABS_API_KEY;
+ if (!key) throw new Error("ELEVENLABS_API_KEY is not set.");
+ return key;
+}
+
+// --- Construction-aware translation -----------------------------------------
+
+const TRANSLATE_SYSTEM = `You are a translator for construction and roofing crews. You translate a contractor's spoken dispatch from English into the target language so a field crew or a customer can act on it immediately.
+
+Rules:
+- Output ONLY the translation. No preamble, no quotes, no notes, no alternatives.
+- Preserve construction and roofing terminology precisely: TPO, EPDM, flashing, drip edge, underlayment, fascia, soffit, valley, ridge, penetration, elevation, square, course, etc. Use the term a working crew in the target language actually uses on site, not a literal dictionary gloss.
+- Keep the tone direct and clear, like a foreman giving instructions or a contractor following up with a homeowner. Keep measurements and numbers exactly as given.
+- If the input is already in the target language, return it unchanged.`;
+
+export async function translate(text, targetLanguage) {
+ const response = await anthropic().messages.create({
+ model: "claude-opus-4-8",
+ max_tokens: 1024,
+ system: TRANSLATE_SYSTEM,
+ messages: [
+ {
+ role: "user",
+ content: `Target language: ${targetLanguage}\n\nText to translate:\n${text}`,
+ },
+ ],
+ });
+ const block = response.content.find((b) => b.type === "text");
+ return block ? block.text.trim() : "";
+}
+
+// --- ElevenLabs voice ------------------------------------------------------
+
+export async function cloneVoice(name, audioBuffer, mimeType) {
+ const form = new FormData();
+ form.append("name", name);
+ form.append(
+ "files",
+ new Blob([audioBuffer], { type: mimeType || "audio/webm" }),
+ "sample.webm"
+ );
+ const res = await fetch(`${ELEVENLABS}/voices/add`, {
+ method: "POST",
+ headers: { "xi-api-key": elevenKey() },
+ body: form,
+ });
+ if (!res.ok) throw new Error(`ElevenLabs clone failed (${res.status}): ${await res.text()}`);
+ return (await res.json()).voice_id;
+}
+
+export async function speak(voiceId, text) {
+ const res = await fetch(`${ELEVENLABS}/text-to-speech/${voiceId}`, {
+ method: "POST",
+ headers: {
+ "xi-api-key": elevenKey(),
+ "Content-Type": "application/json",
+ Accept: "audio/mpeg",
+ },
+ body: JSON.stringify({
+ text,
+ model_id: TTS_MODEL,
+ voice_settings: { stability: 0.5, similarity_boost: 0.8 },
+ }),
+ });
+ if (!res.ok) throw new Error(`ElevenLabs TTS failed (${res.status}): ${await res.text()}`);
+ return Buffer.from(await res.arrayBuffer());
+}
+
+export async function transcribe(audioBuffer, mimeType) {
+ const form = new FormData();
+ form.append("model_id", "scribe_v1");
+ form.append(
+ "file",
+ new Blob([audioBuffer], { type: mimeType || "audio/webm" }),
+ "reply.webm"
+ );
+ const res = await fetch(`${ELEVENLABS}/speech-to-text`, {
+ method: "POST",
+ headers: { "xi-api-key": elevenKey() },
+ body: form,
+ });
+ if (!res.ok) throw new Error(`ElevenLabs STT failed (${res.status}): ${await res.text()}`);
+ return res.json();
+}
+
+// --- Twilio delivery (text + voicemail) -------------------------------------
+
+let _twilio;
+async function twilioClient() {
+ if (_twilio) return _twilio;
+ const { TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN } = process.env;
+ if (!TWILIO_ACCOUNT_SID || !TWILIO_AUTH_TOKEN) {
+ throw new Error("TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN must be set to send messages.");
+ }
+ const { default: twilio } = await import("twilio");
+ _twilio = twilio(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN);
+ return _twilio;
+}
+
+export async function sendText(to, body) {
+ const from = process.env.TWILIO_FROM_NUMBER;
+ if (!from) throw new Error("TWILIO_FROM_NUMBER is not set.");
+ const client = await twilioClient();
+ const msg = await client.messages.create({ to, from, body });
+ return msg.sid;
+}
+
+// Places a phone call that plays a hosted mp3 — a voicemail in the contractor's voice.
+// audioUrl must be publicly reachable by Twilio (see PUBLIC_BASE_URL in server.js).
+export async function placeVoicemailCall(to, audioUrl) {
+ const from = process.env.TWILIO_FROM_NUMBER;
+ if (!from) throw new Error("TWILIO_FROM_NUMBER is not set.");
+ const client = await twilioClient();
+ const twiml = `${audioUrl}`;
+ const call = await client.calls.create({ to, from, twiml });
+ return call.sid;
+}
diff --git a/crewvoice/mcp-server.js b/crewvoice/mcp-server.js
new file mode 100644
index 0000000..3a510c9
--- /dev/null
+++ b/crewvoice/mcp-server.js
@@ -0,0 +1,83 @@
+// CrewVoice MCP server — exposes CrewVoice as tools inside ChatGPT, Claude, or any MCP client.
+//
+// Run over stdio: node mcp-server.js
+// Then register it with your MCP client (see README → "Use it inside Claude/ChatGPT").
+//
+// Tools:
+// clone_voice — clone a contractor's voice from a local audio file
+// translate_dispatch — construction-aware English -> target-language translation (text only)
+// send_text_dispatch — translate, then deliver as an SMS in the recipient's language
+
+import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
+import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
+import { z } from "zod";
+import { readFile } from "node:fs/promises";
+import path from "node:path";
+import dotenv from "dotenv";
+import { translate, cloneVoice, sendText } from "./lib.js";
+
+dotenv.config();
+
+const server = new McpServer({ name: "crewvoice", version: "0.1.0" });
+
+server.registerTool(
+ "clone_voice",
+ {
+ description:
+ "Clone a contractor's voice from a local audio sample (~30s). Returns a voiceId used for later dispatches.",
+ inputSchema: {
+ audioPath: z.string().describe("Absolute or relative path to an audio file (mp3/wav/webm/m4a)."),
+ name: z.string().optional().describe("A label for this voice, e.g. the contractor's name."),
+ },
+ },
+ async ({ audioPath, name }) => {
+ const buf = await readFile(audioPath);
+ const ext = path.extname(audioPath).slice(1).toLowerCase();
+ const mime = { mp3: "audio/mpeg", wav: "audio/wav", webm: "audio/webm", m4a: "audio/mp4" }[ext]
+ || "audio/mpeg";
+ const voiceId = await cloneVoice(name || "CrewVoice contractor", buf, mime);
+ return { content: [{ type: "text", text: `Voice cloned. voiceId: ${voiceId}` }] };
+ }
+);
+
+server.registerTool(
+ "translate_dispatch",
+ {
+ description:
+ "Translate a construction dispatch from English into the crew's or customer's language, preserving trade terminology (TPO, flashing, drip edge, etc.). Returns the translated text only.",
+ inputSchema: {
+ text: z.string().describe("The message in English."),
+ targetLanguage: z.string().describe("Target language, e.g. 'Spanish'."),
+ },
+ },
+ async ({ text, targetLanguage }) => {
+ const translation = await translate(text, targetLanguage);
+ return { content: [{ type: "text", text: translation }] };
+ }
+);
+
+server.registerTool(
+ "send_text_dispatch",
+ {
+ description:
+ "Translate an English dispatch into the recipient's language and deliver it as an SMS text. Use for crew dispatches or customer/bid follow-ups. Requires Twilio configuration.",
+ inputSchema: {
+ text: z.string().describe("The message in English."),
+ targetLanguage: z.string().describe("Recipient's language, e.g. 'Spanish'."),
+ to: z.string().describe("Recipient phone number in E.164 format, e.g. +14155551234."),
+ },
+ },
+ async ({ text, targetLanguage, to }) => {
+ const translation = await translate(text, targetLanguage);
+ const sid = await sendText(to, translation);
+ return {
+ content: [
+ { type: "text", text: `Sent to ${to} (sid ${sid}).\n\nDelivered text:\n${translation}` },
+ ],
+ };
+ }
+);
+
+const transport = new StdioServerTransport();
+await server.connect(transport);
+console.error("CrewVoice MCP server running on stdio.");
diff --git a/crewvoice/package.json b/crewvoice/package.json
new file mode 100644
index 0000000..8a6b86c
--- /dev/null
+++ b/crewvoice/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "crewvoice",
+ "version": "0.1.0",
+ "private": true,
+ "description": "CrewVoice — the vertical AI agent for construction crews. Speak a dispatch in English; your crew hears it in their language, in your cloned voice.",
+ "type": "module",
+ "main": "server.js",
+ "scripts": {
+ "start": "node server.js",
+ "dev": "node --watch server.js",
+ "mcp": "node mcp-server.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "dependencies": {
+ "@anthropic-ai/sdk": "^0.69.0",
+ "@modelcontextprotocol/sdk": "^1.13.0",
+ "dotenv": "^16.4.5",
+ "express": "^4.21.2",
+ "multer": "^1.4.5-lts.1",
+ "twilio": "^5.3.0",
+ "zod": "^3.23.8"
+ }
+}
diff --git a/crewvoice/public/index.html b/crewvoice/public/index.html
new file mode 100644
index 0000000..303b5fe
--- /dev/null
+++ b/crewvoice/public/index.html
@@ -0,0 +1,231 @@
+
+
+
+
+
+CrewVoice — your voice, their language
+
+
+
+
+
_/\_ CREWVOICE
+
Your voice. Their language.
+
Speak a dispatch in English. Your crew hears it in their language — in your own cloned voice.
+
+
+
+ STEP 1
+
Clone your voice
+
Record ~30 seconds of yourself talking — anything. CrewVoice learns your voice once.
+
+
+
+
+
+
+
+
+
+
+ STEP 2
+
Send a dispatch
+
Type what you'd tell the crew. It comes back as a voice note in their language, in your voice.
+
+
+
+
+
+
+
+ Delivered in your voice
+
+
+
+
+
+
+
+ STEP 3 · TWO-WAY
+
Hear back from the crew
+
Record a reply in any language. You get it back in English.
+
+
+
+
+
+
+
+ In English
+
+
+
+
+
+
+
+
+
diff --git a/crewvoice/server.js b/crewvoice/server.js
new file mode 100644
index 0000000..fc4dc17
--- /dev/null
+++ b/crewvoice/server.js
@@ -0,0 +1,131 @@
+// CrewVoice web server — clone a voice, dispatch translated voice notes, deliver as text/voicemail.
+// Core logic lives in lib.js (shared with the MCP server).
+
+import express from "express";
+import multer from "multer";
+import dotenv from "dotenv";
+import crypto from "crypto";
+import {
+ translate,
+ cloneVoice,
+ speak,
+ transcribe,
+ sendText,
+ placeVoicemailCall,
+} from "./lib.js";
+
+dotenv.config();
+
+const { ANTHROPIC_API_KEY, ELEVENLABS_API_KEY, PUBLIC_BASE_URL, PORT = 3000 } = process.env;
+
+if (!ANTHROPIC_API_KEY || !ELEVENLABS_API_KEY) {
+ console.warn(
+ "[CrewVoice] Missing ANTHROPIC_API_KEY and/or ELEVENLABS_API_KEY. " +
+ "Copy .env.example to .env and fill them in — the API routes will fail until you do."
+ );
+}
+
+const app = express();
+app.use(express.json({ limit: "1mb" }));
+app.use(express.static("public"));
+const upload = multer({ limits: { fileSize: 25 * 1024 * 1024 } });
+
+// Short-lived store for generated audio so Twilio can fetch it for voicemail playback.
+const audioStore = new Map(); // id -> { buf, expires }
+function stashAudio(buf) {
+ const id = crypto.randomUUID();
+ audioStore.set(id, { buf, expires: Date.now() + 60 * 60 * 1000 }); // 1h
+ return id;
+}
+app.get("/audio/:id", (req, res) => {
+ const entry = audioStore.get(req.params.id);
+ if (!entry || entry.expires < Date.now()) return res.sendStatus(404);
+ res.type("audio/mpeg").send(entry.buf);
+});
+
+// Agent 1: clone the contractor's voice from a ~30s sample.
+app.post("/api/clone", upload.single("sample"), async (req, res) => {
+ try {
+ if (!req.file) return res.status(400).json({ error: "No voice sample uploaded." });
+ const name = req.body.name || `CrewVoice contractor ${Date.now()}`;
+ const voiceId = await cloneVoice(name, req.file.buffer, req.file.mimetype);
+ res.json({ voiceId });
+ } catch (err) {
+ console.error(err);
+ res.status(500).json({ error: err.message });
+ }
+});
+
+// Agent 2: dispatch — English in, translated voice note out (in the cloned voice).
+app.post("/api/dispatch", async (req, res) => {
+ try {
+ const { text, targetLanguage, voiceId } = req.body || {};
+ if (!text || !targetLanguage || !voiceId) {
+ return res.status(400).json({ error: "text, targetLanguage and voiceId are required." });
+ }
+ const translation = await translate(text, targetLanguage);
+ const audio = await speak(voiceId, translation);
+ res.json({ translation, audio: audio.toString("base64"), mimeType: "audio/mpeg" });
+ } catch (err) {
+ console.error(err);
+ res.status(500).json({ error: err.message });
+ }
+});
+
+// Delivery: translate, then send to a recipient's phone as a text or a voicemail.
+app.post("/api/send", async (req, res) => {
+ try {
+ const { text, targetLanguage, voiceId, to, channel = "text" } = req.body || {};
+ if (!text || !targetLanguage || !to) {
+ return res.status(400).json({ error: "text, targetLanguage and to are required." });
+ }
+ const translation = await translate(text, targetLanguage);
+
+ if (channel === "text") {
+ const sid = await sendText(to, translation);
+ return res.json({ translation, channel, sid });
+ }
+
+ if (channel === "voicemail") {
+ if (!voiceId) return res.status(400).json({ error: "voiceId is required for voicemail." });
+ if (!PUBLIC_BASE_URL) {
+ return res.status(400).json({
+ error: "PUBLIC_BASE_URL must be set so Twilio can fetch the generated audio.",
+ });
+ }
+ const audio = await speak(voiceId, translation);
+ const id = stashAudio(audio);
+ const sid = await placeVoicemailCall(to, `${PUBLIC_BASE_URL}/audio/${id}`);
+ return res.json({ translation, channel, sid });
+ }
+
+ res.status(400).json({ error: `Unknown channel "${channel}".` });
+ } catch (err) {
+ console.error(err);
+ res.status(500).json({ error: err.message });
+ }
+});
+
+// Agent 3: two-way — crew/customer replies in their language, contractor gets English.
+app.post("/api/transcribe", upload.single("reply"), async (req, res) => {
+ try {
+ if (!req.file) return res.status(400).json({ error: "No reply audio uploaded." });
+ const { text, language_code } = await transcribe(req.file.buffer, req.file.mimetype);
+ const english = await translate(text, "English");
+ res.json({ original: text, languageCode: language_code, english });
+ } catch (err) {
+ console.error(err);
+ res.status(500).json({ error: err.message });
+ }
+});
+
+app.get("/api/health", (_req, res) => {
+ res.json({
+ ok: true,
+ anthropic: Boolean(ANTHROPIC_API_KEY),
+ elevenlabs: Boolean(ELEVENLABS_API_KEY),
+ twilio: Boolean(process.env.TWILIO_ACCOUNT_SID),
+ });
+});
+
+app.listen(PORT, () => console.log(`CrewVoice running at http://localhost:${PORT}`));
diff --git a/docs/ai-safety-glasses-brief.md b/docs/ai-safety-glasses-brief.md
new file mode 100644
index 0000000..b84dda0
--- /dev/null
+++ b/docs/ai-safety-glasses-brief.md
@@ -0,0 +1,222 @@
+# AI Safety Glasses — Product & Go-to-Market Brief
+
+**Status:** Draft v0.1 · **Owner:** TBD · **Last updated:** 2026-06-16
+
+---
+
+## 1. The opening
+
+A real production manager, reviewing a consumer smart-glasses product, wrote down the
+exact gap we should own:
+
+> "I am currently investigating sourcing safety-rated lenses to integrate these into my
+> daily shop-floor workflow. While the frames themselves aren't officially safety-rated…"
+
+He bought consumer AI glasses to record POV video of processes and feed it to AI tools
+that generate written Standard Operating Procedures (SOPs). It worked — except the
+hardware isn't rated for an industrial environment, so he can't actually wear it where
+the work happens.
+
+That is the wedge: **impact-rated (ANSI Z87.1 / EN 166) AI glasses purpose-built for the
+shop floor, feeding an SOP/operations intelligence pipeline.**
+
+## 2. Why this fits Allerion specifically
+
+Allerion is "autonomous intelligence for the built world" — construction, infrastructure,
+industrial operations. The glasses are not a side-quest consumer gadget; they are the
+**field data-capture layer** for the platform we already describe:
+
+| Existing capability | What the glasses add |
+|---------------------|----------------------|
+| Digital Twin (3D BIM, spatial data) | First-person, geolocated site capture as a live data feed |
+| Construction ERP (takeoff, BOQ, estimation) | Hands-free field verification, progress capture, as-built vs. as-designed |
+| Agent Orchestration | POV video → transcription → structured SOP / inspection record, generated by agents |
+| Sovereign AI (self-hosted) | On-prem processing of sensitive site footage — a hard requirement for many industrial buyers |
+
+The device is the sensor; the moat is the intelligence pipeline behind it that we already build.
+
+## 3. The honest competitive read
+
+**"First to market on AI glasses" is not winnable** and shouldn't be the goal. Meta/Ray-Ban,
+Brilliant Labs, Even Realities, Xreal and others own the general-purpose consumer category.
+Competing there means losing on capital, supply chain, and brand.
+
+**"First to own certified industrial AI glasses + an operations-intelligence pipeline" is
+winnable**, because:
+
+- **Certification is a moat, not a feature.** Z87.1 / EN 166 require impact, drop, and lens-
+ retention testing. It is slow, expensive, and unglamorous — exactly why fashion-first
+ consumer players avoid it. Once we're through, it protects us.
+- **The buyer is a budget holder, not a hobbyist.** A plant/site manager expensing
+ documentation tooling for a crew is a B2B sale with margin and repeat orders.
+- **Demand is already validated** in the field, not hypothesized.
+
+### Real risks (name them)
+- Hardware is capital-intensive and slow.
+- Certification lead times run months.
+- A consumer incumbent could ship a "rugged" SKU faster than we'd like — so our speed game
+ is **cert + channel + software**, not the device itself.
+- Privacy/consent: always-on cameras in workplaces trigger labor, union, and legal concerns.
+ This must be designed in (recording indicators, on-prem storage, retention policy), not bolted on.
+
+## 4. Strategy: buy the hardware, own the intelligence (software-led)
+
+**We do not manufacture anything.** We white-label glasses that are *already certified and
+on the market*, rebrand them **Allerion**, and put 100% of the value in **ALLERION.ai** and
+the **crew voice** layer. This is consistent with the company line: *we don't sell software,
+we deploy intelligence* — here, the hardware is just the carrier.
+
+Why this beats building:
+- **Zero certification lead time** if we pick a camera-free base (see below) — no re-cert, no
+ factory, no tooling, no months-long test cycle.
+- **Capital-light.** Reseller/white-label agreement + software, not a hardware company.
+- **Sidesteps the privacy fight** that made Lucyd drop the camera — voice-first needs no camera.
+
+### Phase 1 — voice-first, ship now (recommended base: Lucyd Armor)
+Rebrand a discreet, already-certified, **camera-free** audio frame (Lucyd Armor: ANSI
+Z87.1+ / CSA Z94.3 / EN 166, mic + open-ear audio + walkie-talkie VOIP, 8-hr battery) as the
+**Allerion** glasses. Deploy ALLERION.ai + crew voice on it. No re-certification, no privacy
+blocker, fastest path to a deployed product.
+
+### Phase 2 — add a camera SKU for POV → SOP capture
+For sites that want video documentation and can manage consent, license a camera-equipped
+certified device (Vuzix Blade 2 class / RealWear for rugged, Iristick for ATEX). The video →
+SOP pipeline (§6) plugs into the same ALLERION.ai backend.
+
+### Open commercial questions to close
+- White-label/OEM terms with the chosen vendor (Lucyd/Innovative Eyewear or a frame ODM).
+- Branding under a reseller agreement vs. becoming the named "manufacturer" — the latter can
+ shift certification responsibility onto Allerion, so structure the contract deliberately.
+- Volume commitments and per-unit economics.
+
+## 5. Ideal Customer Profile (v0)
+
+- Manufacturing / production managers documenting SOPs and training materials.
+- Construction & infrastructure site supervisors (as-built capture, inspections, progress).
+- Field service / maintenance teams needing hands-free, remote-expert workflows.
+- Common thread: regulated or hazard environments where eye protection is **mandatory**, so a
+ certified device is the only device they're allowed to wear.
+
+## 6. The software pipeline (what we can build now, in this repo's world)
+
+```
+[Glasses POV capture] → [Secure ingest / on-prem] → [Transcription + vision]
+ → [Structured extraction: steps, materials, hazards, timestamps]
+ → [SOP / inspection / progress document generation (agents)]
+ → [Digital Twin + ERP write-back]
+```
+
+This is squarely buildable today with current models and is the highest-leverage place to
+start, independent of hardware timelines.
+
+## 6a. CrewVoice — the Phase 1 hero (already built at allerion.io)
+
+**CrewVoice is the vertical AI agent for construction crews.** It solves the English ↔
+Spanish language barrier that costs the industry billions in rework, injuries, and lost
+productivity — not with text translation, but by delivering a contractor's dispatches in the
+crew's language, **spoken in the contractor's own cloned voice.**
+
+The moat is precisely that voice cloning: when a crew member hears *their boss's actual
+voice* — in Spanish — telling them what to do, that's trust and authority no text-translation
+app (MindForge, Projul, Google Translate) or expensive human interpreter (Boostlingo) can
+replicate. It needs no hardware (works on any phone via WhatsApp/SMS), and it understands the
+trade ("TPO," "flashing," "drip edge," "underlayment").
+
+### Agent architecture (chained, single-purpose agents)
+1. **Voice Cloner** — 30-sec sample → a voice model that speaks any language as that person.
+2. **Dispatcher** — contractor speaks English → delivered as a Spanish voice note in their voice.
+3. **Translator (two-way)** — crew replies in Spanish → contractor receives English.
+4. **Safety Agent** (premium) — daily briefing pushed to each crew member at 6 AM, in their
+ language, in the superintendent's voice.
+5. **Documentation Agent** (enterprise) — end-of-day record of what was communicated, to whom, when.
+
+### Pricing (SaaS, already modeled)
+| Tier | Price/mo | Includes |
+|------|----------|----------|
+| Starter | $149 | 1 voice clone, 100 dispatches, EN→ES |
+| Pro | $299 | 3 clones, unlimited dispatches, two-way, 5 languages |
+| Enterprise | $499 | Unlimited clones, safety briefings, documentation, API |
+
+### Why the glasses matter to CrewVoice
+CrewVoice already works on a phone — but a phone means a crew member stops, pulls it out, and
+looks down. **On the Allerion glasses, CrewVoice becomes hands-free and eyes-up:** the
+contractor speaks a dispatch and the crew hears it, in their language, in their own ears,
+while their hands stay on the work and their eyes stay on the hazard. The glasses are the
+premium delivery layer for a product that already exists — not a new product to invent.
+
+This is the connective tissue: **CrewVoice (software, built) × Allerion glasses (certified
+hardware, white-labeled) = a hands-free bilingual job site.**
+
+## 7. Proposed first milestones
+
+| # | Milestone | Why first |
+|---|-----------|-----------|
+| 1 | **Crew Voice prototype** on a stock camera-free certified frame (Lucyd Armor or sample unit) → ALLERION.ai | Proves the Phase 1 hero with zero manufacturing / cert dependency |
+| 2 | **Software pipeline** (voice/video → structured SOP) wired to the existing agents | The compounding asset; works against off-the-shelf footage too |
+| 3 | **White-label / OEM terms** with the chosen frame vendor | Unlocks shipping rebranded "Allerion" units |
+| 4 | 3–5 design-partner LOIs from ICP sites | Validates demand and shapes the rollout |
+| 5 | Privacy/consent + (for Phase 2 camera SKU) re-certification scoping | Gating requirements before camera deployment |
+
+## 8. Hardware sourcing — what already exists (don't build from scratch)
+
+The instinct "find safety glasses that are already designed and tested, then just add the
+camera" is correct in spirit. The market splits into two camps, and the gap is the space
+between them:
+
+### Camp A — camera + safety rating already exists (but bulky / industrial-looking)
+| Product | Certification | Camera | Form factor |
+|---------|--------------|--------|-------------|
+| **Vuzix Blade 2** | ANSI Z87.1 | Autofocus HD camera | Chunky AR glasses |
+| **RealWear Navigator Z1** | Rugged / worn with PPE | HD camera | Headset-style HMD |
+| **Iristick G2** | Certified PPE, ATEX (explosive atmospheres) | Camera | Industrial, dual-screen |
+
+**Implication:** "first to market with a camera safety wearable" is already gone for the
+rugged HMD form factor. We don't beat these on industrial AR.
+
+### Camp B — discreet, all-day, certified safety glasses (but camera deliberately removed)
+| Product | Certification | Camera | Why no camera |
+|---------|--------------|--------|---------------|
+| **Lucyd Armor** | ANSI Z87.1+, CSA Z94.3, EN 16639:2018 | **None — by choice** | Privacy concerns; launched camera-free at CES 2026 |
+
+Lucyd Armor is exactly the discreet, glasses-like, 8-hour, certified frame the original
+reviewer wanted — audio + AI (ChatGPT) + photochromic lenses — but they **intentionally
+omit the camera** for workplace-privacy reasons.
+
+### The actual open gap
+**Discreet, all-day-wearable, Z87.1-certified glasses WITH a camera, feeding an AI
+SOP/operations pipeline.** Nobody combines all three: the camera players are bulky, and the
+discreet-safety players dropped the camera on purpose.
+
+### ⚠️ The catch with "just add the camera"
+ANSI Z87.1 certifies the **complete assembled product as tested**. Bolting an aftermarket
+camera onto certified frames generally **voids the certification** — it changes mass,
+balance, and structural integrity, and the unit was never impact-tested in that
+configuration. So "add a camera" does not dodge certification; it **relocates** it: you
+re-certify the integrated camera-glasses unit.
+
+Good news: starting from a proven certified frame (validated lens geometry and materials)
+substantially de-risks and shortens re-certification versus designing optics from zero.
+
+### Recommended sourcing paths (fastest → slowest)
+1. **Partner / license with a discreet Z87.1 frame maker** (e.g. Lucyd/Innovative Eyewear,
+ or a frame ODM such as Bollé Safety, Uvex, Oakley SI) → integrate a camera module →
+ re-certify the assembled unit. Closes the exact gap above.
+2. **License an existing camera platform** (Vuzix licenses its tech; Iristick for
+ hazardous/ATEX environments) when industrial-grade or explosive-atmosphere rating matters
+ more than discreet styling.
+3. **Full ODM camera-glasses from Shenzhen** + first-time Z87.1/EN 166 certification — most
+ control, slowest, highest cost. Only if 1 and 2 can't deliver the form factor.
+
+The privacy tension Lucyd designed around (always-on cameras in workplaces) is real and must
+be engineered in: hardware recording indicator, on-prem/sovereign storage, retention policy.
+
+## 9. Open questions for the founder
+
+- Standalone product line, or an accessory/front-end to the existing Allerion platform? (Recommend: the latter.)
+- Geography for first certification — US (Z87.1) or EU (EN 166)?
+- Build the software pipeline against our own agents now, before any hardware commitment?
+
+---
+
+*This is a strategy draft, not a commitment. Numbers and vendor names are illustrative and
+need validation before any spend.*
diff --git a/landing/index.html b/landing/index.html
new file mode 100644
index 0000000..64240f1
--- /dev/null
+++ b/landing/index.html
@@ -0,0 +1,126 @@
+
+
+
+
+
+CrewVoice by Allerion — your voice, every worker's language
+
+
+
+
+
+
+
+
_/\_
+
Now in early access · Allerion Apps
+
CrewVoice — your voice, every worker's language.
+
+ A contractor records their voice once. Then they type a message in English, pick a
+ crew or a customer, and CrewVoice sends it as a voicemail or text in the recipient's
+ language — Spanish, English, more — in the contractor's own cloned voice. Built for
+ construction. Ships as an MCP server, so it plugs straight into the ChatGPT or Claude
+ you already use.
+
This is the contractor version of the voice-clone voicemail model already proven for real-estate agents.
+
+
+
+
+
+
+
+ Clone once
+
Clone your voice
+
Record a short sample and CrewVoice captures your voice. Every message after that goes out sounding like you — no re-recording, no studio.
+
+
+ Translate + send
+
In their language
+
Type in English. CrewVoice translates and delivers a voicemail or text in the recipient's language — Spanish, English, and more — in your cloned voice.
+
+
+ MCP
+
Works in your existing AI
+
Ships as an MCP server. Plug it into the ChatGPT or Claude you already use and send crew dispatches and bid follow-ups straight from chat.
+
+
+
+
+
+
+
+
Built for the job site.
+
The language barrier between English-speaking contractors and their crews and customers costs the industry billions in rework and lost deals. CrewVoice closes it — in the voice everyone already knows.
+
+
+
Dispatch the crew
+
Send a job to a Spanish-speaking crew as a voice note — in your voice, so it carries your authority.
+
+
+
Follow up the bid
+
Reach a homeowner who doesn't speak English, in their language, without an interpreter or a callback you'll miss.
+
+
+
+
+
+
+
+
CrewVoice by Allerion
+
$149/mo · early access
+
Voicemail, text, and an MCP server for ChatGPT and Claude.