Software & AI engineer · Tbilisi, Georgia

Nikoloz Dolbaia

ნიკოლოზ დოლბაია

I have about three years of experience building software in banking and AI. At Bank of Georgia I built card features, at Meama AI automations, internal tools and a customer-support chatbot, and at Caucasus Tourism Holding a flight booking website and internal tools. My main interests are cybersecurity, backend development and AI.

About

I'm a software and AI engineer from Tbilisi with about three years of experience in banking and AI. I like understanding how systems work all the way down.

I studied computer engineering, with a minor in mathematics, at Free University of Tbilisi on a 100% state grant. Its core programming courses follow Stanford's CS106A, CS106B and CS107, and the projects further down come from my time there. I'm now doing a master's in computer science at the Technical University of Georgia.

My first engineering job was at Bank of Georgia, writing PL/SQL for card products. I built the notification systems for a new American Express card, tuned Oracle procedures that process tens of millions of rows, and covered overnight on-call shifts for the bank's end-of-day processes, resolving 10+ production incidents.

Then I moved into AI. At Meama I looked across teams for manual work worth automating and built LLM-based tools for it, from a workflow that turns court letters into signed replies to a customer-support chatbot. Several of these tools were packaged as products for other companies. At Caucasus Tourism Holding I built a flight booking website and internal tools, and I help colleagues across the company use LLMs in their daily work.

My main interests are cybersecurity, backend development and AI.

Experience

– present

AI Automation Engineer

Caucasus Tourism Holding (CTH), Tbilisi

  • Booking platform. Built a flight booking website for Georgian travellers with LLM-assisted development, on top of the Kyte airline API. It handles search and booking across airlines that each have their own fare, booking and ticketing rules.
  • Secure payments. Integrated Flitt's hosted checkout, so customers pay on Flitt's page and card data never touches our servers.
  • Internal tools. Develop tools and applications around what employees actually need, automating repetitive tasks and improving workflows.
  • LLM enablement. Help colleagues across the company adopt LLMs in their daily work, with hands-on guidance for their own tasks.

Kyte API · Flitt hosted checkout · LLM-assisted development

  1. Our site Search and booking

    Fares, availability and bookings through the Kyte airline API.

  2. Flitt Hosted checkout

    The customer types card details on Flitt's page.

    Card data stays inside this boundary
  3. Our site Payment result

    We receive the outcome of the payment, never the card number.

Fig. 1Payment flow on the flight booking site. Card details are entered on Flitt's hosted page and never reach our servers, which keeps card data, and most of the PCI DSS burden, off our side of the system.

–

AI Automation Engineer

Meama, Tbilisi

  • Finding automations. Looked across teams for manual work worth automating and built LLM-based tools for it. Examples: a Gmail workflow that turns incoming court letters into signed reply documents, and workflows between the machine service team and the call centre that ended recurring miscommunication.
  • Customer-support chatbot. Built a RAG chatbot for Instagram and Messenger that handles about 1,000 conversations a month and resolves 50–60% without a human agent. It is hardened against prompt injection with a defensive system prompt, an input classifier and red-teaming, and hands off to a person when unsure.
  • Productisation. Packaged successful tools as products for other companies, deployed on Railway with Google Cloud's Gemini API.

Python · LangChain · Qdrant · Gemini API · Gmail API · Railway

–

Software Engineer (PL/SQL)

Bank of Georgia, Tbilisi

  • Premium card launch. Built the messaging and email notification systems for a new American Express card for very high-net-worth clients.
  • Privileged data access. Worked with privileged production access to the bank's databases and Georgian Card's card-processing databases, keeping the two in sync so our changes were not overwritten by the processor's next-day data.
  • Incident response. Provided overnight on-call support for critical end-of-day processes and resolved 10+ production incidents in real time.
  • Performance tuning. Optimised Oracle stored procedures over tens of millions of rows, cutting runtimes from minutes to seconds with indexing and query tuning.
  • Document automation. Built dynamic Jaspersoft templates for legal documents, including the Credit Card IRR Agreement, generating documents for 100+ customers a day based on client status, currency and IRR rate.
  • Engineering practice. Took part in code reviews and wrote unit and integration tests in an Agile squad.

PL/SQL · Oracle · Jaspersoft

Education

–

Free University of Tbilisi

100% state grant

BSc in Computer Engineering · Minor in Mathematics

Admitted with a 100% state grant, awarded on national exam results. The core programming courses follow Stanford's CS106A, CS106B and CS107, and the university projects on this page come from my time here.

Relevant coursework

–

Technical University of Georgia

In progress

MSc in Computer Science

Graduated

School No. 10, Kutaisi

Silver medal

Silver medal for academic excellence

Certificates and awards

  • Coordinator assistant, Field Practice 2025Free and Agricultural Universities of GeorgiaCertificate of gratitude for outstanding diligence and active collaboration.
    2025
  • Diploma, “Create a Georgian Term” competitionIlia State University and UniLabAwarded for creating the best Georgian term.
    Apr 2023
  • IT Specialist courseF1 IT AcademyCertificate of completion.
    Nov 2021
  • B2 First (FCE)Cambridge Assessment EnglishGrade B, Council of Europe level B2.
    Score 179 · Jun 2020

Skills

Security

  • Access control and least privilege
  • Privileged production access
  • Production incident response
  • LLM red-teaming
  • LLM application risksPrompt injection, data leakage, over-broad agent permissions

Cloud and infrastructure

  • AWS (EC2, RDS)
  • Docker
  • Google Cloud (Gemini API)
  • Railway
  • REST APIs

Networking

  • TCP/IP
  • Subnetting
  • Routing and switching
  • DNS
  • Firewalls
  • VPNs
  • HTTP and HTTPS

Operating systems

  • Linux
  • Windows
  • Bash
  • PowerShell

Programming

  • Python
  • SQL and PL/SQL
  • C#
  • Java
  • C and C++
  • MATLAB
  • Scheme

AI and data

  • LLM API integration
  • RAG
  • Agentic workflows
  • Prompt engineering
  • Oracle performance tuning

A recent personal project first, then university work from Free University of Tbilisi, where the three programming courses follow Stanford's CS106A, CS106B and CS107. Most figures here are live, so you can try them.

Java · Spring Boot · React · Docker · AWS · 2026

Expense Tracker on AWS

Personal project · Spring Boot 4, Java 21, React 19, PostgreSQL

A small ledger I use myself, built end to end and run on my own AWS setup.

  • The app. A full-stack ledger with a Spring Boot 4 / Java 21 backend and a React 19 frontend, for tracking expenses, obligations, accounts and workouts.
  • The container. The frontend and API are packaged into one container image that runs as a non-root user on a read-only filesystem, with a health check. Images are scanned for vulnerabilities with Trivy.
  • The server. Deployed to AWS EC2 with Docker Compose, behind an nginx reverse proxy on an Elastic IP, with HTTPS from Let's Encrypt.
  • The database. Amazon RDS for PostgreSQL with no public access, reachable only from the application server's security group over encrypted connections.
  1. Internet Visitor

    HTTPS only, ports 80 and 443 open.

  2. EC2 nginx

    Terminates TLS with a Let's Encrypt certificate and forwards to the app.

  3. EC2 · Docker App container

    Spring Boot and React in one non-root, read-only image, on 127.0.0.1 only.

  4. RDS PostgreSQL

    No public access; only the app server's security group may connect.

    Private network
Fig. 2How a request reaches the expense tracker. Only nginx faces the internet; the app listens on the server itself, and the database accepts connections from the app server alone, over TLS.

C · C++ · Scheme

Programming Paradigms

Free University of Tbilisi · Stanford CS107 curriculum

Memory management in C and C++, functional programming in Scheme, and concurrency with threads. Every C assignment was checked with Valgrind for memory errors and leaks.

  • Six Degrees. Finds the shortest chain of films linking two actors. The movie database is a packed binary file that the program memory-maps and reads with pointer arithmetic, using binary search over offset tables and breadth-first search for the chain (Fig. 3).
  • Generic containers in C. A vector and a hash set built on void pointers and element sizes, with caller-supplied hash, compare and free functions.
  • Bank simulation. Concurrent deposits, withdrawals and transfers across accounts and branches, guarded by per-account and per-branch semaphores. Locks are always taken in account-number order, so two opposite transfers can't deadlock, and Helgrind checks for data races.
  • Random Sentence Generator. Reads a context-free grammar and expands it recursively into random text.
  • Where Am I, in Scheme. Estimates a position from distances to known stars: it tries every pairing of distances and stars, intersects the circles, and averages the most tightly clustered points, all in a purely functional style.
github.com/EngDolba/Programming-Paradigms
Byte layout of one actor record. Bytes 0 to 9 hold the name Tom Cruise, byte 10 is the terminating zero, byte 11 is padding, bytes 12 and 13 hold the film count as a short, bytes 14 and 15 are padding, and four-byte film offsets start at byte 16. 01234567891011 TomspCruise\0\0 name, terminated by a zero byte pad 121314151617181920212223 countoffset 0offset 1… short pad film offsets, one int each
Fig. 3One record from the memory-mapped actor file, shown for an example name. The name is padded to an even length, the film count is a 2-byte short, and the film offsets start at the next multiple of 4 bytes. Reading this format correctly is all pointer arithmetic.

C++

Programming Abstractions

Free University of Tbilisi · Stanford CS106B curriculum

Recursion, data structures and graph algorithms in C++, across seven assignments.

  • Trailblazer. Shortest paths with Dijkstra's algorithm and A*, and maze generation with Kruskal's algorithm. In my extended version I added Prim's algorithm and options for random terrain and mazes (Fig. 4).
  • Huffman encoding. A working file compressor: frequency table, optimal prefix-code tree, and bit-level reading and writing.
  • Priority queues. The same interface built four ways, from an unsorted vector and sorted linked lists to a binary heap, to compare their costs.
  • Boggle. A computer player that finds every word on the board by recursive backtracking.
  • And more. Markov-chain text generation, word ladders with breadth-first search, and recursion problems such as placing hospitals so that every city is covered.
github.com/EngDolba/Programming-Abstractions
Expanded Queued Shortest path
A* expanded
–
Dijkstra expanded
–
Path length
–
Fig. 4A maze generated and solved in your browser. A* uses an estimate of the distance left, so it usually expands fewer cells than Dijkstra before it reaches the goal. Pick a generator, then run each search to compare.

MATLAB · 2023

Signal Processing Labs

Free University of Tbilisi · signal processing laboratory

Lab work on digital filter design, spectra and detection, written in MATLAB.

  • Removing an interfering tone. I found the tone's frequency from the peak of the spectrum and removed it from a music recording with a second-order FIR notch filter. In the next lab I added poles at r = 0.95 beside the zeros, which makes the notch far narrower and leaves the music around it intact (Fig. 5).
  • Note detection. A bank of twelve resonator filters, one per semitone from A4 at 440 Hz, that names the note in a recording by which filter responds most strongly.
  • Window-based FIR design. Compared Hann, Hamming and Blackman windows in decibels, then designed a Kaiser-window low-pass filter from an attenuation target to clean up noisy speech.
  • Narrowband IIR filtering. Isolated the strongest frequency in a recorded signal with a resonator whose poles sit at r = 0.995.
  • Random processes. Sample mean, variance and empirical CDFs written from scratch and checked against Gaussian and uniform data.
github.com/EngDolba/Signal-Processing-Labs
Notch with poles at radius r FIR notch only, r = 0 Gain in dB against frequency ω in rad/sample

zeros poles

Cut below −3 dB
0.30–0.39 rad/sample
Music at ω = 0.5
0.0 dB
Mid-band, ω = π/2
+0.4 dB
Fig. 5Magnitude response of the notch filter, computed live. The tone sits at θ = 0.345 rad/sample. With r = 0 it is the plain FIR notch from Lab 2, which also cuts everything below about 0.94 rad/sample. Moving the poles out to r = 0.95, as in Lab 3, keeps the cut narrow.

C++ · Arduino · 2023

Arduino Motor Clock

Free University of Tbilisi · course assignment

An analogue clock driven by two motors, written as a reusable C++ class for an Arduino Uno. The same hardware also runs a timer, an alarm and a stopwatch.

  • Two motors, two kinds of motion. A servo drives the hour hand, where 0° means 0 h and 180° means 12 h, so the hand sweeps a half dial. A 28BYJ-48 stepper on a ULN2003 driver turns the minute hand, at 2,038 steps per revolution.
  • One class for the whole board. The MotorClock constructor takes the start time and all eleven pin numbers, so the wiring is defined in one place and the sketch stays short.
  • Input with two buttons. Button I counts and button II confirms. One press adds a minute to a timer, or an hour and then ten minutes to an alarm. The RGB LED shows the input mode: red for timer, green for alarm, blue for stopwatch.
  • Buzzer and wiring. The buzzer keeps sounding until button II is pressed. The breadboard wiring is documented as a Fritzing sketch in the repository.
github.com/EngDolba/Arduino-Clock
Hours · servo
Minutes · stepper
LED Buzzer

Showing the time in Tbilisi. Pick a mode to use the buttons.

Servo
0°
Stepper
0 / 2,038 steps
LED
off
Buzzer
quiet
Fig. 6A simulation of the clock's logic, set to the time in Tbilisi. Choose a mode and use buttons I and II as you would on the board. The timer and stopwatch run 60 times faster here, one minute per second.

Java

Programming Methodology

Free University of Tbilisi · Stanford CS106A curriculum

My first programming course, in Java with the ACM graphics library: decomposition, objects, events and small games.

  • Karel the Robot. Checkerboards, midpoint finding, stone masonry and newspaper collection, solved with nothing but loops, conditions and well-named methods.
  • Breakout. The arcade game, with paddle control, ball movement and collision detection against the bricks.
  • Hangman and Yahtzee. A console game with an animated canvas, and a full implementation of Yahtzee's scoring rules.
  • NameSurfer. Reads a century of US baby-name rankings and plots any name's popularity by decade (Fig. 7).
  • FacePamphlet. A small social network with profiles, photos, status updates and friend lists.
github.com/EngDolba/Programming-Methodologies
“Nicholas”, US popularity rank by decadeRank 1 is the most popular name
Show the data
DecadeRank
1900s132
1910s112
1920s130
1930s162
1940s141
1950s144
1960s147
1970s51
1980s19
1990s8
2000s6
Fig. 7NameSurfer's data for Nicholas, the English form of my name: rank 132 in the 1900s and rank 6 in the 2000s. The numbers come from the names-data.txt file used in the assignment.

Contact

I'm happy to talk about cybersecurity, backend development, AI or any of the projects here. Email is the quickest way to reach me.

Location
Tbilisi, Georgia