Learn React in 30 Days: A Comprehensive Course
Learn React in 30 Days: From Zero to Production
React is the world's most popular JavaScript library for building user interfaces, maintained by Meta (formerly Facebook). With over 23 million weekly downloads on npm and powering applications from Netflix to Airbnb, React has become an essential skill for modern web developers. This 30-day immersive course transforms beginners into confident React developers through a structured, project-driven curriculum.
React uses a declarative paradigm, making it fundamentally different from traditional DOM manipulation with vanilla JavaScript or jQuery. Instead of imperatively writing step-by-step instructions to update the page, you declare the desired UI state, and React efficiently computes the minimal set of DOM changes needed.
The React ecosystem has evolved dramatically since its introduction in 2013. Modern React revolves around functional components with Hooks (introduced in React 16.8), JSX, and a rich ecosystem of tools including Vite, Next.js, Redux Toolkit, and React Query. In 2024 and beyond, the recommended way to build React applications uses Vite as the build tool (replacing the now-deprecated Create React App), with React 19 bringing server components, actions, and improved performance.
Footnotes
-
How To Learn React In 2024 - React Roadmap - PedroTech's comprehensive React roadmap for 2024 covering fundamentals to ecosystem tools. ↩
-
A Definitive Guide to React Architecture Patterns - eTatvaSoft's guide on React architecture patterns and best practices since React's 2013 introduction. ↩
-
The Most Popular Build Tools for React Developers in 2024 - Telerik article covering Vite, Turbopack, Rollup, and other modern React build tools. ↩
React 19 Full Course 2025 – Build an App and Master React in 2 Hours
The 30-Day Roadmap at a Glance
This course is organized into four progressive phases, each building on the last. The repository 30 Days of React by Asabeneh provides an excellent companion structure covering 30 distinct topics from setup through advanced patterns to final projects.
| Phase | Days | Focus | Key Deliverable |
|---|---|---|---|
| Phase 1 | 1–7 | Foundations | JavaScript refresher, JSX, Components, Props |
| Phase 2 | 8–14 | Core React | State, Events, Forms, Conditional Rendering, Lists & Keys |
| Phase 3 | 15–22 | Hooks & Patterns | useEffect, useReducer, useRef, Custom Hooks, Context API |
| Phase 4 | 23–30 | Ecosystem & Projects | Routing, Data Fetching, Redux, Testing, Capstone Project |
Each day requires approximately 1.5–3 hours of focused study combining theory, coding exercises, and mini-projects. By Day 30, you will have built multiple real applications and possess the skills to confidently develop production-grade React apps.
Footnotes
-
30-Days-Of-React by Asabeneh - A step-by-step 30-day React challenge covering setup through advanced hooks and projects. ↩
30-Day React Learning Journey
JavaScript Refresher & Setup
Day 1Review ES6+ features (arrow functions, destructuring, spread/rest, modules, promises). Install Node.js, configure VS Code, and create your first Vite + React project."
JSX & React Elements
Day 2–3Learn JSX syntax, expressions, conditional rendering in JSX, JSX vs HTML differences, and the Virtual DOM reconciliation process."
Components & Props
Day 4–5Build functional components, understand props, prop types, default props, children prop, and component composition patterns."
Lists, Keys & Mini Project
Day 6–7Render lists with .map(), understand why keys matter, build a Todo List mini-app as your first complete React project."
State Management with useState
Day 8–9Master the useState hook: state updates, batching, prevState callback pattern, and lifting state up to parent components."
Events & Forms
Day 10–11Handle onClick, onChange, onSubmit events. Build controlled components, form validation, and multi-field form patterns."
Conditional Rendering & Styling
Day 12–13Implement conditional UI with ternary operators, &&, and enum patterns. Apply CSS Modules, inline styles, and styled-components."
Week 2 Project
Day 14Build a Task Manager app combining state, events, forms, conditional rendering, and styling."
Side Effects & useEffect
Day 15–17Master useEffect: mount/update/unmount lifecycle, dependency arrays, cleanup functions, and common pitfalls (infinite loops, stale closures)."
useReducer & useRef
Day 18–19Manage complex state with useReducer, access DOM elements with useRef, understand when to choose useReducer over useState."
Custom Hooks
Day 20–21Extract reusable logic into custom hooks. Build useFetch, useLocalStorage, useDebounce, and understand hook composition patterns."
Context API
Day 22Implement global state with React.createContext, Provider/consumer pattern, and understand when Context is appropriate vs Redux."
React Router & Navigation
Day 23–24Set up React Router v6+, define routes, nested routes, dynamic parameters, programmatic navigation, and route guards."
Data Fetching & Async Patterns
Day 25–26Fetch data from REST APIs, integrate React Query (TanStack Query) for caching and synchronization, handle loading/error states."
Redux Toolkit & Advanced State
Day 27–28Set up Redux Toolkit with createSlice, configure store, write reducers and actions, integrate RTK Query for API calls."
Testing & Optimization
Day 29Write unit tests with Vitest/Testing Library, implement React.memo, useMemo, useCallback for performance optimization."
Capstone Project & Review
Day 30Build a full-stack capable React application incorporating routing, global state, API integration, testing, and deployment."
Phase 1: Foundations (Days 1–7)
Day 1: JavaScript Refresher & Environment Setup
Before touching React, ensure your JavaScript fundamentals are solid. React heavily relies on ES6+ features, and gaps in JavaScript knowledge will become painful obstacles. The key prerequisites include:
- Arrow functions:
const greet = (name) => \Hello, ${name}!`` - Destructuring:
const { name, age } = person;andconst [first, second] = array; - Spread/Rest operators:
const newObj = { ...oldObj, updated: true }; - Template literals:
`Result: ${value}` - Array methods:
.map(),.filter(),.reduce(),.find(),.some() - Promises & async/await: Handling asynchronous operations
- ES Modules:
importandexportsyntax
For your development environment, install Node.js (v18+ LTS), VS Code with the ES7+ React/Redux/React Native snippets extension, and create your first React project using Vite:
1npm create vite@latest my-react-app -- --template react 2cd my-react-app 3npm install 4npm run dev
Vite has become the standard build tool for new React projects in 2024, replacing the deprecated Create React App. It offers significantly faster hot module replacement (HMR) and optimized builds using Rollup.
Days 2–3: JSX & the Virtual DOM
JSX is not a template language — it is syntactic sugar for React.createElement() calls. Understanding this distinction is crucial:
1// JSX syntax 2const element = <h1 className="title">Hello, React!</h1>; 3 4// Compiles to: 5const element = React.createElement('h1', { className: 'title' }, 'Hello, React!');
Key JSX rules:
- You must return a single parent element (or use a Fragment
<>...</>) - All tags must be properly closed (
<img />,<br />) - Use
classNameinstead ofclass,htmlForinstead offor - JavaScript expressions go inside
{ }braces - Conditional rendering uses ternary operators or
&&inside JSX
The Virtual DOM is React's secret to performance. When state changes, React creates a new Virtual DOM tree, diffs it against the previous one, and computes the minimal set of real DOM changes needed — a process called reconciliation.
Footnotes
-
30-Days-Of-React by Asabeneh - A step-by-step 30-day React challenge covering setup through advanced hooks and projects. ↩
-
5 React Architecture Best Practices for 2024 - SitePoint's guide on scalable project structures and component organization. ↩
Common JSX Pitfall
JSX does NOT support if/else statements directly inside { }. Use ternary operators (condition ? a : b) or the logical AND pattern (condition && element). For complex conditions, compute the value in a variable above the return statement, then reference it in JSX.
Pro Tip: React DevTools
Install the React Developer Tools browser extension (Chrome/Firefox). It lets you inspect the component tree, view props and state in real-time, and profile rendering performance. It is indispensable for debugging and understanding how React renders your application.
Building Your First React Component
- 1Step 1
In
src/App.jsx, define a function that returns JSX. React functional components are plain JavaScript functions that return React elements:1function Greeting() { 2 return <h1>Hello, World!</h1>; 3} - 2Step 2
Make the component dynamic by accepting
props— the mechanism for passing data from parent to child:1function Greeting({ name }) { 2 return <h1>Hello, {name}!</h1>; 3} - 3Step 3
Add interactivity using the
useStatehook. State represents data that changes over time and triggers re-renders:1import { useState } from 'react'; 2 3function Counter() { 4 const [count, setCount] = useState(0); 5 return ( 6 <div> 7 <p>Count: {count}</p> 8 <button onClick={() => setCount(c => c + 1)}>+1</button> 9 </div> 10 ); 11} - 4Step 4
Build complex UIs by nesting components. This is the foundation of React's compositional model:
1function App() { 2 return ( 3 <div> 4 <Greeting name="Alice" /> 5 <Greeting name="Bob" /> 6 <Counter /> 7 </div> 8 ); 9} - 5Step 5
In
src/main.jsx, mount the root component usingcreateRoot:1import { StrictMode } from 'react'; 2import { createRoot } from 'react-dom/client'; 3import App from './App'; 4 5createRoot(document.getElementById('root')).render( 6 <StrictMode><App /></StrictMode> 7);
Phase 2: Core React (Days 8–14)
Days 8–9: Mastering State with useState
State is the heart of React's reactivity system. The useState hook provides a way to declare reactive variables in functional components:
1const [state, setState] = useState(initialValue);
Critical concepts to master:
-
State updates are asynchronous — React batches updates for performance. You cannot read the updated value immediately after calling
setState. -
Use the functional updater form when the new state depends on the previous state:
1// ❌ Can cause stale state bugs in rapid updates 2setCount(count + 1); 3 4// ✅ Always uses the latest state value 5setCount(prevCount => prevCount + 1);
-
State is isolated per component instance — each component has its own independent state.
-
Lifting state up — when two sibling components need to share data, move the state to their nearest common parent and pass it down via props.
Days 10–11: Event Handling & Forms
React uses synthetic events to ensure consistent event handling across all browsers. Key patterns:
1// Event handler inline 2<button onClick={() => handleClick(id)}>Delete</button> 3 4// Event handler reference 5<button onClick={handleClick}>Click Me</button> 6 7// Accessing event object 8<input onChange={(e) => setValue(e.target.value)} />
Controlled components are the React way to handle forms. The component's state becomes the "single source of truth":
1function Form() { 2 const [email, setEmail] = useState(''); 3 const [password, setPassword] = useState(''); 4 5 const handleSubmit = (e) => { 6 e.preventDefault(); 7 console.log({ email, password }); 8 }; 9 10 return ( 11 <form onSubmit={handleSubmit}> 12 <input value={email} onChange={(e) => setEmail(e.target.value)} /> 13 <input type="password" value={password} onChange={(e) => setPassword(e.target.value)} /> 14 <button type="submit">Submit</button> 15 </form> 16 ); 17}
Days 12–13: Conditional Rendering & Styling
React offers multiple patterns for rendering different UI based on conditions:
| Pattern | Syntax | Best For |
|---|---|---|
| Ternary | {condition ? <A /> : <B />} | Either/or rendering |
| Logical AND | {condition && <A />} | Show/hide single element |
| Early return | if (!data) return <Loading /> | Guard clauses |
| Enum/switch | {statusMap[status]} | Multiple mutually exclusive states |
| IIFE | {(() => { if... })()} | Complex multi-branch logic |
For styling, modern React supports CSS Modules (scoped class names), inline styles (for dynamic styles), and CSS-in-JS libraries like styled-components or emotion. CSS Modules are often the simplest and most performant choice for new projects.
Day 14: Week 2 Project — Task Manager
Build a Task Manager application that integrates everything from Phase 2:
- Add, delete, and toggle tasks
- Filter by status (all/active/completed)
- Controlled form inputs with validation
- Conditional rendering for empty states and filters
- CSS Modules for scoped styling
Footnotes
-
State Management in React – Hooks, Context API and Redux - GeeksforGeeks comprehensive guide on useState, useReducer, and Context API. ↩
30-Day Course: Hours Per Week by Activity
Recommended time allocation across the four weeks
Phase 3: Hooks & Patterns (Days 15–22)
Days 15–17: Side Effects & useEffect
useEffect is the second most important hook after useState. It handles all "side effects" — operations that reach outside the React render cycle:
1useEffect(() => { 2 // Effect: runs after render 3 const subscription = subscribe(); 4 5 // Cleanup: runs before next effect & on unmount 6 return () => subscription.unsubscribe(); 7}, [dependency]); // Only re-run when dependency changes
The dependency array is the most critical (and error-prone) aspect of useEffect:
| Dependency Array | Behavior |
|---|---|
| No array | Runs after every render — rarely what you want |
[] (empty array) | Runs once on mount — for initial setup |
[dep1, dep2] | Runs on mount + whenever dep1 or dep2 change |
Common pitfalls and how to avoid them:
- Infinite loop: Calling
setStateinside an effect with no dependency array - Stale closure: Referencing a state variable in an effect without including it in the dependency array
- Missing cleanup: Forgetting to return a cleanup function for subscriptions, timers, and event listeners
- Over-fetching: Fetching data on every render instead of only on mount
Infinite Loop Trap
If your useEffect calls a state setter and the changed state is referenced in the same effect without a proper dependency array, you create an infinite render loop: render → effect → setState → re-render → effect → setState → .... Always verify your dependency array. Use eslint-plugin-react-hooks to catch these errors automatically.
Days 18–19: useReducer & useRef
useReducer is preferred when state transitions are complex or when the next state depends heavily on the previous one:
1const initialState = { count: 0, step: 1 }; 2 3function reducer(state, action) { 4 switch (action.type) { 5 case 'increment': return { ...state, count: state.count + state.step }; 6 case 'decrement': return { ...state, count: state.count - state.step }; 7 case 'setStep': return { ...state, step: action.payload }; 8 case 'reset': return initialState; 9 default: throw new Error(`Unknown action: ${action.type}`); 10 } 11} 12 13function Counter() { 14 const [state, dispatch] = useReducer(reducer, initialState); 15 return ( 16 <div> 17 <p>Count: {state.count}</p> 18 <button onClick={() => dispatch({ type: 'increment' })}>+</button> 19 <button onClick={() => dispatch({ type: 'decrement' })}>-</button> 20 </div> 21 ); 22}
useRef serves two primary purposes:
- Accessing DOM elements:
const inputRef = useRef(null); <input ref={inputRef} /> - Storing mutable values that persist across renders but should NOT trigger re-renders (e.g., previous values, timer IDs, measurement values)
Days 20–21: Custom Hooks
Custom hooks are the primary mechanism for code reuse in React. The convention is to name them starting with use:
1// Custom hook: fetches data from an API 2function useFetch(url) { 3 const [data, setData] = useState(null); 4 const [loading, setLoading] = useState(true); 5 const [error, setError] = useState(null); 6 7 useEffect(() => { 8 const controller = new AbortController(); 9 setLoading(true); 10 fetch(url, { signal: controller.signal }) 11 .then(res => { 12 if (!res.ok) throw new Error(`HTTP ${res.status}`); 13 return res.json(); 14 }) 15 .then(setData) 16 .catch(err => { 17 if (err.name !== 'AbortError') setError(err.message); 18 }) 19 .finally(() => setLoading(false)); 20 21 return () => controller.abort(); 22 }, [url]); 23 24 return { data, loading, error }; 25} 26 27// Usage 28function UserProfile({ userId }) { 29 const { data, loading, error } = useFetch(`/api/users/${userId}`); 30 if (loading) return <Spinner />; 31 if (error) return <Error message={error} />; 32 return <UserCard user={data} />; 33}
Day 22: Context API
The Context API solves "prop drilling" — the problem of passing props through many intermediate components that don't use them:
1// 1. Create context 2const ThemeContext = createContext('light'); 3 4// 2. Provide value at tree root 5function App() { 6 return ( 7 <ThemeContext.Provider value="dark"> 8 <Dashboard /> 9 </ThemeContext.Provider> 10 ); 11} 12 13// 3. Consume in any descendant 14function ThemedButton() { 15 const theme = useContext(ThemeContext); 16 return <button className={`btn-${theme}`}>Click Me</button>; 17}
When to use Context vs Redux: Use Context for "low-frequency" updates (theme, auth, locale). For high-frequency updates or complex state interactions, use Redux Toolkit or Zustand, as Context triggers re-renders on all consumers when the value changes.
Footnotes
-
State Management in React – Hooks, Context API and Redux - GeeksforGeeks comprehensive guide on useState, useReducer, and Context API. ↩
-
Why You Should Use Redux in 2024 - Mark Erikson's talk on Redux evolution, RTK, and when Redux vs alternatives are appropriate. ↩
1// Simple, local state 2const [isOpen, setIsOpen] = useState(false); 3 4✅ Best for: 5- Simple values (booleans, strings, numbers) 6- Independent state slices 7- UI toggles and form inputs 8 9❌ Avoid when: 10- State transitions are complex 11- Next state depends heavily on previous 12- Multiple related values must update together
Phase 4: Ecosystem & Projects (Days 23–30)
Days 23–24: React Router
React Router v6+ provides a declarative, component-based routing system:
1import { BrowserRouter, Routes, Route, Link, useParams } from 'react-router-dom'; 2 3function App() { 4 return ( 5 <BrowserRouter> 6 <nav> 7 <Link to="/">Home</Link> 8 <Link to="/about">About</Link> 9 <Link to="/users/42">Profile</Link> 10 </nav> 11 <Routes> 12 <Route path="/" element={<Home />} /> 13 <Route path="/about" element={<About />} /> 14 <Route path="/users/:id" element={<UserProfile />} /> 15 <Route path="*" element={<NotFound />} /> 16 </Routes> 17 </BrowserRouter> 18 ); 19} 20 21function UserProfile() { 22 const { id } = useParams(); 23 return <h1>User {id}</h1>; 24}
Key React Router v6 concepts:
<Routes>and<Route>for declarative route definitionuseParams()for accessing URL parametersuseNavigate()for programmatic navigation- Nested routes with
<Outlet />for layout patterns <NavLink>for active link styling
Days 25–26: Data Fetching & React Query
While you can fetch data with useEffect, the modern approach uses TanStack Query (React Query), which provides automatic caching, background refetching, pagination, and optimistic updates:
1import { useQuery, QueryClient, QueryClientProvider } from '@tanstack/react-query'; 2 3const queryClient = new QueryClient(); 4 5function UsersList() { 6 const { data, isLoading, error, isError } = useQuery({ 7 queryKey: ['users'], 8 queryFn: () => fetch('/api/users').then(res => res.json()), 9 staleTime: 5 * 60 * 1000, // 5 minutes 10 }); 11 12 if (isLoading) return <Spinner />; 13 if (isError) return <Error message={error.message} />; 14 return <UserList users={data} />; 15}
Why React Query over useEffect + useState?
- Automatic caching and deduplication of requests
- Background refetching to keep data fresh
- Built-in loading, error, and stale states
- Pagination and infinite scroll support
- Optimistic updates for instant UI feedback
- Offline support and retry logic
Days 27–28: Redux Toolkit
Redux Toolkit (RTK) has resolved the historical boilerplate problems of Redux with createSlice, createAsyncThunk, and createApi:
1import { createSlice, configureStore, createAsyncThunk } from '@reduxjs/toolkit'; 2 3// Async thunk 4const fetchUsers = createAsyncThunk('users/fetch', async () => { 5 const res = await fetch('/api/users'); 6 return res.json(); 7}); 8 9// Slice with reducers 10const usersSlice = createSlice({ 11 name: 'users', 12 initialState: { list: [], status: 'idle', error: null }, 13 reducers: { 14 addUser(state, action) { state.list.push(action.payload); }, 15 }, 16 extraReducers: (builder) => { 17 builder 18 .addCase(fetchUsers.pending, (state) => { state.status = 'loading'; }) 19 .addCase(fetchUsers.fulfilled, (state, action) => { 20 state.status = 'succeeded'; 21 state.list = action.payload; 22 }) 23 .addCase(fetchUsers.rejected, (state, action) => { 24 state.status = 'failed'; 25 state.error = action.error.message; 26 }); 27 }, 28}); 29 30// Store 31const store = configureStore({ reducer: { users: usersSlice.reducer } });
Day 29: Testing & Performance Optimization
Testing Stack: Use Vitest (test runner) + React Testing Library + jsdom for unit and integration tests:
1// Counter.test.jsx 2import { render, screen, fireEvent } from '@testing-library/react'; 3import { describe, it, expect } from 'vitest'; 4import Counter from './Counter'; 5 6describe('Counter', () => { 7 it('increments count on button click', () => { 8 render(<Counter />); 9 const button = screen.getByRole('button', { name: /\+1/i }); 10 fireEvent.click(button); 11 expect(screen.getByText('Count: 1')).toBeInTheDocument(); 12 }); 13});
Performance optimization techniques:
| Technique | Hook/API | Purpose |
|---|---|---|
React.memo | Wrapper function | Prevent re-renders when props unchanged |
useMemo | Hook | Memoize expensive computations |
useCallback | Hook | Stable function references for child props |
| Code splitting | React.lazy + Suspense | Load components on demand |
| Virtualization | react-window | Render only visible list items |
Day 30: Capstone Project
Build a full-featured Project Management Dashboard incorporating:
- React Router for multi-page navigation
- Redux Toolkit for global state
- React Query for API data fetching
- Custom hooks for reusable logic
- Form handling with validation
- Responsive CSS Modules styling
- Unit testing with Vitest
- Deploy to Vercel or Netlify
Footnotes
-
Why You Should Use Redux in 2024 - Mark Erikson's talk on Redux evolution, RTK, and when Redux vs alternatives are appropriate. ↩ ↩2
Project Setup & Architecture Best Practices
- 1Step 1
Create a new React project using Vite for fast development builds:
1npm create vite@latest my-app -- --template react 2cd my-app && npm installVite provides instant server start, lightning-fast HMR, and optimized production builds using Rollup.
- 2Step 2
Implement a scalable folder structure following community best practices:
src/ ├── components/ # Reusable UI components ├── pages/ # Route-level components ├── hooks/ # Custom hooks ├── context/ # React Context providers ├── services/ # API calls and external integrations ├── utils/ # Helper functions and utilities ├── assets/ # Images, fonts, global styles └── App.jsx # Root component
Footnotes
-
Roadmap for React JS 2024 - DEV Community roadmap covering fundamentals, advanced topics, and ecosystem tools. ↩
-
- 3Step 3
In
vite.config.js, set up path aliases to avoid messy relative imports:1import { defineConfig } from 'vite'; 2import path from 'path'; 3 4export default defineConfig({ 5 resolve: { 6 alias: { '@': path.resolve(__dirname, './src') }, 7 }, 8});Now use
import Component from '@/components/Component'instead of../../../components/Component. - 4Step 4
Add the core libraries you'll need throughout the course:
1npm install react-router-dom @reduxjs/toolkit react-redux 2npm install @tanstack/react-query axios 3npm install -D vitest @testing-library/react @testing-library/jest-dom jsdom - 5Step 5
Configure ESLint with React hooks plugin to catch bugs early:
1npm install -D eslint-plugin-react-hooks eslint-config-prettierEnable the
react-hooks/exhaustive-depsrule — it will save you from countlessuseEffectdependency bugs. - 6Step 6
Initialize version control and push to GitHub. This establishes the habit of committing frequently as you progress through the 30 days:
1git init && git add . && git commit -m 'Initial Vite + React setup' 2gh repo create --source=. --public --push
Skill Proficiency by Day 30
Expected skill levels after completing the full 30-day program
Common Questions & Edge Cases
Knowledge Check
Which hook is used to manage simple, local state in a React functional component?
Explore Related Topics
React Hooks in Depth
This course explains React Hooks, the functional alternative to class components, covering core hooks, usage rules, performance optimizations, and how to create custom hooks.
useStateanduseEffectreplace class state and lifecycle methods; the dependency array controls when effects run.- Hooks must be called at the top level of React function components or custom hooks, and the ESLint plugin enforces these rules.
useMemomemoizes values anduseCallbackmemoizes functions, both improving performance for expensive calculations or stable callbacks.useReduceris preferred for complex state logic, following a reducer pattern similar to Redux.- Building a custom hook involves extracting reusable
useState/useEffectlogic into a function whose name starts with “use”.
Learn SQL in 30 Days: From Zero to Query Master
SQL (Structured Query Language) is the standard language for creating, managing, updating, and retrieving data from relational databases such as MySQL, PostgreSQL, SQL Server, and Oracle. It is widely used across industries — from software engineering to data analytics — making it one of the most in
Learn AWS in 60 Days: A Complete Accelerated Cloud Mastery Roadmap
A 60‑day plan to AWS, covering fundamentals, core services, architecture, serverless, IaC, projects, and certification.
- Phases: Days 1‑10 foundations, 11‑25 core services, 26‑34 architecture, 35‑42 serverless, 43‑50 advanced/IaC, 51‑60 exam prep.
- Hands‑on using Free Tier, IAM, VPC, and Well‑Architected Framework.
- Key services: EC2, S3, VPC, IAM, Lambda, RDS, DynamoDB, CloudWatch, CloudFormation, Route 53.
- Study load: hrs, allocated across phases.
- Exam: 65 questions (50 scored), 130 min, passing , covering four architecture domains.