One binary. Deployed in one morning.
Strowger ships as a single strowgerd executable with no
runtime dependencies — embedded SQLite, a TOML config, a systemd unit — plus the
strowger-cli admin tool. Pick your platform below, or use the one-liner.
v1.0.0-rc4 · release candidate
Debian / Ubuntu, amd64 or arm64. Detects your architecture, downloads and checksum-verifies the binary, sets up the systemd service:
curl -fsSL https://lic.strowger.io/install.sh | sudo bash
On macOS (Apple Silicon) the same script runs without sudo: it downloads, checksum-verifies and unpacks locally, then prints the manual-run steps. Then edit the config, drop in your secrets, start the service and activate the licence — see Install below.
Every release ships a SHA256SUMS file. Verify the archive before you run it:
# fetch the checksums
curl -fsSLO https://lic.strowger.io/download/strowgerd-1.0.0-rc4-SHA256SUMS
# verify (run from the folder holding the .tar.gz)
sha256sum -c strowgerd-1.0.0-rc4-SHA256SUMS 2>/dev/null | grep OK
A detached minisign signature and its public key will be published here for the 1.0 final release; the one-line installer already refuses to install on a checksum mismatch.
# unpack
tar xzf strowgerd-1.0.0-rc4-x86_64-unknown-linux-gnu.tar.gz
cd strowgerd-1.0.0-rc4-x86_64-unknown-linux-gnu
# install strowgerd + strowger-cli + systemd unit (idempotent)
sudo ./deploy/install.sh ./strowgerd
# configure: trunk, model key, inbound routes
sudo editor /etc/strowger/config.toml
sudo editor /etc/strowger/strowger.env # secrets, 0640 root:strowger
# start
sudo systemctl enable --now strowger
# activate the licence (the binary is enforced: new calls are refused until you do).
# demo self-service — light identification, 1 channel / 60-second calls:
strowger-cli register --company "Your Co" --contact "You" \
--email [email protected] --phone +33XXXXXXXXX
# commercial key instead: strowger-cli register --key <YOUR-KEY>
journalctl -u strowger -f
macOS (evaluation): unpack the darwin tarball, then run
STROWGER_CONFIG=./config.toml ./strowgerd by hand — no systemd, no root.
Production targets Linux.
Agent Call Transfer (transfer_call): the voice agent can now autonomously transfer an active conversation to a human agent, department, or external phone number using the built-in transfer_call tool.
Configure transfer policy and security rules under the [transfer] section in config.toml:
# /etc/strowger/config.toml
[transfer]
enabled = true
mode = "refer" # "refer" (SIP REFER / carrier blind transfer) or "hairpin" (bridged 2nd leg)
max_per_call = 3 # Anti-loop protection: max transfers allowed per call
allow = [ # Fail-closed whitelist: E.164, prefixes (+), wildcards (*), or SIP URIs
"+33144556677",
"+33184*",
"sip:*@company.com",
]
deny = [ # Blacklist overrides allow
"+33184163999",
]
drain_timeout_ms = 4000 # Playout drain before issuing transfer
refer_timeout_ms = 15000 # Timeout waiting for carrier REFER/NOTIFY progression
hairpin_timeout_ms = 30000 # Timeout waiting for 2nd leg answer in hairpin mode
mode = "refer"(Default): Issues in-dialog SIP REFER (RFC 3515) to delegate the transfer to your carrier/PBX, drains the farewell message, verifies progression via NOTIFY, and tears down the initial leg. Zero ongoing compute or RTP bandwidth.mode = "hairpin": Places a second outbound leg directly to the target destination, cross-connects bidirectional 8 kHz PCM audio streams (A↔C), cleanly releases the AI voice backend session, and supervises both legs with cascade hangup (BYE) and correlated CDRs. Works across all carriers and PSTN destinations regardless of carrier REFER support.
Real-time Transcript Streaming Aggregation: User and agent speech turns are aggregated in real time with high-precision timestamps and rendered into structured call transcripts in CDRs and webhooks.
Call payload validation limits are configurable via the [limits.payload] section in TOML or environment variables (priority: TOML > Environment > Compiled defaults):
# /etc/strowger/config.toml
[limits.payload]
objectives-len = 8192 # Max system prompt size in bytes (default: 8192)
first-message-len = 4096 # Max opening message size in bytes (default: 4096)
url-len = 2048 # Max callback_url / proxy_url length (default: 2048)
short-field-len = 256 # Max caller_id / agent_id / model / language length (default: 256)
proxy-tools = 256 # Max proxy_tools entries (default: 256)
Or set via environment variables in /etc/strowger/strowger.env:
STROWGER_MAX_OBJECTIVES_LEN, STROWGER_MAX_FIRST_MESSAGE_LEN,
STROWGER_MAX_URL_LEN, STROWGER_MAX_SHORT_FIELD_LEN, and STROWGER_MAX_PROXY_TOOLS.
Strowger is licensed per concurrent channel — one channel = one simultaneous
call. The shipped binary enforces the licence: each install carries an
offline signed licence (Ed25519) that is the sole authority and keeps working even
if the licence server is unreachable, up to its own expiry. Capacities
(max_concurrent_calls, trunks, recording, AI) are read from the verified
licence. On expiry only new calls are refused; calls in progress always finish, and
/health turns degraded with a clear reason.
Every install runs a free demo — capped at 1 trunk, 1 channel and
a 1-minute maximum call duration. Activate it once with
strowger-cli register; upgrade the same licence to lift the caps, no reinstall.
Model tokens and telecom minutes are always yours, paid at cost to your providers, with no
markup from us. See pricing.