A CLI tool for managing XL prepaid numbers: OTP login, quota checking, package purchases, point redemption, and payments via balance/e-wallet/QRIS including decoy techniques.
All data including saved numbers, OTP tokens, decoy data, and transaction history is stored locally in a SQLite database on your device. Nothing is sent to external servers beyond what's required for XL API interactions. Your data stays with you.
| Menu | Feature | Description |
|---|---|---|
1 |
Active Number Dashboard | View active number dashboard: profile, balance, tiering, active packages, history, point redemption, notifications, and package purchases |
2 |
Select Active Number | Switch between saved numbers |
3 |
Login New Number | Login with a new XL number via OTP (send OTP, enter OTP code) |
4 |
Delete Number | Remove a number from the saved list |
5 |
Decoy Management | CRUD operations for decoy data: view, add, edit, delete, reset to defaults |
6 |
Exit | Exit the application |
Once an active number is selected, the dashboard provides these sub-menus:
| Sub-menu | Feature |
|---|---|
| History | View transaction history |
| Redeem | Search & redeem items using reward points |
| Active Packages | View active package quotas |
| Notifications | View notifications |
| Buy via Option Code | Purchase a package by entering an option code directly, choose payment method |
| Buy via Family Code | Search for packages via family code, select variant & payment method |
| Buy All Family | Purchase all packages within a family code via balance+decoy |
| Validate MSISDN | Validate number via Family Plan API |
| Family Code List | View & search available family codes (server-side data, encrypted) |
| Option Code List | View, search & browse packages by option code (server-side data, encrypted) |
| Method | Description |
|---|---|
| Balance | Pay using prepaid balance |
| E-Wallet | Pay via DANA, GoPay, ShopeePay, or OVO |
| QRIS | Pay via QRIS |
| Balance + Decoy | Pay via balance using decoy technique (standard) |
| Balance + Decoy V2 | Pay via balance using decoy technique V2 (with decoy confirmation token) |
| QRIS + Decoy | Pay via QRIS with decoy technique (+1K) |
| QRIS + Decoy V2 | Pay via QRIS with decoy technique V2 |
| Balance Nx | Pay via balance in multiple installments (in development) |
| Payment Method | Prio Decoy Name | Reguler Decoy Name |
|---|---|---|
| PulsaDecoy | PRIO PASS | XL PASS |
| PulsaDecoyV2 | PRIO PASS | XL PASS |
| QRISDecoy | Conference | Apps Quota Xtra Combo Plus 2GB |
| QRISDecoyV2 | Conference | Kuota Aplikasi BIZ 2GB |
| Payment Method | Prio Decoy ID | Reguler Decoy ID |
|---|---|---|
| PulsaDecoy | 4 | 1 |
| PulsaDecoyV2 | 4 | 1 |
| QRISDecoy | 5 | 2 |
| QRISDecoyV2 | 5 | 3 |
- Login: Enter an XL number → the application sends an OTP to that number → enter the OTP code → token is stored in a local SQLite database
- Select Active Number: If you have multiple saved numbers, pick one to use
- Dashboard: Displays active number information and provides access to various transaction features
- Purchase: Select a package → choose a payment method → confirm
- Decoy: A purchase technique that adds inexpensive "decoy" items to a single multipayment request in order to manipulate the total transaction amount
MayaXL is distributed as a pre-compiled binary via GitHub Releases. The installer scripts automatically detect your platform, download the correct binary along with database migrations, and set up everything needed to run the CLI.
Prerequisites: curl and sudo (Linux/macOS only for PATH update), or a Bash-compatible shell. No Node.js, Python, or Go runtime required the binary is self-contained.
The installer downloads the binary to ~/.local/bin/mayaxl, extracts database migration files alongside it, and optionally adds ~/.local/bin to your PATH via your shell RC file (.bashrc or .zshrc).
| Supported Architectures | Binary Name |
|---|---|
| Linux x86_64 | mayaxl-linux-x64 |
| Linux ARM64 (aarch64) | mayaxl-linux-arm64 |
| macOS Intel (x86_64) | mayaxl-darwin-x64 |
| macOS Apple Silicon (ARM64) | mayaxl-darwin-arm64 |
Fresh install:
bash <(curl -fsSL https://raw.githubusercontent.com/ryotwell/mayaxl/main/install.sh)After installation, run the tool with:
mayaxlUpdate to the latest version:
bash <(curl -fsSL https://raw.githubusercontent.com/ryotwell/mayaxl/main/install.sh) updateThe updater checks the installed version and only downloads the binary when a newer release exists. Your database and configuration are preserved.
Uninstall:
bash <(curl -fsSL https://raw.githubusercontent.com/ryotwell/mayaxl/main/install.sh) uninstallThis removes the binary, version file, and drizzle migrations. The SQLite database is kept by default delete it manually if desired:
- Linux:
~/.local/share/mayaxl - macOS:
~/Library/Application Support/mayaxl
The Termux installer works similarly to the Linux one but handles the additional requirements for running a glibc-linked binary on Termux's bionic-based environment.
Note: Only ARM64 (aarch64) devices are supported.
Fresh install:
bash <(curl -fsSL https://raw.githubusercontent.com/ryotwell/mayaxl/main/install-termux.sh)Update:
bash <(curl -fsSL https://raw.githubusercontent.com/ryotwell/mayaxl/main/install-termux.sh) updateUninstall:
bash <(curl -fsSL https://raw.githubusercontent.com/ryotwell/mayaxl/main/install-termux.sh) uninstallRemoves the binary (mayaxl.bin), wrapper script (mayaxl), version file, and migrations. The SQLite database at ~/mayaxl.db is retained.
The PowerShell installer places the binary in %LOCALAPPDATA%\mayaxl\mayaxl.exe and adds this directory to the user-level PATH environment variable.
Fresh install:
irm https://raw.githubusercontent.com/ryotwell/mayaxl/main/install.ps1 | iexAfter installation, open a new terminal and run:
mayaxlUpdate:
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/ryotwell/mayaxl/main/install.ps1))) updateUninstall:
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/ryotwell/mayaxl/main/install.ps1))) uninstallRemoves the binary, version file, and migrations. The SQLite database at %APPDATA%\mayaxl is kept. The user-level PATH entry is cleaned up automatically.