I build the interface,the API,and lately, the agent.
The agent stops here until a person approves.
- etl.codegenscript generated
- qa.validate4/4 checks passed
- 200 OK
Six years of shipping web products, from React frontends to Python/Django backends. Lately I build AI agents that show their work: they cite their sources, trace every model call and stop for a person before they write code.
Selected work
Four systems I can walk you through.
Most of my code lives in client repositories under NDA, so each project is shown as the system it is: how it works, and what I did in it.
Each block is one stage of the system, in the order work moves through it. Its color is the layer that stage runs in.
- interface
- api
- agent
- human: approval & checks
- 01 · agentspecialists map the schema
- 02 · humana person approves the contract
- 03 · agentETL code is generated
- 04 · humanQA validates the scripts
- Role
- Lead developer
- Context
- AngryLynx · internal R&D
A multi-agent system on the Claude Agent SDK. Specialist agents map a legacy schema onto the new data model, and every mapping has to cite its source as file:line or the synthesizer rejects it.
A person approves the mapping contract before any ETL code is generated, and a QA validator checks the generated scripts for existence, syntax, traceability and coverage.
The engine is model-agnostic: Claude or Kimi K2.6 can run any job behind one engine-neutral layer, with the file tools rebuilt as OpenAI-compatible function calls, streaming and retries. Every phase, agent and LLM call is traced with OpenTelemetry, with Prometheus metrics and a provisioned Grafana dashboard.
- Claude Agent SDK
- Kimi K2.6
- Python
- SQLAlchemy
- Flask
- OpenTelemetry
- Prometheus
- Grafana
- Docker Compose
- 01 · interfacevoice comes in
- 02 · agentthe tool-calling loop works
- 03 · apithe answer streams back
- Role
- Developer
- Context
- AngryLynx · internal R&D
A web assistant built around a tool-calling loop: retrieval, web search, file loading, image generation and clarifying questions. When a tool keeps failing it escalates instead of looping, it recovers malformed tool calls, and it falls back to a smaller model when it hits a rate limit.
Retrieval is built from scratch (chunking, TF-IDF, cosine similarity) next to a LangChain retriever. A self-learning loop checks a user’s correction on the web before it stores it. Answers stream over SSE; voice comes in through Whisper and a browser wake word.
- Python
- Groq
- gpt-oss-120b
- Whisper
- LangChain
- SSE
- Vanilla JS
- 01 · interfacethree Next.js portals
- 02 · apione Django REST API
- 03 · humanBDD tests on each feature
- Role
- Full-stack developer
- Context
- US digital marketing client
An ordering and fulfillment platform that replaced three legacy products: one Django backend in a modular monolith of 27+ apps, serving three Next.js frontends, built by a team of 10-15 developers across the US and Serbia.
My partOn the backend: credits and billing, coupons and promotions, bulk order write-offs, fulfillment workflows, campaigns and role-based permissions. On the frontend: user impersonation with role-based routing, order and campaign management. BDD scenarios on nearly every feature.
- Python
- Django
- DRF
- PostgreSQL
- Celery
- Redis
- Next.js
- React
- TypeScript
- Behave
- 01 · agentan LLM wrapper from scratch
- 02 · agenta LoRA fine-tune
- 03 · humanan automated scorer
- Role
- Author
- Context
- Internal tools & R&D
A Python command-line assistant built from scratch on Groq and Llama 3.1 8B: multi-file context loading, tool calling, wake-word voice input on a background thread, text-to-speech and conversation export. I turned it into an internal talk on how LLMs, context windows and system prompts work.
The next step was looking under the hood of training: a LoRA fine-tuning experiment that asks whether a small self-hosted model can map schemas as reliably as a 120B one. It has 400 synthetic training examples, 25 real held-out cases, an automated scorer and a GPU cost estimate for EU cloud. The training run itself is next.
- Python
- Groq
- Llama 3.1 8B
- Whisper
- Text-to-speech
- LoRA
- Colab
Side project
The gym app I built for my own training.
Konst is mine end to end, and I still train with it. An Android app with no account, no servers and no tracking: everything stays on the phone.
KonstConsistency made easy.
- plan wizard
- Three steps to a four-week plan, or start from one of 9 built-in templates.
- 193 exercises
- A built-in library with form cues, browsable by muscle, plus your own exercises.
- last-time prefill
- A new set starts from the weight and reps you did last time.
- local-first
- No account and no network calls. Saves are debounced and flushed when the app goes to the background.
- safe sharing
- Plans export as JSON. Imports are validated: size and count limits, clamped text and fresh IDs.
- React Native
- Expo SDK 54
- TypeScript (strict)
- AsyncStorage
- React Navigation



About
I started at the surface and kept going down.
First came the interfaces: React apps for banking, fitness and TV products, a React Native app, embedded React + LVGL projects, and the Figma design for a banking app redesign.
Then I moved down the stack. Django backends and REST APIs, a Shopify SaaS app as a freelancer, and a multi-brand ordering platform built with a team spread across two continents.
Today I build AI systems the way I would want to debug them: with traces, tests, cited sources and a person who signs off. I also design the hands-on assessments we use to hire AI engineers.
How I work
$ behave features/how-i-work.feature
- shows its traceevery agent and LLM call gets a span
- cites its sourcesno file:line, no mapping
- keeps a human in the loopapproval comes before code generation
- tests the boring pathsBDD scenarios on nearly every feature
- survives a model swapone engine-neutral layer, more than one model
5 passed· 0 failed
Stack
What a request passes through.
The tools I reach for, in the order a request meets them: the screen, the API and its data, the agent, and the checks that keep a person in control.
L1 · interface
Interface
Where I started
- React
- Next.js
- TypeScript
- JavaScript
- React Native
- TanStack Query
- Tailwind CSS
- Sass
- Shopify Polaris
- Figma
L2 · api
API & data
Where products hold together
- Python
- Django
- Django REST Framework
- FastAPI
- Flask
- Celery
- PostgreSQL
- MySQL
- Redis
- SQLAlchemy
- Pydantic
- Wagtail CMS
L3 · agent
Agents
What I build lately
- Claude Agent SDK
- OpenAI SDK
- LangChain
- Multi-agent systems
- Tool calling
- RAG
- Prompt caching
- LLM evaluation
- LoRA fine-tuning
- Whisper
- Text-to-speech
L4 · human
Checks & ops
What keeps a person in control
- Behave (BDD)
- Django tests
- OpenTelemetry
- Prometheus
- Grafana
- Docker
- Docker Compose
- Git
- Jira
- Linear
Path
Six years on one timeline.
11/2025 - Present
Full-Stack Developer & AI Engineer
AngryLynx · Novi Sad · Hybrid
A multi-brand ordering platform for a US client, and AI systems alongside client work: agents, observability, evaluation.
01/2025 - 11/2025
Full-Stack Developer
Freelance · Independent
A Shopify SaaS app on Polaris with a React frontend and Django REST APIs, plus custom CMS work in Wagtail, directly with the client.
12/2020 - 12/2024
React Developer
Veriest · Serbia
React apps for banking, fitness and TV, a React Native app, embedded React on LVGL, a banking app redesign in Figma, and the technical point of contact for clients.
Education
BSc Information TechnologyVTSNS, Novi Sad · 2014 - 2018
Certifications
- Exoscale Certified Solution ArchitectExoscale Academy · 2026
- Exoscale Certified Cloud ProfessionalExoscale Academy · 2026
- Exoscale Certified Container EngineerExoscale Academy · 2026
- IONOS Cloud FoundationsIONOS · 2026
- Advanced & Intermediate Python 3Codecademy
- Build Python Web Apps with DjangoCodecademy
Contact
Tell me what you’re building.
Click the address to copy it