Junior AI Engineer

Aleksandr
Balaev

I build software with AI agents and make sure it works. Most recently I co-built Personal Exchange Bot, a Telegram service that helps Russians living abroad exchange rubles for local currency, person to person. It has been in production since October.

Based in Nitra, Slovakia. Open to roles in Bratislava or remote.

Aleksandr Balaev in a black hoodie, standing by a baroque stone wall in Dresden

Personal Exchange Bot

Rubles for local currency, person to person. A safer alternative to exchange chats, with a rate you can check.

Banks won’t take rubles

Since the 2022 sanctions, most banks and exchange offices in Europe no longer exchange rubles. Yet many Russians live abroad and need local money, like Czech koruna.

Chats are full of scammers

So people swap in Telegram chats, typing “I’ll swap this much for that much” by hand, with scammers among them.

Changers push the rate

Money changers in those chats inflate the rate and set the trend for everyone else.

The bot turns this into a clear process: structured offers, rates to compare, checked accounts and ratings.

A simplified walkthrough: create an offer, get responses, agree on a place, exchange and rate. The bot never holds money.

4,808

automated tests, run on every pull request

173

screens in the bot

327

pull requests merged, each through CI and review

2

days from the spec to a working first version

Built in a team of two.

The idea and the original spec came from my teammate. I turned the spec into a working product in two days, then kept building.

Version one in two days

On 30 September and 1 October I built the first working version end to end: database, offer feed, responses, deals and ratings, notifications, moderation, a web admin with two-factor login, Docker and tests.

Interface and design

Bot flows and the admin panel: the redesign, the mobile version, the System and Stats sections, ban management, and an Android admin app in Kotlin with Jetpack Compose.

Trust and safety

An encrypted log of every deal chat, phone and Telegram account checks against the CAS and LOLS spam databases, weighted reputation, a risk score that alerts moderators, and deal complaints.

Rates and languages

Market rates from ExchangeRate-API, exchanger rates from BestChange, Revolut and Wise for comparison. The bot reads amounts written as text, like “1000 euro” or “€1000”. I also added Ukrainian and the language packs.

Test infrastructure

I laid the groundwork for testing: database fixtures, a test bench for the bot, and end-to-end tests that run the bot, the worker and the admin together.

Tooling for AI agents

Environment checks, a map of every screen, and automatic handoff between agent sessions, so each new session picks up exactly where the last one stopped.

153 of the 365 commits and 103 of the 327 merged pull requests are mine.

Agents write the code.
I own the result.

On Personal Exchange Bot every change runs through the same loop: one GitHub issue, one coding agent, one fresh session. People stay in the loop through the issue thread.

  1. Open an issue

    Every task starts as a GitHub issue. Its labels set the model and the effort, using Claude Code’s own values.

  2. Start an agent

    A session manager runs the issue watcher and starts one headless Claude Code agent per issue, each in its own git worktree.

  3. Confirm the task

    Before any code, the agent posts how it understood the issue, with sample screens where relevant.

  4. Build

    The agent writes the code and the tests on its own branch and opens a pull request through the existing workflow.

  5. Verify

    CI runs ruff, mypy, the full pytest suite and a secret scan. Then a person reviews the result.

  6. Hand off

    The agent leaves a handoff for the next session. Agents talk through issue comments, in plain language anyone can read.

A simplified example of one issue going through the loop.

1 : 1

One issue, one agent. Each works in its own git worktree, on its own branch, from a fresh session.

2

agents at a time. Other issues wait in a queue, and no issue ever gets two agents.

Opus, xhigh

the default model and effort when an issue has no labels.

Labels set the power

model:haikumodel:sonnetmodel:opus

effort:loweffort:mediumeffort:higheffort:xhigheffort:max

0

shared secrets. One setup script, and everyone signs in with their own GitHub and Claude accounts.

Hi, I’m Alex.

I live in Nitra, Slovakia, and study English at Constantine the Philosopher University. I came into tech through testing: I’m an ISTQB-certified tester and test web and mobile apps for real clients on uTest.

Now I’m focused on AI engineering: building real products with AI agents, and making sure what they ship actually works.

Experience

QA Crowdtester (freelance)

  • Exploratory and functional testing of web and mobile apps for real clients
  • Reproducible bug reports with clear steps and expected results
  • Logs and HTTP traffic analysed in Fiddler and Charles Proxy

Gaming Club Administrator

  • Technical support for customers
  • Maintenance of gaming workstations and software
  • Technical setup for CS:GO and Dota 2 tournaments

Education

Constantine the Philosopher University in Nitra

Faculty of Arts

  • Advanced English communication
  • Text analysis
  • Research
  • Public speaking

Skills

AI engineering
Claude Code, agentic engineering, AI agent orchestration, tooling and handoff for agent sessions
Shipped with
Python, aiogram 3, FastAPI, PostgreSQL, SQLAlchemy
Quality
pytest, Hypothesis, ruff, mypy, gitleaks, exploratory and functional testing, bug reporting, Fiddler, Charles Proxy, Jira
Learning now
  • Python
  • SQL
  • API testing

Languages

English
Upper-intermediate (B2)
Russian
Native
Slovak
Full understanding, speaking at B1

Certificates

GitHub Foundations

Exam GH-900.

In preparation

Let’s talk.

I’m looking for a junior role in AI engineering, in Bratislava or remote. The bot’s code is private, so I’m happy to walk you through it on a call.