Slack
@mentions, slash commands, DMs, thread context, feedback buttons. Socket Mode or HTTP.Discord
Prefix commands, per-channel history, pagination, starter questions, role and channel allowlists.
Microsoft Teams
Adaptive Cards, thread support, tenant allowlists, Azure-native deployment.
Telegram
BotFather setup, markdown tables rendered as PNG, inline source buttons, polling or webhook.
Twilio-based, FastAPI server, slash commands for mode/language switching, sandbox to production path.
Signal
signal-cli-rest-api backend, Docker Compose deploy, primary or linked-device registration.
Shared architecture
Every chatbot follows the same flow: All six bots share:- Vaquill client (
vaquill_client.py) that wrapsPOST /api/v1/statutes/search - Conversation manager for per-channel or per-DM chat history
- Rate limiter with Redis or in-memory backend
- Slash / prefix commands:
help,clear,examples,stats - Statute citation rendering appropriate to each platform’s primitives (Block Kit, Adaptive Cards, inline keyboards, etc.)
Pick by deployment surface
If you want zero exposed ports during development, Slack (Socket Mode), Discord, Telegram (polling), and Signal all run without a public URL.
Deploy targets
All six bots ship with Dockerfiles and have been smoke-tested on:- Docker Compose (recommended for self-hosting)
- Railway (Git-based deploys)
- Render (free tier with cold starts)
- Fly.io (low-latency regions)
- VPS + systemd (full control)
- Azure App Service (Teams bot only)

