PRIMUS
PRIMUS was Navigos Group's premium recruitment dashboard — the tool employers used to post executive roles, shortlist candidates, and manage hiring pipelines. I inherited a fragmented React frontend, rewrote it as a single Angular application, and later rebuilt the core search engine in SvelteKit so internal consultants could use it inside their CRM.

7s to under 1s
Load Time
0
Tickets Solo
0 yrs
Sole Frontend
0K+
Crawled Jobs
Five React apps. No types. No measurement.
When I took over PRIMUS, the frontend was split into separate React applications that each loaded their own bundles. Redux stores crossed app boundaries, everything was plain JavaScript without types, and adding a feature meant touching multiple codebases while hoping nothing else broke. Then a new requirement arrived: the same candidate search needed to work inside a .NET CRM for internal consultants, which was a completely different tech environment.
7 seconds to load
every time a recruiter opened the dashboard
3 seconds between features
because switching tabs unmounted the entire app
Zero usage data
so product decisions were based on guesswork
Same search, two systems
and the code couldn't move between them
Rewrite, don't patch
I pushed for a full rewrite instead of incremental patching because the problem wasn't just performance — it was architecture. React alone wouldn't have solved the core issue since everything lived in separate silos with no shared foundation. I went with Angular and TypeScript because they gave me module boundaries, dependency injection, and compile-time safety from day one.
Angular + TypeScript for the rewrite
I chose Angular because refactoring the untyped React codebase would have taken longer than rewriting it. TypeScript caught integration bugs at compile time instead of production, and Angular's module boundaries kept the codebase from turning into spaghetti again as it grew.
One application with lazy-loaded features
I consolidated five separate React apps into a single Angular workspace where routing, auth, and shared services lived in one place. When I added a feature, I added it once instead of coordinating changes across multiple codebases.
Built an event tracking pipeline from scratch
The old platform had zero usage data, so product decisions were guesses. I built a composable tracking pipeline where any component could hook in and modify events before they shipped, which gave product managers real numbers on what recruiters were actually doing.

The screen recruiters lived in all day
This was the single most-used screen on the platform. Recruiters tracked candidates across multiple sourcing channels, filtered by qualification status, downloaded CVs in bulk, and managed their pipeline from one table. Every interaction needed to feel instant because they were doing this eight hours a day.

Where companies found their executive roles
The homepage listed top companies, latest executive positions, and career consultant profiles. It served as both a marketing surface and a functional entry point — candidates discovering roles and companies discovering talent in the same place.

Every employer got a living page
Companies like Home Credit had full profiles that pulled together office photos, open positions, and about sections. Candidates could research an employer before applying instead of jumping between websites.
Same search engine, different framework
By 2022, PRIMUS was stable and running. But internal consultants needed the same candidate search power inside their .NET CRM, and I couldn't force the CRM to load an Angular app. I rebuilt the search engine in SvelteKit instead because Svelte's component model was close enough to Angular's that the domain logic ported cleanly. The server hooks handled CRM authentication natively, and consultants got a tool that felt native to their daily workflow without leaving the system they already lived in.

Boolean search, zero context switching
The same candidate search logic that powered PRIMUS was rebuilt and embedded directly into the CRM. Consultants filtered by keywords, Boolean operators, location, salary, and language without leaving the system they used all day.

Candidate folders and saved searches
Consultants organized shortlists into folders tied to specific job requisitions. They could save search queries, run bulk actions, and toggle between recent and active lists. SvelteKit's optimistic updates kept everything feeling instant even on slower connections.

Direct job pipeline integration
Consultants could add candidates to open positions in two clicks from the search results, which replaced the manual copy-paste workflow between CRM and PRIMUS that was costing them time every day.
One search engine. Two platforms. One architecture.
PRIMUS continued to serve Navigos Group's employer-facing operations, and the candidate search I built in Angular became the foundation for the SvelteKit migration into the CRM. The domain logic moved cleanly between frameworks because the platform was designed with clear boundaries from the start. Different stacks, same architectural thinking.
0
Tickets shipped solo
0x
Faster initial load
0x
Faster navigation
0
Platforms, one search engine
| PRIMUS | NBS | |
|---|---|---|
| Frontend | Angular 14 + TypeScript | SvelteKit + TypeScript |
| Users | Employers (external) | Consultants (internal) |
| Auth | JWT + Navigos SSO | .NET CRM hooks |
| State | RxJS services | Svelte stores + optimistic updates |