Open source · GPL v3 · Built on Jasmin's Perspective Broker API

Run your Jasmin SMS gateway.
Skip the telnet.

Joyce is a self-hosted web console for the Jasmin SMS Gateway. Configure SMPP connectors, users, MO/MT routes, filters and interceptors from a clean UI. Every change is applied to your running gateway in real time, and you only see success when Jasmin confirms it.

0
telnet sessions needed
100%
of jcli config modules covered
1
docker compose to run it all
the old way: telnet :8990

The Joyce way

live via Perspective Broker
HTTP API SMPP bind Routing filters · rules smppc_01 carrier A smppc_02 carrier B

Traffic from your apps is filtered, routed and delivered through the SMPP connectors you configure in Joyce.

SMPP v3.4 client connectors◆ MO & MT routing◆ Static / RoundRobin / Failover routes◆ message filters◆ python interceptors◆ user credentials & quotas◆ throughput throttling◆ DLR handling◆ multi-tenant workspaces

What is Joyce?

Jasmin is a world-class SMS gateway.
Its admin experience isn't.

Jasmin is a battle-tested, open-source SMS gateway used by carriers, aggregators and businesses to move millions of messages over SMPP and HTTP. But out of the box, configuring it means a telnet session into jcli: cryptic commands, no validation, no audit trail, and one typo away from broken routing.

Joyce replaces that with a web console built on Jasmin's native Perspective Broker API, the same management interface jcli itself uses. Nothing is faked or scraped: when you save a connector or a route in Joyce, it is applied to the live gateway and persisted, and if Jasmin rejects it you see the real error immediately.

It's a Django application you host yourself, next to your gateway. Your credentials, your traffic and your configuration never leave your infrastructure.

Before · jcli

smppccm -a
> cid carrier_a
> host 10.0.0.12
> port 2775
> username smppuser
> submit_throughput 50
> ok
mtrouter -a
> type StaticMTRoute
> filters U-tier1
> ...

After · Joyce

  • Forms with validation for every connector & route option
  • Start / stop connectors with live status indicators
  • Real errors from Jasmin surfaced right in the form
  • Who-changed-what tracked on every object
  • Role-based access per workspace

Features

Every jcli module, as a proper UI

Everything you would normally manage over telnet (groups, users, connectors, routes, filters and interceptors) is a first-class screen with permissions and history.

SMPP client connectors

The full smppccm surface: bind type, TON/NPI, timers, reconnection policy, DLR expiry, throughput throttling, SSL. Start, stop and monitor each connector from the list view.

MO & MT routing

Build Default, Static, Random-RoundRobin and Failover routes for both directions, attach filters and connectors, set rates and ordering. No route syntax to memorize.

Filters & interceptors

Create MO/MT filters (source, destination, user, group, content and more) and upload Python interceptor scripts that rewrite or reject messages mid-flight.

Gateway users & groups

Manage the accounts your customers bind and send with: HTTP/SMPP authorizations, value filters, defaults, balance and throughput quotas. The complete Jasmin credential model, not a subset.

Multi-tenant workspaces

Isolate teams or customers in workspaces with their own members and roles (Administrator, Gateway Manager, Reports, API) on one shared Jasmin deployment.

Truthful, live sync

Joyce talks to the gateway over Jasmin's Perspective Broker and waits for confirmation. If Jasmin rejects a change, you get the actual error. Never a green toast over a broken config.

How it works

From zero to routed traffic

  1. 01

    Point Joyce at Jasmin

    Set the RouterPB and SMPP management ports (8988/8989) in the environment, or just run the bundled Docker Compose, which ships Jasmin, Redis, RabbitMQ and a test SMSC.

  2. 02

    Create a workspace

    Sign up, name your organization and invite teammates with the roles they need. Each workspace keeps its gateway objects separate.

  3. 03

    Configure connectors & routes

    Add your carriers as SMPP connectors, define groups and users, then wire up filters and MO/MT routes. Start the connectors and watch them bind.

  4. 04

    Send traffic

    Your applications keep using Jasmin's standard HTTP API and SMPP server. Joyce manages the gateway and never sits in your message path.

Self-hosting

Your gateway, your servers, your rules

Joyce is free software under GPL v3. Run it on the same host as Jasmin or anywhere that can reach the PB ports. The repository includes a complete development stack.

  • 1 Requirements: Python 3.11+, PostgreSQL, and a Jasmin instance with its Perspective Broker ports enabled.
  • 2 Batteries included: docker-compose with Jasmin, Redis, RabbitMQ, a REST API container and an SMPP simulator for safe testing.
  • 3 No lock-in: Joyce writes standard Jasmin configuration. Drop back to jcli any time, everything stays compatible.
quick start
# grab the code
git clone https://github.com/ekeeya/jasmin-web-gui.git
cd jasmin-web-gui

# bring up jasmin + friends
docker compose up -d

# run joyce
poetry install
python manage.py migrate
python manage.py runserver

FAQ

Common questions

Does Joyce replace jcli? +

For day-to-day configuration, yes. Joyce uses the same management API that jcli uses, so both stay in sync. You can keep jcli around for edge cases and debugging, and Joyce won't mind.

Does my SMS traffic flow through Joyce? +

No. Messages keep flowing directly through Jasmin's HTTP API and SMPP server. Joyce is a management plane only. If it goes down, your traffic doesn't.

Which Jasmin versions are supported? +

Joyce is developed and tested against Jasmin 0.11.x. Because it uses the stable Perspective Broker interfaces, nearby versions generally work too.

Is it really free? +

Yes. Free and open source under GPL v3. If it saves you hours of telnet pain, the author accepts coffee in crypto (see the repository README).

Your last telnet session ended today.

Create a workspace, connect your Jasmin instance and manage your gateway like it's 2026.