Plamen Markov

Backend engineer building AI into production systems

Available · remote B2B · Europe (UTC+2)

Backend engineer with 20+ years of remote production work, most of it as the engineer who owned the whole system: architecture, data model, rollout and years of maintenance after launch. Builds LLM features into production software: a tool-calling agent that is never allowed to compute a figure itself, a Claude plugin held to an LLM-judge eval suite, an MCP server published on npm and vision OCR. Earlier, built and ran a retrieval-augmented generation (RAG) product solo. PHP and Laravel are the foundation; TypeScript and LLM integration are where the work is heading.

AI he has shipped to production

Tool-calling reporting agent that never computes a number

  • laravel/ai
  • Tool calling
  • Enum-constrained schemas
  • Laravel 13
  • PHP 8.4
  • Feature flags
Problem
Staff at an insurance brokerage wanted to ask about clients, payments and sales goals in plain language. A language model that writes its own queries or does its own arithmetic can return a confident wrong figure, and the data includes personal information.
Approach
Built on Laravel with laravel/ai. The agent is not allowed to compute or estimate any figure: every number comes from one of 15 curated tools that read through the existing reporting service. Tool schemas are enum-constrained, so the model picks filters from a fixed catalogue instead of free-forming a query. Access needs both an authorisation gate and a feature flag, and the tools are kept off the platform's public MCP endpoint, which exposes only an anonymous lookup.
Result
Shipped in a production insurance back office. Every figure in an answer traces back to a named tool call, and personal data cannot reach the public endpoint. Client code, so the architecture is described here and the code is not public.

Claude plugin that drafts forensic fire-investigation reports

  • Claude plugin
  • Claude Code
  • LLM-judge evals
  • Vision
  • MCP
  • CI
Problem
A court-format forensic fire-investigation report took an expert 5–6 hours at a desktop, working through a case file of 15–20 documents.
Approach
A Claude plugin, built with Claude Code. It reads phone photos of the case file and drafts the report on the required template. A mechanical check and a separate AI reviewer examine every draft before the expert signs it. Regression evals with an LLM judge run in CI, including trap cases where the correct answer is "no data" rather than an invented one. Personal-data checks are enforced in code, not left to the prompt.
Result
About 10–15 minutes per report instead of 5–6 hours, from a phone. The LLM judge catches all six planted fabricated facts in its eval set, and every rule in the plugin traces back to a failure an eval caught.

MCP server for the Bulgarian motor-insurance register

  • MCP
  • TypeScript
  • Node.js
  • npm
  • Laravel
Problem
Before selling mandatory motor liability insurance, a broker must know whether the vehicle is already insured and until when. The official register is a web page meant for people, so every check was manual and the online sales form could not use the answer.
Approach
A dedicated service automates the register lookup and returns structured JSON. The brokerage's Laravel backend reads it through one interface, with two other data sources as interchangeable implementations. An MCP server in TypeScript exposes the check as a single tool to any MCP client; it was ported from a first Python version with the tool signature and output kept identical.
Result
Published on npm and runs with npx -y go-insurance-checker: no clone, no install. A check takes about 5–15 seconds, and the sales form now decides by itself whether a car can be insured and from which date.

Vision OCR for vehicle documents; earlier, a hybrid-search RAG product

  • GPT-4o vision
  • RAG
  • PostgreSQL
  • pgvector
  • Hybrid search
  • Cohere rerank
  • Laravel
Problem
OCR: insurance agents retyped 17 fields from every vehicle registration certificate into the policy form. RAG, earlier: drafting technical expert reports depended on finding the right passages in years of earlier reports and reference material.
Approach
OCR: a vision model (GPT-4o) reads the registration certificate and pre-fills the 17 fields, with national ID numbers checked against their checksum. RAG: the assistant combined PostgreSQL + pgvector semantic search with Postgres full-text search, merged and reranked the results with Cohere down to the top four passages, and used a structure-aware chunker, covered by 27 tests, so every passage kept its section heading.
Result
OCR: in use in the production insurance platform. RAG: a solo product that was built, deployed with Docker Compose on a VPS with TLS and nightly backups, and run in production by one engineer.

How he works with AI on a codebase

  • Claude Code every day for over a year, inside client production codebases: refactoring, test generation and debugging.
  • The value is senior review of generated code, not the generating: every agent-written change is read, tested and verified before it ships.
  • Guardrails live in the pipeline, not in good intentions: on an insurance platform built and run solo, PHPStan level 9, 878 tests and dependency audits gate every push in CI.
  • Repeatable AI work gets its own tooling: custom Claude Code skills, MCP servers and LLM-judge evals that catch regressions before users do.

Long engagements, systems owned end to end

  1. Aug 2025 – present

    Smartwary (Bulgaria)

    Senior PHP Developer, B2B contract

    B2B contract with Smartwary, building Browswave's product: PriceLens, a multi-tenant pricing-intelligence SaaS for Shopify merchants, and PromoManager, a second Shopify app built end to end. The client took PriceLens in-house in October 2026; the Smartwary contract continues, with no active project.

    • Introduced 436 tests to a three-year-old codebase that had almost none, plus a nightly end-to-end suite that drove a real Shopify demo store through install, sync, billing, repricing and uninstall.
    • Fixed recurring production queue deadlocks with FOR UPDATE SKIP LOCKED, READ COMMITTED and a retry with exponential backoff.
    • Made Shopify API use resilient across 24 tenant databases: leaky-bucket pacing, jittered retries that honour Retry-After, idempotent webhooks.
    • Cut dashboard load times with a denormalised read model rebuilt in a shadow table and swapped in atomically, so the live table is never locked.
  2. 2005 – 2025

    Ivanov New Media Studio (Nantucket, MA, USA)

    Remote developer, contractor

    Ivanov New Media Studio's long-term remote developer for twenty years; Nantucket Energy was their client. Principal developer of that client's propane and heating-oil delivery platform for thirteen years, author of 86.5% of its surviving code.

    • Integrated four tank-telemetry vendors over four transport styles: hand-built SOAP, two session-authenticated REST APIs and a LoRaWAN webhook decoding raw hex payloads.
    • Built the 55-endpoint export API that drained the legacy database into its Laravel replacement over seven years, with both systems live.
    • Built an unbilled-delivery detector that reconciles telemetry against the invoice ledger and catches deliveries that were made but never billed.
  3. 2008 – present

    Direct clients

    Independent contractor, sole developer

    Sole developer on production systems still in service, each owned end to end for over a decade: an insurance brokerage's platform and NPP Kozloduy's occupational-health system.

    • Built the Laravel successor of an insurance platform and the migration layer that moved 26,000+ legacy policies into it, with a parity-tested cutover.
    • Traced a report that had slowed from 0.24 s to 137 s to a non-sargable join and fixed it; deep pagination went from about 6 s to 0.1 s per page.
    • Rebuilt the occupational-health system in place from PHP 5.6 to PHP 8.2, extracting 114 domain services from 172 page scripts; a full rewrite was evaluated and rejected, and the decision recorded in ADRs.
    • Took a report page from 736 ms to 6 ms with generated columns and covering indexes.
  4. 2026

    Own products

    Designer and sole developer

    Products designed, built and shipped solo.

    • ADR Zone: a React Native / Expo app in TypeScript, live on the App Store and Google Play. An offline dangerous-goods reference with 1,818 substances, relevance ranking and a Cyrillic case-fold layer.
    • go-insurance-checker: an MCP server in TypeScript, published on npm.
    • A RAG assistant on Laravel, PostgreSQL + pgvector and Cohere rerank was built, deployed and run solo.

The tools he works with

AI/LLM

  • Claude Code (daily, 1+ year)
  • Claude plugins and skills
  • MCP servers
  • Tool-calling agent design
  • LLM-judge evals
  • RAG: pgvector, hybrid search, Cohere rerank
  • Vision OCR (GPT-4o)
  • laravel/ai
  • Anthropic and OpenAI APIs

Backend

  • PHP 8 (20+ years)
  • Laravel
  • Symfony 7
  • Livewire
  • Node.js
  • REST, GraphQL, webhooks
  • Queues and scheduled jobs
  • MySQL / MariaDB
  • PostgreSQL + pgvector
  • Redis
  • SQLite

Frontend

  • TypeScript
  • React
  • React Native / Expo
  • Vue 2
  • Svelte
  • Alpine.js
  • Tailwind CSS

Infra

  • Docker
  • AWS (EC2, S3)
  • Linux VPS: nginx, TLS, backups
  • Bitbucket Pipelines
  • GitHub Actions

Quality

  • PHPUnit
  • Pest
  • Laravel Dusk
  • PHPStan level 9
  • CI gates
  • Architecture decision records

How to work with him

Pleven, Bulgaria · Europe (UTC+2)

Terms

  • Remote, B2B contract
  • Start within about 2 weeks
  • Async-friendly
  • European hours, with US overlap

Languages

  • Bulgarian – native
  • English – B2 (working level)

Education

  • Technical University of Gabrovo – Computer Systems & Technologies (2005)
  • SoftUni – PHP Web Developer (2019)
  • SoftUni – Front-End Developer with JavaScript (2020)