Boris Nikolić
Software Developer · Backend-focused Full-Stack (Python, Go, PostgreSQL, React)
Based in Belgrade, Serbia · Remote friendly (CET) · Open to relocation within Europe · Looking for full-time or part-time backend, full-stack, or DevOps roles with flexible working hours · B2B contractor or employee
Odoo/ERP modules and data pipelines in Python and PostgreSQL for Fairphone (2025 – present)
NestJS and Go services, with the React and Next.js frontends that consume them
DevOps with security in mind: deploying and managing services, hardened Linux servers, Docker, CI/CD, monitoring
Close to five years of hands-on web development, from frontend internships to contract engineering
Type a command and press Enter. Tab completes, arrow keys browse history, Ctrl+L clears.
Projects
Four projects, three with public code. Client work is under Experience.
ecommerce-platform/
repository ↗ (opens in a new tab)E-commerce platform (opens in a new tab)
A complete shop with real authentication, real payments, and an external product catalog that has to stay fast and keep working when the cache is down.
- Go (Gin) backend with dual-token JWT auth and revocable refresh tokens.
- Two-step Stripe PaymentIntent checkout, order line-item snapshots, and an admin dashboard.
- Cache-aside Redis catalog that degrades gracefully; Nginx and Docker Compose in front.
- Go
- Gin
- Next.js
- PostgreSQL
- Redis
- Stripe
- Nginx
- Docker Compose
systems-networking/
repository ↗ (opens in a new tab)Systems & networking in C/C++ (opens in a new tab)
Networking and security primitives written from the socket up, without a framework in between.
- Multi-client HTTP server built from POSIX sockets up.
- Multi-hop HTTP forward proxy with layered encryption (in progress).
- Terminal password manager with per-secret hybrid encryption (AES-256-GCM, GPG).
- C
- C++
- POSIX sockets
- AES-256-GCM
- GPG
order-revenue-platform/
No public repository.
Order & revenue management platform
One application for several roles to manage orders, follow revenue, and get notified, with access controlled per role.
- Multi-role web application with role-based access control.
- Order management, revenue reporting, and notifications.
- Go
- Next.js
- TypeScript
- PostgreSQL
rpg-campaign-manager/
repository ↗ (opens in a new tab)RPG campaign manager (opens in a new tab)
University coursework: game masters run campaigns, sessions, and item catalogs while players manage characters and inventories.
- REST API with JWT access and refresh tokens and role-based authorization.
- React single-page frontend consuming the API.
- Java 21
- Spring Boot 3
- JWT
- React
Working with people
- Requirements gathered directly from the people who use the software, then turned into a scope both sides understand.
- Technical terms and trade-offs explained in plain language, so non-technical stakeholders can decide on priorities and timelines with the full picture.
- Modules and features shipped end to end: built, tested, and tailored to the client's production VPS.
- Alongside the stakeholders from the first requirement to delivery, so what ships matches how they actually work.
Experience
Newest first. Client work is described at the level the engagement allows.
Software Developer (B2B contract) · Fairphone
Freelance B2B · ERP engineering for supply-chain and sustainability operations.
- Built Odoo modules (Python, PostgreSQL) for sustainability and procurement teams, replacing manual, hand-kept tracking with automated workflows and reporting over large datasets.
- Designed and built replication of ERP data into analytical warehouses, with reliable delivery as the core requirement.
- Designed the architecture for a customer-facing web shop on top of Odoo: an API gateway in front of the ERP with separate frontend services.
- Worked directly with stakeholders: gathered requirements, explained technical trade-offs in plain language, and shipped tested features end to end to the production VPS.
Client-owned, licensed software; details limited by agreement.
Independent Full-Stack Developer · Self-directed
Belgrade
- Moved from frontend into backend: built NestJS servers and REST APIs with auth and PostgreSQL, plus the React frontends consuming them.
Frontend Developer (part-time internship) · High school partner company
Zaječar
- Contributed to a production React codebase: built UI components and styling to spec.
- Prepared request data for backend APIs and handled responses and state on the frontend.
- Contributed to C# codebases on .NET in a Windows environment.
Web Development Intern (school programme) · Local team, Zaječar
Alongside school
- Built and styled websites in HTML and CSS.
education: BSc Software Engineering, Singidunum University, Belgrade, expected 2027
Skills
Entries marked (working knowledge) are used less often.
Languages/
- Python
- Go
- TypeScript/JavaScript
- SQL
- C/C++
- Java (Spring Boot) (working knowledge)
- PHP (Laravel) (working knowledge)
- C# (.NET) (working knowledge)
Backend/
- Odoo module development
- Go (Gin, chi)
- NestJS (Node.js, Express)
- REST API design
- JWT auth & RBAC
- Stripe
Data/
- PostgreSQL
- Redis
- ERP data replication
- Query optimization
- RabbitMQ
- Scheduled jobs
Frontend/
- React
- Next.js
- Angular
- Tailwind CSS
- Redux Toolkit
Ops/
- Linux
- Docker/Compose
- Nginx
- GitHub Actions
- GitLab CI
- Prometheus
- Grafana
Also/
- AI-assisted development (Claude Code, Codex)
- Motion & graphic design
How I work with AI
An agent in the terminal, briefed like a teammate. The loop stays the same whether the codebase is years old or an empty directory: brief, plan, build with tests, review, verify, document. The agent gets the same context a new colleague would, written down in the repository.
loop
Every task, every repository, the same six steps.
- briefA written brief with goals, constraints, and integrity rules: what the agent may and may not invent.
- planBrainstorm, then a written plan before code. Specs and plans are committed next to the code.
- buildSmall tasks, tests first where the stack allows. The agent works from CLAUDE.md and the docs hierarchy, not from chat memory.
- reviewAI review passes (code review, security review) followed by my own read of every change.
- verifyLint, build, run, and drive the actual app before anything is called done.
- documentSTATUS, CHANGELOG, and open-question files so the next session, human or agent, starts with context.
prompting
Prompts are repository files with a job, a reading order, rules, and a done checklist. They are versioned like code and reviewed like code.
- Role prompts per job: a Builder prompt for features and fixes, a Testing prompt for coverage, each with its own goal, workflow, and checklist.
- A docs hierarchy the agent reads first: CONTEXT.md, STATUS.md, coding standards, and the security remediation plan.
- Hard rules as NEVER / ALWAYS lists (no secret logging, parameterized SQL, crypto/rand only) that come before style preferences.
- A reporting format for finished work: what changed, files, tests added, breaking changes, next steps.
- An example session in the prompt so the agent sees a full loop, not just rules.
- Tool inventory in CLAUDE.md: which commands and MCP servers exist, so the agent uses real tools instead of guessing.
day to day
Every repository carries its own setup, so a session starts knowing the project instead of asking about it.
- a codebase I'm new to
- The first session is orientation: the agent reads the repository and writes down what it learned (stack, commands, architecture, rules), so every session after starts productive.
- from the ground up
- Brainstorm before code: goals, constraints, and trade-offs argued out with the agent, a plan written and committed next to the code, then small tasks with tests first.
- the everyday
- Features, fixes, debugging, and reviews run the same loop, with planning, review, and verification checklists so quality does not depend on the day.
- memory and specs
- Persistent memory files plus written specs and plans committed next to the code, so the next session, human or agent, picks up where the last one stopped.
real systems
The agent does not just write code, it acts. MCP servers give it real tools instead of pasted output, declared per project so it knows exactly what it can call.
- GitLab
- Pipeline automation from the agent: merge requests, pipeline status, and job logs without leaving the session.
- cloud infrastructure
- Managing infrastructure resources through MCP tools, with the same review loop as code changes.
- issue and ops trackers
- GitHub, Jira and Confluence, Linear, Datadog, and PagerDuty connectors, enabled per project.
- browser
- The agent drives a browser against the running app: screenshots, console, DOM checks, keyboard navigation.
Home lab
Self-hosted infrastructure and free-time projects, run like production.
- forge:
- Forgejo git forge on a self-hosted server.
- servers:
- Hardened Linux servers.
- monitoring:
- Prometheus and Grafana over the stack.
- irc:
- IRC chats hosted over onion services (Tor) and garlic routing (I2P).
- rust:
- Rust implementations for systems work, built in free time.
About
Backend-focused full-stack developer with close to five years of hands-on web development, progressing from frontend internships (2022–2023) through independent NestJS backend work (2024) to contract engineering for Fairphone (2025–present), where I build Odoo/ERP modules and data pipelines in Python and PostgreSQL.
I own features end to end, from stakeholder requirements to deployment, and also write Go services and take care of the DevOps side with security in mind: deploying and managing services, hardened Linux servers, Docker, CI/CD pipelines, and monitoring.
university
BSc Software Engineering, Singidunum University, Belgrade. Expected 2027, alongside the work.
off the keyboard
- Sim racing, Counter-Strike, and cars.
- The gym, trying to stay in shape.
- A good meal: pasta, or anything protein-rich.
How I work
- Model the domain before the endpoints
- Schemas, states, and invariants come first. APIs and screens follow from them.
- Design for failure
- Acknowledgments, retries, and idempotent steps, so a crash midway becomes a retry instead of a data gap.
- Measure the database
- Query plans and real data volumes before optimizing. PostgreSQL usually has the answer.
- Keep boundaries clear
- Layers and services that can be understood, tested, and changed on their own.
- AI writes, I answer for it
- Agents work from written briefs and rules; every change is read, understood, and verified by me.
- Automate what would otherwise repeat
- If something has to be done twice, it gets a script: server hardening, pipelines, reports.
Open to new roles and projects
Looking for full-time or part-time backend, full-stack, or DevOps roles with flexible working hours, remote friendly (CET), as a B2B contractor or an employee. Open to relocation within Europe for hybrid roles with a couple of office days a week. Email is the fastest way to reach me.