![]()
Plataforma SMS Gateway
Website · Dashboard · Read in English
Vendel es una plataforma full-stack para gestión y envío de SMS a través de dispositivos conectados. Permite enviar mensajes SMS usando dispositivos registrados (teléfonos Android o módems) como gateways, con gestión de cuotas, webhooks y soporte para múltiples usuarios.

/_/v* → Imagen Docker en GHCR + binarios Go vía GoReleasersms_received, sms_sent, sms_delivered, sms_failedVendel puede entregar SMS a través de gateways externos además de teléfonos Android físicos y módems USB. Actualmente AWS End User Messaging (AEUM) es el primer proveedor externo soportado.
Cuando AEUM_ENABLED=true, Vendel crea un dispositivo virtual global "AWS End User Messaging" que:
- Aparece en la lista de dispositivos de cada usuario (solo lectura).
- Actúa como fallback cuando el usuario no tiene dispositivos físicos online.
- Puede dirigirse explícitamente vía device_id en POST /api/sms/send.
El pool de AWS al que apuntes puede incluir short codes, sender IDs, números 10DLC y RCS Agents. Vendel llama a SendTextMessage una vez por destinatario; AWS elige el canal y la origination identity desde el pool.
Los eventos de delivery vuelven vía SNS HTTPS subscription a /api/webhooks/aws-aeum-events; Vendel actualiza sms_messages.status y dispara los webhooks estándar sms_delivered / sms_failed.
Configuración: ver docs/aws-end-user-messaging-setup.md.
Limitaciones del MVP:
- RCS solo texto — sin rich cards, carousels, media ni suggested replies.
- La selección de canal vive en AWS (el pool decide); Vendel solo expone channel=auto.
- El costo no se trackea en Vendel; configura un límite mensual de gasto en la consola de AWS.
vendel/
├── backend/ # Go + PocketBase API
│ ├── main.go # Setup de PocketBase, hooks, cron, rutas
│ ├── go.mod / go.sum
│ ├── handlers/ # Rutas API custom (sms, planes, webhooks)
│ ├── services/ # Lógica de negocio (SMS, FCM, cuota, suscripciones)
│ │ └── payment/ # Proveedor de pago (QvaPay)
│ ├── middleware/ # Auth por API key, modo mantenimiento
│ └── migrations/ # Definiciones de colecciones + datos semilla
├── frontend/ # App React
│ ├── src/
│ │ ├── routes/ # Páginas (TanStack Router)
│ │ ├── components/ # Componentes React
│ │ ├── hooks/ # Hooks custom (PocketBase SDK)
│ │ └── lib/pocketbase.ts # Cliente PocketBase
│ └── tests/ # Tests Playwright
├── modem-agent/ # Agente Go para módems USB (AT commands)
├── Dockerfile # Multi-stage (node + go + alpine)
├── docker-compose.yml
├── litestream.yml # Config de replicación Litestream (opt-in)
├── entrypoint.sh # Startup condicional (con/sin Litestream)
└── .env # Variables de entorno
# Iniciar la app
docker compose up -d
# Ver logs
docker compose logs -f app
Servicios disponibles: | Servicio | URL | |----------|-----| | App (API + Frontend) | http://localhost:8090 | | PocketBase Admin | http://localhost:8090/_/ | | Mailcatcher | http://localhost:1080 |
cd backend
# Ejecutar servidor de desarrollo
go run . serve --http=0.0.0.0:8090
# Compilar binario
go build -o vendel .
./vendel serve --http=0.0.0.0:8090
cd frontend
# Instalar dependencias
npm install
# Servidor de desarrollo
npm run dev
# Build
npm run build
# Tests E2E
npx playwright test
El modem agent permite usar módems USB LTE/4G/5G con tarjeta SIM física como gateways de SMS — sin necesidad de un teléfono Android.
cd modem-agent
# Configurar módems (formato: api_key:command_port[:notify_port], separados por coma)
export VENDEL_URL=http://localhost:8090
export MODEMS="tu_api_key_del_dispositivo:/dev/ttyUSB0:/dev/ttyUSB1"
# Ejecutar
go run .
Crea un archivo .env en la raíz del proyecto:
# Core
ENVIRONMENT=local
FIRST_SUPERUSER=admin@vendel.cc
FIRST_SUPERUSER_PASSWORD=changethis
# Firebase (push notifications)
FIREBASE_SERVICE_ACCOUNT_JSON=<json-de-firebase>
# OAuth (opcional)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
# Pago (QvaPay)
QVAPAY_APP_ID=
QVAPAY_APP_SECRET=
# Seguridad
WEBHOOK_ENCRYPTION_KEY= # Clave AES para secretos de webhooks
# SMTP (por defecto localhost:1025 para mailcatcher en dev)
SMTP_HOST=
SMTP_PORT=
SMTP_USERNAME=
SMTP_PASSWORD=
# Backup (Litestream - opcional)
LITESTREAM_REPLICA_URL= # ej. s3://my-bucket/vendel/data
LITESTREAM_ACCESS_KEY_ID=
LITESTREAM_SECRET_ACCESS_KEY=
# URLs
APP_URL=http://localhost:8090
FRONTEND_URL=http://localhost:5173 # Usar el valor de APP_URL en producción
# Tests E2E
npx playwright test
# Modo UI
npx playwright test --ui
git tag v0.1.0 && git push --tags) para publicar imagen Docker en GHCR y compilar binarios Go vía GoReleasergit tag modem-agent/v0.1.0 && git push --tags) para compilar binarios del modem agent| Repositorio | Descripción |
|---|---|
| vendel-homepage | Landing page y sistema de diseño |
| vendel-android | App Android (gateway de dispositivo) |
| vendel-mcp | Servidor MCP para asistentes de IA |
| vendel-sdk-js | SDK JavaScript/TypeScript (vendel-sdk en npm) |
| vendel-sdk-python | SDK Python (vendel-sdk en PyPI) |
| vendel-sdk-go | SDK Go (Go modules) |
MIT License
$ claude mcp add vendel \
-- python -m otcore.mcp_server <graph>