Quick Start

Get Vendel up and running in 5 minutes.

Choose your path

Self-hosted

Deploy on your own server with Docker or as a standalone binary.

Continue reading below ↓

Self-hosted setup

Prerequisites

  • Docker and Docker Compose installed
  • An Android phone with a SIM card (or USB modem)

1. Create a docker-compose.yml

docker-compose.yml
services:
  app:
    image: ghcr.io/jimscope/vendel:latest
    environment:
      - ENVIRONMENT=production
      - [email protected]
      - FIRST_SUPERUSER_PASSWORD=change-this-password
      - APP_URL=http://localhost:8090
      - FRONTEND_URL=http://localhost:8090
    ports:
      - "8090:8090"
    volumes:
      - vendel_data:/app/pb_data

volumes:
  vendel_data:

2. Start the service

docker compose up -d

This starts Vendel on port 8090, serving both the API and the web dashboard as a single service. Data is stored in an embedded SQLite database.

3. Log in to the dashboard

Open the dashboard at http://localhost:8090 and log in with the superuser credentials you set in the environment variables. You can also access the PocketBase admin panel at http://localhost:8090/_/.

4. Connect a device

Install the Vendel Android app on your phone:

  1. Download the APK from GitHub Releases
  2. Open the app and enter your server URL: http://YOUR_SERVER_IP:8090
  3. Log in with your credentials
  4. Grant SMS permissions when prompted

Your phone is now registered as a device and ready to send messages.

5. Create an API key

Back in the dashboard:

  1. Go to Settings → API Keys
  2. Click Create API Key
  3. Copy the key (it won't be shown again)

6. Send your first message

Use your API key to send an SMS:

curl -X POST http://localhost:8090/api/sms/send \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "recipients": ["+1234567890"],
    "body": "Hello from Vendel!"
  }'

You'll get a response like:

{
  "message_ids": ["a1b2c3d4e5f6g7h"],
  "recipients_count": 1,
  "status": "accepted"
}

7. Check message status

View your message in the dashboard, or query it via the PocketBase collections API:

curl http://localhost:8090/api/collections/sms_messages/records/MESSAGE_ID \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Next steps