Full Stack Developer (MERN)
A step-by-step path to shipping complete web apps with the MERN stack: React on the client, Node.js and Express for the API, MongoDB for data. It covers the parts tutorials skip, such as auth, testing, deployment and running the app once real people use it.
- Before you start
- No prior coding is needed, but plan for steady practice: every stage ends with something to build. You should be comfortable installing software, using a terminal and reading documentation in English.
- Where it gets you
- You can design, build, test and deploy a full-stack MERN app with secure auth, a well-modeled MongoDB database and a typed React frontend, run it in production, and explain the trade-offs behind it in an interview.
0 of 65 topics done
Tick a topic once you can explain it and have used it in a project. Progress is saved in this browser.
- Core
- Recommended
- Optional
- Done
- 1
Web and JavaScript Foundations
About 5-6 weeks0/7
Build interactive pages with HTML, CSS and plain JavaScript, and track every change in Git.
Build: Movie Search in Plain JavaScript
Build a responsive page that searches a public movie API with fetch, shows loading and error states, and saves favorites to localStorage. Keep it in a GitHub repo with small, clear commits.
- 2
React Frontend with Vite
About 6-7 weeks0/8
Build a multi-page React 19 app with routing, forms and server data, styled with Tailwind CSS.
Build: Recipe Browser SPA
Build a React app with search, a details page per recipe, favorites and a validated add-recipe form, using a public API through TanStack Query. Deploy the static build so anyone can open it.
- 3
Node.js and Express APIs
About 5-6 weeks0/7
Build a REST API with Node.js 24 LTS and Express 5 that validates input, handles errors and returns consistent JSON.
Build: Task Manager API
Build an Express API for projects and tasks with full CRUD, Zod validation, pagination and a central error handler, storing data in memory for now. Document every endpoint and test it with an HTTP client.
- 4
MongoDB and Mongoose
About 4-5 weeks0/8
Model real data in MongoDB, query it efficiently with Mongoose and keep it consistent as the app grows.
Build: Persist the Task Manager
Move the Task Manager API onto MongoDB Atlas with Mongoose models for users, projects and tasks, indexes for the common queries and a stats endpoint built with the aggregation pipeline.
- 5
Auth and Security Across the Stack
About 4-5 weeks0/8
Add secure sign-up, login and role-based access that work end to end from React to Express to MongoDB.
Build: Secure the Task Manager
Add sign-up and login with hashed passwords, httpOnly refresh-token rotation, admin and member roles checked in Express, protected React routes and avatar uploads to object storage.
- 6
TypeScript and Testing Across the Stack
About 4-5 weeks0/7
Share types between client and server and prove the important paths work with automated tests.
Build: Typed and Tested Task Manager
Convert the app to a TypeScript monorepo with client, server and shared packages, add API tests for auth and CRUD, component tests for the main forms and one Playwright test for sign-up to first task.
- 7
Real-Time and Production Features
About 4-5 weeks0/7
Add the features real products need: live updates, caching, background jobs, email and payments.
Build: Real-Time Team Board
Turn the Task Manager into a team board where changes appear live for everyone in the project, invites go out by email through a job queue, and dashboard stats are cached in Redis.
- 8
Deploy and Operate
About 3-4 weeks0/7
Ship the MERN app to production with Docker, HTTPS and automated deploys, and keep it healthy.
Build: Ship the Team Board
Deploy the React build to a static host, the API and Redis in Docker behind Nginx with HTTPS, and the data on Atlas, with GitHub Actions running tests and deploying on every merge to main.
- 9
Level Up Beyond MERN
About 4-6 weeks0/6
Extend the MERN skill set with Next.js, SQL and system design so you can grow into bigger full-stack roles.
Build: Capstone Product
Build and launch one original full-stack product for a real use case, with auth, a well-modeled database, tests, CI/CD and monitoring. Write a case study that explains the architecture and the trade-offs you made.
Where it gets you
You can design, build, test and deploy a full-stack MERN app with secure auth, a well-modeled MongoDB database and a typed React frontend, run it in production, and explain the trade-offs behind it in an interview.
Core must know for the roleRecommended expected in most jobsOptional for specific teams or later
Web and JavaScript Foundations
About 5-6 weeks
Build interactive pages with HTML, CSS and plain JavaScript, and track every change in Git.
How the Web Works
CoreEvery MERN app is a browser talking to a server over HTTP, so this model explains most bugs you will meet later.
- Clients, servers and URLs
- HTTP requests and responses
- Methods, status codes, headers
- DNS and domains, briefly
- Browser DevTools Network tab
HTML and CSS Essentials
CoreReact renders HTML and styles it with CSS, so solid basics here make every component easier to build and fix.
- Semantic elements and forms
- The box model and cascade
- Flexbox and grid layouts
- Responsive design with media queries
- Accessible labels and alt text
Modern JavaScript
CoreJavaScript runs every layer of MERN, from React components to Express routes, so depth here pays off four times.
- let, const and scope
- Functions, closures and this
- Arrays and objects in depth
- Destructuring, spread and rest
- Classes and prototypes, briefly
- Errors with try and catch
Async JavaScript and Fetch
CoreDatabase calls, API requests and file reads are all asynchronous, so promises and async/await are daily tools.
- Callbacks and the event loop
- Promises and chaining
- async and await
- fetch with JSON bodies
- Handling loading and errors
The DOM and Events
CoreChanging the page by hand once shows you exactly what React automates for you later.
- Selecting and updating elements
- Event listeners and delegation
- Form submit and input events
- localStorage for simple saving
Modules and npm
CoreBoth the React app and the Node server are built from modules and npm packages.
- import and export syntax
- package.json and scripts
- Dependencies vs devDependencies
- Lockfiles and semantic versioning
Git and GitHub
CoreVersion control is how every team ships code, and your GitHub history is part of your portfolio.
- Commits, branches and merges
- Remotes, push and pull
- Pull requests and reviews
- Resolving merge conflicts
- Useful .gitignore files
Build: Movie Search in Plain JavaScript
Build a responsive page that searches a public movie API with fetch, shows loading and error states, and saves favorites to localStorage. Keep it in a GitHub repo with small, clear commits.
React Frontend with Vite
About 6-7 weeks
Build a multi-page React 19 app with routing, forms and server data, styled with Tailwind CSS.
Vite and Project Setup
CoreVite gives the MERN client a fast dev server and build, and it is the usual starting point for a React SPA.
- Create a React app with Vite
- Project structure and entry point
- Dev server and hot reload
- Environment variables in Vite
- ESLint and Prettier setup
Components, JSX and Props
CoreComponents are the unit of every React screen, so thinking in small, reusable pieces comes first.
- JSX rules and expressions
- Passing and reading props
- Rendering lists with keys
- Conditional rendering
- Composition with children
State and Hooks
CoreState is what makes a React app interactive, and hooks are how components hold and share it.
- useState and updater functions
- Lifting state up
- useReducer for complex state
- useContext for shared values
- useRef for DOM and values
- Custom hooks for reuse
Effects and Data Loading
CoreEffects connect components to the outside world, and knowing when not to use one avoids most React bugs.
- useEffect and cleanup
- Dependency arrays explained
- Fetching data safely
- Avoiding race conditions
- Knowing when to skip effects
Routing with React Router
CoreA MERN client is usually a single-page app, and React Router gives it real URLs, layouts and navigation.
- Routes and nested layouts
- Links and programmatic navigation
- URL params and search params
- Not found and error routes
- Protected route wrappers
Forms and Validation
CoreSign-up, login and create forms are where users meet your API, so they need clear validation and errors.
- Controlled and uncontrolled inputs
- Form Actions in React 19
- Client-side validation with Zod
- Showing field-level errors
- Disabling while submitting
Styling with Tailwind CSS
RecommendedTailwind CSS v4 is the common way to style React apps quickly while keeping a consistent design.
- Utility classes and variants
- Responsive and dark mode styles
- Theme tokens with @theme
- Extracting reusable components
Server State with TanStack Query
RecommendedData from your Express API needs caching, refetching and loading states, which TanStack Query handles for you.
- Queries and query keys
- Mutations and invalidation
- Loading and error states
- Optimistic updates
- Pagination and infinite lists
Build: Recipe Browser SPA
Build a React app with search, a details page per recipe, favorites and a validated add-recipe form, using a public API through TanStack Query. Deploy the static build so anyone can open it.
Node.js and Express APIs
About 5-6 weeks
Build a REST API with Node.js 24 LTS and Express 5 that validates input, handles errors and returns consistent JSON.
The Node.js Runtime
CoreNode runs your MERN backend, so knowing how it schedules work explains slow endpoints and stuck servers.
- What Node is and is not
- The event loop in practice
- Blocking vs non-blocking code
- Running files and the REPL
- Watch mode for development
Core Modules and Config
CoreReading files, paths and environment variables is part of almost every server you will write.
- fs and path modules
- Environment variables and .env
- process.argv and exit codes
- Streams for large files
Express Routing and Middleware
CoreExpress is the E in MERN: routes map URLs to handlers and middleware runs shared logic around them.
- Routes, params and query strings
- Routers for feature modules
- Built-in JSON body parsing
- Writing custom middleware
- Middleware order matters
REST API Design
CoreA predictable API makes the React side simple, so design resources and responses before writing handlers.
- Resource-based URLs
- Correct methods and status codes
- Consistent JSON error shape
- Pagination, sorting and filters
- Versioning basics
Error Handling
CoreOne central error handler keeps crashes out of production and gives the client useful messages.
- Error-handling middleware
- Async errors in Express 5
- Custom error classes
- Never leak stack traces
Validating Input with Zod
CoreNever trust the client: validating every body, param and query stops bad data before it reaches MongoDB.
- Schemas for bodies and params
- A reusable validate middleware
- Readable validation errors
- Inferring types from schemas
API Docs and Tooling
RecommendedDocumented, testable endpoints make it easier for you and any teammate to build the frontend against them.
- Testing with an HTTP client
- OpenAPI spec basics
- Generated interactive docs
- Request logging in development
Build: Task Manager API
Build an Express API for projects and tasks with full CRUD, Zod validation, pagination and a central error handler, storing data in memory for now. Document every endpoint and test it with an HTTP client.
MongoDB and Mongoose
About 4-5 weeks
Model real data in MongoDB, query it efficiently with Mongoose and keep it consistent as the app grows.
Documents and CRUD
CoreMongoDB stores JSON-like documents, which map naturally to the objects your Express API already sends.
- Databases, collections, documents
- BSON types and ObjectId
- Insert, find, update, delete
- Query and update operators
- Using mongosh and Compass
MongoDB Atlas and Local Setup
CoreAtlas is the managed cloud database most MERN apps use in production, with a free tier for learning.
- Create a free Atlas cluster
- Database users and network access
- Connection strings and secrets
- Local MongoDB for development
Schema Design: Embed or Reference
CoreGood MongoDB design follows how the app reads data, and this choice shapes performance more than anything else.
- Embedding related data
- Referencing with ObjectIds
- One-to-many and many-to-many
- Avoiding unbounded arrays
- Designing for your queries
Mongoose Schemas and Models
CoreMongoose adds schemas, validation and helpers on top of MongoDB, and it is the standard ODM in MERN apps.
- Connecting with Mongoose
- Schemas, types and defaults
- Built-in and custom validators
- Timestamps and virtuals
- Middleware hooks like pre save
- lean() for read-heavy queries
Relationships and Populate
CoreMost apps link users, posts and comments, and populate is how Mongoose joins referenced documents.
- ref and populate
- Selecting only needed fields
- Nested populate, sparingly
- When to denormalize instead
Indexes and Query Performance
CoreWithout the right indexes every query scans the whole collection, which gets slow long before you have many users.
- Single field and compound indexes
- Unique indexes for emails
- Reading explain() output
- Index order and sort
- Text indexes for simple search
Aggregation Pipeline
CoreDashboards and reports need grouping and totals, which the aggregation pipeline computes inside the database.
- $match, $group and $sort
- $project and computed fields
- $lookup for joins
- Pagination with $skip and $limit
Transactions and Consistency
RecommendedWhen one action must update several documents together, such as an order and its stock, you need a transaction.
- Single-document atomicity
- Multi-document transactions
- Sessions in Mongoose
- Keeping transactions short
Build: Persist the Task Manager
Move the Task Manager API onto MongoDB Atlas with Mongoose models for users, projects and tasks, indexes for the common queries and a stats endpoint built with the aggregation pipeline.
Auth and Security Across the Stack
About 4-5 weeks
Add secure sign-up, login and role-based access that work end to end from React to Express to MongoDB.
Passwords and Hashing
CoreStoring passwords safely is the first rule of auth, and a leak without hashing is a disaster.
- Why never store plain passwords
- Hashing with bcrypt or argon2
- Salts and work factors
- Password reset flows
JWT Access and Refresh Tokens
CoreShort-lived access tokens with rotating refresh tokens are the common MERN pattern for staying logged in safely.
- What a JWT contains
- Signing and verifying tokens
- Short access token lifetimes
- Refresh token rotation
- Detecting refresh token reuse
- Logout and token revocation
Cookies, CORS and CSRF
CoreA React app on one origin calling an API on another needs correct cookie and CORS settings to work at all.
- httpOnly, Secure, SameSite cookies
- CORS with credentials
- Why tokens stay out of localStorage
- CSRF risks and defenses
Roles and Permissions
CoreAuthentication says who someone is; authorization decides what they may do, and it must be checked on the server.
- Auth middleware for Express
- Role-based access control
- Ownership checks per record
- Hiding UI the user cannot use
Auth on the React Side
CoreThe client needs to know who is logged in, refresh quietly and redirect cleanly without ever holding secrets.
- An auth context or store
- Silent refresh on 401 responses
- Protected and public routes
- Handling expired sessions
Hardening the API
CoreA few standard defenses close the holes attackers try first on any Express app.
- Security headers with helmet
- Rate limiting login routes
- Blocking NoSQL injection
- Limiting request body size
- Keeping dependencies patched
Social Login with OAuth
RecommendedSign in with Google or GitHub is expected in many products and uses the OAuth 2.0 authorization code flow.
- Authorization code flow with PKCE
- Linking OAuth to local accounts
- Storing provider ids safely
File Uploads
RecommendedAvatars and attachments are common features, and files belong in object storage, not in MongoDB.
- multipart/form-data with Multer
- Validating type and size
- Uploading to S3 or Cloudinary
- Presigned URLs for direct uploads
Build: Secure the Task Manager
Add sign-up and login with hashed passwords, httpOnly refresh-token rotation, admin and member roles checked in Express, protected React routes and avatar uploads to object storage.
TypeScript and Testing Across the Stack
About 4-5 weeks
Share types between client and server and prove the important paths work with automated tests.
TypeScript Fundamentals
CoreMost MERN job posts now expect TypeScript, and types catch the mismatches between client and server early.
- Types, interfaces and unions
- Narrowing and type guards
- Generics in practice
- Strict mode settings
TypeScript with React
CoreTyped props, state and events make React components safer to change and easier to reuse.
- Typing props and children
- Typing state and reducers
- Event and ref types
- Typing API responses
TypeScript on the Server
CoreA typed Express API with typed Mongoose models removes a whole class of runtime bugs.
- Running TypeScript in Node
- Typing requests and responses
- Typed Mongoose models
- tsc --noEmit in CI
Shared Types and a Monorepo
RecommendedKeeping client, server and shared code in one repo lets both sides use the same Zod schemas and types.
- npm workspaces layout
- A shared package for schemas
- z.infer for request types
- One lint and format setup
API Tests with Vitest and Supertest
CoreIntegration tests against a real test database prove your routes, auth and validation work together.
- Test runner basics with Vitest
- HTTP tests with Supertest
- In-memory MongoDB for tests
- Testing auth and permissions
- Resetting data between tests
Component Tests
RecommendedTesting components the way a user sees them catches broken forms and flows without brittle details.
- React Testing Library queries
- Simulating user events
- Mocking API calls
- Testing loading and errors
End-to-End Tests with Playwright
RecommendedA few browser tests of the critical journeys, such as sign-up and checkout, guard the whole stack at once.
- Writing a first Playwright test
- Locators and assertions
- Logging in once per suite
- Running tests in CI
Build: Typed and Tested Task Manager
Convert the app to a TypeScript monorepo with client, server and shared packages, add API tests for auth and CRUD, component tests for the main forms and one Playwright test for sign-up to first task.
Real-Time and Production Features
About 4-5 weeks
Add the features real products need: live updates, caching, background jobs, email and payments.
Real-Time with Socket.IO
CoreChat, notifications and live boards push updates from the server, and Socket.IO is the usual MERN choice.
- WebSockets vs polling vs SSE
- Socket.IO server and client
- Rooms for teams or chats
- Authenticating socket connections
- Scaling with a Redis adapter
Caching with Redis
RecommendedCaching expensive reads in Redis takes load off MongoDB and makes busy pages feel instant.
- Keys, TTLs and data types
- Cache-aside pattern
- Invalidating on writes
- Rate limit counters in Redis
Background Jobs with BullMQ
RecommendedEmails, image processing and bulk sends should not block a request, so they run as queued jobs.
- Queues, workers and jobs
- Retries with backoff
- Scheduled and repeatable jobs
- Idempotent job handlers
Transactional Email
RecommendedVerification, password reset and invite emails are part of nearly every product.
- Nodemailer or an email API
- Email verification links
- Templates for common emails
- Sending through a queue
Payments with Stripe
OptionalTaking payments safely means letting Stripe hold card data and trusting only verified webhooks.
- Checkout sessions
- Verifying webhook signatures
- Recording orders in MongoDB
- Test mode and test cards
Search, Filters and Pagination
CoreLists grow fast, so users need fast search and paging that stays quick on large collections.
- Offset vs cursor pagination
- Filter and sort query params
- Atlas Search for full text
- Debounced search inputs in React
Frontend Performance
RecommendedA fast first load and smooth interactions matter as much as the API, and they are measured by Core Web Vitals.
- Code splitting with lazy
- Optimizing images
- Avoiding needless re-renders
- Measuring Core Web Vitals
Build: Real-Time Team Board
Turn the Task Manager into a team board where changes appear live for everyone in the project, invites go out by email through a job queue, and dashboard stats are cached in Redis.
Deploy and Operate
About 3-4 weeks
Ship the MERN app to production with Docker, HTTPS and automated deploys, and keep it healthy.
Environments and Secrets
CoreDevelopment, staging and production need different settings, and secrets must never land in Git.
- Config through environment variables
- Separate dev and prod databases
- Secrets in your host or CI
- Validating config at startup
Production Builds
CoreProduction builds of the client and server behave differently from dev, so you need to know what changes.
- vite build and previews
- NODE_ENV and production mode
- Compression and caching headers
- Serving the client from a CDN
Docker for MERN
CoreContainers make the API run the same on your laptop and the server, and Compose runs the whole stack locally.
- Writing a Dockerfile for Node
- Multi-stage builds
- Compose for API, Mongo, Redis
- Volumes and networks
Nginx, Domains and HTTPS
RecommendedA reverse proxy with free TLS certificates is how a self-hosted API is served safely on a real domain.
- Nginx as a reverse proxy
- Pointing a domain with DNS
- Free certificates with Let's Encrypt
- Proxying WebSocket connections
Choosing Where to Host
CoreKnowing the trade-offs between a VPS and managed platforms lets you pick the right home for each part.
- Static hosts for the React build
- Managed platforms for the API
- A VPS or EC2 for control
- Atlas for the database
CI/CD with GitHub Actions
CoreAutomated checks and deploys on every merge stop broken code from reaching users.
- Workflow files and triggers
- Lint, type-check and test jobs
- Building and pushing images
- Deploying on merge to main
Logs, Health Checks and Monitoring
CoreOnce real users arrive you need to see errors and slowdowns before they report them.
- Structured logs with pino
- Health check endpoints
- Error tracking for client and server
- Uptime alerts
- Database backups and restores
Build: Ship the Team Board
Deploy the React build to a static host, the API and Redis in Docker behind Nginx with HTTPS, and the data on Atlas, with GitHub Actions running tests and deploying on every merge to main.
Level Up Beyond MERN
About 4-6 weeks
Extend the MERN skill set with Next.js, SQL and system design so you can grow into bigger full-stack roles.
Next.js App Router
RecommendedNext.js 16 turns React into a full-stack framework, and many MERN teams now build new products with it.
- File-based routing and layouts
- Server and client components
- Route handlers as API endpoints
- Metadata and SEO
Server Components and Server Functions
OptionalReading data on the server and mutating it with server functions removes a lot of client and API glue.
- Fetching data in server components
- Mutations with server functions
- Revalidating after changes
- When an Express API still fits
SQL and PostgreSQL Basics
RecommendedMany teams run PostgreSQL next to or instead of MongoDB, so basic SQL widens the jobs you can take.
- Tables, keys and relations
- SELECT, JOIN and GROUP BY
- When relational beats documents
- Using an ORM such as Prisma
System Design Basics
RecommendedInterviews and senior work both ask how an app holds up as traffic and data grow.
- Stateless servers and scaling out
- Caching layers and CDNs
- Queues for slow work
- Read replicas and sharding, briefly
- Drawing and explaining an architecture
Adding AI Features
OptionalChat, search and summaries powered by language models are now common in MERN products.
- Calling a model API from Express
- Streaming responses to React
- Vector search in MongoDB
- Tracking cost per request
Portfolio and Interview Prep
CoreHiring teams judge you on shipped work and how clearly you explain it, so package your projects well.
- Two or three deployed projects
- Readable READMEs with screenshots
- Short case study per project
- Practicing JavaScript fundamentals
- Explaining your auth and data model
Build: Capstone Product
Build and launch one original full-stack product for a real use case, with auth, a well-modeled database, tests, CI/CD and monitoring. Write a case study that explains the architecture and the trade-offs you made.
Go deeper
Last reviewed .