Frontend Engineering Roadmap

Nine levels, each defined by what you can build once you have it rather than by what you have read. The order matters: every level assumes the failure modes of the one before it, and the levels that look boring are the ones that decide whether the interesting ones work.

0 / 176 mastered0%
Level 1

Structure, style and the object model

You can build a page whose markup means something — headings that outline the document, controls that are real controls, styles that resolve the way you predicted — and you can open devtools and explain why a given element ended up with the computed value it has. This is the level at which the browser stops being a mystery box and becomes a machine with named parts.

The Browser Is a Runtime
What Happens When You Open a Website
The Multi-Process Browser
The Frontend Reasoning Loop
Origins and the Sandbox
Semantics Are Behaviour
Document Structure and Reading Order
What Native Elements Already Do
The Head: Metadata That Changes Rendering
Div Soup: How It Happens and What It Costs
The DOM Is Not Your HTML
What a Mutation Costs
Queries, Live Collections and Stale References
Node Identity Across Updates
The CSSOM
The Cascade
Specificity
Inheritance and Computed Style
Custom Properties
The Box Model
Level 2

Events, forms, accessibility and adapting to the viewport

You can build an interface that a person can actually operate — with a keyboard, with a screen reader, on a phone held one-handed, in a language that runs longer than English. Forms submit, errors are announced, focus goes where the user expects, and the layout responds to the space it is given rather than to the width of your laptop.

How an Event Is Dispatched
Event Delegation
preventDefault vs stopPropagation
Pointer Events
Keyboard Events
Native Forms First
Input Types, Inputmode and Autocomplete
Native Validation and Its Limits
Submission: Method, Encoding and Doing It Once
Errors People Can Actually Perceive
The Accessibility Tree
Semantics Before ARIA
Keyboard Operability
Focus Management
The Rules of ARIA
Live Regions and Announcement
Fluid Layout First
Media Queries Beyond Width
Container Queries
Responsive Images
Level 3

State, components, routing and talking to a server

You can build a real application: multiple screens with shareable URLs, components with contracts other people can use, and data that arrives from a server with its loading and error states rendered honestly. Crucially, you can answer "where does this value live and who owns it" for every piece of state in the app, which is the question most frontend bugs turn out to be.

The Seven Kinds of State
Who Owns This State?
The URL Is Application State
Derived State
Form State Is a Draft
Controlled vs Uncontrolled Inputs
Drawing Component Boundaries
What a Component Owes Its Caller
Composition and Slots
Prop Drilling, Context and Global State
Over-Componentization
Reactivity Models
Reconciliation and Keys
Client-Side Routing
Route Matching
URL Parameters
History and Navigation
The Life of a Fetch
Loading, Error, Empty — The States You Did Not Render
Server State Is Not Your State
Level 4

The rendering pipeline, the event loop and the one main thread

You can look at a change you are about to make and say which pipeline stages it invalidates and roughly what that costs — and when a page freezes, you can find the task that owns the thread instead of guessing. This is the level at which "it feels janky" becomes a diagnosis rather than a complaint.

The Rendering Pipeline
Style Calculation
Style Invalidation
The Cost of a Change
Layout Thrashing
Paint Commands
Compositing Layers
Cheap and Expensive Animation
The Frame Budget
Scroll and Input Latency
The Event Loop, Precisely
Tasks: The Unit That Cannot Be Interrupted
The Microtask Checkpoint
The Rendering Opportunity
Long Tasks
What the Main Thread Owns
Yielding and Scheduling
Web Workers and the DOM Boundary
When a Worker Is Actually the Answer
Streaming HTML
Level 5

Client caches, optimistic updates and live data

You can build an interface that feels instant without lying: a cache with keys you can invalidate deliberately, mutations that render before the server has agreed and roll back honestly when it disagrees, and a live connection that survives being dropped in a lift. You can also say what happens when two responses to the same screen arrive out of order.

The Client Cache Model
Query Keys and Invalidation
Stale-While-Revalidate
Optimistic UI
Rollback and Reconciliation
Out-of-Order Responses
Cancelling a Request Nobody Is Waiting For
Five Components, One Request
Retries, and the Duplicate Order
Choosing a Real-Time Transport
Server-Sent Events
WebSockets in the UI
Reconnect and Backoff
Ordering and Duplicate Delivery
Resynchronisation After a Gap
State Synchronization
Persistent Client State
Choosing Browser Storage
Level 6

What the browser enforces, what you can prove, and what real users emit

You can state precisely which half of a defence the browser is doing and which half only the server can, write tests at the level that can actually prove the thing you are worried about, and read production signal from real devices instead of from your own machine. You stop shipping "it worked locally" as a release note.

The Browser Security Model
The Same-Origin Policy
Cross-Site Scripting
Sanitization and Trusted HTML
Cross-Site Request Forgery
CORS
Content Security Policy
Clickjacking and Framing
Third-Party Scripts and the Supply Chain
What the Frontend Is Responsible For in Auth
Cookies vs Script-Readable Tokens
Storage Security and Durability
Choosing the Test Level
Testing Pure Logic
Component Testing
End-to-End Testing
Accessibility Testing
Frontend Error Tracking
Real User Monitoring
Vitals in the Field
Level 7

Performance, the critical path and what your users download

You can take a slow page, find the actual bottleneck from evidence rather than folklore, and fix the one thing that matters — whether that is a blocking resource, a long task, a render that did not need to happen or three hundred kilobytes of a date library nobody imports. You can also say what your fix cost, because every one of them costs something.

Measure Before Optimising
Loading: Why Content Arrives Late
Interaction Responsiveness
Visual Stability
The Real Cost of JavaScript
Images and Fonts
List Virtualization
Memoization
Memory Leaks
The Critical Rendering Path
Reading a Network Waterfall
Render-Blocking Resources
Resource Hints
Browser HTTP Caching
Content-Hashed Assets
The Module Graph
Code Splitting
Lazy Loading
Tree Shaking
Minification Is Not Compression
Level 8

Where the HTML comes from: CSR, SSR, SSG, streaming and islands

You can choose a rendering strategy from the shape of the content and the shape of the traffic rather than from what the framework's landing page recommends, and you can explain hydration to someone who has just watched their server-rendered page ignore three clicks in a row. You can also mix strategies within one application on purpose.

Client-Side Rendering
Server-Side Rendering
Static Site Generation
Hydration
Hydration Mismatch
Islands and Partial Hydration
Streaming Server Rendering
Server Components
Choosing a Rendering Strategy
Route Loading Boundaries
`defer`, `async` and `type="module"`
The Preload Scanner
CDN Delivery
ESM vs CommonJS
Polyfills vs Transpilation
TypeScript in the Build
Bundle Analysis
Source Maps
Level 9

Frontend architecture and running it in browsers you do not control

You can shape a frontend that a team can work in for years — architecture chosen for the constraints that actually apply, a design system with tokens rather than a folder of components, i18n that was not bolted on, and a deployment story that survives the fact that web clients never update atomically. You can debug a production incident from field evidence and ship the fix behind a flag.

Choosing a Frontend Architecture
MPA vs SPA
Micro Frontends
Design Systems
Design Tokens
Internationalization
Timezones and Locale Formatting
Deploying a Frontend
Long-Lived Clients and Version Skew
Feature Flags in the Client
Analytics Events That Answer a Question
File Upload UX
How API Shape Drives UI Complexity
Backend for Frontend
Release Health
Session Replay and the Privacy It Costs
A Method for Frontend Bugs
The Service Worker Lifecycle
The Offline Mutation Queue
What the Frontend Owns in an Agent Product