votapil
Denis Lipatov

Denis Lipatov

Senior backend engineer · PHP / Laravel · LLM features in production

I build Laravel backends and the LLM features inside them. In software since 2012, on Laravel since 2016. This year I built and shipped VotaWallet, an expense tracker for Serbia, on my own.

Belgrade, Serbia (CET) · Remote with EU and US teams, or relocation

Open to senior backend roles

I also take projects
VotaWallet: receipt items sorted into categories (demo data)
VotaWallet, my product. On Google Play.

My product

VotaWallet: from the first commit to Google Play

I got tired of typing my expenses in by hand. A friend once showed me that the QR code on a Serbian receipt links to almost the whole receipt. Now I scan it, and the app sorts every item into a category.

From the QR code the app pulls the official receipt record from the tax administration, with no OCR, and it learns categories from your confirmations. It has family budgets and a Telegram bot, and it never connects to bank accounts.

The hardest part so far was getting into the app stores: screenshots, descriptions, review rules and the code for all of it.

Web app, Telegram bot and Android on Google Play. iOS is in App Store review.

Solo since Feb 2026: 1,200+ commits. Available in English, Russian and Serbian. VotaWallet is part of the Google for Startups Cloud Program.

votawallet.app (opens in a new tab)
VotaWallet: scanning the QR code on a Serbian receipt (demo data)
VotaWallet: receipt items sorted into categories (demo data)
Demo data

Stack

Laravel 13, PHP 8.4, Octane, Horizon, Reverb, Passport, Filament, PostgreSQL, Redis, Pest · Nuxt 4, Vue 3, Vuetify (Material Design 3), Capacitor · Python FastAPI + OpenCV · Terraform, Google Cloud Run, GitHub Actions.

Connect your AI assistant to your wallet

While the app waited for Apple’s review, I added an MCP server to it. Connect Claude, ChatGPT or Gemini to your own wallet and ask where the money went. The server does the math, the model only talks.

  • 17 tools behind OAuth 2.1. AI gets its own narrow access, revocable in one click.
  • Totals and currency conversions come from the server, so they match the app.
  • Before adding a record, the server checks for likely duplicates. If one looks close, nothing is written until you confirm.
  • Records added by AI are marked in the app, and an AI import can be undone.
How it was built

The code is private. I’ll walk you through it on a call.

Experience

Senior roles at product companies: fully remote at GrowFood, and with a US team at Alyce before that.

I care about how code reads and runs. A tidy data aggregation or a well-placed cache makes my day.

GrowFood · Senior Backend Engineer Sep 2022 - Jun 2026 · Fully remote

Led the R&D direction inside the dev team: PHP and Laravel upgrades across all services, Redis queues, Kafka, Datadog, and 10+ production Telegram bots on one platform.

  • Unified marketplace and retail partner integrations, plus Jira and 1C (ERP), behind one entry point built for several partners from the first one. The second and third partners plugged in without a heavy rewrite.
  • Performance work started from p90 response times, then a profiler or EXPLAIN: N+1 queries removed, key routes several times faster.
  • Shipped LLM features in production (support bots, dish detection in photos, a self-learning ticket classifier) and set up AI-assisted development for the team: rules, skills and MCP servers linking Cursor, Claude Code and Antigravity to internal knowledge bases.
Alyce · Senior Laravel Developer Sep 2021 - Jul 2022

B2B SaaS from Boston: new features and architecture decisions in a production codebase, daily work in English with a US team.

Coalition Education Center (matetech.ru) · Senior PHP Developer Jul 2019 - Sep 2021

Launched matetech.ru from an empty repo: a multi-tenant learning platform with sub-companies and subdomains. Built a code-generation system and brought in git-flow.

Media Target (pushex.io) · Backend Developer Dec 2017 - Jun 2019

Built pushex.io from the ground up on Laravel, with Go microservices and a custom worker model for faster personalized push delivery. Hired engineers.

TriLan (diler.ru) · Backend Developer, freelance Aug 2017 - Dec 2017

Made diler.ru from scratch on Laravel and Vue, with a catalog parser that a non-technical manager configures for each source site.

legko.com · Laravel Developer Nov 2016 - Jun 2017

Took the service from zero to launch: architecture, database, admin panel, user area and tests.

Earlier roles · Project manager, PHP and Android developer 2012 - 2016

The project management years still help in AI work: clear specs and careful checks of model output.

Three products from an empty repo, architecture and database included: legko.com, diler.ru, matetech.ru.

Core stack

PHP 8, Laravel, Go, MySQL, PostgreSQL, Redis, Kafka, ClickHouse, Docker, Kubernetes, Linux, REST API and OpenAPI.

Education

Synergy University, Applied Informatics (Bachelor’s). Also studied at NRNU MEPhI (Computer Systems and Technologies), the LKSh summer computer school and the Mytishchi School of Programmers.

Languages

Russian (native), English B2 (certified), Serbian (basic).

Open source and side builds

VotaCrudGenerator

My Laravel package that generates CRUD code from the database schema: 850+ installs on Packagist.

votaboilerplate

A Laravel 13 and Nuxt 4 starter for projects that will be written with coding agents, built from the VotaWallet experience.

VotaMonad

Built in one day at Monad Blitz Belgrade, Aug 2026: track-and-trace that anchors 100,000 codes on-chain in two transactions through one Merkle root.

Pivonator

Akinator, but for beer. A Bayesian engine picks the question that narrows the choice the most, and a bartender named Brew asks it. It knows 11,000+ beers and is still in development.

In development

How I work with AI

In VotaWallet, models draft and check each other; the tests and my own review decide what ships.

The model’s plan sounded right

Checked against the real code and database, the plan for VotaWallet’s MCP server had missed five problems you can’t see from a chat. All of them were closed before the feature shipped.

  1. Model

    A long design conversation with Gemini about an MCP server for VotaWallet.

  2. Me

    I checked every claim against the code, read-only production data and the MCP clients’ docs.

  3. Checks

    That check turned up the problems the chat had missed, so the spec was written around them.

  4. Model

    A second model reviewed the plan without changing anything: 25 findings.

  5. Me

    Each finding went back to the code before I accepted or rejected it.

  6. Checks

    Tests first, then code: Claude Code wrote it task by task from the spec.

  7. Me

    Shipped, then checked live with Claude, ChatGPT and Gemini.

Four rules I keep

Spec first

Every feature starts from a written spec. VotaWallet has two dozen of them, plus a short list of rules the agents may not break.

I don’t merge a diff I can’t explain

I read every diff before it merges, and each change comes with a test that shows what it does. Nothing reaches production until the full suite passes.

A second model checks the first

On Pivonator, the reviewing model ran its own simulator and caught a sign error in the math that picks the next question.

Mistakes become rules

When an agent gets something wrong, I find out why and write a rule. Once it joined a table with a similar name from another data domain: the result was wrong only on some loop iterations and nothing threw. That is a rule now.

Toolbox

Agents and assistants

  • Claude Code (main)
  • Cursor
  • Antigravity
  • Gemini CLI
  • NotebookLM
  • OpenClaw

Method

  • Spec Kit (spec-driven development)
  • TDD with Pest
  • Hooks that run tests after edits
  • Cross-model review
  • Playwright checks

MCP servers

  • VotaWallet (mine, for end users)
  • Postgres
  • Redis
  • Context7
  • Google Stitch
  • Playwright

Local models

  • Parakeet speech-to-text
  • Ollama embeddings

Skills I wrote

  • Pull bug reports from production with screenshots and console logs, fix, ship, reply to the reporter
  • Seed demo data and check it looks plausible before capturing screenshots and video for a post
  • Draft a devlog post from the day’s commits
  • Generate an API endpoint database-first with VotaCrudGenerator, my own package

73 agent skills in the VotaWallet repo. Most are community packs I chose and tuned; the project-specific ones I wrote.

Agents I set up for myself

VotaClaw

Personal assistant

It lives in one Telegram chat, files what I send into my Obsidian notes and watches VotaWallet’s CI and production errors.

Rules it runs on

  • Plain scripts first, the model only when there is something to say.
  • Text from outside is data, never instructions.
  • Silent by default.
  • Anything external, like a post or a calendar event, waits for my tap.

Once a week it reads its own history and proposes changes to its own rules. I approve or reject them.

How it behaves. Real messages stay private.

In
Voice note
It does
Transcribes it offline with a local speech model and files it like a text note.
Waits for me
Nothing
In
Event poster
It does
Pulls out the title, date, time and place, then writes an event note.
Waits for me
“Add to calendar?”
In
New commits
It does
Drafts a devlog post in my voice.
Waits for me
Publishing
In
VotaWallet errors
It does
Checks CI runs and production error logs, then sends me one short message.
Waits for me
What to fix
In
A page with instructions inside
It does
Writes a summary; any commands in the page stay plain text.
Waits for me
Nothing runs
In
Nothing happened
It does
Stays silent.
Waits for me
Nothing

Agentic document pipeline

Adapted from an open-source framework. One agent drafts only from a fact base I keep correct. A second agent reviews with a fresh context. A check flags any line I could not defend in a conversation, and a script checks that machines read the PDF correctly. The final text is mine: I edit it and decide what goes out. It suits any document where every line has to hold up: proposals, contracts, support replies.

I also take projects

Contract work and consulting. Same rules as in my own products: a written spec first, tests on every change, and nothing goes out without your approval.

An MCP server for your product

Your customers connect Claude, ChatGPT or Gemini to their own data in your app, with narrow access they can revoke. Totals come from your server, so they match your app. Records added by AI are marked, and an AI import can be undone in one step.

Where I’ve done it: VotaWallet

LLM features and bots in your product

A support bot over your docs, ticket triage that learns from your team’s choices, photo classification, Telegram bots and assistants that draft for a person to approve.

Where I’ve done it: GrowFood VotaClaw

An MVP from an empty repo

Laravel and Nuxt with a Material Design UI, and one codebase for web and mobile. Google Cloud is set up with Terraform, and CI runs from the first day.

For an existing team, I set up agentic coding with rules, skills and MCP servers, as I did for the dev team at GrowFood, and add a CI gate that tests what the agents write.

At handover you get the repo, docs generated from the code, and a rules file that the next developer or AI agent reads first.

Off the clock

D&D 5e

An evocation wizard and a kenku monk who carves runes.

Actor

Five screen credits, 2009-2013.

Kinopoisk

Belgrade

Where I live and go to startup events: Startup World Cup Serbia as the founder of VotaWallet, Monad Blitz Belgrade with a one-day build.

Also anime and films, fencing a few years back, and beer as a dataset (Pivonator).