Skip to main content
Navigos Group · 2024 — PresentLive

Navigos Talent One

Navigos Talent One is the employer recruitment platform that Navigos Group's clients use to post jobs, screen candidates with AI scoring, build hiring campaign pages, and track applications from search to onboarding. Four engineering squads ship features on this codebase in parallel.

React 19Next.js 15TypeScriptTurborepoTailwindCSSTipTapSocket.IO

203K

Lines of Code

15

Packages

4

Squads

2800+

Components

What Needed Solving

203K lines of TypeScript. Four teams. Constant collisions.

Four engineering squads build features on a 203K-line TypeScript monorepo with 15 packages. When one squad changed shared state, another squad's feature would break without warning. Merge conflicts stacked up because everyone touched the same files. The platform serves users in multiple languages, but translation keys were plain strings with no validation, so typos only surfaced in production when a user saw a missing label. None of the off-the-shelf state management options solved the core tension: teams needed isolation to ship independently, but they also needed to share data like permissions, authentication, and user preferences across module boundaries.

Application tracking system with AI-scored candidates at 75% match, showing pipeline stages from screening to onboarding

Application tracking with AI match scoring

How It Works

Custom state that isolates teams but shares what matters

To solve the collision problem, I built a state management system on top of React's useSyncExternalStore and Immer. Each squad's state lives in its own scope so changes can't leak into another team's features, but shared data like permissions and authentication flows through app-wide stores that every module can subscribe to. Components only re-render when the specific values they care about change, so one team updating their state doesn't trigger unnecessary renders across the rest of the platform.

The translation issue was solved the same way: the system uses plain TypeScript objects with type-safe keys, so developers get autocomplete for every translation string and the compiler catches typos before code reaches production. Feature modules are lazy-loaded so the browser only downloads code for the section the user actually opens, and route prefetching starts loading the next likely page while the current one is still visible. The monorepo itself uses git submodules to give each squad its own feature scope, which cut down merge conflicts because teams stopped editing the same files.

Landing page builder WYSIWYG editor showing Work in Finland hiring campaign

Block-based landing page builder

Job list with view and application metrics per posting

Job management with live metrics

AI candidate recommendations with 75% match scores and invite actions

AI-powered candidate recommendations

Candidate profile with AI evaluation score of 75 and detailed assessment

Candidate AI evaluation profile

Feature Showcase

What the squads shipped

AI-Powered Hiring

Employers type a job title, AI writes the posting

The AI job description generator takes a title and a few bullet points and produces a structured posting ready to publish. Every incoming application gets scored by AI across skills, experience, and education, so recruiters see a match percentage on every candidate without reading the full CV first.

Post job with AI — form fields for job title, category, industry, and work location
AI content correction panel reviewing and refining generated job description
Landing Page Builder

Hiring campaigns that used to need a developer

Employers build their own recruitment campaign pages using a block-based editor with responsive previews, template system, theme colors, and draft/publish workflows. Uploaded images are automatically converted and resized to WebP at multiple breakpoints so campaign pages load fast on any device. Before this builder existed, every campaign page required developer time to create and deploy.

Landing page builder with block-based editing, responsive preview, and campaign publishing workflow
Application Tracking

Every application from search to onboarding in one pipeline

The ATS tracks candidates across multiple pipeline stages with AI match scoring, bulk operations, and collaborative review workflows. Moving a candidate between stages uses optimistic updates so the UI responds immediately while the server confirms in the background, which matters when recruiters are processing dozens of applications in a session. Four engineering squads built different parts of this system in parallel, and the custom state architecture kept their code from colliding.

Application tracking general info with candidate details, AI scoring, and pipeline management
What Shipped

Four teams shipping without waiting for each other

Each squad owns its features and deploys without waiting on the others. When a user logs in, switches language, or changes roles, the relevant content updates instantly without a full page reload because the state system re-renders only the affected components. Route prefetching and lazy-loaded modules mean the next page is often ready before the user clicks, and optimistic updates make every action feel immediate even on slower connections. Permissions are checked through one shared system across all modules, so no team had to build their own access control from scratch.

0

Engineering Squads

Each ships features without waiting on the others

0K

Lines of TypeScript

Spread across 15 packages in one monorepo

0

Page Reloads Needed

The screen never goes blank, no matter what you do

0

Shared Permission System

Every module uses the same access control logic