Skip to content

Commit b4ada8f

Browse files
travisjneumanclaude
andcommitted
feat: insert modality hub tables across 94 project READMEs and concept docs
Add "Learn Your Way" navigation tables to all 34 concept docs, 15 level-0 projects, 15 level-1 projects, 15 level-2 projects, and 15 level-10 projects. Each table links available modalities (concept, project, walkthrough, quiz, flashcards, diagram, browser) with em-dash for missing content. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1d0bb89 commit b4ada8f

File tree

124 files changed

+2879
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

124 files changed

+2879
-0
lines changed

concepts/api-basics.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
An **API** (Application Programming Interface) is a way for programs to talk to each other. When people say "API" in web development, they usually mean a web API — a server that accepts HTTP requests and returns data (usually JSON).
44

5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) || [Quiz](quizzes/api-basics-quiz.py) | [Flashcards](../practice/flashcards/README.md) ||
12+
13+
<!-- modality-hub-end -->
14+
515
## Visualize It
616

717
See how Python works with JSON data, the format APIs use to communicate:

concepts/args-kwargs-explained.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
`*args` and `**kwargs` let a function accept any number of arguments. `*args` collects extra positional arguments into a tuple. `**kwargs` collects extra keyword arguments into a dictionary. Together, they make functions flexible without requiring a fixed parameter list.
44

5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) || [Quiz](quizzes/args-kwargs-explained-quiz.py) | [Flashcards](../practice/flashcards/README.md) ||
12+
13+
<!-- modality-hub-end -->
14+
515
## Why This Matters
616

717
You will see `*args` and `**kwargs` in almost every Python library. Understanding them is essential for writing decorators, creating wrapper functions, and understanding how frameworks like Flask and pytest work under the hood. They also appear in function signatures on docs.python.org — you need to read them confidently.

concepts/async-explained.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
Async lets your program do other work while waiting for slow operations (network requests, file reads, database queries).
44

5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) || [Quiz](quizzes/async-explained-quiz.py) | [Flashcards](../practice/flashcards/README.md) ||
12+
13+
<!-- modality-hub-end -->
14+
515
## Visualize It
616

717
See how `async` and `await` allow coroutines to run concurrently:

concepts/classes-and-objects.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
> **Try This First:** Before reading, try this in Python: `class Dog: pass` then `my_dog = Dog()` then `print(type(my_dog))`. You just created a class and made an object from it.
44
5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) || [Quiz](quizzes/classes-and-objects-quiz.py) | [Flashcards](../practice/flashcards/README.md) ||
12+
13+
<!-- modality-hub-end -->
14+
515
A **class** is a blueprint for creating things. An **object** is a thing created from that blueprint.
616

717
## Visualize It

concepts/collections-deep-dive.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
Python's `collections` module provides specialized container types that go beyond the built-in `list`, `dict`, and `set`. They solve common patterns like counting items, creating lightweight objects, and handling missing dictionary keys — all with less code and better performance than rolling your own solution.
44

5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) || [Quiz](quizzes/collections-deep-dive-quiz.py) | [Flashcards](../practice/flashcards/README.md) ||
12+
13+
<!-- modality-hub-end -->
14+
515
## Why This Matters
616

717
Every program needs to store and organize data. The built-in types handle most cases, but they have gaps. Need to count how often each word appears? `Counter`. Need a dict that automatically handles missing keys? `defaultdict`. Need a lightweight immutable object with named fields? `namedtuple`. Learning these tools saves you from writing (and debugging) boilerplate code.

concepts/collections-explained.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
> **Try This First:** Before reading, try this in Python: `fruits = ['apple', 'banana']; fruits.append('cherry'); print(fruits)`. What does the list look like after `append`?
44
5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) | [Videos](videos/collections-explained.md) | [Quiz](quizzes/collections-explained-quiz.py) | [Flashcards](../practice/flashcards/README.md) | [Diagrams](diagrams/collections-explained.md) |
12+
13+
<!-- modality-hub-end -->
14+
515
Python has several ways to group multiple values together.
616

717
## Visualize It

concepts/comprehensions-explained.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
A comprehension is a one-line way to build a list, dictionary, or set from another sequence. Instead of writing a loop that appends to a list, you describe what you want in a single expression. Comprehensions are one of Python's most distinctive features.
44

5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) || [Quiz](quizzes/comprehensions-explained-quiz.py) | [Flashcards](../practice/flashcards/README.md) ||
12+
13+
<!-- modality-hub-end -->
14+
515
## Why This Matters
616

717
Comprehensions make your code shorter, faster, and more readable — once you learn the pattern. They show up everywhere in Python: filtering data, transforming lists, building dictionaries from pairs, and more. Understanding them is essential from Level 2 onward.

concepts/context-managers-explained.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
A context manager is something that sets up a resource when you enter a block and cleans it up when you leave — even if an error occurs. The `with` statement is how you use them. If you have ever written `with open("file.txt") as f:`, you have already used one.
44

5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) || [Quiz](quizzes/context-managers-explained-quiz.py) | [Flashcards](../practice/flashcards/README.md) ||
12+
13+
<!-- modality-hub-end -->
14+
515
## Why This Matters
616

717
Resources like files, database connections, and network sockets need to be properly closed when you are done with them. Forgetting to close a file can corrupt data. Forgetting to close a database connection can exhaust the connection pool and crash your server. Context managers make cleanup automatic — you cannot forget.

concepts/dataclasses-explained.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
A **dataclass** is the easy way to create a class that holds data. Instead of writing `__init__`, `__repr__`, and `__eq__` yourself, Python generates them for you.
44

5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) || [Quiz](quizzes/dataclasses-explained-quiz.py) | [Flashcards](../practice/flashcards/README.md) ||
12+
13+
<!-- modality-hub-end -->
14+
515
## The problem dataclasses solve
616

717
Here is a plain class that stores a person's information:

concepts/debugging-methodology.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
Debugging is the systematic process of finding and fixing bugs. It is not about staring at code until you see the problem — it is a repeatable method that works on any bug, in any language. The best debuggers are not the smartest programmers; they are the most methodical.
44

5+
<!-- modality-hub-start -->
6+
7+
### Learn Your Way
8+
9+
| Read | Build | Watch | Test | Review | Visualize |
10+
|:---: | :---: | :---: | :---: | :---: | :---:|
11+
| **You are here** | [Projects](#practice) || [Quiz](quizzes/debugging-methodology-quiz.py) | [Flashcards](../practice/flashcards/README.md) ||
12+
13+
<!-- modality-hub-end -->
14+
515
## Why This Matters
616

717
You will spend more time debugging than writing new code. A systematic approach turns frustrating hours of "why does this not work?" into a predictable process. The method described here — Reproduce, Isolate, Hypothesize, Test, Fix, Verify, Prevent — works for everything from a typo to a race condition.

0 commit comments

Comments
 (0)