TEE-hosted Signal bots for voice transcription and group translation, designed as an interoperable product suite (see issue #10).
Not a general AI chat assistant. Conversation history, tool-calling, and x402 credits have been removed from this fork.
| Product | Bot role | Where it runs |
|---|---|---|
| Voice transcription | BOT__ROLE=transcription |
Own CVM / Compose stack (with Whisper) |
| In-chat (group) translation | BOT__ROLE=translation |
Shared translation CVM |
| Language Threads | BOT__ROLE=translation |
Shared translation CVM |
Pair products by adding both bots (two phone numbers) to the same Signal group. Signal is the bus — there is no Docker network between CVMs.
Details: docs/two-cvm-architecture.md · docs/voice-transcription.md · docs/in-chat-translation.md · docs/language-threads.md
Signal group
├── Transcription CVM (4 GB): signal-api + whisper-api + signal-bot
└── Translation CVM (4 GB): signal-api + signal-bot (+ registration proxy)
- Signal E2E encryption terminates inside each TEE
- Whisper stays on the transcription CVM only (local Docker HTTP)
- Translation uses NEAR AI on text (including transcripts posted by the transcription bot)
cp docker/transcription.env.example docker/transcription.env
cp docker/translation.env.example docker/translation.env
# Two different SIGNAL_PHONE values; NEAR_AI_API_KEY in translation.env
docker compose -f docker/compose.transcription.yaml --env-file docker/transcription.env up -d
docker compose -f docker/compose.translation.yaml --env-file docker/translation.env up -dMore thorough local setup (Signal captcha registration, verify SMS/voice codes, and docker compose logs -f monitoring): docs/local-dev/.
# Build linux/amd64 images, then deploy each compose to its own CVM @ tdx.medium (4 GB)
phala deploy … -c docker/phala.transcription.yaml …
phala deploy … -c docker/phala.translation.yaml …crates/
signal-bot/ # Binary; role via BOT__ROLE
whisper-client/ # Whisper HTTP client
near-ai-client/ # NEAR AI (translation)
signal-client/ # Signal CLI REST client
dstack-client/ # TEE attestation / key derive
signal-registration-proxy/ # Ops helper for Signal registration
docker/
compose.transcription.yaml
compose.translation.yaml
phala.transcription.yaml
phala.translation.yaml
docs/
two-cvm-architecture.md
language-threads.md
cargo build --release
cargo testThis repo uses commitlint with @commitlint/config-conventional. After clone, run npm install once so Husky can install hooks.
- commit-msg — rejects non-conventional messages at commit time
- pre-push — rejects a push if any commit being pushed fails lint
Format: type(scope): subject — e.g. feat: add whisper timeout, fix(docker): pin signal-api digest. Common types: feat, fix, docs, chore, refactor, test, ci.
| Variable | Description |
|---|---|
BOT__ROLE |
transcription or translation (required) |
SIGNAL__SERVICE_URL |
Signal CLI REST URL (default http://signal-api:8080) |
NEAR_AI__API_KEY |
Required for translation role |
WHISPER__ENABLED / WHISPER__SERVICE_URL |
Required for transcription role |
TRANSLATE_ALL__ENABLED |
In-chat !translate-on (translation role) |
See .env.example and the docker *.env.example files.
See .agents/docs/DEVELOPMENT.md for the TEE trust model, why Signal CLI must run in the TEE, and attestation (!verify).
For coding agents, see AGENTS.md (includes Compound Engineering install: /add-plugin compound-engineering, then /ce-setup).
Apache-2.0