One binary, and it talks back.
The same executable is every process in the gateway and every tool for running it — provisioning, settings, migrations and restore. There is no second package to install to administer it.
Usage
$ yakugate --help
usage: yakugate [--config FILE] <role> | yakugate --version
yakugate [--config FILE] console the setup menu
yakugate [--config FILE] migrate [--seed]
yakugate [--config FILE] config [list [--all] | get NAME |
set NAME=VALUE... [--new] | unset NAME... | path]
yakugate backup-verify <run-dir>
yakugate [--config FILE] backup-restore <run-dir> --db config|cold|hot
[--table NAME]... [--into-nonempty] [--dry-run]Roles
Run the shape you need. Each role is the same binary with a different first argument, so they scale independently — several edges, one billing process, or everything on one box.
http-serverClient HTTP edge — accepts submits, runs the 19-stage pipelinesmpp-serverClient SMPP edge — binds, windowing, concat assemblyhttp-vendorSends to HTTP carriers; config-driven adapter, no code per vendorsmpp-vendorSends to SMPP carriersdlrDelivery receipts — correlate, render, push to the clientmoInbound (mobile-originated) messagesbillingRates and charges accepted traffic against the rate cardsretryRe-attempts what failed, with increasing gapsexpiryGives up on what outlived its validity periodretentionMoves aged records out of the hot storebackupDumps the stores with a verifiable manifestabuse-monitorSliding-window scoring; warn, throttle, suspendblackholeVendor simulator — accepts and discards, for load tests$ yakugate http-server $ yakugate --config /etc/yakugate/yakugate.config smpp-vendor
Commands
yakugate consoleProvision the whole gateway from a menu
Companies, accounts, vendors, HTTP calls, routing rules, dialects, rate cards, credentials, spam rules, blocked numbers and operators — asked for field by field, never as JSON. It writes the same rows the Admin API writes, so a gateway can be set up and run with no portal at all.
$ yakugate console 1 Companies 6 Routing rules 2 Accounts 7 Rate cards 3 Vendors 8 Spam rules 4 HTTP calls 9 Blocked numbers 5 Dialects 10 Operators ↑↓ move · enter choose · esc back
yakugate configEdit settings without a text editor
Reads and rewrites yakugate.config in place. Only the named lines change, a commented line is uncommented where it stands, the previous file is kept as .bak, and every write is re-parsed through the loader before it replaces anything. A name the binary does not know is refused unless you pass --new. Secrets and DSN passwords are masked unless you ask for them.
$ yakugate config set YAKU_API_ADDR=:8080 ✓ YAKU_API_ADDR set $ yakugate config get YAKU_CONFIG_DSN YAKU_CONFIG_DSN=root:****@tcp(127.0.0.1:3306)/yakugate_config $ yakugate config list --all --show-secrets $ yakugate config path
yakugate migrateBuild the stores
The gateway creates every database it needs and applies its own migrations — you can run it without the Admin API at all. --seed adds the development accounts. It runs on every start unless you turn that off, so this is for doing it deliberately, ahead of time.
$ yakugate migrate ✓ config store: applied 8 migration(s) ✓ queue store: applied 2 migration(s) ✓ hot store: applied 5 migration(s) stores are up to date $ yakugate migrate --seed
yakugate backup-restorePut a backup back, carefully
The manifest is verified before anything is written, then every table is pre-checked. A table that already has rows is refused unless you say --into-nonempty. It never drops and never truncates, creates missing tables from the run itself, and does one transaction per table. --dry-run tells you what it would do and stops.
$ yakugate backup-verify /backups/2026-09-28T02:00Z
✓ manifest OK — 41 files, 2,318,004 rows
$ yakugate backup-restore /backups/2026-09-28T02:00Z \
--db config --table companies --dry-runWhere settings come from
Pass --config FILE, or let the binary find one. It takes the first yakugate.config it meets, walking up from the working directory, then the binary's own folder, then the usual system locations. A file still named sms.config (the name until 2 October 2026) is read in each of those places too, and the log asks you to rename it.
--config FILE, if you passed it./yakugate.config, then each parent directory- the folder the binary itself sits in
~/.config/yakugate/yakugate.config/etc/yakugate/yakugate.config
Environment variables override any line in the file. That is what makes one image work across environments: bake the file, override the DSN per deployment. A line the parser cannot read stops the start rather than being skipped quietly.
See it on your own traffic.
A fully functional gateway with its portal, free for 60 days.
