Ordering app for your café or shop
A Telegram Mini App where customers browse your menu, order and pay, with a staff panel for orders, stock and profit per product. Like Rahat Go, set up for your business.
Ruslan Akhmetvaleev · Da Nang, Vietnam · remote
QA automation engineer (SDET) at CMA Small Systems, working on instant payments and SWIFT / ISO 20022 messaging. In my own time I build products like Rahat Go, an ordering app and CRM that runs a bakery inside Telegram.
01 Product · 2026
My friend owns a bakery in Da Nang. Orders came in through chats, stock lived on paper, and nobody knew which dishes actually made money. I built him one app that does all of it, inside Telegram, where his customers already are.
Customers browse the menu, order for pickup or delivery and pay by QR. Staff run the order pipeline, a POS, dine-in tables and daily stock. The owner sees revenue, best sellers and the real cost and margin of every dish.
One Go binary serves the bot, the REST API and the Mini App. I designed it and built it with Claude Code sub-agents, reviewing every pull request.
Try it: add something to the cart, then switch to Staff and Owner.
About this phone
A working replica of Rahat Go built for this page. Dishes, photos and prices are the bakery's real menu; ingredient costs and today's orders are illustrative.
02 Day job · 2023 — now
At CMA Small Systems I build backend test frameworks for payment systems: instant payments, SWIFT MT and ISO 20022 MX messages, and the conversion between them.
The trick that paid off most was writing the steps in business language. Our manual testers could read them, then write new scenarios themselves. I onboarded six of them, and testing that used to take days across several projects now takes hours.
Try it: run the scenario, or break the payment and watch the test catch it.
The scenario in the demo is illustrative and uses public ISO 20022 message types. Client systems and data are under NDA.
package bank.tests.steps import io.cucumber.java.en.Givenimport io.cucumber.java.en.Thenimport io.cucumber.java.en.Whenimport org.assertj.core.api.Assertions.assertThatimport java.math.BigDecimal class PaymentSteps( private val accounts: TestAccounts, // test-data API private val gateway: PaymentGateway, // ISO 20022 endpoint private val clearing: ClearingSim, // clearing system simulator) { private lateinit var debtor: String private lateinit var pacs008: Pacs008 @Given("the debtor account {string} has {bigdecimal} EUR") fun debtorHas(iban: String, balance: BigDecimal) { debtor = iban.replace(" ", "") accounts.ensureBalance(debtor, balance, "EUR") } @When("the bank sends a pacs.008 credit transfer of {bigdecimal} EUR to {string}") fun sendCreditTransfer(amount: BigDecimal, creditor: String) { val mt103 = Mt103.creditTransfer(debtor, creditor.replace(" ", ""), amount) pacs008 = MtToMx.convert(mt103) // MT103 -> pacs.008.001.08 assertThat(pacs008.settlementAmount).isEqualByComparingTo(amount) gateway.send(pacs008) } @Then("the message is valid against the pacs.008 schema") fun messageIsValid() { assertThat(Xsd.PACS_008.validate(pacs008.xml)).isEmpty() } @Then("the clearing system replies with pacs.002 status {string}") fun clearingReplies(status: String) { val pacs002 = clearing.awaitStatusReport(pacs008.endToEndId) assertThat(pacs002.txStatus).isEqualTo(status) } @Then("the debtor account has {bigdecimal} EUR") fun debtorBalance(expected: BigDecimal) { assertThat(accounts.balance(debtor)).isEqualByComparingTo(expected) }}Allure-style report · run #1
Simulated run with illustrative timings.
03 ML + automation · 2023
In 2023 I had a part-time job labeling buyer–seller chats: did they agree on a deal? Yes, no, or not enough information. After a few thousand of them, I noticed I was the training data.
A Tampermonkey script saved every answer I gave. I fine-tuned a small Russian BERT on those answers, and a Selenium bot used the model to read each chat and click the answer.
Chats in the demo are made up; the numbers are from the project's saved results.
Покупатель и продавец договорились о сделке?Did the buyer and seller agree on a deal?
Tap an answer to guess before the bot does.
demo sample · synthetic chats
04 Bachelor's thesis · 2022
Classical upscaling can only blend the pixels it already has, so a 4× enlargement comes out blurry. A GAN learns what real detail looks like and draws it back in.
I implemented and trained SRGAN and ESRGAN in PyTorch and compared them with bicubic interpolation. Drag the slider: left is bicubic, right is my ESRGAN, from the same small input.


Set5 benchmark images; the models were trained on CelebA faces.
05 Mobile game · 2020 — 2021
Asteroids fall on your city; swipe to cut them down. Chain three or more in one swipe for a combo. I made it in Unity with C#: waves, 12 power-ups, dark and light themes, English and Russian, and AdMob ads.
Play a round. Desktop: drag with the mouse. Phone: swipe.
This is a small browser remake of the core loop. The original Android game was on Google Play until the developer account went inactive.
Browser remake · 2021 Android game
Swipe through falling asteroids before they reach the city. Hit three or more in one swipe for a streak.
Wave 1 cleared
Keys 1 2 3 · bonus lasts 15 s
The city has fallen
0
New best score
Drag or swipe to cutP pauseScoring and bonuses follow the original C#
Experience
2023 — now
2023
2022
2018 — 2022
Freelance
A Telegram Mini App where customers browse your menu, order and pay, with a staff panel for orders, stock and profit per product. Like Rahat Go, set up for your business.
API and UI test suites with CI and readable reports. BDD steps in plain language, so your team can write new tests without me.
Automate the repetitive part of your work: notifications, order intake, reports, admin panels, integrations with the services you already use.