Work — 7 production systems
Multi-tenant SaaS products — NexorFlow for electrical contractors, a physiotherapy clinic platform and a makeup marketplace — plus client work: the Starlinger Inquiry Tool (Angular 20), Brilos Silver B2C webshop, Mastercentar B2B webshop and the AurumB2B jewelry platform.
NexorFlow — Field Service SaaS
Multi-tenant platform for electrical contractors: quotes, work orders, field inspections with digital signatures, maintenance contracts, inventory, fiscalization-ready invoicing and a client portal.
- Client / industry: Own product · multi-tenant SaaS for Croatian electrical contractors
- My role: Founder & sole engineer — product, multi-tenant architecture, Symfony API, Angular SPA, marketing site, deployment.
- Challenge: Contractors run on paper and spreadsheets — quotes in Word, inspections on clipboards, maintenance intervals in someone's head. Serving many companies from one platform meant tenant data could never leak into another's, and Croatian invoicing rules had to hold.
- Solution: One PostgreSQL database per tenant, resolved from the subdomain, behind a Symfony 7 + API Platform backend and an Angular 18 SPA. A module entitlement system switches capabilities — workforce/HR, site diary, HSE reporting, subcontractors, photo documentation — on per company, enforced centrally instead of controller by controller.
- Result: 68 tenant entities across 27 feature modules: quotes and work orders, inspections signed on a phone, maintenance contracts that generate their own periodic work, inventory, attendance and leave that export to payroll, and a client portal — Croatian-first UI with an English toggle.
- Tech stack: PHP 8.2 · Symfony 7 · API Platform · Angular 18 · PrimeNG · Tailwind · PostgreSQL · Astro · Docker
Clinic Platform — Physio & Rehab SaaS
Multi-tenant platform for physiotherapy and rehabilitation clinics — staff application, operator console, public booking resolved by clinic hostname, and a marketing site, each on its own origin.
- Client / industry: Own product · physiotherapy & rehabilitation practices
- My role: Founder & sole engineer — tenancy architecture, entitlement authority, clinical and billing modules, legacy data migration.
- Challenge: A clinic platform holds health data for many practices at once, so isolation has to be structural rather than a WHERE clause — and the first practice arrived with a legacy system full of real history that had to survive the move.
- Solution: Four runtime surfaces on separate origins, so a session in one cannot be read by another. A control-plane tenant registry with database-enforced invariants, host→tenant resolution with every refusal accounted for, a dedicated tenant connection per operation, per-tenant migrations, and entitlement decisions computed from persisted plans, subscriptions and overrides.
- Result: Encounters and treatment execution, packages and payments, Croatian fiscalization, and anonymous booking resolved by hostname — cross-tenant isolation proven against two separate PostgreSQL databases under roughly 1,500 tests.
- Tech stack: PHP 8.2 · Symfony · API Platform · Angular · PostgreSQL · Messenger · Docker · Playwright
Makeup Market — Marketplace & Artist SaaS
A marketplace connecting customers with makeup artists, and the business software those artists run on — bookings, calendar, client records, priced service catalogue and portfolio.
- Client / industry: Own product · beauty marketplace and artist business software
- My role: Founder & sole engineer — module architecture, the scheduling model, marketplace and professional applications.
- Challenge: Two products in one system: a consumer marketplace that has to be found and trusted, and professional software an artist would pay for even with the marketplace switched off. Double-booking an artist could never be possible from any code path, present or future.
- Solution: A modular monolith of 29 backend modules with tiers enforced by Deptrac, three Angular applications over shared libraries, and one `calendar_occupancy` table — protected by a PostgreSQL exclusion constraint — that every action consuming an artist's time writes through. A studio and a solo artist are the same workspace shape, so studios are additive rather than a rewrite.
- Result: Booking, scheduling, listings, portfolios, conversations, subscriptions and entitlements behind one workspace model, with the artist CRM and business dashboard as the current build.
- Tech stack: PHP 8.4 · Symfony 7.4 · API Platform 4 · Angular 22 · PostgreSQL 18 · PostGIS · Redis · Docker
Starlinger Inquiry Tool
Customer-facing inquiry & configuration platform for an Austrian industrial machinery manufacturer.
- Client / industry: Starlinger & Co · industrial machinery, Austria (woven plastic packaging & recycling lines)
- My role: Frontend Developer — Angular client app, spreadsheet/forms architecture, cart & inquiry workflows.
- Challenge: Replacing email-and-spreadsheet quoting with a guided UI: machine catalog, spreadsheet-style bulk spec entry, XLSX template uploads, and a dual-mode interface for end customers and reseller agents.
- Solution: A modular Angular SPA with lazy-loaded feature modules, CanDeactivate guards protecting in-progress inquiries, and a shared forms layer used by both the customer and agent modes.
- Result: A 34K-line Angular 20 SPA with 46 feature modules, lazy routing, and guards protecting in-progress inquiries from accidental data loss. Backed by a Symfony API and a sibling Angular admin app.
- Tech stack: Angular 20 · TypeScript · RxJS · ag-Grid · Angular SSR · Symfony API
Brilos Silver — B2C Webshop
Full-featured silver jewelry storefront with faceted search, RMA returns, abandoned-cart recovery, and EU Omnibus pricing compliance.
- Client / industry: Brilos Silver · silver jewelry retail
- My role: Full Stack Developer — backend, storefront, payments and compliance.
- Challenge: A consumer storefront that had to stay fast under a large faceted catalog while satisfying EU Omnibus price-history rules and handling returns without manual bookkeeping.
- Solution: Symfony 7 with API Platform behind a Vue/Stimulus storefront, cached facets, a price-history model for Omnibus, and an RMA workflow with automated abandoned-cart recovery.
- Result: Live B2C shop with self-service returns, recovered carts, and compliant price display across the catalog.
- Tech stack: PHP · Symfony 7 · API Platform · Vue.js · Stimulus · Tailwind · MySQL · Stripe
Mastercentar — B2B Webshop
Croatian B2B supply webshop with company accounts, per-customer pricing, bulk ordering, and PDF/Excel exports.
- Client / industry: Mastercentar · Croatian B2B supply
- My role: Full Stack Developer — accounts, pricing engine, ordering and exports.
- Challenge: Every buying company sees different prices, orders in bulk, and needs paperwork their accounting can ingest.
- Solution: Company accounts with role-based users, a per-customer pricing layer resolved server-side, bulk order entry, and PDF/Excel export pipelines.
- Result: Wholesale ordering moved off phone and email onto self-service accounts with correct contract pricing.
- Tech stack: PHP · Symfony 6 · API Platform · Vue.js · JWT · MySQL
AurumB2B — B2B Jewelry Platform
B2B jewelry catalog where prices are login-gated and every order is an inquiry — built for negotiated, per-client pricing rather than public checkout.
- Client / industry: AurumB2B · wholesale jewelry
- My role: Full Stack Developer — catalog, gating, inquiry flow.
- Challenge: Wholesale jewelry pricing is negotiated per client and must never be publicly visible, yet the catalog still has to be browsable and fast.
- Solution: Login-gated pricing with an inquiry-based order flow, server-rendered Twig with Turbo/Stimulus for speed without an SPA.
- Result: A catalog that markets the range publicly while keeping every price behind authentication.
- Tech stack: PHP · Symfony 7 · API Platform · Twig · Stimulus · Turbo · Tailwind · MySQL