I work where correctness isn't negotiable. Senior Fullstack Developer by title, working at architecture level: most recently I designed the architecture for a ground-up rebuild of a payments platform, consolidating four legacy codebases into one modular, type-safe system, and wrote roughly 75% of it (~1,815 commits across five repositories).
I care about the parts that compound: documented decisions (ADRs), an architecture that enforces itself in CI, a generated type-safe API client that kills front/back schema drift, and developer experience that turns a two-day setup into one command. (A recent favorite: tracing a 23-second page to a 32-join database view and making it ~10x faster.)
🟢 Open to remote Senior / Staff / Architect roles - wherever the scope is genuinely architectural.
- Backend: PHP 8.4 (Laminas / Mezzio, Slim), Doctrine, DDD, OpenAPI
- Frontend: TypeScript (strict), Vue 3, Nuxt 4, Nuxt UI, Vuetify, Tailwind CSS, Pinia, i18n
- Data & platform: PostgreSQL (Supabase, row-level security), MariaDB / MySQL, Redis / Upstash, pg_cron
- Testing: Vitest, Playwright (incl. automated a11y with axe), PHPUnit, Go's testing package
- Quality & CI: PHPStan (level 5) + custom rules, Psalm, Deptrac, Rector, oxlint, SonarQube, GitHub Actions
- Observability: Sentry, PostHog, structured logging
- AI in the loop: Gemini (
gemini-3.5-flash-litescores every posting in job·finder), Claude Code for AI-augmented development, Google Stitch for brand and UI assets - Infra: Docker, DDEV, Ansible, Cloudflare Pages, Vercel, Linux
- Also writing: Go, Rust, Shell
Client work is closed source, so these are the public evidence of how I build: typed, tested, documented, released through CI. Longer write-ups at goranninkovic.com/projects.
| Project | What it is | Evidence | Links |
|---|---|---|---|
| forge | Git hook runner that executes linters inside DDEV/Docker. One Go binary, no Node. | 297 Go test functions | docs · tap |
| porter | Air-gapped file transfer over dynamic QR codes. Rust sender, Flutter receiver, LT fountain codes. | 160 tests, bit-exact across 2 languages | docs |
| job·finder 🔒 | Reads company ATS boards, scores every posting against your CV with an LLM. Built on gstack in 13 days. | 766 tests, 9 ATS adapters | write-up |
| gstack | Multi-tenant SaaS starter: Nuxt 4 + Supabase, tenancy enforced by Postgres RLS | 10 feature layers, RLS-gated | docs |
| moj·GO 🔒 | Multi-tenant HR leave management, in production. Private repo. | 71 test files, 81 migrations | product · write-up |
| php-booster | The PHP quality toolchain I bring to a team (PHPStan, Psalm, ECS, Rector, hooks), packaged | 1-command install, auto-fix in CI | docs |
| Griffin ⭐ | Provisions a full Linux/macOS workstation from bare metal | Tested on Ubuntu, WSL, macOS | docs |
| sudoku | A solver that explains itself - human techniques, not brute force | 6 unit-tested modules | play it |
Also: goranninkovic.com - my portfolio and writing: Nuxt 4, Tailwind, i18n, prerendered to Cloudflare.
- Designing and building a payments-platform rebuild (modular monolith + Slim middleware + Nuxt 4 SPA + generated TypeScript SDK), with an AI-augmented migration workflow that roughly halved the projected timeline
- Writing Go and Rust — porter's sender is Rust, ported off TypeScript to drop the runtime dependency
- Open to the right remote team - let's talk





