PHP / Full-Stack Developer

Petras Bukelis

I turn legacy systems into platforms worth keeping — and build new ones to last: robust, scalable, and made for years of use, with automation and LLM integration as my specialty.

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
Personal projects

What I build in my own time, on my own small Kubernetes (k3s) server, all live under testice.com.

Testice Investing

Private beta

Stock research and portfolio tracking that answers plain questions — is it growing, is it expensive, how am I doing — from up to 20 years of a company's own SEC filings, every figure linked to its source. Import an Interactive Brokers portfolio and see it against the S&P 500; check every company against your own rules; see the market dates that matter for your money. Audited every night, every page opened by a browser test on desktop and phone.

Stock pages
Portfolio import
Your strategy
Watchlist & alert prices
Calendar
investing.testice.com
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
Connect on LinkedIn
© 2026 Petras Bukelis