Curriculum
Every lesson across all tracks and tiers. Filter by topic, and your completed lessons are checked off automatically as you go.
Overall progress0/573 lessons
First Steps
Fundamentals
Beginner
- What is a program?foundationsmental-models
- How a computer runs your codefoundationsmental-models
- Data and typesfoundationsmental-models
- Logic and control flowfoundationsmental-models
- Decompositionfoundationsmental-models
- Reading error messages and stack tracesfoundationsdebugging
- Working with an AI coding agentfoundationsai-agents
- The shape of a projectfoundationsproject-structure
- Lab: reason about a programLabfundamentalslab
- How to read documentationfoundationsdocumentation
- Reading a reference entrydocumentationself-reliance
- Finding answers yourselfdocumentationself-reliance
- Searching effectivelydocumentationself-reliance
- Lab: find the answerLabfundamentalslab
- Version control, conceptuallyfoundationsversion-control
- Your first repositorygitself-reliance
- Seeing what changedgitself-reliance
- Branching and switchinggitself-reliance
- Working with remotesgitself-reliance
- Lab: run the git workflowLabfundamentalsgit
Intermediate
- Systems thinkingsystemsarchitecture
- Abstraction and interfacessystemsarchitecture
- Data structures: choosing the right shapesystemsdata-structures
- Algorithms and complexitysystemsalgorithms
- Reading unfamiliar source codesystemsreading-code
- Lab: think in systemsLabfundamentalssystems
- Software architecture basicssystemsarchitecture
- APIs and protocolssystemsapis
- Concurrencysystemsconcurrency
- Testing and verificationsystemstesting
- Designing with AI agentssystemsai-agents
- Debugging as a disciplinesystemsdebugging
- Performance and tradeoffssystemsperformance
- Lab: think in systemsLabfundamentalslab
- Writing a README people usedocumentationwriting
- Docstrings and commentsdocumentationwriting
- Writing a good commit messagedocumentationgit
- Architecture Decision Recordsdocumentationarchitecture
- Changelogs and release notesdocumentationwriting
- Lab: document it wellLabfundamentalslab
- Merge vs rebasegitself-reliance
- Resolving conflicts by handgitdebugging
- Undoing anythinggitself-reliance
- Stash and cherry-pickgitself-reliance
- Reviewing changes and pull requestsgitreview
- Finding a bad commit with git bisectgitdebugging
- Lab: handle git troubleLabfundamentalsgit
Advanced
- Build and release pipelinesproductiondelivery
- Deployment strategiesproductiondelivery
- Configuration and environmentsproductiondelivery
- Lab: ship safelyLabfundamentalslab
- Logging, metrics, and tracingoperationsobservability
- Monitoring and alertingoperationsobservability
- Incident responseoperationsincidents
- Lab: diagnose in productionLabfundamentalslab
- Thinking like an attackersecurity
- Authentication and authorizationsecurity
- Secrets and dependenciessecurity
- Common vulnerabilitiessecurity
- Lab: spot the vulnerabilityLabfundamentalslab
- Why distributed is harddistributed-systems
- State and consistencydistributed-systems
- Cachingdistributed-systemsperformance
- Designing for failuredistributed-systemsreliability
- Lab: reason about distributionLabfundamentalslab
- Measure before you scaleperformancescaling
- Scaling strategiesperformancescaling
- Load testing and bottlenecksperformancescaling
- Lab: scale deliberatelyLabfundamentalslab
Python
Beginner
- Variables and typespythonsyntax
- Control flowpythonsyntax
- Functionspythonsyntax
- Stringspythonsyntax
- Lab: text and numbersLabpythonlab
- Lists and tuplespythonsyntax
- Dictionaries and setspythonsyntax
- Lab: choosing the right structureLabpythonlab
- Errors and exceptionspythonsyntax
- Modules and importspythonsyntax
- Lab: core syntax capstoneLabpythonlab
- Boolean logicpythonsyntax
- Reading and writing filespythonfiles
- Working with strings in depthpythonstrings
- Lab: filter and reportLabpythonlab
Intermediate
- Comprehensionspythonidioms
- Generatorspythonidioms
- Lab: think in comprehensionsLabpythonlab
- Decoratorspythonidioms
- Classes and dataclassespythonidioms
- Context managerspythonidioms
- Type hintspythonidioms
- Lab: idioms capstoneLabpythonidioms
- Reading and writing CSVpythondata-io
- Working with JSONpythondata-io
- Data transformation patternspythondata-io
- String manipulation and pattern matchingpythondata-io
- Lab: data pipelineLabpythonlab
Advanced
- The GIL, threads, and processespythonconcurrency
- asynciopythonconcurrency
- Profiling and optimizationpythonperformance
- Lab: make it fast and correctLabpythonlab
- Virtual environments and pippythontooling
- Packaging with pyprojectpythontooling
- Testing with pytestpythontooling
- Lab: survive the test suiteLabpythonlab
- Binary data and bytespythonbinary
- Database IO with sqlite3pythondatabase
- Bitwise operations and advanced boolean patternspythonbitwise
- Filesystem and path manipulationpythonfilesystem
- Lab: database-backed data pipelineLabpythonlab
- Challenge: best time to buy and sellChallengepythonchallenge
- Challenge: maximum subarrayChallengepythonchallenge
- Challenge: product of array except selfChallengepythonchallenge
- Challenge: subarray sums (boss)Challengepythonchallenge
JavaScript / TS
Beginner
- Values and bindingjavascriptsyntax
- Functionsjavascriptsyntax
- Control flowjavascriptsyntax
- Strings and template literalsjavascriptsyntax
- Lab: logic and textLabjavascriptlab
- Arrays and objectsjavascriptsyntax
- Lab: shaping dataLabjavascriptlab
- Modulesjavascriptsyntax
- TypeScript basicsjavascripttypescript
- Lab: language basics capstoneLabjavascripttypescript
Intermediate
Advanced
- Microtasks and the event loopjavascriptruntime
- Memory and garbage collectionjavascriptruntime
- Performance profilingjavascriptperformance
- Lab: optimize itLabjavascriptlab
- Modules, bundlers, and buildsjavascripttooling
- Advanced TypeScriptjavascripttypescript
- Testing JavaScriptjavascripttooling
- Lab: robust codeLabjavascriptlab
SQL
Beginner
Intermediate
Advanced
Dialect appendices
Rust
Beginner
Intermediate
Bash
Beginner
Intermediate
- Conditionals In Depthbashscripting
- Loops In Depthbashscripting
- Functionsbashscripting
- Exit Codesbashscripting
- Lab: Scripting patternsLabbashscripting
- Grep Patternsbashtext-processing
- Sed Basicsbashtext-processing
- Awk Basicsbashtext-processing
- Cut, Sort, and Uniqbashtext-processing
- Lab: Text processingLabbashtext-processing
Advanced
Go
Beginner
Intermediate
C
Beginner
- What is C and why it matterscintroduction
- Your first C programcgcc
- Variables and primitive typescvariables
- Arithmetic and expressionscarithmetic
- Lab: Temperature converterLabclab
- if, else, and else ifccontrol-flow
- switch statementsccontrol-flow
- while and do-while loopsccontrol-flow
- for loopsccontrol-flow
- break, continue, and loop patternsccontrol-flow
- Lab: FizzBuzz in CLabclab
- Declaring and defining functionscfunctions
- Parameters and return valuescfunctions
- Scope and lifetimecfunctions
- Recursion basicscfunctions
- Lab: Recursive factorial and FibonacciLabclab
- Arrays: declaration, indexing, and iterationcarrays
- Multidimensional arrayscarrays
- C strings: char arrays and the null terminatorcstrings
- String functions from <string.h>cstrings
- Common string pitfallscstrings
- Lab: Palindrome checkerLabclab
Intermediate
- What is a pointer?cpointers
- Pointer arithmeticcpointers
- Pointers and arrayscpointers
- Pointers to pointerscpointers
- const pointerscpointers
- Common pointer bugscpointers
- Lab: Implement strlen and strcpy from scratchLabclab
- Stack vs. heapcmemory
- malloc, calloc, realloc, and freecmemory
- Memory leaks and how to find themcmemory
- Buffer overflowscmemory
- Valgrind basicscvalgrind
- Lab: Dynamic array (growable buffer)Labclab
- Defining and using structscstructs
- Nested structs and arrays of structscstructs
- Pointers to structscstructs
- typedef idiomsctypedef
- enum and bit flagscenum
- Lab: Linked list in CLabclab
- Opening and closing filescfile-io
- Reading and writing text filescfile-io
- Binary file I/Ocfile-io
- Error handling with errnocerrno
- Lab: CSV parserLabclab
Advanced
- The four stages: preprocessor, compilation, assembly, linkingccompilation
- Header files and include guardscheaders
- static and externcstatic
- Makefiles and build systemscmakefile
- Lab: Multi-file project with a MakefileLabclab
- Function pointerscfunction-pointers
- Void pointers and generic programmingcvoid-pointer
- Memory alignment and paddingcalignment
- restrict and aliasing rulescrestrict
- Writing a simple allocatorcallocator
- Challenge: Arena allocatorChallengecchallenge
- Threads vs. processescthreads
- Creating threads with pthread_createcpthreads
- Mutexes and race conditionscpthreads
- Condition variablescpthreads
- Deadlock and how to avoid itcpthreads
- Challenge: Thread-safe bounded queueChallengecchallenge
- Signals and signal handlerscsignals
- fork and execcfork
- Pipes and inter-process communicationcpipes
- Writing portable Ccportability
- Challenge: Build a minimal shellChallengecchallenge
Data Science
Beginner
- What is data?data-sciencedata-fundamentals
- Reading data filesdata-sciencepython
- Data shapesdata-sciencedata-fundamentals
- Inspecting with pandasdata-sciencepython
- Data qualitydata-sciencedata-fundamentals
- Cleaning datadata-sciencepython
- Lab: explore a datasetLabdata-sciencepython
- Statistics conceptsdata-sciencestatistics
- Calculating statsdata-sciencepython
- Grouping conceptsdata-sciencedata-fundamentals
- Filtering and groupingdata-sciencepython
- Lab: mini analysisLabdata-sciencepython
Intermediate
- Joining datadata-sciencejoins
- Merging DataFramesdata-sciencepython
- Reshaping datadata-sciencereshaping
- Window operationsdata-sciencepython
- Apply and transformdata-sciencepandas
- Custom aggregationsdata-sciencepython
- Lab: merge and reshapeLabdata-sciencepython
- Choosing a chartdata-sciencevisualisation
- Matplotlib essentialsdata-sciencepython
- Seaborn statistical plotsdata-sciencevisualisation
- Seaborn in practicedata-sciencepython
- Anatomy of a good chartdata-sciencevisualisation
- Lab: visual summaryLabdata-sciencepython
- What is a feature?data-sciencefeature-engineering
- Encoding categoricalsdata-sciencepython
- Scaling and normalisationdata-sciencefeature-engineering
- Scaling in practicedata-sciencepython
- Lab: prepare a datasetLabdata-sciencepython
Advanced
- Supervised vs unsupervised learningdata-sciencemachine-learning
- The bias-variance tradeoffdata-sciencemachine-learning
- The model lifecycledata-sciencemachine-learning
- Choosing a modeldata-sciencepython
- Lab: compare classification modelsLabdata-sciencepython
- fit(), predict(), transform()data-sciencesklearn
- Linear regression in sklearndata-sciencepython
- Decision treesdata-sciencemachine-learning
- Decision tree practicedata-sciencepython
- Sklearn pipelinesdata-sciencepython
- Saving and loading modelsdata-sciencepython
- Lab: build a sklearn pipelineLabdata-sciencepython
- Classification metricsdata-sciencemodel-evaluation
- Regression metricsdata-sciencepython
- Cross-validationdata-sciencemodel-evaluation
- Hyperparameter tuningdata-sciencepython
- Lab: evaluate honestlyLabdata-sciencepython
- Time series structuredata-sciencetime-series
- Decomposing a time seriesdata-sciencepython
- Autocorrelationdata-sciencetime-series
- Simple forecasting methodsdata-sciencepython
- Lab: forecast a time seriesLabdata-sciencepython
- ETL vs ELTdata-sciencedata-engineering
- Reproducible pipelinesdata-sciencedata-engineering
- Testing data pipelinesdata-sciencepython
- Lab: build a complete ML pipelineLabdata-sciencepython
Game Dev
Beginner
- What makes a game?game-devgame-concepts
- Your first pygame windowgame-devpython
- The game loopgame-devgame-concepts
- Moving thingsgame-devpython
- State in gamesgame-devgame-concepts
- Player inputgame-devpython
- Lab: Build a basic gameLabgame-devpython
- Collision conceptsgame-devgame-concepts
- Collision in codegame-devpython
- Lab: Polish the basic gameLabgame-devpython
Intermediate
- Game state machinesgame-devarchitecture
- Scene managementgame-devpython
- Entity designgame-devarchitecture
- Event systemsgame-devpython
- Camera and viewportgame-devcamera
- Lab: State machine refactorLabgame-devpython
- The Sprite classgame-devpygame
- Sprite groups in practicegame-devpython
- Sprite animationgame-devanimation
- Animated spritesgame-devpython
- Tile mapsgame-devtile-maps
- Lab: Tile platformerLabgame-devpython
- Sound effectsgame-devaudio
- Sound in practicegame-devpython
- Saving game stategame-devpersistence
- Save, load, and configgame-devpython
- Lab: Polish and persistenceLabgame-devpython
Advanced
- Vectors and mathgame-devmath
- Velocity and accelerationgame-devpython
- Gravity and jumpinggame-devphysics
- Gravity in codegame-devpython
- Lab: Physics systemLabgame-devpython
- Finite state machines for NPC AIgame-devai
- NPC state machine in codegame-devpython
- Pathfinding conceptsgame-devpathfinding
- A* on a gridgame-devpython
- Lab: Enemy AILabgame-devpython
- Particle systemsgame-devvfx
- Particle system in codegame-devpython
- Screen effectsgame-devvfx
- Screen effects in codegame-devpython
- Lab: Visual effectsLabgame-devpython
- The observer patterngame-devdesign-patterns
- Component architecturegame-devarchitecture
- Spatial hashinggame-devalgorithms
- Lab: game design patternsLabgame-devdesign-patterns
- Packaging conceptsgame-devdistribution
- PyInstaller packaginggame-devpython
- Cross-platform concernsgame-devcross-platform
- Lab: Publish your gameLabgame-devpython
Workflow
Beginner
- What is automation?workflowautomation
- Reading and writing filesworkflowpython
- Paths and directoriesworkflowfilesystem
- Automating file operationsworkflowpython
- What makes a good script?workflowscript-design
- Building a CLI scriptworkflowpython
- Lab: Automate a taskLabworkflowpython
- Structured data conceptsworkflowdata-formats
- Parsing JSON and CSVworkflowpython
- Lab: Wrangle some dataLabworkflowpython
Intermediate
- HTTP fundamentalsworkflowhttp
- Making requestsworkflowpython
- Authenticationworkflowauthentication
- Auth in practiceworkflowpython
- Pagination and rate limitingworkflowhttp
- Lab: API reportLabworkflowpython
- Subprocess fundamentalsworkflowsubprocess
- Subprocess in practiceworkflowpython
- Building pipelinesworkflowshell
- Python subprocess pipelineworkflowpython
- Lab: Subprocess pipelineLabworkflowpython
- Cron conceptsworkflowscheduling
- Python schedulersworkflowpython
- Config filesworkflowconfiguration
- Config and loggingworkflowpython
- Lab: Scheduled jobLabworkflowpython
Advanced
- Idempotency in practiceworkflowreliability
- Checkpoints and atomic writesworkflowpython
- Retry logicworkflowreliability
- Retry in practiceworkflowpython
- Lab: harden a pipelineLabworkflowpython
- Why scripts need testsworkflowtesting
- Mocking the filesystemworkflowpython
- Mocking HTTPworkflowtesting
- Mocking HTTP in practiceworkflowpython
- Lab: test suiteLabworkflowpython
- DAG thinkingworkfloworchestration
- Makefiles for pipelinesworkflowmake
- Prefect conceptsworkflowprefect
- Prefect in practiceworkflowpython
- Lab: DAG pipelineLabworkflowpython
- Docker conceptsworkflowdocker
- Writing a Dockerfileworkflowdocker
- Docker Compose workflowsworkflowdocker
- Lab: containerise a pipelineLabworkflowdocker
- GitHub Actions basicsworkflowgithub-actions
- Running Python in CIworkflowgithub-actions
- Secrets and environmentsworkflowgithub-actions
- Lab: Deploy workflowLabworkflowgithub-actions
Utilities
Beginner
- What is a utility?utilitiesunix-philosophy
- Input and outpututilitiespython
- Composabilityutilitiesunix-philosophy
- CLI argumentsutilitiespython
- Exit codes and errorsutilitiesexit-codes
- Building a CLI toolutilitiespython
- Lab: build a utilityLabutilitiespython
- Packaging conceptsutilitiespackaging
- Packaging in Pythonutilitiespython
- Lab: package and shareLabutilitiespython
Intermediate
- Why output design mattersutilitiesux
- Rich text outpututilitiespython
- Progress barsutilitiesux
- Rich progressutilitiespython
- Tables and treesutilitiesux
- Colour conventionsutilitiesux
- Lab: Rich toolLabutilitiespython
- Click vs argparseutilitiesclick
- Click basicsutilitiespython
- Subcommands with groupsutilitiesclick
- Groups in practiceutilitiespython
- Configuration filesutilitiesconfiguration
- Lab: Click toolLabutilitiespython
- Testing with CliRunnerutilitiestesting
- CliRunner in practiceutilitiespython
- Mocking stdin and envutilitiestesting
- Snapshot testingutilitiespython
- Lab: CLI coverageLabutilitiespython
Advanced
- PyPI and the registryutilitiespackaging
- Build backendsutilitiespython
- Versioningutilitiespackaging
- Release workflowutilitiespython
- Lab: Publish to TestPyPILabutilitiespython
- Don't buffer what you can streamutilitiesperformance
- Streaming in practiceutilitiespython
- Memory profilingutilitiesperformance
- Profiling in practiceutilitiespython
- Lab: Optimise a utilityLabutilitiespython
- TUI conceptsutilitiestui
- Textual basicsutilitiespython
- Interactive formsutilitiestui
- Live dashboardsutilitiespython
- Lab: TUI log viewerLabutilitiespython
- Entry points as extensionsutilitiesplugins
- Designing a plugin APIutilitiesplugins
- Dynamic loadingutilitiespython
- Lab: Plugin systemLabutilitiespython
- Path portabilityutilitiescross-platform
- Platform-specific behaviourutilitiescross-platform
- Shebang and executablesutilitiescross-platform
- Lab: cross-platformLabutilitiescross-platform
CS Fundamentals
Beginner
Intermediate
- Solving with listscs-fundamentalspython
- Key-value thinkingcs-fundamentalsdata-structures
- Solving with dictscs-fundamentalspython
- Big-O intuitioncs-fundamentalsbig-o
- Measuring speedcs-fundamentalspython
- Lab: algorithm practiceLabcs-fundamentalspython
- Recursion conceptscs-fundamentalsrecursion
- Recursion in Pythoncs-fundamentalspython
- Search conceptscs-fundamentalssearch
- Search in Pythoncs-fundamentalspython
- Lab: searchLabcs-fundamentalspython
- Stackscs-fundamentalsdata-structures
- Stacks in practicecs-fundamentalspython
- Queuescs-fundamentalsdata-structures
- Queues in practicecs-fundamentalspython
- Heaps and priority queuescs-fundamentalsdata-structures
- Heaps in practicecs-fundamentalspython
- Lab: structure problemsLabcs-fundamentalspython
- Why sorting matterscs-fundamentalssorting
- Merge sortcs-fundamentalspython
- Python's sortcs-fundamentalspython
- Custom sortingcs-fundamentalspython
- Binary search variationscs-fundamentalsbinary-search
- Lab: sorting problemsLabcs-fundamentalspython
- Graph representationcs-fundamentalsgraphs
- BFS and DFScs-fundamentalspython
- Tree fundamentalscs-fundamentalstrees
- Tree traversalscs-fundamentalspython
- Binary search treescs-fundamentalstrees
- Lab: graphs and treesLabcs-fundamentalspython
Advanced
- DP intuitioncs-fundamentalsdynamic-programming
- Memoisationcs-fundamentalspython
- Tabulationcs-fundamentalsdynamic-programming
- Classic DP patternscs-fundamentalspython
- 2D DPcs-fundamentalspython
- Lab: DP problemsLabcs-fundamentalspython
- Weighted graphscs-fundamentalsgraphs
- Dijkstra's algorithmcs-fundamentalspython
- Topological sortcs-fundamentalsgraphs
- Topo sort and cycle detectioncs-fundamentalspython
- Lab: graph algorithmsLabcs-fundamentalspython
- Sliding windowcs-fundamentalssliding-window
- Sliding window practicecs-fundamentalspython
- Two-pointer on stringscs-fundamentalstwo-pointer
- Hashing stringscs-fundamentalspython
- Lab: string problemsLabcs-fundamentalspython
- Greedy algorithmscs-fundamentalsgreedy
- Greedy in practicecs-fundamentalspython
- Divide and conquercs-fundamentalsdivide-and-conquer
- Backtrackingcs-fundamentalspython
- Lab: paradigm problemsLabcs-fundamentalspython
- Challenge: trapping rain waterChallengecs-fundamentalschallenge
- Challenge: longest substring without repeating charactersChallengecs-fundamentalschallenge
- Challenge: word breakChallengecs-fundamentalschallenge
- Challenge: number of islandsChallengecs-fundamentalschallenge
Data Types & Type Systems
Computer Architecture
Operating Systems
Networking Fundamentals
Database Internals
Regular Expressions
Beginner
- What is a regular expression?regexfundamentals
- Literals and metacharactersregexsyntax
- Character classesregexcharacter-classes
- Quantifiersregexquantifiers
- Anchorsregexanchors
- Lab: core syntaxLabregexlab
- Groups and alternationregexgroups
- The dot and flagsregexflags
- Common patternsregexpatterns
- Lab: practical matchingLabregexlab
Intermediate
- Capturing groupsregexgroups
- Named groupsregexgroups
- Non-capturing groupsregexgroups
- Backreferencesregexbackreferences
- Lab: groups and referencesLabregexlab
- Positive lookaheadregexlookahead
- Negative lookaheadregexlookahead
- Lookbehindregexlookbehind
- Combining lookaroundsregexlookarounds
- Lab: lookaroundsLabregexlab
Advanced
- Catastrophic backtrackingregexperformance
- Atomic groups and possessive quantifiersregexperformance
- Benchmarking regex patternsregexperformance
- Engine differencesregexengines
- Lab: performance and pitfallsLabregexlab
- Parsing log filesregexlogs
- Data extraction pipelinesregexextraction
- Regex in toolingregexgrep
- When not to use regexregexbest-practices
- Lab: real-world applicationsLabregexlab
Using AI
Beginner
- What is AI?using-aifoundations
- How large language models workusing-aifoundations
- What AI is good at — and not so good atusing-aifoundations
- Lab: Exploring AI outputsLabusing-ailab
- The conversation modelusing-aifoundations
- Your first promptusing-aiprompting
- Giving contextusing-aiprompting
- Reading and verifying AI outputusing-aiprompting
- Lab: Your first AI-assisted programLabusing-ailab
Intermediate
- Anatomy of a good promptusing-aiprompting
- Role and persona promptingusing-aiprompting
- Chain-of-thought promptingusing-aiprompting
- Iterating on promptsusing-aiprompting
- Tokens and context windowsusing-aiprompting
- Lab: Prompt engineering challengeLabusing-aiprompting
- Decomposing problems for AIusing-aiproblem-solving
- Debugging with AIusing-aiproblem-solving
- Validating AI solutionsusing-aiproblem-solving
- AI as a research and documentation toolusing-aiproblem-solving
- Lab: Solve a real problem with AILabusing-aiproblem-solving
Advanced
- What are AI agents?using-aiagents
- AI coding toolsusing-aiagents
- Agent memory filesusing-aiagents
- Directing agents effectivelyusing-aiagents
- Reviewing agent workusing-aiagents
- Lab: Build a feature with an agentLabusing-aiagents
- Multi-step agent workflowsusing-aiagents
- Hooks and automationusing-aiagents
- MCP servers and agent toolsusing-aiagents
- Agent security and trustusing-aiagents
- Challenge: Build an automated workflowChallengeusing-aiagents
Web Foundations
Beginner
- What is HTML?webhtml
- Elements and Structurewebhtml
- Semantic HTMLwebhtml
- Attributes, Links, and Imageswebhtml
- Forms and Inputswebhtml
- Lab: Build a Well-Structured PageLabwebhtml
- How CSS Workswebcss
- Selectors and the Cascadewebcss
- Specificitywebcss
- The Box Modelwebcss
- Colors, Typography, and Unitswebcss
- Lab: Style a PageLabwebcss
Intermediate
- Normal Flowwebcss
- Flexbox Basicswebcss
- Flexbox Alignmentwebcss
- CSS Gridwebcss
- When to Use Flexbox vs Gridwebcss
- Positioningwebcss
- z-index and Stacking Contextswebcss
- Lab — Layout ChallengeLabwebcss
- The Viewportwebcss
- Media Querieswebcss
- Mobile-First Designwebcss
- Fluid Typography and Spacingwebcss
- Responsive Imageswebcss
- Lab: Make It ResponsiveLabwebcss
- What Is Web Accessibility?webaccessibility
- Keyboard Navigationwebaccessibility
- ARIA Roles and Attributeswebaccessibility
- Color and Contrastwebaccessibility
- Testing Accessibilitywebaccessibility
- Lab — Accessibility AuditLabwebaccessibility
Advanced
- Parsing and the Render Treewebperformance
- Reflow and Repaintwebperformance
- The Critical Rendering Pathwebperformance
- Loading Strategieswebperformance
- Lab — Profile with DevToolsLabwebperformance
- CSS Custom Propertieswebcss
- The Cascade in Productionwebcss
- Design Tokenswebcss
- CSS Methodology Trade-offswebcss
- Lab — Refactor a StylesheetLabwebcss
- Core Web Vitalswebperformance
- Image Optimizationwebperformance
- Font Loading Strategieswebperformance
- Asset Optimizationwebperformance
- Lab — Improve Core Web VitalsLabwebperformance