← Back to courses

Course

Redux

187 lessons across 18 modules

Intermediate to advanced, assuming JavaScript and React. From the state-management question through the store, Redux Toolkit, selectors, async thunks, middleware, RTK Query, auth, architecture, performance and testing - ending in two full projects. The road is laid out in full; lessons are being written one at a time.

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

State Management Fundamentals

The question Redux answers, before any Redux

State management in the React course →

What is State Management?

1

What "state" is, why two parts of an app start to disagree about the same data, and the three questions every state management tool - including Redux - answers.

Beginnerfundamentals30 min
Lesson 1Open →

Local State vs Global State

2

Most state belongs to one component. Learn to sort state into local and global with four simple questions, and see - with measured re-renders - what each wrong choice costs.

Beginnerfundamentals35 min
Lesson 2Open →

Client State vs Server State

3

Some data belongs to your app. Other data belongs to a server, and your app only holds a copy that can go out of date. Learn to tell them apart, and see - with real requests counted - why server data needs different tools.

Beginnerfundamentals35 min
Lesson 3Open →

Why State Management Becomes Difficult

4

Six ways state goes wrong as an app grows - duplicated values, drifting copies, stored totals, changes nobody can trace, changes React never sees, and answers that arrive in the wrong order. Each one reproduced with running code, and each one fixed.

Beginnerfundamentals40 min
Lesson 4Open →

Prop Drilling

5

Passing a value down through components that do not use it. When it is perfectly fine, what it really costs (measured - it is mostly not speed), and three ways out: composition, Context and a store.

Beginnerfundamentals35 min
Lesson 5Open →

Lifting State Up

6

When two components need the same state, move it up to their closest common parent - value down, changes up. Then see, with counted re-renders, what happens when state climbs too high, and three ways back.

Beginnerfundamentals35 min
Lesson 6Open →

Context API vs Redux

7

React Context delivers a value to components; it does not manage state. See - with counted re-renders - why one big context re-renders every consumer, how to fix it, and when Context or Redux is the right choice.

Beginnerfundamentals40 min
Lesson 7Open →

When Should You Use Redux?

8

Redux has real costs and real benefits - we measured both. The honest criteria for using it, the kinds of apps that do not need it, and how to delete a store that only one screen ever read.

Beginnerfundamentals30 min
Lesson 8Open →

Redux Architecture Overview

9

The whole Redux loop on one page - UI, action, dispatch, middleware, reducers, store, selectors - traced step by step through a real click and a real server request. Then how to draw a feature on paper before writing code.

Beginnerfundamentals35 min
Lesson 9Open →

Redux Terminology

10

Every Redux word you will meet in this course - store, action, reducer, dispatch, selector, middleware and more - defined once in simple English, shown working in one runnable script, with the pairs people mix up.

Beginnerfundamentals30 min
Lesson 10Open →
Module 2 of 1810 lessonsComing soon

Redux Fundamentals

The model, before the tooling that hides it

What is Redux?

11

A predictable state container - and what each of those words buys.

Replaying a bug from a recorded action list

Lesson 11planned

Redux Core Principles

12

Single source of truth, read-only state, pure reducers.

Breaking each principle and watching what goes wrong

Lesson 12planned

Store

13

Created once, held at the top, read everywhere.

Creating a store and logging its state

Lesson 13planned

State

14

The shape of the tree, and why it is never mutated in place.

Two slices side by side in one state object

Lesson 14planned

Actions

15

Plain objects describing what happened, not what to change.

Naming after events rather than setters

Lesson 15planned

Reducers

16

Pure functions from state and action to the next state.

A reducer that must not touch the state it was handed

Lesson 16planned

Dispatch

17

The only way in, and what happens on the way through.

Following one dispatch from click to re-render

Lesson 17planned

Selectors

18

The only way out, and why reading through a function matters.

Changing the state shape without touching a component

Lesson 18planned

Redux Data Flow

19

The whole cycle end to end, with nothing skipped.

A counter traced through all five steps

Lesson 19planned

Unidirectional Data Flow

20

Why one direction makes a system you can reason about.

A two-way binding bug that cannot happen here

Lesson 20planned
Module 3 of 1810 lessonsComing soon

Redux Without Redux Toolkit

The long way round, so Toolkit makes sense

Creating a Redux Store

21

createStore by hand, and everything you must supply yourself.

Ten lines before a single feature exists

Lesson 21planned

Creating Actions

22

Type constants and action creators, written out in full.

Three files for one increment

Lesson 22planned

Creating Reducers

23

Switch statements, default cases, and returning new objects.

A spread that has to go three levels deep

Lesson 23planned

Dispatching Actions

24

Wiring dispatch without the React bindings.

store.dispatch from a plain DOM handler

Lesson 24planned

Reading State

25

getState, subscribe, and doing the re-render yourself.

A manual subscription that has to be cleaned up

Lesson 25planned

Combining Reducers

26

combineReducers, and how the state tree gets its shape.

Two reducers becoming two keys

Lesson 26planned

Middleware

27

applyMiddleware, and why async needs it at all.

Adding thunk support by hand

Lesson 27planned

Redux DevTools

28

Wiring the extension manually, and what it shows you.

Time-travelling through a bug

Lesson 28planned

Building a Counter

29

The smallest complete app, with every piece visible.

Increment and decrement, nothing hidden

Lesson 29planned

Building a Todo Store

30

Add, toggle, and remove - and the immutability that costs.

Updating one item in an array without mutating it

Lesson 30planned
Module 4 of 1812 lessonsComing soon

Redux Toolkit

The way Redux is actually written now

Why Redux Toolkit?

31

Module 3 line by line, and what disappears.

The same counter, two thirds shorter

Lesson 31planned

configureStore

32

Store setup, devtools, and the middleware you get for free.

Replacing createStore and four lines of wiring

Lesson 32planned

createSlice

33

Reducers and actions declared together, in one place.

A slice that generates its own action creators

Lesson 33planned

Initial State

34

Shaping it deliberately, and typing it once.

An initial state that makes the loading case obvious

Lesson 34planned

Reducers

35

Case reducers inside a slice, and what they may assume.

Three reducers that stay readable at a glance

Lesson 35planned

Actions

36

Generated creators, their types, and prepare callbacks.

Generating an id inside the action, not the reducer

Lesson 36planned

useSelector

37

A first look at reading from the store in a component.

Rendering the counter value

Lesson 37planned

useDispatch

38

A first look at sending an action from a component.

A button wired to increment

Lesson 38planned

Immer and Immutable Updates

39

Why state.value += 1 is safe here and nowhere else.

The draft, and what it produces when you are done

Lesson 39planned

Multiple Slices

40

Splitting by feature, and keeping slices independent.

Auth, courses, and cart with no shared keys

Lesson 40planned

Store Configuration

41

Middleware, devtools, preloaded state, and enhancers.

Turning off the serializability check, and when that is wrong

Lesson 41planned

Redux Toolkit Project Structure

42

Where slices, selectors, and the store actually live.

app/store.ts and a features folder

Lesson 42planned
Module 5 of 1811 lessonsComing soon

Redux with React

Wiring the store into components

Installing React Redux

43

The bindings package, and what it is responsible for.

What react-redux adds that Redux itself does not

Lesson 43planned

Provider

44

Putting the store in context, once, at the top.

The error you get from a component outside it

Lesson 44planned

useSelector

45

Reading state, and the equality check that decides re-renders.

A selector returning a new object every render

Lesson 45planned

useDispatch

46

Sending actions, and keeping store details out of components.

A button that dispatches and knows nothing else

Lesson 46planned

Connecting Components

47

Which components should touch the store at all.

One container reading, five children taking props

Lesson 47planned

Reading Multiple Values

48

Several selectors against one object selector.

Why one call returning three fields re-renders constantly

Lesson 48planned

Dispatching Payloads

49

Passing data with an action, and where to shape it.

Sending a whole record rather than four arguments

Lesson 49planned

Updating Objects

50

Editing one field of a record inside a slice.

A profile update that keeps the other fields

Lesson 50planned

Updating Arrays

51

Add, remove, and edit in place - safely, via Immer.

Toggling one item in a list of two hundred

Lesson 51planned

Sharing State Between Components

52

Two distant components on one value, with no prop drilling.

A cart badge and the cart page agreeing

Lesson 52planned

Building a React and Redux Application

53

Every piece so far, assembled into something that runs.

A course list with full CRUD

Lesson 53planned
Module 6 of 1810 lessonsComing soon

Redux Actions and Payloads

Designing the messages your app sends itself

What is an Action?

54

A description of something that happened, and nothing more.

userLoggedOut against setUser(null)

Lesson 54planned

Action Creators

55

Functions that build actions, and why you never write the object.

A typo in a string that the creator makes impossible

Lesson 55planned

Payload

56

The convention, and what belongs in it.

One payload field against four loose properties

Lesson 56planned

Multiple Payload Values

57

Passing several things without inventing positional arguments.

An object payload that reads at the call site

Lesson 57planned

Structured Payloads

58

Shaping a payload so the reducer stays simple.

Normalising in the prepare callback, not the reducer

Lesson 58planned

Action Naming

59

domain/eventHappened - past tense, and why it matters.

Renaming a slice worth of setters into events

Lesson 59planned

Action Design Patterns

60

One action many reducers, and when to split instead.

A logout that three slices each respond to

Lesson 60planned

Updating Nested State

61

Reaching into depth safely - and the sign you should flatten.

A four-level update that says normalise me

Lesson 61planned

Handling Collections

62

Add, update, remove, and reorder within a slice.

Four reducers covering a whole list

Lesson 62planned

Practical CRUD Example

63

The full set against one resource, end to end.

A users slice with all four operations

Lesson 63planned
Module 7 of 1810 lessonsComing soon

Selectors

Reading state without coupling to its shape

What is a Selector?

64

A function from state to the piece you want.

Moving state.users.items out of six components

Lesson 64planned

Basic Selectors

65

Writing them, naming them, and where they live.

selectCurrentUser beside the slice that owns it

Lesson 65planned

Reusable Selectors

66

One definition, many call sites - and refactors that stay cheap.

Renaming a state key and changing one line

Lesson 66planned

Derived State

67

Computing rather than storing, and the bugs storing causes.

A total that drifts out of sync with its items

Lesson 67planned

Filtering State

68

Filters and sorts in a selector, not in a component body.

An active-users list computed once

Lesson 68planned

Selecting Nested State

69

Reaching in safely, with defaults for the missing case.

A selector that survives an empty store on first render

Lesson 69planned

Selector Composition

70

Building larger selectors out of smaller ones.

Three primitives combining into one screen selector

Lesson 70planned

Memoized Selectors

71

Why a new array every call causes a re-render, and the fix.

filter() in a selector, before and after memoising

Lesson 71planned

Reselect

72

createSelector, its cache of one, and what invalidates it.

A selector recomputing on every unrelated dispatch

Lesson 72planned

Selector Performance

73

Measuring rather than guessing, and the cost of getting it wrong.

Finding the selector behind forty re-renders

Lesson 73planned
Module 8 of 1812 lessonsComing soon

Async Redux

Requests, and the three states each one has

Why Async State is Different

74

A request is not a value, it is a small state machine.

idle, pending, succeeded, failed - drawn out

Lesson 74planned

Loading State

75

Initial against refetching, and not flashing a spinner.

A skeleton that stays away on a fast response

Lesson 75planned

Success State

76

Storing the result, and clearing what the last attempt left.

A success that forgets to clear the previous error

Lesson 76planned

Error State

77

Where it lives, what to show, and how it gets cleared.

A failed save that leaves the form editable

Lesson 77planned

createAsyncThunk

78

One call generating three actions, and where they are handled.

extraReducers covering all three in one slice

Lesson 78planned

Pending

79

Marking the request in flight, and disabling what must be.

A submit button that cannot fire twice

Lesson 79planned

Fulfilled

80

Writing the payload in, and what else should reset.

Replacing a list against merging into it

Lesson 80planned

Rejected

81

rejectWithValue, and keeping the server message.

A 422 surfacing real field errors rather than "failed"

Lesson 81planned

API Integration

82

Keeping fetch out of slices, behind a service layer.

Swapping the HTTP client without touching a reducer

Lesson 82planned

Error Handling

83

Network against HTTP against validation, and what each shows.

Three failures, three different screens

Lesson 83planned

Request Parameters

84

Arguments into a thunk, and reading state inside one.

A paginated fetch that knows the current page

Lesson 84planned

Authentication Requests

85

Login, token storage, and rehydrating on reload.

Staying logged in across a refresh

Lesson 85planned
Module 9 of 189 lessonsComing soon

Redux Middleware

The seam every action passes through

What is Middleware?

86

Where it sits, what it sees, and what it may do.

The store, next, action signature explained once

Lesson 86planned

Redux Middleware Pipeline

87

Order, next(), and what happens if you forget to call it.

An action that silently never reaches a reducer

Lesson 87planned

Built-in Middleware

88

What Toolkit turns on, and the warnings it produces.

The non-serializable value warning, and what it is protecting

Lesson 88planned

Custom Middleware

89

Writing one properly, and when a thunk is the better answer.

Six lines that log every action

Lesson 89planned

Logging Middleware

90

Before and after state, grouped readably.

A log you can actually scan during a bug hunt

Lesson 90planned

Async Middleware

91

How thunk works underneath, written from scratch.

Twelve lines that explain the whole trick

Lesson 91planned

Error Middleware

92

Catching rejected actions in one place and reporting them.

Every failed thunk reaching the logger automatically

Lesson 92planned

Authentication Middleware

93

Reacting to a 401 centrally rather than in every thunk.

One expired token logging the user out everywhere

Lesson 93planned

Middleware Best Practices

94

Keeping it thin, ordered, and testable.

A middleware that grew into business logic

Lesson 94planned
Module 10 of 1816 lessonsComing soon

RTK Query

Treating the server as a cache, not as state you own

What is RTK Query?

95

A cache with hooks, built on the store you already have.

Where the cache actually lives in state

Lesson 95planned

Why RTK Query?

96

What it replaces - a slice, a thunk, and three loading flags.

Deleting an entire async slice

Lesson 96planned

API Slice

97

One slice per API, and where it is registered.

Adding the reducer and middleware in configureStore

Lesson 97planned

createApi

98

Endpoints, generated hooks, and the shape of the definition.

Four endpoints and eight hooks from one object

Lesson 98planned

fetchBaseQuery

99

Base URL, headers, and attaching auth in one place.

Reading the token from state for every request

Lesson 99planned

Queries

100

Defining reads, and the arguments that key them.

A course list with no reducer written at all

Lesson 100planned

Mutations

101

Writes, their lifecycle, and what happens after they land.

Creating a course and seeing the list update itself

Lesson 101planned

Query Hooks

102

The generated hook return shape, read properly.

isLoading against isFetching, and when each is true

Lesson 102planned

Loading States

103

First load, refetch, and keeping previous data on screen.

Paging without the table collapsing between pages

Lesson 103planned

Error States

104

The error shape, narrowing it, and retrying.

Distinguishing a network failure from a 404

Lesson 104planned

Caching

105

Cache keys, lifetimes, and what a cache hit looks like.

Navigating back to a screen that renders instantly

Lesson 105planned

Cache Invalidation

106

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

Refreshing one list without refetching the whole app

Lesson 106planned

Tags

107

providesTags and invalidatesTags, including per-id tags.

Editing one user refreshing only that user

Lesson 107planned

Optimistic Updates

108

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

A toggle that reverts when the request fails

Lesson 108planned

Polling

109

Refetching on an interval, and turning it off when hidden.

A dashboard that stops polling in a background tab

Lesson 109planned

Pagination

110

Page and cursor strategies, and merging pages.

Infinite scroll without losing what is already loaded

Lesson 110planned
Module 11 of 1811 lessonsComing soon

Redux Authentication

Who the user is, held in one place

Authentication State

111

What belongs in the auth slice, and what does not.

A slice with three fields rather than eleven

Lesson 111planned

Login

112

The thunk, the pending UI, and what lands in state.

A login form wired to a real endpoint

Lesson 112planned

Logout

113

Clearing slices, clearing the RTK Query cache, ending the session.

Logging out without leaving the previous user cached

Lesson 113planned

Current User

114

One selector the whole app reads the user through.

selectCurrentUser used in nine components

Lesson 114planned

Access Token

115

Where to keep it, and attaching it to every request once.

prepareHeaders reading straight from state

Lesson 115planned

Refresh Token

116

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

Three requests hitting a 401 and one refresh going out

Lesson 116planned

Authentication Persistence

117

Surviving a reload without trusting what you stored.

Rehydrating, then verifying against the server

Lesson 117planned

Protected Routes

118

Gating screens on auth state, and the flash before it is known.

Rendering nothing until the session resolves

Lesson 118planned

Role-Based Access

119

Roles in state for UX, enforced on the server for safety.

An admin route hidden and still checked

Lesson 119planned

Permission-Based UI

120

Finer-grained than roles, kept readable with a selector.

A can() selector used across a toolbar

Lesson 120planned

Handling Expired Sessions

121

Detecting expiry, telling the user, and not losing their work.

An expired token mid-form, handled gracefully

Lesson 121planned
Module 12 of 1810 lessonsComing soon

Redux State Architecture

Shaping state so reading it stays cheap

Designing Redux State

122

Flat, minimal, and shaped for reads - with the trade-offs named.

Sketching a store before writing a slice

Lesson 122planned

Feature-Based State

123

One slice per feature, with boundaries you can point at.

A store whose keys match the features folder

Lesson 123planned

Normalized State

124

Storing by id instead of in nested arrays.

Updating one user that appears in four lists

Lesson 124planned

Nested State

125

When nesting is fine, and the depth at which it stops being.

A four-level spread as the signal to flatten

Lesson 125planned

Entity State

126

The ids-and-entities shape, and why it is the default.

Reordering a list by touching only the ids array

Lesson 126planned

createEntityAdapter

127

The reducers and selectors it hands you for free.

Replacing forty lines of id bookkeeping

Lesson 127planned

State Ownership

128

Exactly one slice owns each piece of data.

Two slices both storing the current user

Lesson 128planned

Avoiding Duplicate State

129

The copies that drift, and how to spot them early.

A count stored beside the list it counts

Lesson 129planned

Derived State

130

Computing at read time rather than storing another copy.

Deleting a field and adding a selector

Lesson 130planned

State Shape Best Practices

131

The rules worth writing down for a team.

A one-page convention the whole repo follows

Lesson 131planned
Module 13 of 1810 lessonsComing soon

Advanced Redux Patterns

Composition, and codebases that keep growing

Feature Slices

132

A slice as a feature boundary, not just a state key.

Moving one feature out without touching the others

Lesson 132planned

Slice Composition

133

Building larger behaviour from smaller slices.

Two slices that stay independent but cooperate

Lesson 133planned

Reusable Reducers

134

Factories for the shapes you write over and over.

One paginated-list reducer used by three features

Lesson 134planned

Reusable Selectors

135

Parameterised selectors, and the memoisation trap in them.

Why one memoised selector per component instance is needed

Lesson 135planned

Dynamic Reducers

136

Injecting reducers after the store exists.

A reducer registered when a route loads

Lesson 136planned

Code Splitting Redux

137

Keeping feature code out of the initial bundle.

An admin slice that only admins download

Lesson 137planned

Lazy-loaded Redux Features

138

Loading slice, API, and UI together as one unit.

A feature that arrives complete or not at all

Lesson 138planned

Cross-slice Communication

139

One action, several slices - without importing each other.

A logout three slices each respond to

Lesson 139planned

Advanced Middleware Patterns

140

Listener middleware, and reacting to state rather than actions.

Saving a draft whenever the form settles

Lesson 140planned

Large Application Architecture

141

Conventions that survive fifty slices and several teams.

A structure that still makes sense two years in

Lesson 141planned
Module 14 of 1810 lessonsComing soon

Redux Performance

Where the cost is, measured rather than guessed

Understanding Redux Re-renders

142

What actually triggers a component to run again.

Counting renders before changing a line

Lesson 142planned

Selector Performance

143

Reference equality, and the new object that defeats it.

A selector returning a fresh array every call

Lesson 143planned

Memoized Selectors

144

Where memoisation helps, and where it only adds cost.

Measuring before and after, honestly

Lesson 144planned

createSelector

145

Its cache of one, and what silently invalidates it.

A shared selector thrashing between two components

Lesson 145planned

Avoiding Unnecessary Updates

146

Selecting narrowly, and shallow equality where it fits.

One component subscribing to the whole store

Lesson 146planned

Normalized State

147

Why the shape itself is a performance decision.

An update touching one entity instead of a whole array

Lesson 147planned

Large Collections

148

Thousands of rows in the store, and rendering few of them.

Virtualising a list backed by entity state

Lesson 148planned

Redux DevTools Performance

149

What the extension costs, and turning it off in production.

A profile that was really measuring devtools

Lesson 149planned

RTK Query Caching

150

Cache lifetimes as a performance lever.

Tuning keepUnusedDataFor for a tabbed screen

Lesson 150planned

Performance Best Practices

151

The short list that accounts for most real wins.

A checklist applied to a slow dashboard

Lesson 151planned
Module 15 of 1810 lessonsComing soon

Redux Testing

The part of an app that is genuinely easy to test

Testing Redux

152

What is worth testing here, and what is not.

Deleting a test that only restated the reducer

Lesson 152planned

Testing Reducers

153

Pure functions in, pure functions out - no mocks needed.

Six assertions covering a whole slice

Lesson 153planned

Testing Actions

154

Creators and prepare callbacks, where they hold logic.

Testing the id generation inside prepare

Lesson 154planned

Testing Selectors

155

Derived output, including the memoised path.

Proving a selector does not recompute

Lesson 155planned

Testing Async Thunks

156

All three outcomes, against a mocked network.

Pending, fulfilled, and rejected each asserted

Lesson 156planned

Testing RTK Query

157

MSW at the boundary, and asserting on cache behaviour.

A test that survives changing the endpoint

Lesson 157planned

Testing Redux and React

158

Rendering with a real store and driving it through the UI.

A helper that wraps render in a Provider

Lesson 158planned

Mocking API Calls

159

Mocking the network, not your own modules.

One handler serving every test in the file

Lesson 159planned

Integration Testing

160

Several slices and components together, where bugs live.

Login, fetch, and render in one test

Lesson 160planned

Test Architecture

161

Factories, fixtures, and tests that survive refactors.

A store factory used by the whole suite

Lesson 161planned
Module 16 of 1810 lessonsComing soon

Production Redux Architecture

What it takes to run this in front of real users

Redux Project Structure

162

Where the store, slices, selectors, and API layer live.

app/, features/, services/ - and why

Lesson 162planned

Feature-Based Architecture

163

Grouping by what it does, with boundaries you can enforce.

An import lint rule that keeps features apart

Lesson 163planned

API Layer

164

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

Changing the base URL in exactly one file

Lesson 164planned

Authentication Architecture

165

Slice, middleware, and API working as one design.

The whole auth path drawn on one page

Lesson 165planned

Error Handling

166

One strategy across thunks, queries, and boundaries.

Every failure path in the app, mapped

Lesson 166planned

Logging

167

What to record, what to redact, and where it goes.

An action log that does not leak a token

Lesson 167planned

Persistence

168

Persisting selectively, and migrating a stored shape.

A release that changes state shape without breaking users

Lesson 168planned

Environment Configuration

169

Per-environment values, kept out of the bundle where they must be.

One build promoted through three environments

Lesson 169planned

Security Considerations

170

Tokens in state, devtools in production, and what is visible.

Finding the access token in a devtools export

Lesson 170planned

Production Best Practices

171

The decisions worth making before launch, not after.

A pre-launch review of a real store

Lesson 171planned
Module 17 of 188 lessonsComing soon

Real-World Redux Project

Admin management platform, built end to end

Project Setup and Architecture

172

React, TypeScript, Redux Toolkit, RTK Query, Router, Hook Form, Zod.

The folder structure agreed before any feature

Lesson 172planned

Authentication

173

Login, tokens, persistence, and protected routes.

A session that survives a reload

Lesson 173planned

Dashboard

174

Several queries on one screen, loading independently.

Four widgets that do not block each other

Lesson 174planned

Users

175

An entity-adapter list with detail and edit.

Editing a user visible in three places at once

Lesson 175planned

Roles and Permissions

176

Modelling them in state, and gating the UI from selectors.

A toolbar that changes per role

Lesson 176planned

Products

177

A second resource, sharing the patterns of the first.

The users feature copied and adapted in an hour

Lesson 177planned

Search, Filters, and Pagination

178

Query state in the URL, cached per combination.

A filtered page you can share as a link

Lesson 178planned

CRUD and Finishing

179

Optimistic writes, invalidation, and a final review.

Delete that rolls back when the server refuses

Lesson 179planned
Module 18 of 188 lessonsComing soon

Capstone Project

A multi-tenant learning platform

Capstone Architecture

180

Planning the slices and the API surface for a real product.

The store diagram before the first commit

Lesson 180planned

Authentication and Current User

181

Sign-in, session, and the user every screen reads.

One selector behind the whole app shell

Lesson 181planned

Tenancy

182

Tenant selection, and scoping every request to it.

Switching tenant and watching the cache clear

Lesson 182planned

Permissions

183

Per-tenant roles, and UI that follows them.

The same user seeing two different apps

Lesson 183planned

Courses, Modules, and Lessons

184

A three-level hierarchy, normalized rather than nested.

Loading one lesson without fetching the whole course

Lesson 184planned

Enrollment and Progress

185

Writes that must feel instant, and reconcile correctly.

Marking a lesson complete offline and syncing later

Lesson 185planned

Notifications and UI State

186

The genuinely client-side state, kept separate from server data.

A toast queue that is nobody else business

Lesson 186planned

Final Build and Review

187

Assembled, tested, and reviewed against the original plan.

The finished app, and what you would change next time

Lesson 187planned