Petras Bukelis
PHP / Full-Stack Developer

Petras Bukelis

I turn legacy systems into platforms worth keeping — and rough ideas into products that ship.

About

Five years as a backend-focused PHP developer, working directly with leadership to plan, scope, and architect internal platforms — and staying hands-on with the code the whole way through.

Core stack is PHP 8.4+, Symfony 8, Docker, and MySQL/MariaDB, with GitLab and GitHub CI/CD wired into everything I ship. Full-stack capable — Vue.js, Twig, JavaScript — but backend is my home. Through the company I work for, I've built systems for clients across healthcare, public sector, and banking-adjacent work, and spent the last few years working with self-hosted LLMs and NLP models — enough hands-on experience to know how they actually fit into a system, not just how to call an API.

Lithuanian — fluent in English and Lithuanian.

Case Studies

Seven apps, one shared foundation

Seven standalone applications — spanning data pipelines and language-driven analysis — each its own codebase, each operable only by a developer, each rebuilding the same groundwork from scratch. I architected a shared services layer underneath all seven, plus a management interface so non-developer staff can configure and run them directly.

Led the architecture end to end — my first project of this scale — refining the design with feedback from our CTO along the way.

Before
After
7 apps, dev-only
Admin UI
Seven separate applications, seven separate codebases
No shared services — the same groundwork rebuilt in each one
Only a developer could operate or adjust any of them
Same seven applications, still separately owned and coded
One shared services layer underneath, built once, used by all seven
Non-developer staff configure and run them through a dedicated UI
Symfony
Docker
GitLab CI/CD
MySQL / MariaDB

Don't hand a stranger your personal data

When large language models started getting wired into internal products, there was no way to guarantee a third-party provider wouldn't retain — or leak — the personal data inside the text it received: names, phone numbers, ID codes, addresses. Rather than avoid LLMs, I built a self-hosted service — running its own local NLP model — that strips personal data out before any of it reaches an external API.

Two things stood in the way: I didn't know Python, and I'd never administered a production server. I used LLMs to get up to speed on both fast enough to design, ship, and still personally run the infrastructure it lives on.

It cross-checks text against roughly 8 million public first and last names across six languages, catching an estimated 94–95% of personal data across 10M+ tested examples, with a false-positive rate around 2–3% — reviewed and tightened every month against real production logs. It's been running in production, self-hosted and self-managed, for about two and a half years without a security incident.

Before
LLM API
Survey and chat text sent straight to a third-party LLM, personal data included
No control over what a provider retains, trains on, or could leak
Every new use case meant trusting another API with raw personal data
After
CLEAN
LLM API
Every request passes through a local NLP model before anything leaves the server
Names, phone numbers, emails, IDs and addresses replaced automatically
The provider only ever sees cleaned, masked text
FastAPI (Python)
Self-hosted
Local NLP
Multi-language (6)
Linux Administration

When the client asked for something that didn't exist yet

A client wanted their own non-technical staff to ask questions about their survey data directly — no developer, no dashboard, no waiting on a report. At the time, nothing packaged covered it: Claude Desktop's connector ecosystem was brand new, and I'd never used the MCP protocol before. About a day of research later, I had an architecture that worked.

The result: staff type a question into Claude and get an answer straight from the live data — installed on their own computer, Windows or Mac, with no developer in the loop.

That gap hasn't closed since. The database we use still has no official connector in Claude's ecosystem — some other databases do now, but none of them hand you the same level of control over exactly what a connection can and can't touch. Simpler to install isn't the same as fully solved.

Before
Question
days
Analytics
team
Answer
Every question went to the customer's own analytics team, working from a dashboard
Dashboards showed the numbers clearly, but couldn't answer a plain, direct question the charts hadn't already anticipated
After
Question
Claude
Live DB
query data
Answer
Claude queries the live database directly and answers from what comes back
Staff ask questions about their own data directly in Claude, in plain language
Set up once, self-installed on the client's own computer — Windows or Mac
MCP (Claude Desktop)
MariaDB
Live Data Access
Windows & Mac
Skills
System Architecture
PHP 8.4+
Symfony 8
Docker
GitLab / GitHub CI/CD
PHPUnit
MySQL / MariaDB
Vue.js
JavaScript
FastAPI (Python)
LLM Integration
Prompt Engineering
ETL Pipelines
Local NLP
Linux Administration
Kubernetes
k3s
MCP (Model Context Protocol)
Claude

Let's talk

Connect on LinkedIn
© 2026 Petras Bukelis