Repository navigation
Releases
v0.24.1
The live USDT price again; restoring a backup in the README
- Fixed: the live USDT price stopped on some servers. The bot read it from Tetherland and Wallex. Tetherland's API is gone, and Wallex does not answer some servers outside Iran. On those servers no source answered, and a store with no rate of its own (
payments.usdt_rate) stopped offering USDT payment for Toman prices.- The bot now reads Nobitex, Tabdeal and Wallex and uses the middle price of those that answer. A reading is still refused when the exchanges are more than 3% apart. One exchange that is down, or that blocks your server, leaves two.
- Fixed: a failed reading now says why. When no exchange answers, the error names each one and why it gave nothing: unreachable, timed out, an HTTP status, or no usable price. It shows in the bot's log and on Read it now under Gateways. Before, it only said that none answered.
- Docs: the README has a new section, Backups, restoring and moving to a new server. It covers where backups are, where to see the backup key again (
sudo bobres> 11), and restoring on the same server. It also gives the six steps to move to a new server and says what comes back. The README also shows a screenshot ofsudo bobreson a real store.
Updating: sudo bobres update or System > Updates. There is no migration, and only the bot changes. A few minutes after the update, the live rate is read again, and USDT payment comes back where it had stopped.
Full details: CHANGELOG.md
What's Changed
- Live USDT price: read Nobitex, Tabdeal and Wallex; say why none answered by @sobhanaz in #180
- Release 0.24.1: the live USDT price again; README screenshot and restoring a backup by @sobhanaz in #179
Full Changelog: v0.24.0...v0.24.1
v0.24.0
Days from the first connection
- Added: days from the first connection. A bought service can now start counting its days when its config first connects, not when it is made. A customer who sets up the app a week later loses no days, and a reseller can hand a config out later.
- There are two switches in the dashboard's Settings > Days from the first connection: one for customers' purchases and one for resellers'. You can also use
/set first_use.customersand/set first_use.resellersin the bot. Both are off by default. - The panel client is made with a delayed start. 3x-ui, Marzban, S-UI and Hiddify all support this. Until the first connection, the service is active with no end date. It can wait as long as needed, it cannot expire, and it gets no reminder about its end. The bot, the Mini App and the dashboard show 30 days, from the first connection instead of a date.
- At the first connection the panel sets the end date. The usage sync picks it up, and from then on the service runs like any other.
- Renewing a service that is still waiting adds the renewal's days to the wait. A traffic package keeps the wait as it is, and days added by staff also go to the wait.
- The free trial and services made by staff start at once, as before. Services made before a switch is turned on keep their dates.
- There are two switches in the dashboard's Settings > Days from the first connection: one for customers' purchases and one for resellers'. You can also use
Updating: sudo bobres update or System > Updates. There is one additive database migration (core 00058). The bot, core and the provisioner update together.
Full details: CHANGELOG.md
What's Changed
Full Changelog: v0.23.0...v0.24.0
v0.23.0
Undelivered orders, late receipts, and the welcome in view
-
Added: undelivered orders. Paid orders that could not be delivered because a server did not answer now have their own list, at Payments > Undelivered in the dashboard and in the bot's admin menu. Each one shows the buyer, the seller, the plan and the server. Staff can:
- retry one order or all of them;
- deliver the order on another server, for the same plan and price;
- refund it to the buyer's wallet with an optional note. A reseller's commission on an order that was never delivered is taken back.
The buyer is told about each of these. A service that arrives late comes with an apology for the wait.
-
Fixed: late receipts were lost. A card-to-card receipt sent after the 30-minute receipt step closed was dropped. The bot now offers the payments still waiting for a receipt, with their reference, and one tap sends the receipt to the owners for approval. After approval the money reaches the wallet, as before. A picture sent when no payment is waiting gets instructions on how to pay.
-
Added: a 💳 Top up wallet button in the reseller panel.
-
Changed:
/startanswers with the welcome and the bottom menu only, so a long welcome stays in view. Buy and Free trial come first, each on its own row.
Updating: sudo bobres update or System > Updates. There is one additive database migration (core 00057). The bot, core and the provisioner update together.
Full details: CHANGELOG.md
What's Changed
- Release 0.23.0: undelivered orders, late receipts, the welcome in view by @sobhanaz in #177
- Undelivered orders: list, retry, move to another server, refund with a note by @sobhanaz in #175
- Bot: welcome without the home screen; Buy and Free trial first by @sobhanaz in #174
- Receipts sent after their step closed reach the owners; reseller panel top-up by @sobhanaz in #176
Full Changelog: v0.22.1...v0.23.0
v0.22.1
The Config names card, and a faster name lookup
- Fixed: the dashboard's Settings > Config names card (the two switches added in 0.22.0) did not show, and the switches could not be saved from the dashboard. They could only be turned on from the bot's settings. The card now shows and saves.
- Changed: the example config name is now
USERNAME12345in the bot, the Mini App and the dashboard, in every language. Capital letters are accepted and saved as small letters (username12345). - Changed: a new index makes the provisioner's name check fast on large client lists (provisioner migration 00009, additive).
Updating: sudo bobres update or System > Updates.
Full details: CHANGELOG.md
What's Changed
Full Changelog: v0.22.0...v0.22.1
v0.22.0
Config names
Customers and resellers can choose the name of a new config (sobhan1234) instead of the automatic u<id>-<random>, and rename a service they have, keeping the same subscription link.
- Off by default. Turn it on in the dashboard under Settings > Config names: one switch for customers, one for resellers (also in the bot's
/setlist). - Where: the bot's payment menu and the Mini App checkout ("Choose a config name"), and Change config name on My services in the bot and the Mini App, the reseller panel, and the dashboard's service page for staff (with a reason, audited).
- Rules: 4 to 20 lowercase letters and digits, at least one of each; Persian digits are accepted; a reseller's prefix stays in front (
sob-sobhan1234). - Unique everywhere, before payment: checked in BOBRES and on every enabled panel. A server that does not answer means "try again", never "free". If someone takes the name on a panel between the check and the delivery, the paid service is made with the automatic name and the customer is told.
- Rename works on 3x-ui and Hiddify. Marzban (usernames cannot change) and S-UI (the link contains the name) hide the button.
Updating: one additive migration (core 00056). sudo bobres update or System > Updates updates the bot, core and the provisioner together.
Full details: CHANGELOG.md
What's Changed
- CI: Hiddify job is a real check; the ruleset lists every CI job by @sobhanaz in #167
- Config names: customers and resellers choose and rename their config names by @sobhanaz in #168
- Release 0.22.0: config names by @sobhanaz in #169
Full Changelog: v0.21.1...v0.22.0
v0.21.1
Updating to 0.21.1
From the dashboard: System > Updates > Update now (owner only), or over SSH: sudo bobres update. If something is wrong afterwards: sudo bobres rollback. No migration; core and the bot update together.
Fixed:
- No startup warning after an update or a reboot. Core starts a few seconds before the bot, so its first look at the CI facts failed with
lookup bot … server misbehavingand showed on the System page as a warning. In core's first two minutes that is now logged as information; later it is a warning, as before. - The install id is made safely by concurrent callers. Callers that found it missing at the same moment could fail with "no rows". A real install has the id from its first migration, so stores were not affected; the benchmark's test setup was.
Also since 0.21.0: the Hiddify real-panel CI job starts reliably, and the README has a new look.
What's Changed
- CI: make the Hiddify integration job start reliably by @sobhanaz in #158
- Install id: no "no rows" when callers make it at the same moment by @sobhanaz in #159
- READMEs: bring them up to v0.21.0 by @sobhanaz in #160
- Issue chooser: send security reports to the private advisory form by @sobhanaz in #162
- Monitor: no warning when the bot is still starting by @sobhanaz in #163
- README: neon redesign with animated cards, mockups and system-design flows by @sobhanaz in #165
- Release 0.21.1: no startup warning after an update, install id race by @sobhanaz in #166
Full Changelog: v0.21.0...v0.21.1
v0.21.0
Updating to 0.21.0
From the dashboard: System > Updates > Update now (owner only), or over SSH: sudo bobres update. If something is wrong afterwards: sudo bobres rollback. Four additive migrations (core 00053–00055, provisioner 00008); core and the bot update together. Nothing new is switched on by the update.
What is new:
- S-UI and Hiddify Manager panels beside 3x-ui and Marzban (Panel servers > Panel software). Tested against S-UI v1.6.6 and Hiddify Manager v14.0.5. Hiddify has one "all proxies" inbound, no client groups, and counts expiry in whole days.
- Arabic, Russian and Turkish (beta) in the bot, the Mini App and the dashboard. Each store turns them on in Settings > General > Customer languages; the default stays Persian and English. The texts are machine-translated and need a native speaker's review.
- New product announcements: an Announce button on a plan posts a card with a Buy button in the store's channel and sends it to customers who said yes when the bot asked them once (off by default).
- The wallet answers faster: a balance with its USDT equivalent now takes 2 database reads instead of 9.
- For the vendor's own store only (a license with private features): the affiliate program (20% of a buyer's first license, off by default), refunds of sold licenses, the Hosted stores register with health from each store's
/metrics, andtools/hostedfor assisted installs. - A benchmark baseline (
docs/21-benchmark.md,tools/bench): 366–448 purchases a second on one machine, about 180 MB for all six services under load.
Known limits: the Hiddify real-panel CI job is allowed to fail (its upstream image is experimental and did not start on this run); tools/hosted has been tested only against a fake SSH runner; announcements and the affiliate program were tested against a fake Telegram.
What's Changed
- New product announcements (channel and private, with a Buy button) by @sobhanaz in #153
- Release 0.21.0: S-UI and Hiddify, three beta languages, affiliate and hosted stores, benchmark by @sobhanaz in #157
- Add S-UI and Hiddify Manager panel kinds by @sobhanaz in #152
- Benchmark baseline of v0.19.0 before code protection by @sobhanaz in #154
- Arabic, Russian and Turkish (beta) in the bot, Mini App and dashboard by @sobhanaz in #155
- Affiliate program and hosted-store tooling (vendor side) by @sobhanaz in #156
Full Changelog: v0.20.0...v0.21.0
v0.20.0
Updating to 0.20.0
From the dashboard: System > Updates > Update now (owner only), or over SSH: sudo bobres update. If something is wrong afterwards: sudo bobres rollback. One additive migration (core 00052); core and the bot update together.
What is new:
- Messages only for resellers (Resellers > Messages): to those who owe, all, or one tier, with
{name},{debt},{balance},{credit_limit},{tier},{customers}filled in per reseller, a preview, "send to me" and a Settle / Top up button. - A weekly settlement reminder (off by default; Thursday 21:00 store time by default; only resellers in debt by default), sent once a week in each reseller's language.
- Buttons for services the panel no longer has: "Manage these services" under the daily notice and "Not on the panel (N)" in
/admin(make again or delete, one by one or all, each asked first), and bulk select in the dashboard.
Known limits: {name} is the reseller's @username (or group name, or id); tested against a fake Telegram.
What's Changed
- Decide about services not on the panel from the bot and in bulk by @sobhanaz in #149
- Messages to resellers and a weekly settlement reminder by @sobhanaz in #150
- Release 0.20.0: reseller messages and reminder, actions for services not on the panel by @sobhanaz in #151
Full Changelog: v0.19.0...v0.20.0
v0.19.0
Updating to 0.19.0
From the dashboard: System > Updates > Update now (owner only), or over SSH: sudo bobres update --check and then sudo bobres update. If something is wrong afterwards: sudo bobres rollback.
Additive migrations only (core 00048 to 00051, payments 00009 and 00010). Everything new is off until the owner turns it on.
What is new:
- Cashback on paid and delivered orders (a refund takes it back), reseller monthly targets with a bonus per tier, and a daily wheel of fortune (one free spin a day, a daily budget, never paid spins). Settings > Growth.
- Aqayepardakht, a fourth Iranian card gateway, and automatic TON payments (a unique comment per payment, read from TON Center, priced from Binance and OKX). Gateways page.
Known limits, in short: neither gateway was tried against the real service yet: run the checklist at the end of docs/19-aqayepardakht.md and docs/20-ton.md with a small real payment first. The wheel's animation was not seen on a real phone.
What's Changed
- Release 0.19.0: growth tools, Aqayepardakht and automatic TON by @sobhanaz in #148
- Growth tools: cashback, reseller monthly targets, daily wheel of fortune by @sobhanaz in #146
- Add the Aqayepardakht gateway and automatic TON payments by @sobhanaz in #147
Full Changelog: v0.18.0...v0.19.0
v0.18.0
Updating to 0.18.0
From the dashboard: System > Updates > Update now (owner only), or over SSH: sudo bobres update --check and then sudo bobres update. If something is wrong afterwards: sudo bobres rollback.
Additive migrations only (core 00041, 00042, 00046, 00047; provisioner 00007). Everything new for operators and owners is off until switched on, so an update changes nothing customers see except the three customer features below.
What is new:
- My codes in the bot (Wallet,
/codes) and the Mini App: the customer's own reward codes and the gift codes they applied. - A plan priced in USDT can be paid from the Toman wallet, at the shown rate (the quote holds for 2 minutes), and the Mini App tops up in USDT too.
- Per-server capacity limits, a Prometheus
/metricsendpoint (off until a token is made), an uptime view and an optional public status page. - Approve dashboard sign-ins in Telegram (off by default;
sudo bobres admin approval offis the way out) andsudo bobres rotate-keyto replace the master keys.
Known limits, in short: rotate-key was tested with throwaway databases and a fake Docker, not on a real server yet: take a backup you keep off the server first. A bulk purchase of a USDT-priced plan still uses the USDT wallet.
What's Changed
- Roadmap: the hosted offering and the affiliate program as written plans by @sobhanaz in #140
- 0.18.0, part 1: my codes, and USDT plans paid from the wallet (with the Tether top-up in the Mini App) by @sobhanaz in #142
- My codes: the customer's own list of reward and gift codes by @sobhanaz in #138
- Pay a plan priced in USDT from the wallet, and top up in USDT in the Mini App by @sobhanaz in #141
- Release 0.18.0: my codes, USDT plans from the wallet, capacity, metrics, uptime, sign-in approval, rotate-key by @sobhanaz in #145
- Approve dashboard sign-ins in Telegram, and bobres rotate-key for the master keys by @sobhanaz in #143
- Platform capacity, metrics and uptime: server limits, GET /metrics, uptime view and status page (release 0.19.0) by @sobhanaz in #144
Full Changelog: v0.17.2...v0.18.0