Mid-level Full-Stack Developer (PHP / TypeScript)
Onsite — Stockholm • Permanent, full-time • 3–5 years' experience
About the role :
Potentialpark is the analytics and benchmarking platform for the candidate experience and employer-brand industry. We help large employers understand how they show up to candidates across web, mobile, social and applying-online channels, and we publish the surveys, rankings and reports that many of them measure themselves against.
We're at a turning point. The platform that has powered our customers for the last decade is moving from a CakePHP 2.x backend and an AngularJS 1.x SPA onto a modern Laravel 11 + React 18 stack — without losing the analytical depth or the editorial voice that customers come to us for. We're hiring a mid-level full-stack developer to be one of the first engineers on that migration.
You'll spend your first six months porting customer-facing endpoints and dashboards, slice by slice, behind feature flags, while the legacy system keeps running in production. After that, you'll spend the next six on the new visualisations and exploration tools that turn our research into something customers can navigate, not just read.
This is a hands-on coding role. You'll work onsite from our Stockholm office, alongside a small team of product researchers. You report to the Product lead.
What you'll work on :
Migration work
Customer dashboards
API design
Security hardening
Test discipline
Documentation
Code review and pairing
Our stack
Today (legacy — gradually being retired)
Backend: CakePHP
Frontend: AngularJS
Database: MySQL
Integrations: Mandrill, Upsales, AWS S3, DocRaptor.
Where we're going (target stack)
Backend: Laravel 11, PHP 8.3, Eloquent, Sanctum + Fortify (TOTP MFA), Horizon (queues on Redis), Pint, Larastan, Pest, Spectator
Frontend: React 18, TypeScript (strict), Vite, Tailwind CSS, shadcn/ui (Radix), TanStack Query, React Router v6, React Hook Form + Zod, MSW
Charts & Tables: Highcharts, Apache ECharts (heatmap/treemap/sunburst/choropleth), TanStack Table v8 with virtualization
API Contract: OpenAPI 3.1, Spectral linting, generated TypeScript SDK consumed by the SPA
Testing & Security: Pest + PHPUnit, Vitest + React Testing Library, Storybook + Chromatic, Playwright (smoke + nightly full), k6 for load, OWASP ZAP baseline
Documentation: MkDocs Material site, Architecture Decision Records, Redoc/Stoplight for API docs
Infrastructure & CI/CD: AWS (ECS/Fargate, RDS MySQL, ElastiCache Redis, CloudFront, Secrets Manager); Terraform; GitHub Actions with OIDC; Sentry + OpenTelemetry; gitleaks, CodeQL, Dependabot
What we're looking for :
We're hiring for the mindset and the fundamentals — not a checklist of tools. That said, you should have most of the following:
Required :
3–5 years of professional full-stack experience with a modern PHP framework (Laravel ideally; Symfony or current CakePHP is fine) and a component-based JS framework (React preferred; we'll consider Vue or recent Angular if your TypeScript and component habits are solid).
Strong SQL — you can read an EXPLAIN, design a sensible index, and you would not write `"SELECT … '" . $id . "' …"` even if asked.
Comfortable working in TypeScript with strict mode.
Hands-on experience writing automated tests — unit, integration, and at least some end-to-end work.
Used to git, code review, and small focused pull requests. You leave the repo cleaner than you found it.
Care about security: why CSRF tokens exist, what makes CORS dangerous, and you're curious about the rest.
Communicate clearly in English, in writing and in calls.
Nice to have (not required) :
Direct Laravel 11 / Eloquent experience.
Experience working in or with a charting library (Highcharts, ECharts, Plotly, D3) and a sense for what makes a dashboard usable.
Worked on a legacy migration before — strangler fig, parity tests, feature flags.
Familiarity with OpenAPI / contract-driven API design.
AWS (ECS/Fargate, RDS, CloudFront), Terraform, or general containerised-deployment experience.
Experience using AI-assisted developer tooling (Claude Code, Copilot, Cursor) productively we use these daily.
Reading legacy CakePHP 2.x or AngularJS 1.x will be part of the job; prior exposure helps but is not required.
How we work :
Onsite, Stockholm. We collaborate in person, pair often, and keep the loop tight between research, product, and engineering.
Small PRs, mandatory tests, mandatory code review. Green CI is the only path to merge.
Architectural decisions are written down (ADRs) before they go into code. We don't relitigate decisions in chat.
We use Claude Code for analysing legacy code, drafting tests, and porting endpoints. You'll be expected to use it well, and to know when not to.
We protect focus time. Meetings are deliberate; deep work is the default.
Customer impact matters. You'll see how customers use what you build, and you'll be expected to care.
Hiring process :
Intro call (30 min) with the engineering lead — about you, about us, and the role.
Technical conversation (60 min) , you can demo your work if you want to.
Architecture & systems chat (60 min) — we walk through a real migration slice from our roadmap and talk through how you'd approach it.
Team conversation (45 min) — meet two people you'd be working with daily.
Offer + reference check.
End-to-end: about two weeks, sometimes faster. We give a yes/no within 72 hours of the last conversation.
How to apply :
Send a short note describing one project you've worked on that you're proud of and one technical decision you'd make differently in hindsight. Attach a CV or a link to your GitHub / portfolio. Cover letters are optional — the project description matters more.
Apply to: recruiting@potentialpark.odoo.com — please write "Mid-level Full-Stack Developer (PHP / TypeScript)" in the subject line.
A note on inclusion
Research consistently shows that mid-level developers — especially women, people of colour, and career-switchers — apply only when they meet most or all of the listed criteria, while others apply with far fewer. If you read this description and most of it sounds like you, apply. We'd rather have a conversation than miss someone good.
Potentialpark is an equal-opportunity employer. We welcome applications from candidates of all backgrounds and life paths and make hiring decisions on the basis of skills, judgement, and how you work — nothing else.