← Back to courses

Course

React

192 lessons across 18 modules

From JSX to production - components, state, forms, hooks, routing, data, performance, TypeScript, testing, and four projects that use the whole course. The road is laid out in full; lessons are being written one at a time.

Course18 modules192 lessonsEach heading below is a module (one topic). Each card under it is a lesson. Start with Module 1.
Solid: ready (14)Dashed: coming soon (178)
Module 1 of 1810 lessons

React Fundamentals

JSX, rendering, and the shape of a React app

Prerequisite: the JavaScript course →
Module 2 of 1810 lessons4 ready

Components and Props

Splitting a UI up, and passing data down

Functional Components

11

A component is a function that returns UI. Everything else follows.

Beginnercomponents35 min
Lesson 11Open →

Props Basics

12

Passing data from a parent component to a child - the thing that makes components reusable.

Beginnerprops35 min
Lesson 12Open →

Props Destructuring & Default Props

13

Destructuring, optional props, default values, rest and spread - and designing a clean component API.

Beginnerprops35 min
Lesson 13Open →

Passing Functions as Props

14

Callback props - how a child tells its parent that something happened.

Beginnerprops35 min
Lesson 14Open →

Children Props

15

children as the slot that makes wrappers possible.

A Modal that knows nothing about what it contains

Lesson 15planned

Component Composition

16

Building screens by nesting components instead of by adding options.

A Card that takes content rather than twelve boolean props

Lesson 16planned

Creating Reusable Components

17

Finding the right seam - what to make configurable and what to fix.

One Button that covers six variants without a prop explosion

Lesson 17planned

Props vs State

18

Read-only from above against owned and changeable here.

Deciding where a search term should live

Lesson 18planned

Component Design Best Practices

19

Size, naming, one responsibility, and when to stop splitting.

Reviewing a component that does three jobs

Lesson 19planned

Module Project: Course Catalogue

20

Components, props, children, and callbacks in one small app.

A course catalogue page built from typed, reusable components

Lesson 20planned
Module 3 of 1811 lessonsComing soon

State and Events

Making a component remember, and respond

Understanding State

21

Why a plain variable does not survive a render, and what state fixes.

A counter with let, and the same one with state

Lesson 21planned

useState

22

Declaring state, reading it, and the setter that replaces it.

A search box that drives a filtered list

Lesson 22planned

Updating Primitive State

23

Strings, numbers, and booleans - and why updates are not immediate.

Logging state right after setting it and seeing the old value

Lesson 23planned

Updating Objects

24

Replacing rather than mutating, and spreading the rest.

Editing one field of a user form without losing the others

Lesson 24planned

Updating Arrays

25

Add, remove, and edit without push, splice, or sort.

A todo list where every operation returns a new array

Lesson 25planned

Functional State Updates

26

setCount(c => c + 1) and the stale-value bug it prevents.

Two increments in one handler, and why only one lands

Lesson 26planned

Event Handling

27

Attaching handlers, the synthetic event, and passing arguments.

Why onClick={handler()} fires on render

Lesson 27planned

Mouse Events

28

Click, double click, hover, and the difference between target and currentTarget.

A row click that ignores clicks on its delete button

Lesson 28planned

Keyboard Events

29

keydown against keyup, reading the key, and accessible shortcuts.

Submitting on Enter and closing on Escape

Lesson 29planned

Form Events

30

onChange, onSubmit, and preventDefault.

A login form that does not reload the page

Lesson 30planned

State and Component Re-rendering

31

What triggers a render, what it costs, and why it is not a redraw.

Counting renders with a console log to see what really happens

Lesson 31planned
Module 4 of 1810 lessonsComing soon

Forms

Controlled inputs, validation, and submission

Controlled Components

32

React as the source of truth for an input, and the uncontrolled alternative.

An input that will not type until you wire onChange

Lesson 32planned

Input Fields

33

Text, number, email, password - value, onChange, and the types that lie.

Why a number input still gives you a string

Lesson 33planned

Select and Checkbox

34

value against checked, and multi-select.

A filter panel with a dropdown and three checkboxes

Lesson 34planned

Radio Buttons

35

Grouping by name, and one piece of state for the whole group.

Choosing a difficulty level

Lesson 35planned

Multiple Form Fields

36

One state object and one handler, keyed by input name.

A six-field profile form with a single onChange

Lesson 36planned

Form Validation

37

When to validate, where to keep errors, and how to show them.

Validating on blur and again on submit

Lesson 37planned

Dynamic Forms

38

Fields that appear, repeat, and are removed - and keeping keys stable.

Adding and removing question rows in a quiz builder

Lesson 38planned

File Uploads

39

The file input, FormData, previews, and size limits.

Uploading an avatar with a preview before submit

Lesson 39planned

Form Submission

40

Disabling during submit, handling failure, and not double-posting.

A submit button that cannot be clicked twice

Lesson 40planned

Building a Complete Form

41

Every piece together - state, validation, submit, error, and success.

A registration form from empty file to working

Lesson 41planned
Module 5 of 1810 lessonsComing soon

React Hooks

The built-in hooks, their rules, and writing your own

Every hook with a live demo →

Understanding Hooks

42

What a hook is, why they replaced classes, and how React tracks them.

Why hooks are stored by call order, not by name

Lesson 42planned

Rules of Hooks

43

Top level only, components and hooks only - and what breaks otherwise.

A hook inside an if, and the state that lands on the wrong variable

Lesson 43planned

useEffect

44

Running code after render, and what an effect is actually for.

Setting the document title when a lesson opens

Lesson 44planned

Effect Dependencies

45

The array, what belongs in it, and the two ways to get it wrong.

An empty array that captures a stale value

Lesson 45planned

Effect Cleanup

46

Returning a teardown, and why it runs more often than you expect.

A subscription that leaks until you clean it up

Lesson 46planned

API Calls with useEffect

47

Fetching on mount, tracking loading and error, and avoiding the race.

Two fast searches, and the slower response overwriting the newer one

Lesson 47planned

useRef

48

A value that survives renders without causing one, and DOM access.

Focusing an input on mount, and holding a timer id

Lesson 48planned

useReducer

49

Moving complex state transitions into one function.

A form with eight fields and four actions

Lesson 49planned

useContext

50

Reading shared values without threading props through every level.

A theme read three components deep

Lesson 50planned

Custom Hooks

51

Extracting stateful logic into a reusable function.

useDebounce and useLocalStorage, written from scratch

Lesson 51planned
Module 6 of 1811 lessonsComing soon

API Integration

Talking to a backend, and handling what comes back

Understanding REST APIs

52

Methods, status codes, headers, and the contract a frontend depends on.

Reading an endpoint spec before writing any code

Lesson 52planned

fetch

53

The built-in client, and the ways it does not behave like you expect.

Why a 404 does not reject the promise

Lesson 53planned

Axios

54

Instances, interceptors, defaults - and when it earns its weight.

One instance carrying the base URL and auth header

Lesson 54planned

GET Requests

55

Reading data, query strings, and rendering the result.

A paginated course list

Lesson 55planned

POST Requests

56

Sending a body, setting headers, and using the response.

Creating a course and showing it without a refetch

Lesson 56planned

PUT and PATCH Requests

57

Full replacement against partial update, and which to send.

Editing one field without wiping the rest

Lesson 57planned

DELETE Requests

58

Removing a record, confirming first, and updating the list.

Deleting a row and rolling back when the server says no

Lesson 58planned

Loading States

59

Initial, refetching, and empty - three states people collapse into one.

A skeleton that does not flash on a fast response

Lesson 59planned

Error Handling

60

Network against HTTP against validation errors, and what to show for each.

A 422 with field errors mapped back onto the form

Lesson 60planned

Request Cancellation

61

AbortController, and cleaning up a request the user has moved on from.

Cancelling the previous search as the user keeps typing

Lesson 61planned

Building an API Service Layer

62

Keeping fetch calls out of components, in one typed place.

Moving twelve scattered calls into api/courses.ts

Lesson 62planned
Module 7 of 1811 lessonsComing soon

React Router

Multiple screens in a single-page app

Introduction to React Router

63

What client-side routing is, and what it costs you for free.

A back button that stops working, and why

Lesson 63planned

Routes

64

Declaring paths, matching, and rendering the element.

Three screens behind three URLs

Lesson 64planned

Links and Navigation

65

Link against an anchor tag, and why one reloads the app.

Measuring the difference in the network tab

Lesson 65planned

useNavigate

66

Navigating from code after an action, and replace against push.

Redirecting to the new record after a successful save

Lesson 66planned

Route Parameters

67

Dynamic segments, reading them, and handling a bad one.

A lesson page keyed by slug

Lesson 67planned

Query Parameters

68

Putting filters in the URL so they survive a refresh and a share.

A filtered course list you can send to someone

Lesson 68planned

Nested Routes

69

Routes inside routes, and the Outlet that renders them.

A course page with tabs that are each a URL

Lesson 69planned

Layout Routes

70

Sharing a shell across screens without re-mounting it.

A sidebar that keeps its scroll position across navigations

Lesson 70planned

Protected Routes

71

Gating a screen on auth, and remembering where the user was going.

Logging in and landing back on the page you wanted

Lesson 71planned

404 Pages

72

The catch-all route, and the difference between missing and forbidden.

A useful not-found page rather than a blank screen

Lesson 72planned

Lazy-loaded Routes

73

Splitting by screen so the first load does not carry the whole app.

Cutting the initial bundle by moving the admin area behind lazy

Lesson 73planned
Module 8 of 1812 lessonsComing soon

State Management

When local state stops being enough

Redux in depth →

Local State vs Global State

74

The question to ask before reaching for any library.

Three pieces of state, and where each one belongs

Lesson 74planned

Lifting State Up

75

Moving state to the closest common parent, and the cost of doing it.

Two sibling components that need the same value

Lesson 75planned

Prop Drilling

76

What it is, when it is fine, and the point at which it is not.

A value passed through four components that ignore it

Lesson 76planned

Context API

77

Provider, consumer, and the re-render behaviour people miss.

A context change that re-renders half the app

Lesson 77planned

When to Use Global State

78

The honest criteria - and why most apps need less than they use.

Deleting a store that only one screen read from

Lesson 78planned

Redux Fundamentals

79

Store, action, reducer, dispatch - the model before the tooling.

The same counter in plain Redux

Lesson 79planned

Redux Toolkit

80

What it removes, and why nobody writes Redux by hand now.

The same counter, two thirds shorter

Lesson 80planned

createSlice

81

Reducers and actions together, with mutation that is not mutation.

Writing state.value += 1 safely, and how Immer allows it

Lesson 81planned

useSelector

82

Reading from the store, and selecting narrowly enough to avoid re-renders.

A selector returning a new object every time

Lesson 82planned

useDispatch

83

Sending actions, and keeping components free of store details.

A component that dispatches and knows nothing else

Lesson 83planned

Async Redux Operations

84

createAsyncThunk, and the three states every request has.

Pending, fulfilled, and rejected handled in one slice

Lesson 84planned

RTK Query

85

Treating the server as a cache rather than state you own.

Replacing a slice, a thunk, and three loading flags with one hook

Lesson 85planned
Module 9 of 1812 lessonsComing soon

Server State and TanStack Query

Caching, refetching, and data you do not own

Client State vs Server State

86

The distinction that makes most state-management arguments dissolve.

Why a user list is not really your state

Lesson 86planned

Introduction to TanStack Query

87

What it does for you, and what it replaces.

Deleting a useEffect, two useStates, and a cleanup

Lesson 87planned

Queries

88

useQuery, its return shape, and reading status properly.

Loading, error, and data without writing any of the plumbing

Lesson 88planned

Query Keys

89

The cache identity - and why getting it wrong shows stale data.

Two searches sharing one key and one wrong result

Lesson 89planned

Mutations

90

Writes, their lifecycle, and what to do when they land.

Creating a course and refreshing the list automatically

Lesson 90planned

Caching

91

What is kept, for how long, and what a cache hit looks like.

Navigating back to a screen that renders instantly

Lesson 91planned

Stale Time

92

The single setting that decides how fresh your data feels.

The same screen at staleTime 0 and at five minutes

Lesson 92planned

Refetching

93

On focus, on reconnect, on interval - and turning them off.

A dashboard that updates when you come back to the tab

Lesson 93planned

Query Invalidation

94

Marking data stale after a write, and how wide to go.

Invalidating one list without refetching the whole app

Lesson 94planned

Pagination

95

Page-based data, and keeping the previous page visible.

Paging without the table collapsing between pages

Lesson 95planned

Infinite Queries

96

Cursor-based loading and an endless list.

Load more, and then the same thing on scroll

Lesson 96planned

Optimistic Updates

97

Showing the result before the server confirms - and rolling back.

A like button that reverts when the request fails

Lesson 97planned
Module 10 of 1812 lessonsComing soon

React Performance

Why it re-renders, and what to do about it

Understanding Re-rendering

98

What causes a render, and why a render is not a repaint.

Counting renders before changing a single line

Lesson 98planned

React Reconciliation

99

How React decides what changed, and where keys fit in.

Watching a list update in the DOM inspector

Lesson 99planned

Virtual DOM

100

What it actually is, and the myths worth discarding.

Why "the virtual DOM is fast" is the wrong claim

Lesson 100planned

React.memo

101

Skipping a render when props are equal - and when that never happens.

A memo defeated by an inline object prop

Lesson 101planned

useMemo

102

Caching an expensive value, and the cost of caching a cheap one.

Measuring a filter before and after memoising it

Lesson 102planned

useCallback

103

A stable function identity, and why it only matters with memo.

A useCallback that does nothing because the child is not memoised

Lesson 103planned

Avoiding Unnecessary Re-renders

104

Composition, state placement, and fixing the cause not the symptom.

Moving state down instead of memoising three components

Lesson 104planned

Code Splitting

105

Shipping less on first load, and choosing the split points.

Reading the bundle analyser and finding the heavy import

Lesson 105planned

lazy

106

Deferring a component until it is needed.

A chart library that only loads on the reports tab

Lesson 106planned

Suspense

107

Declaring the fallback, and where to put the boundary.

One spinner in the right place instead of five

Lesson 107planned

List Virtualization

108

Rendering only what is on screen, for lists that are genuinely long.

Ten thousand rows that scroll smoothly

Lesson 108planned

Web Workers

109

Moving heavy work off the main thread so the UI keeps responding.

Parsing a large CSV without freezing the page

Lesson 109planned
Module 11 of 1812 lessonsComing soon

Advanced React

Boundaries, concurrency, and component patterns

Error Boundaries

110

Catching a render error so one component does not blank the app.

A widget that fails without taking the page with it

Lesson 110planned

Portals

111

Rendering outside the parent DOM node, while staying in the tree.

A modal that escapes overflow hidden but keeps its context

Lesson 111planned

Suspense

112

Beyond lazy - coordinating loading states across a subtree.

Three components that appear together rather than one by one

Lesson 112planned

Transitions

113

Marking an update as interruptible so typing stays smooth.

A filter over a large list that no longer stutters

Lesson 113planned

useTransition

114

The pending flag, and showing that work is happening.

A tab switch that stays responsive while the next tab loads

Lesson 114planned

useDeferredValue

115

Letting one value lag behind on purpose.

An instant input with a deferred result list

Lesson 115planned

Optimistic UI

116

Rendering the intended result immediately, and correcting it.

useOptimistic on a comment form

Lesson 116planned

Advanced Component Patterns

117

Choosing a pattern from the problem rather than from fashion.

The same dropdown written four ways, compared honestly

Lesson 117planned

Compound Components

118

Related components sharing implicit state.

Tabs, TabList, and TabPanel that just work together

Lesson 118planned

Render Props

119

Passing rendering as a function - and what hooks replaced.

A Toggle that lets the caller decide the markup

Lesson 119planned

Higher-Order Components

120

Wrapping a component to add behaviour, and why it faded.

withAuth, and the custom hook that replaces it

Lesson 120planned

Reusable Architecture Patterns

121

Composing the patterns into something a team can maintain.

A component library seam that survives two years

Lesson 121planned
Module 12 of 1812 lessonsComing soon

TypeScript with React

Typing props, state, events, and data

TypeScript in depth →

TypeScript Fundamentals

122

The subset you need for React, without the full language tour.

Reading an error message and knowing what it wants

Lesson 122planned

Typing Props

123

Prop types, optional props, and defaults that type correctly.

A Button whose variant cannot be misspelled

Lesson 123planned

Typing State

124

Inference, and the cases where you must annotate.

useState with a null initial value

Lesson 124planned

Typing Events

125

Event types that are hard to guess and easy to look up.

ChangeEvent, MouseEvent, and FormEvent in one form

Lesson 125planned

Typing Forms

126

One type for the form shape, driving the state and the handler.

A field name that cannot be typed wrong

Lesson 126planned

Typing useRef

127

DOM refs against value refs, and the null that TypeScript insists on.

Why an input ref starts as null and how to narrow it

Lesson 127planned

Typing useReducer

128

A discriminated union of actions, checked exhaustively.

Adding an action and letting the compiler find every gap

Lesson 128planned

Typing API Responses

129

Where types come from, and why the network is not typed.

Validating at the boundary instead of trusting the cast

Lesson 129planned

Interfaces vs Types

130

The real differences, and a rule you can apply without thinking.

Declaration merging, and where it matters

Lesson 130planned

Generics

131

Writing something once that keeps its caller types.

A useFetch that returns the right shape each time

Lesson 131planned

Generic Components

132

Components parameterised by the data they render.

A Table that types its rows and its column keys together

Lesson 132planned

Type-safe React Architecture

133

Types at the seams so the rest of the app can relax.

One API type flowing from fetch to render

Lesson 133planned
Module 13 of 1813 lessonsComing soon

React Testing

Testing what the user does, not what the code is

Why Testing?

134

What a test buys you, and the tests that buy nothing.

A test that breaks on every refactor and catches no bugs

Lesson 134planned

Testing Fundamentals

135

Arrange, act, assert - and what makes a test worth keeping.

Naming a test so a failure explains itself

Lesson 135planned

Vitest and Jest

136

Runner, matchers, and config - and how the two differ in practice.

A first passing test, run in watch mode

Lesson 136planned

React Testing Library

137

Querying by role and text, and why not by class name.

Rewriting a brittle selector as an accessible query

Lesson 137planned

Testing Components

138

Rendering, asserting on output, and staying off internals.

Testing what the card shows, not how it stores it

Lesson 138planned

Testing Props

139

Covering the variants that actually change behaviour.

One test per branch, not one per prop

Lesson 139planned

Testing State

140

Driving state through the UI rather than reaching into it.

Clicking to open a panel instead of setting a flag

Lesson 140planned

Testing User Interactions

141

userEvent, and why it beats firing raw events.

Typing that triggers the same handlers a real user would

Lesson 141planned

Testing Forms

142

Filling, submitting, and asserting on validation messages.

A submit blocked by an invalid email

Lesson 142planned

Mocking APIs

143

MSW at the network boundary rather than stubbing your own modules.

A test that survives swapping fetch for Axios

Lesson 143planned

Testing Custom Hooks

144

renderHook, and when a hook deserves its own test at all.

Testing useDebounce with fake timers

Lesson 144planned

Integration Testing

145

Several components together, which is where the bugs live.

Search, filter, and paginate in one test

Lesson 145planned

Cypress E2E Testing

146

The real browser, the real app - and how few of these you need.

One end-to-end test covering login to checkout

Lesson 146planned
Module 14 of 1811 lessonsComing soon

Authentication and Authorization

Who the user is, and what they may do

Authentication Concepts

147

Authentication against authorization, sessions against tokens.

Drawing the flow before writing any of it

Lesson 147planned

Login and Register

148

The forms, the calls, and what to do with the result.

A login screen wired to a real endpoint

Lesson 148planned

JWT

149

What is inside a token, what it proves, and what it does not.

Decoding one, and why decoding is not verifying

Lesson 149planned

Access Tokens

150

Attaching them, expiring them, and keeping them short-lived.

An interceptor that adds the header once

Lesson 150planned

Refresh Tokens

151

Renewing silently, and the queue problem when several calls fail at once.

Three requests hitting a 401 and only one refresh going out

Lesson 151planned

Cookie-based Authentication

152

httpOnly cookies, SameSite, and why they beat localStorage.

The same login moved from localStorage to a cookie

Lesson 152planned

Protected Routes

153

Gating screens, and the flash of the wrong content before you do.

Rendering nothing until the session is known

Lesson 153planned

Role-Based Access Control

154

Roles on the client for UX, on the server for safety.

An admin link that hides but is still enforced server-side

Lesson 154planned

Permission-Based UI

155

Finer-grained than roles, and how to keep it readable.

A can() helper used across a toolbar

Lesson 155planned

Logout

156

Clearing state, clearing the cache, and ending the session properly.

Logging out without leaving the previous user cached

Lesson 156planned

Session Handling

157

Restoring on reload, expiry, and multiple tabs.

Logging out in one tab and having the other notice

Lesson 157planned
Module 15 of 189 lessonsComing soon

React Security

The frontend half of keeping an app safe

XSS

158

What React escapes for you, and the one prop that opts out.

dangerouslySetInnerHTML with untrusted content

Lesson 158planned

CSRF

159

Why cookie auth needs a token, and how SameSite changed it.

A forged form post, and the header that stops it

Lesson 159planned

Secure Authentication

160

The choices that matter most, ranked honestly.

Reviewing an auth flow for the three common holes

Lesson 160planned

Token Storage

161

localStorage, memory, and httpOnly cookies compared.

What each one exposes when an XSS lands

Lesson 161planned

Input Sanitization

162

Where sanitising belongs, and why the client is not enough.

Rendering user markdown without handing over the page

Lesson 162planned

Dependency Security

163

Audits, lockfiles, and the transitive packages you never chose.

Reading an npm audit report and deciding what is real

Lesson 163planned

Environment Variables

164

Everything in a frontend build is public. Everything.

Finding an API key in a production bundle

Lesson 164planned

Secure API Communication

165

HTTPS, CORS, and what CORS does not protect.

A CORS error, and why it is not a security feature for you

Lesson 165planned

Common React Security Mistakes

166

The handful that account for most real incidents.

A checklist applied to a finished app

Lesson 166planned
Module 16 of 1810 lessonsComing soon

React Architecture

Structuring an app that more than one person works on

React Project Structure

167

By type against by feature, and why the first one stops scaling.

A components folder with ninety files in it

Lesson 167planned

Feature-Based Architecture

168

Grouping by what it does, with clear boundaries between features.

Moving one feature out without touching the others

Lesson 168planned

Component Architecture

169

Layers - page, container, presentational - and not over-applying them.

Deciding which of three components owns the fetch

Lesson 169planned

Shared Components

170

What earns a place in shared, and what should stay put.

A "shared" component used exactly once

Lesson 170planned

Custom Hooks Architecture

171

Organising hooks so they stay findable and testable.

Splitting a 200-line hook that does three things

Lesson 171planned

API Service Architecture

172

One place per resource, typed, with no fetch in a component.

Swapping the HTTP client without touching a screen

Lesson 172planned

State Management Architecture

173

Deciding per piece of state, and writing the decision down.

A one-page rule the whole team can follow

Lesson 173planned

Error Handling Architecture

174

Boundaries, toasts, and logging - one strategy, not per-component guesses.

Every failure path in an app, mapped

Lesson 174planned

Configuration Management

175

Environments, feature flags, and keeping config out of the code.

One build promoted through three environments

Lesson 175planned

Scalable React Architecture

176

The whole thing together, and what to do when it stops fitting.

Reviewing a real structure and naming what will break first

Lesson 176planned
Module 17 of 1812 lessonsComing soon

Production React

Building, shipping, and watching it run

Environment Configuration

177

Per-environment values, and the ones that must never be in the bundle.

Three environments from one codebase

Lesson 177planned

Development vs Production

178

What changes in a production build, and the bugs that only appear there.

A double render in dev that is not a bug

Lesson 178planned

Build Process

179

What the bundler does, and how to read what it produced.

Following one import into the output file

Lesson 179planned

Production Builds

180

Minification, tree shaking, hashing, and cache headers.

A deploy that does not serve anyone a stale bundle

Lesson 180planned

Error Logging

181

Catching what users hit, with enough context to act on it.

A stack trace that means something after minification

Lesson 181planned

Analytics

182

Measuring use without collecting more than you need.

Three events that answer a real product question

Lesson 182planned

Performance Monitoring

183

Core Web Vitals from real users, not from your laptop.

Finding the slow route in field data

Lesson 183planned

Accessibility

184

Semantics, focus, and keyboard paths - the parts React will not do for you.

Navigating a whole flow without a mouse

Lesson 184planned

Internationalization

185

Extracting strings, plurals, dates, and layouts that grow.

A button that fits in English and breaks in German

Lesson 185planned

SEO

186

What a client-rendered app costs you, and the ways back.

Viewing source and finding an empty div

Lesson 186planned

Deployment

187

Static hosting, SPA rewrites, and the 404 on refresh.

A deep link that works only after you fix the rewrite

Lesson 187planned

CI/CD

188

Lint, typecheck, test, build, deploy - and failing fast.

A pipeline that blocks a broken build from shipping

Lesson 188planned
Module 18 of 184 lessonsComing soon

React Projects

Four builds that use the whole course

Project 1 - Todo Application

189

Components, state, forms, local storage, and filtering, end to end.

Add, complete, filter, and persist across a refresh

Lesson 189planned

Project 2 - E-Commerce Application

190

Products, search, filters, cart, authentication, and checkout.

A cart that survives login and reload

Lesson 190planned

Project 3 - Admin Dashboard

191

React, TypeScript, and Redux - users, roles, permissions, tables, and charts.

A paginated table with role-gated actions

Lesson 191planned

Project 4 - Learning Platform

192

Courses, modules, lessons, quizzes, progress, and learning paths.

The platform this course is hosted on, rebuilt

Lesson 192planned