Sources

Every factual claim in this course, the exact wording it came from, and where to check it.

Flagged as ungrounded

These could not be traced to a primary source. They are listed here rather than quietly dropped.

Every load-bearing number, command, error string, and claim in this course traces to a row below. Quotes are verbatim. Where a fact could not be verified, it appears under Ungrounded and the course either cuts it, teaches the method for finding it, or flags it in the topic.

Research date: 29 July 2026, confirmed 13 August 2026. Angles: A1 primary source · A2 authoritative numbers · A3 current-state check (a=Python, b=macOS, c=Linux, d=WSL) · A4 misconception harvest · A5 prior-art gap.

13 August confirmation. Python docs are now 3.14.7 (page footer "Last updated on Aug 13, 2026"). The http.server CLI contract is unchanged: default port 8000, bind-all, HTTP/1.0, index.html index pages, production warning, CGI removed in 3.15. Captured teaching output remains the 3.14.6 run from 29 July (Server: SimpleHTTP/0.6 Python/3.14.6). WSL mirrored-mode LAN path is still documented on Microsoft Learn as Win 11 22H2+, not the default. RFC 1918 and the IANA port table are unchanged. No spine number moved.


Primary


Ledger

Filesystem, paths, permissions

#ClaimValue / verbatim quoteSourceAngle
1macOS home directories live under /Users"/Users—This directory contains one or more user home directories. The user home directory is where user-related files are stored."https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.htmlA3b
2Linux home is /home/<user>echo $HOME/home/colin; passwd: colin:x:1000:1000:Ubuntu:/home/colin:/usr/bin/bashcommand: echo $HOME; getent passwd colinA3c
3WSL: Windows drives mount at /mnt/c"the Windows file system C:\ drive (C:\Users\<user name>\Project) will look like this when mounted in a WSL command line: /mnt/c/Users/<user name>/Project$."https://learn.microsoft.com/en-us/windows/wsl/filesystemsA3d
4WSL: put project files in the Linux filesystem, not /mnt/c"We recommend against working across operating systems with your files, unless you have a specific reason for doing so. For the fastest performance speed, store your files in the WSL file system if you are working in a Linux command line (Ubuntu, OpenSUSE, etc)."https://learn.microsoft.com/en-us/windows/wsl/filesystemsA3d
5WSL: MS's own path contrast"Use the Linux file system root directory: /home/<user name>/Project — Not the Windows file system root directory: /mnt/c/Users/<user name>/Project$"https://learn.microsoft.com/en-us/windows/wsl/filesystemsA3d
6APFS default is case-INsensitive"APFS, like HFS+, is case-sensitive on iOS and is available in case-sensitive and case-insensitive variants on macOS, with case-insensitive being the default."https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/APFS_Guide/FAQ/FAQ.htmlA3b
7APFS is case-PRESERVING in all variants"APFS accepts only valid UTF-8 encoded filenames for creation, and preserves both case and normalization of the filename on disk in all variants."same as 6A3b
8Linux filesystems are case-SENSITIVE — provenindex.html inode 4924918, Index.html inode 4924919; cat returns lowercase file vs UPPERCASE filecommand: ls -li; stat -c '%n %i %s' index.html Index.htmlA3c
9WSL Linux FS case-sensitive; /mnt/c is not"When working in the WSL file system, you are running Linux, thus files and directories are treated as case-sensitive by default." + "NTFS-formatted drives mounted to a WSL distribution will be case-insensitive by default."https://learn.microsoft.com/en-us/windows/wsl/case-sensitivityA3d
10Real ls -la teaching blockdrwxr-xr-x. 3 colin ubuntu 120 Jul 29 04:25 . / -rw-------. 1 colin ubuntu 14 Jul 29 04:25 .env / -rw-r--r--. 1 colin ubuntu 12 Jul 29 04:25 index.html / drwxr-xr-x. 2 colin ubuntu 40 Jul 29 04:25 projectscommand: ls -laA3c
11An 11th character may follow the permission stringTrailing . is an SELinux security-context marker (Fedora/RHEL hosts). Plain Ubuntu/Debian prints 10 characters, no dot.command: ls -la; ls -ZA3c
12Default umask sets new-file modesUbuntu default umask 0022 → files 644, directories 755command: umaskA3c
13ls -a reveals dotfiles-a → "do not ignore entries starting with ." ; -l → "use a long listing format"https://manpages.ubuntu.com/manpages/noble/en/man1/ls.1.htmlA1
14ls with no argument lists the current directory"List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort is specified."https://manpages.ubuntu.com/manpages/noble/en/man1/ls.1.htmlA1

Shell and commands

#ClaimValue / verbatim quoteSourceAngle
15cd is a shell builtin, not a coreutils program"cd — change the working directory" / "The cd utility shall change the working directory of the current shell execution environment"https://pubs.opengroup.org/onlinepubs/9799919799/utilities/cd.htmlA1
16Absolute paths are defined by a leading /"If the directory operand begins with a character, set curpath to the operand and proceed to step 7."https://pubs.opengroup.org/onlinepubs/9799919799/utilities/cd.htmlA1
17Bare cd goes to $HOME — the origin of ~"If no directory operand is given and the HOME environment variable is set to a non-empty value, the cd utility shall behave as if the directory named in the HOME environment variable was specified as the directory operand."https://pubs.opengroup.org/onlinepubs/9799919799/utilities/cd.htmlA1
18cd - toggles and prints the destinationAlternates /etc/var/log, echoing the directory moved to; backed by $OLDPWDcommand: cd /etc; cd /var/log; cd -; cd -A3c
19mkdir -p creates parents and is idempotent"-p, --parents" → "no error if existing, make parent directories as needed". Without -p: mkdir: cannot create directory '.../x/y/z': No such file or directory and mkdir: cannot create directory '.../a': File existshttps://manpages.ubuntu.com/manpages/noble/en/man1/mkdir.1.html + commandA1, A3c
20mv is both rename and move"mv - move (rename) files" / "Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY."https://manpages.ubuntu.com/manpages/noble/en/man1/mv.1.htmlA1
21cp needs -r for directories"-R, -r, --recursive" → "copy directories recursively"https://manpages.ubuntu.com/manpages/noble/en/man1/cp.1.htmlA1
22rm refuses directories by default"rm removes each specified file. By default, it does not remove directories."https://manpages.ubuntu.com/manpages/noble/en/man1/rm.1.htmlA1
23rm flag semantics"-f, --force" → "ignore nonexistent files and arguments, never prompt"; "-i" → "prompt before every removal"; "-r, -R, --recursive" → "remove directories and their contents recursively"https://manpages.ubuntu.com/manpages/noble/en/man1/rm.1.htmlA1
24mv/cp safety flags"-i, --interactive" → "prompt before overwrite"; "-n, --no-clobber" → "do not overwrite an existing file"https://manpages.ubuntu.com/manpages/noble/en/man1/mv.1.htmlA1
25grep -rn output shapeREADME.md:179:**Activity types** (9): readings, lectures, flashcards, podcasts, quizzes, games, music (jam),command: grep -rn "flashcard" README.mdA3c
26Searching a single file omits the path: prefixGNU grep prints line:text only when given one file; -H forces the filenamecommand: grep -rn on one file vs a directoryA3c
27wc output columnswc /etc/hosts 7 40 384 /etc/hosts (lines, words, bytes); wc -l /etc/hosts7 /etc/hostscommand: wc /etc/hostsA3c
28Linux default shell is bash; prompt ends $echo $SHELL/usr/bin/bash; stock PS1 \u@\h:\w\$ renders colin@seamus:~$. The \$ escape prints # when uid is 0.command: echo $SHELL; grep -n "PS1=" /etc/skel/.bashrcA3c
29/bin/sh is NOT bash on Ubuntu/Debianlrwxrwxrwx 1 ... /bin/sh -> dashcommand: ls -l /bin/sh /bin/bashA3c
30macOS default shell is zsh; prompt ends %"Starting with macOS Catalina, your Mac uses zsh as the default login shell and interactive shell." + zsh manual: "%# — A '#' if the shell is running with privileges, a '%' if not."https://support.apple.com/en-au/HT208050 · https://zsh.sourceforge.io/Doc/Release/Prompt-Expansion.htmlA3b
31Terminal.app location"In the Finder, open the /Applications/Utilities folder, then double-click Terminal."https://support.apple.com/guide/terminal/open-or-quit-terminal-apd5265185d-f365-44cb-8b09-71a064a42125/macA3b
32Ubuntu/Fedora default terminal is now Ptyxis, not GNOME Terminal"Ptyxis is the new default terminal emulator introduced in Ubuntu 26.04, replacing the traditional GNOME Terminal." Default since Ubuntu 25.04; Fedora Workstation 41+ (GNOME 47).https://ubuntu.fan/en/docs/desktop-use/basics/default-apps-changes · https://discussion.fedoraproject.org/t/gnome-terminal-is-ptyxis-now/131691A3c
33Windows Terminal is MS's recommended host"We recommend using WSL with Windows Terminal, especially if you plan to work with multiple command lines."https://learn.microsoft.com/en-us/windows/wsl/setup/environmentA3d
34nano ships by default on Ubuntu and FedoraUbuntu Priority: standard; apt-cache rdepends nanoubuntu-standard, ubuntu-wsl. Fedora ships nano-default-editor in @standard and sets $EDITOR.command: apt-cache show nano, apt-cache rdepends nano · https://fedoraproject.org/wiki/Changes/UseNanoByDefaultA3c
35Current Ubuntu LTSUbuntu 26.04 LTS "Resolute Raccoon", released 2026-04-23https://canonical.com/blog/canonical-releases-ubuntu-26-04-lts-resolute-raccoonA3c

Networking — addresses and ports

#ClaimValue / verbatim quoteSourceAngle
36Ports are a 16-bit namespace → 0–65535"TCP, UDP, UDP-Lite, SCTP, and DCCP use 16-bit namespaces for their port number registries."https://www.rfc-editor.org/rfc/rfc6335.txtA2
37TCP header port fields are 16 bits"Source Port: 16 bits" / "Destination Port: 16 bits"https://www.rfc-editor.org/rfc/rfc9293.txtA2
38Port 0 is Reserved → bindable range is 1–65535IANA CSV: ,0,tcp,Reserved,,,,2024-12-20,[RFC6335],,,https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csvA2
39System / Well-Known Ports = 0–1023"o the System Ports, also known as the Well Known Ports, from 0-1023 (assigned by IANA)"https://www.rfc-editor.org/rfc/rfc6335.txtA2
40User / Registered Ports = 1024–49151"o the User Ports, also known as the Registered Ports, from 1024-49151 (assigned by IANA)"https://www.rfc-editor.org/rfc/rfc6335.txtA2
41Dynamic / Private Ports = 49152–65535"o the Dynamic Ports, also known as the Private or Ephemeral Ports, from 49152-65535 (never assigned)"https://www.rfc-editor.org/rfc/rfc6335.txtA2
42Port 80 = httpIANA CSV: http,80,tcp,World Wide Web HTTP,[IESG],[IETF_Chair],,2021-10-01,[RFC9110],,,https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csvA2
43Port 443 = httpsIANA CSV: https,443,tcp,http protocol over TLS/SSL,[IESG],[IETF_Chair],,2021-10-01,[RFC9110],,,same as 42A2
44Port 22 = sshIANA CSV: ssh,22,tcp,The Secure Shell (SSH) Protocol,,,,,[RFC4251],,,same as 42A2
45Port 8000 is NOT registered as HTTP — it is irdmiIANA CSV: irdmi,8000,tcp,iRDMI,[Gil_Shafriri],[Gil_Shafriri],,,,,, — no RFC reference, no relation to HTTP. Dev-server use is pure convention.same as 42A2
46A registered port implies nothing about the traffic"ASSIGNMENT OF A PORT NUMBER DOES NOT IN ANY WAY IMPLY AN ENDORSEMENT OF AN APPLICATION OR PRODUCT, AND THE FACT THAT NETWORK TRAFFIC IS FLOWING TO OR FROM A REGISTERED PORT DOES NOT MEAN THAT IT IS "GOOD" TRAFFIC"https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txtA2
47RFC 1918 private IPv4 blocks" 10.0.0.0 - 10.255.255.255 (10/8 prefix)" / " 172.16.0.0 - 172.31.255.255 (172.16/12 prefix)" / " 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)"https://www.rfc-editor.org/rfc/rfc1918.txtA2
48Private addressing needs no coordination with IANA"An enterprise that decides to use IP addresses out of the address space defined in this document can do so without any coordination with IANA or an Internet registry."https://www.rfc-editor.org/rfc/rfc1918.txtA2
49Loopback is the whole 127/8, not just 127.0.0.1RFC 1122 §3.2.1.3 form (g): "(g) { 127, }" / "Internal host loopback address. Addresses of this form MUST NOT appear outside a host."https://www.rfc-editor.org/rfc/rfc1122.txtA2
50Loopback block in CIDRRFC 6890 Table 4: "Address Block127.0.0.0/8" / "NameLoopback" / "Forwardable
51Real loopback interface outputinet 127.0.0.1/8 scope host locommand: ip -4 addr showA3c
52IPv4 is 32 bits / four octets"Addresses are fixed length of four octets (32 bits)."https://www.rfc-editor.org/rfc/rfc791.txtA2
53IPv6 is 128 bits"IPv6 increases the IP address size from 32 bits to 128 bits"https://www.rfc-editor.org/rfc/rfc8200.txtA2
54An IP socket address is address + 16-bit port"An IP socket address is defined as a combination of an IP interface address and a 16-bit port number."https://man7.org/linux/man-pages/man7/ip.7.htmlA2
55Ports below 1024 are privileged"The port numbers below 1024 are called privileged ports (or sometimes: reserved ports). Only a privileged process (on Linux: a process that has the CAP_NET_BIND_SERVICE capability in the user namespace governing its network namespace) may bind(2) to these sockets."https://man7.org/linux/man-pages/man7/ip.7.htmlA2
56The privileged-port threshold is a tunable, default 1024"ip_unprivileged_port_start - INTEGER ... Default: 1024". Verified locally: net.ipv4.ip_unprivileged_port_start = 1024https://docs.kernel.org/networking/ip-sysctl.html + command: sysctl net.ipv4.ip_unprivileged_port_startA2, A3c
57Linux's real ephemeral range differs from IANA's"The default values are 32768 and 60999 respectively." (ip_local_port_range) — not the IANA Dynamic range 49152–65535https://docs.kernel.org/networking/ip-sysctl.htmlA2
58ss -tlnp real outputLISTEN 0 5 0.0.0.0:8000 0.0.0.0:* users:(("python3",pid=8,fd=4))command: ss -tlnpA3c
59ss -p shows your own processes without sudoThe Process column is populated for processes you own and blank for other users'; sudo ss -tlnp fills every rowcommand: ss -tlnp before/after starting an owned listenerA3c
60ss flag meanings-t TCP, -u UDP, -l listening, -n don't resolve service names, -p show processcommand: ss --helpA3c
61netstat is officially obsolete on Linuxnetstat(8) NOTES: "This program is mostly obsolete. Replacement for netstat is ss. Replacement for netstat -r is ip route."command: man netstatA3c
62ifconfig is no longer installed by defaultCanonical: "We've already stopped installing ifconfig on desktops (it still gets installed on servers for now)"https://ubuntu.com/blog/if-youre-still-using-ifconfig-youre-living-in-the-pastA3c
63macOS has no ip or ssNo ip(8) or ss man page exists in the current macOS/Xcode man-page set; both are Linux iproute2 tools. Negative evidence.https://keith.github.io/xcode-man-pages/A3b
64macOS LAN IPv4 commandipconfig(8) getifaddr: "Prints to standard output the IP address for the first network service associated with the given interface. The output will be empty if no service is currently configured or active on the interface."https://keith.github.io/xcode-man-pages/ipconfig.8.htmlA3b
65macOS Wi-Fi is not reliably en0Apple Silicon Macs have been observed reporting Wi-Fi as en2. Discover with networksetup(8) -listallhardwareports: "Displays list of hardware ports with corresponding device name and ethernet address."https://developer.apple.com/forums/thread/820120 · https://keith.github.io/xcode-man-pages/networksetup.8.htmlA3b
66macOS listening-port commandlsof(8): -P "inhibits the conversion of port numbers to port names for network files"; -n "inhibits the conversion of network numbers to host names for network files"https://keith.github.io/xcode-man-pages/lsof.8.htmlA3b
67macOS netstat -a needed to see listeners"The socket is listening for incoming connections. Unconnected listening sockets like these are only displayed when using the -a option."https://keith.github.io/xcode-man-pages/netstat.1.htmlA3b

Names and DNS

#ClaimValue / verbatim quoteSourceAngle
68Real /etc/hosts localhost line127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 and ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6command: cat /etc/hostsA3c
69/etc/hosts is consulted before DNShosts: files mdns4_minimal [NOTFOUND=return] dns myhostnamefiles precedes dnscommand: grep ^hosts /etc/nsswitch.confA3c
70macOS has /etc/hosts at the same pathhosts(5): "hosts — host name data base"https://keith.github.io/xcode-man-pages/hosts.5.htmlA3b
71dig was NOT removed from macOSdig(1) is present in the current (Xcode 27.0 beta 4) man-page set: "dig - DNS lookup utility". host(1) and nslookup(1) also ship. No DNS-tool removal appears in the macOS 15 or macOS 26 release notes.https://keith.github.io/xcode-man-pages/dig.1.htmlA3b
72macOS dig bypasses the system resolver"The dig command does not use the host name and address resolution or the DNS query routing mechanisms used by other processes running on macOS."https://keith.github.io/xcode-man-pages/dig.1.htmlA3b
73dig is NOT preinstalled on Debian/Ubuntu/WSLdpkg -S /usr/bin/digbind9-dnsutils. dnsutils is a "Transitional package for bind9-dnsutils". Absent from the Ubuntu 24.04 WSL manifest. Install: sudo apt install bind9-dnsutilscommand: dpkg -S, apt-cache show dnsutils · https://cloud-images.ubuntu.com/wsl/noble/current/ubuntu-noble-wsl-amd64-wsl.manifestA3c, A3d

HTTP

#ClaimValue / verbatim quoteSourceAngle
74What HTTP is"HTTP is a protocol for fetching resources such as HTML documents. It is the foundation of any data exchange on the Web and it is a client-server protocol, which means requests are initiated by the recipient, usually the Web browser."https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/OverviewA1
75Requests and responses are discrete messages"Clients and servers communicate by exchanging individual messages (as opposed to a stream of data). The messages sent by the client are called requests and the messages sent by the server as an answer are called responses."same as 74A1
76HTTP is human-readable"HTTP is generally designed to be human-readable... HTTP messages can be read and understood by humans, providing easier testing for developers, and reduced complexity for newcomers."same as 74A1
77HTTP is stateless"HTTP is stateless: there is no link between two requests being successively carried out on the same connection."same as 74A1
78Minimal real requestGET / HTTP/1.1 / Host: developer.mozilla.org / Accept-Language: frsame as 74A1
79Every HTTP message has the same four parts"1. A start-line ... 2. An optional set of HTTP headers ... 3. An empty line indicating the metadata of the message is complete. 4. An optional body containing data associated with the message."https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MessagesA1
80Request-line grammar<method> <request-target> <protocol>same as 79A1
81Status-line grammar<protocol> <status-code> <reason-phrase>same as 79A1
82The reason phrase is decorative"The optional text after the status code is a brief, purely informational, text description of the status to help a human understand the outcome of a request."same as 79A1
83Head vs body"The start-line and headers of the HTTP message are collectively known as the head of the requests, and the part afterwards that contains its content is known as the body."same as 79A1
84Status codes group into five classesInformational (100199), Successful (200299), Redirection (300399), Client error (400499), Server error (500599)https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/StatusA1
85200 OK"The 200 (OK) status code indicates that the request has succeeded. The content sent in a 200 response depends on the request method." (RFC 9110 §15.3.1)https://www.rfc-editor.org/rfc/rfc9110.txtA2
86301 Moved Permanently"The 301 (Moved Permanently) status code indicates that the target resource has been assigned a new permanent URI and any future references to this resource ought to use one of the enclosed URIs." (§15.4.2)same as 85A2
87304 Not Modified"The 304 (Not Modified) status code indicates that a conditional GET or HEAD request has been received and would have resulted in a 200 (OK) response if it were not for the fact that the condition evaluated to false." (§15.4.5)same as 85A2
88404 Not Found"The 404 (Not Found) status code indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists." (§15.5.5)same as 85A2
89500 Internal Server Error"The 500 (Internal Server Error) status code indicates that the server encountered an unexpected condition that prevented it from fulfilling the request." (§15.6.1)same as 85A2
90404 in beginner terms"The server cannot find the requested resource. In the browser, this means the URL is not recognized. ... This response code is probably the most well known due to its frequent occurrence on the web."https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/StatusA1
91HTTP/1.1 requires a Host header"A client MUST send a Host header field (Section 7.2 of [HTTP]) in all HTTP/1.1 request messages."https://www.rfc-editor.org/rfc/rfc9112.txtA2
92Missing/duplicate Host → 400"A server MUST respond with a 400 (Bad Request) status code to any HTTP/1.1 request message that lacks a Host header field and to any request message that contains more than one Host header field line"same as 91A2
93What Host is for"The "Host" header field in a request provides the host and port information from the target URI, enabling the origin server to distinguish among resources while servicing requests for multiple host names."https://www.rfc-editor.org/rfc/rfc9110.txtA2
94Content-Type"The "Content-Type" header field indicates the media type of the associated representation"same as 93A2
95Content-Length"The "Content-Length" header field indicates the associated representation's data length as a decimal non-negative integer number of octets."same as 93A2
96RFC 9110 obsoletes the 723x series"Obsoletes: 2818, 7230, 7231, 7232, 7233, 7235, 7538, 7615, 7694" / "STD: 97" / "June 2022"same as 93A2
97RFC 2616 → 723x → 911xDatatracker, RFC 2616: "Obsoleted by RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235"https://datatracker.ietf.org/doc/rfc2616/A2

URLs

#ClaimValue / verbatim quoteSourceAngle
98What a URL is"A URL (Uniform Resource Locator) is the address of a unique resource on the internet."https://developer.mozilla.org/en-US/docs/Learn_web_development/Howto/Web_mechanics/What_is_a_URLA1
99Scheme"The first part of the URL is the scheme, which indicates the protocol that the browser must use to request the resource"same as 98A1
100Authority = domain + port"Next follows the authority, which is separated from the scheme by the character pattern ://. If present the authority includes both the domain (e.g., www.example.com) and the port (80), separated by a colon"same as 98A1
101An IP address may replace the domain"The domain indicates which Web server is being requested. Usually this is a domain name, but an IP address may also be used (but this is rare as it is much less convenient)."same as 98A1
102Port as a "gate"; why :8000 must be typed"The port indicates the technical "gate" used to access the resources on the web server. It is usually omitted if the web server uses the standard ports of the HTTP protocol (80 for HTTP and 443 for HTTPS) to grant access to its resources. Otherwise it is mandatory."same as 98A1
103The URL path was once a literal file path"/path/to/myfile.html is the path to the resource on the Web server. In the early days of the Web, a path like this represented a physical file location on the Web server. Nowadays, it is mostly an abstraction handled by Web servers without any physical reality."same as 98A1
104The fragment never reaches the server"It is worth noting that the part after the #, also known as the fragment identifier, is never sent to the server with the request." Also MDN URI reference: "The fragment is not sent to the server when the URI is requested; it is processed by the client (e.g., the browser) after the resource is retrieved."same as 98 · https://developer.mozilla.org/en-US/docs/Web/URI/Reference/FragmentA1, A4
105The address bar needs an absolute URL"In your browser's address bar, a URL doesn't have any context, so you must provide a full (or absolute) URL"same as 98A1

The server — python3 -m http.server

#ClaimValue / verbatim quoteSourceAngle
106Invocation and default port"The server listens to port 8000 by default." --help: port bind to this port (default: 8000)https://docs.python.org/3/library/http.server.html + command: python3 -m http.serverA1, A3a
107Default bind is all interfaces"Specifies a specific address to which it should bind. Both IPv4 and IPv6 addresses are supported. By default, the server binds itself to all interfaces." Verified: ss -ltnLISTEN 0 5 0.0.0.0:8000same as 106A1, A3a
108Startup banner (stdout)Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...command: python3 -u -m http.server 8000A3a
109The server speaks HTTP/1.0 by defaultCPython source line 694: protocol_version = "HTTP/1.0" (BaseHTTPRequestHandler; not overridden by SimpleHTTPRequestHandler). Docs: "For backwards compatibility, the setting defaults to 'HTTP/1.0'." Live response line: HTTP/1.0 200 OKhttps://github.com/python/cpython/blob/3.14/Lib/http/server.py + command: curl -IA3a
110It serves the current working directory"Specifies a directory to which it should serve the files. By default, the server uses the current directory." (-d/--directory added in 3.7)https://docs.python.org/3/library/http.server.htmlA1, A3a
111URL path maps to a local file path"The request is mapped to a local file by interpreting the request as a path relative to the current working directory."same as 110A1
112Why index.html is special"If the request was mapped to a directory, the directory is checked for an index page as specified by index_pages. If found, the file's contents are returned; otherwise a directory listing is generated by calling the list_directory() method." index_pages "Defaults to (\"index.html\", \"index.htm\")."same as 110A1, A3a
113Real full curl -I responseHTTP/1.0 200 OK / Server: SimpleHTTP/0.6 Python/3.14.6 / Date: Wed, 29 Jul 2026 04:26:16 GMT / Content-type: text/html / Content-Length: 31 / Last-Modified: Wed, 29 Jul 2026 04:23:59 GMTcommand: curl -sS -I http://localhost:8000/index.htmlA3a
114A served .html file gets Content-type: text/html with NO charsetReal file → Content-type: text/html (lowercase "t", no charset). Only the generated directory listing gets Content-type: text/html; charset=utf-8, and the 404 page Content-Type: text/html;charset=utf-8.command: curl -sS -I against a file, a directory, and a missing pathA3a
115Real access-log line127.0.0.1 - - [29/Jul/2026 04:26:16] "GET /nope HTTP/1.1" 404 -command: python3 -u -m http.server 8000A3a
116Access log goes to stderr; the banner goes to stdoutSource line 656: sys.stderr.write("%s - - [%s] %s\n" % ...). Timestamp is local time with no timezone suffix; the size field is always -.source http/server.py:656 + command: redirect stdout and stderr separatelyA3a
117The request line in the log echoes the client's versionLog shows "GET /nope HTTP/1.1" (the client's request) while the response is HTTP/1.0command: curl against the serverA3a
118Server: header leaks the Python versionserver_version = "SimpleHTTP/" + __version__ with __version__ = "0.6", plus sys_version = "Python/" + sys.version.split()[0]source http/server.py:83,304,719A3a
119Port 80 as non-root failsPermissionError: [Errno 13] Permission denied, raised from socketserver.py self.socket.bind(self.server_address); exit code 1. Raw errno 13 = EACCES.command: python3 -m http.server 80 (uid 1000)A3a, A3c
120Port already in useOSError: [Errno 98] Address already in use on Linux; Errno 48 on macOS. Exit code 1.command: two servers on port 8000A3a
121Ctrl-C outputKeyboard interrupt received, exiting.source http/server.py:1360-1362 + command: kill -INTA3a
122Production warning"http.server is not recommended for production. It only implements basic security checks."https://docs.python.org/3/library/http.server.htmlA1, A3a
123The concrete reason why"SimpleHTTPRequestHandler will follow symbolic links when handling requests which makes it possible for files outside of the specified directory to be served."same as 122A1, A3a
124The module is not deprecated (one sub-feature is)Only: "Deprecated since version 3.13, will be removed in version 3.15: CGIHTTPRequestHandler is being removed in 3.15" and the --cgi flag. The module itself is current.same as 122A3a
125Python 2's SimpleHTTPServer is deadModuleNotFoundError: No module named 'SimpleHTTPServer'; python2: command not found; bare python absentcommand: python3 -c "import SimpleHTTPServer"A3a
126Current stable Python3.14.6, released 10 June 2026https://www.python.org/downloads/source/A3a
127macOS ships no Python runtimemacOS 12.3 release notes: "Python 2.7 was removed from macOS in this update. Developers should use Python 3 or an alternative language instead. (39795874)" Catalina notes: "Future versions of macOS won't include scripting language runtimes by default, and might require you to install additional packages. (49764202)"https://developer.apple.com/documentation/macos-release-notes/macos-12_3-release-notes · https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notesA3b
128What a Mac beginner sees typing python3GUI dialog: "The "python3" command requires the command line developer tools. Would you like to install the tools now?" Python docs: "Recent versions of macOS include a python3 command in /usr/bin/python3 that links to a usually older and incomplete version of Python provided by and for use by ... Xcode or the Command Line Tools for Xcode."https://developer.apple.com/forums/thread/698531 · https://docs.python.org/3/using/mac.htmlA3a, A3b
129The macOS fixxcode-select(1) --install: "Opens a user interface dialog to request automatic installation of the command line developer tools."https://keith.github.io/xcode-man-pages/xcode-select.1.htmlA3b
130Ubuntu/WSL ships python3, curl, nano, ip, ssWSL manifest: python3 3.12.3-0ubuntu2, curl 8.5.0-2ubuntu10.6, nano 7.2-2ubuntu0.1, iproute2 6.1.0-1ubuntu6 (provides ip and ss)https://cloud-images.ubuntu.com/wsl/noble/current/ubuntu-noble-wsl-amd64-wsl.manifestA3d

Reaching it from another device

#ClaimValue / verbatim quoteSourceAngle
131curl status-code idiomcurl -s -o /dev/null -w '%{http_code}\n' https://example.com200command: as shownA3c
132curl 8.x wording for a closed portcurl: (7) Failed to connect to 127.0.0.1:9999 after 0 ms: Could not connect to server (exit 7). "Connection refused" appears only under -v: connect to 127.0.0.1 port 9999 from 127.0.0.1 port 48604 failed: Connection refusedcommand: curl http://127.0.0.1:9999, curl -v ...A3c
133The underlying errno for refusederrno=111 [Errno 111] Connection refused (ECONNREFUSED)command: python3 -c "socket.connect(('127.0.0.1',9999))"A3c
134Refused vs unreachable is a timing differenceRefused = instant, exit 7. Unreachable (192.0.2.1, RFC 5737 TEST-NET) = curl: (28) Operation timed out after 4002 milliseconds with 0 bytes received, exit 28.command: curl --max-time 4 http://192.0.2.1/A3c
135A failed ping does not mean the network is downIn a restricted environment: ping: socktype: SOCK_RAW / ping: socket: Operation not permitted / ping: => missing cap_net_raw+p capability or setuid? — failing even for 127.0.0.1, while curl to the internet succeeded on the same machine.command: ping -c 3 127.0.0.1; getcap /usr/bin/ping; capsh --printA3c
136WSL2: LAN access does not work by default"When using a WSL 1 distribution, if your computer was set up to be accessed by your LAN, then applications run in WSL could be accessed on your LAN as well. This isn't the default case in WSL 2. WSL 2 has a virtualized ethernet adapter with its own unique IP address. Currently, to enable this workflow you will need to go through the same steps as you would for a regular virtual machine. (We are looking into ways to improve this experience.)"https://learn.microsoft.com/en-us/windows/wsl/networkingA1, A3d
137NAT is still the WSL default in 2026"By default WSL uses a NAT based architecture, and we recommend trying the new Mirrored networking mode". networkingMode default = NAT.https://learn.microsoft.com/en-us/windows/wsl/networking · https://learn.microsoft.com/en-us/windows/wsl/wsl-configA3d
138Windows→WSL localhost forwarding works"you can access it from a Windows app (like your Edge or Chrome internet browser) using localhost (just like you normally would)."https://learn.microsoft.com/en-us/windows/wsl/networkingA1, A3d
139Apps must accept LAN connections"When using remote IP addresses to connect to your applications, they will be treated as connections from the Local Area Network (LAN). This means that you will need to make sure your application can accept LAN connections. For example, you may need to bind your application to 0.0.0.0 instead of 127.0.0.1." (python3 -m http.server already does — see row 107)same as 138A1, A3d
140Mirrored mode enables LAN access"On machines running Windows 11 22H2 and higher you can set networkingMode=mirrored under [wsl2] in the .wslconfig file to enable mirrored mode networking." Benefits list includes: "Connect to WSL directly from your local area network (LAN)"same as 138A1, A3d
141Mirrored mode is GA, not experimental, not the defaultnetworkingMode now sits in the main [wsl2] settings table with default NAT; it is no longer in the [experimental] table.https://learn.microsoft.com/en-us/windows/wsl/wsl-configA3d
142The Hyper-V firewall rule mirrored mode requires"Run the following command in PowerShell window with admin privileges to Configure Hyper-V firewall settings to allow inbound connections: New-NetFirewallHyperVRule -Name \"MyWebServer\" -DisplayName \"My Web Server\" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80"https://learn.microsoft.com/en-us/windows/wsl/networkingA3d
143The WSL VMCreatorId"The WSL VMCreatorId is {40E0AC32-46A5-438A-A0B2-2B479E8F2E90}."https://learn.microsoft.com/en-us/windows/security/operating-system-security/network-security/windows-firewall/hyper-v-firewallA3d
144Hyper-V firewall is on by default for WSL"On machines running Windows 11 22H2 and higher, with WSL 2.0.9 and higher, the Hyper-V firewall feature will be turned on by default."https://learn.microsoft.com/en-us/windows/wsl/networkingA3d
145The NAT-mode fallback commandnetsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)same as 144A1, A3d
146hostname -I vs -i"Using a lowercase "i" with the hostname command will generate a different result than using an uppercase "I". wsl hostname -i is your local machine (127.0.1.1 is a placeholder diagnostic address), whereas wsl hostname -I will return your local machine's IP address as seen by other machines"same as 144A1, A3d
147ipconfig.exe runs from inside WSL"WSL can run Windows tools directly from the WSL command line using [tool-name].exe." Example: ipconfig.exe | grep IPv4 | cut -d: -f2https://learn.microsoft.com/en-us/windows/wsl/filesystemsA3d
148.wslconfig location and the restart rule"The .wslconfig file does not exist by default. It must be created and stored in your %UserProfile% directory". "You must wait until the subsystem running your Linux distribution completely stops running and restarts... This typically takes about 8 seconds after closing ALL instances of the distribution shell."https://learn.microsoft.com/en-us/windows/wsl/wsl-configA3d
149Windows Firewall blocks inbound by default"The default behavior of Windows Firewall is to: - block all incoming traffic, unless solicited or matching a rule - allow all outgoing traffic, unless matching a rule"https://learn.microsoft.com/en-us/windows/security/operating-system-security/network-security/windows-firewall/A3d
150Public vs private profile matters"The public network profile is designed with higher security in mind for public networks... It's the default profile for unidentified networks." Check with Get-NetConnectionProfile.same as 149A3d
151macOS firewall alert wording"When your Mac detects an attempt to connect to an app you haven't added to the list and given access to, an alert message appears asking if you want to allow or deny the connection over the network or internet."https://support.apple.com/guide/mac-help/block-connections-to-your-mac-with-a-firewall-mh34041/macA3b
152WSL install prerequisites (Windows version)"You must be running Windows 10 version 2004 and higher (Build 19041 and higher) or Windows 11 to use the commands below." / wsl --install / "By default, the installed Linux distribution will be Ubuntu."https://learn.microsoft.com/en-us/windows/wsl/installA1, A3d
153WSL 2 is the default version"New Linux installations, installed using the wsl --install command, will be set to WSL 2 by default."same as 152A1, A3d

Misconceptions (distractor stock)

#ClaimValue / verbatim quoteSourceAngle
154Learners expect localhost to work from another device"So I want to directly connect to my apache2 server from my android device using localhost and not the servers IP (ex 192.168.1.70)." Companion question "Accessing localhost (xampp) from another computer over LAN network - how to?" has 903,096 views.https://stackoverflow.com/questions/58584142/ · https://stackoverflow.com/questions/5524116/A4
1550.0.0.0 vs 127.0.0.1 vs localhost are conflated"What is the difference between 0.0.0.0, 127.0.0.1 and localhost?" — 379,882 viewshttps://stackoverflow.com/questions/20778771/A4
156The firewall is the invisible second cause"Typing the 192.168.xxx.xxx:8080 in the browser of this device (ipad). But this doesn't work. "This site cannot be reached". ... First I switched off the firewall then I was able to request the site from another device. So it is a firewall setting." (71,123 views)https://superuser.com/questions/1228430/A4
157WSL learners hit exactly this wall"Connecting to WSL2 server via local network" — "I can't connect to my server from another computer in the same network. ... None of the above have worked" — 364,943 viewshttps://stackoverflow.com/questions/61002681/A4
158Address already in use reads as a broken machine"Node / Express: EADDRINUSE, Address already in use - how can I stop the process using the port?" — 1,833,924 viewshttps://stackoverflow.com/questions/4075287/A4
159command not found is read as "not installed""bash: pip: command not found" — 2,426,531 views; "zsh: command not found: brew" — 1,105,124 viewshttps://stackoverflow.com/questions/9780717/A4
160Being trapped in vim is the most-viewed question on Stack Overflow"How do I exit Vim?" — "I am stuck and cannot escape. It says: ... But when I type that it simply appears in the object body." 3,316,707 viewshttps://stackoverflow.com/questions/11828270/A4
161The $ prompt gets copy-pasted"The $ character in tutorials indicates a command prompt. It is not meant to be typed in." A dedicated tool exists: undollar — "Often when copy-pasting terminal commands from the internet you'll inadvertently end up also having copied the dollar sign at the beginning (especially if you triple-click to select)"https://mac.install.guide/terminal/command-not-found-$ · https://github.com/xtyrrell/undollarA4
162Hidden dotfiles read as "the folder is empty""Why doesn't this show the hidden files/folders?" (222,790 views); "How to show only hidden files in Terminal?" (1,009,429 views)https://askubuntu.com/questions/356902/A4
163The cwd mismatch reads as "the file is corrupted""command prompt says "No such file or directory" but the file exists" — "I copy n pasted a pathway for an existing file and just swapped the file with the one that im being told does not exist." (21,771 views)https://stackoverflow.com/questions/55672620/A4
164Absolute vs relative slash, with permanent consequences"Undo rm -r, restore data" — "I used rm -r /home/ instead of rm -r home/ as root. Is there anything I can do to restore my /home/ dir? ... Unfortunately I have no backups." (56,565 views)https://unix.stackexchange.com/questions/49080/A4
165rm has no trash — a professional-scale exampleGitLab's public postmortem: an engineer ran rm -rf on the wrong database host and destroyed live production data; "out of 5 backup/replication techniques deployed none are working reliably or set up in the first place"https://about.gitlab.com/blog/gitlab-dot-com-database-incident/A4
166Renaming the extension is believed to convert the file"Saving one file format with a different file extension. JPG - PNG; MOV - MP4" — "From experience I know that if I save .jpg file with an .png extension (or vice versa) the most programs will open it as normally."https://superuser.com/questions/1576056/A4
167Spaces in filenames break unquoted commands"How to use cp command in bash script to copy files with spaces and $ characters in it?" (55,267 views)https://unix.stackexchange.com/questions/219750/A4
168A file:// URL is believed to be shareableTeaching resource documenting this exact student failure: "If the address contains a drive letter (usually C://), you've accidentally linked to a file on your computer, not on the server" — "Such a link will work only on your computer."https://mason.gmu.edu/~dtaciuch/webdev/troublelinks.htmlA4
169Learners ask why a local server is needed at all"Is there an advantage to running code on a localhost as opposed to simply double clicking on the HTML file?" — "It seems I can simply click on an HTML file (say, index.html) and the app will display in my browser, so why go through all of the trouble of setting up a localhost?"https://teamtreehouse.com/community/is-there-an-advantage-to-running-code-on-a-localhost-as-opposed-to-simply-double-clicking-on-the-html-fileA4
170file:// breaks JS loading sibling files, and it reads as a path bug""Origin null is not allowed by Access-Control-Allow-Origin" in Chrome. Why?" — "I am just working with local files." (79,546 views). "Is it a path issue for product-color.html? All my three files are in the same root folder" (252,808 views). MDN: "Browsers commonly treat requests to load resources using the file:// scheme as cross-origin requests."https://stackoverflow.com/questions/5224017/ · https://stackoverflow.com/questions/27742070/ · https://developer.mozilla.org/en-US/docs/Learn_web_development/Howto/Tools_and_setup/set_up_a_local_testing_serverA4
171404 vs 500 — whose fault it is"A 404 means the client made a mistake (like requesting a page that doesn't exist)." — "The server is working fine — it just doesn't have what you're looking for." vs "A 500 means the server broke"https://hyperping.com/blog/404-vs-500-error-client-vs-server-errors-explainedA4
172http and https are believed to share a portStanding need to configure both: "Serve http (port 80) and https (port 443) on same VirtualHost" (176,498 views)https://serverfault.com/questions/303744/A4

The gap this course fills

#ClaimValue / verbatim quoteSourceAngle
173Librarian-documented literacy gaps in current college students"Not understanding how to navigate Microsoft OneDrive vs computer file directories (or: why doesn't my paper show up on the computer?)" · "Saving everything to desktop/not using file directories" · "Unable to use browser (only uses phone applications)" · "The technical understanding of computers, programs, and how they work just isn't there in many young adults"https://acrlog.org/2024/03/21/turn-it-off-and-on-again-digital-literacy-in-college-students/A5
174The hierarchy metaphor has no referent for this generationSarah Barrett (information architect) argues Gen Z never used physical filing cabinets, so the metaphor underpinning hierarchical directories has no referent; educators must teach the mental model explicitly rather than assume it.https://sarahrbarrett.com/gen-z-can-t-use-file-structuresA5
175Search displaced hierarchy as the organizing modelL. M. Sacasas, "A World Ordered Only By Search" — information is no longer ordered spatially, so "where is this file" is an unfamiliar question rather than a forgotten skill.https://theconvivialsociety.substack.com/p/a-world-ordered-only-by-searchA5
176Students don't know where files are saved (see Ungrounded — mirror-corroborated only)"Not only did they not know where their files were saved — they didn't understand the question." · "the concept of file folders and directories, essential to previous generations' understanding of computers, is gibberish to many modern students." · "In an age where every conceivable user interface includes a search function, young people have never needed folders or directories." — Monica Chin, File Not Found, The Verge, 22 Sept 2021https://www.theverge.com/22684730/students-file-folder-directory-structure-education-gen-zA5
177MIT's Missing Semester targets CS undergrads, not beginnersAssumes "a traditional Computer Science education"; the 2026 lecture list contains no networking, HTTP, or web-server lecture.https://missing.csail.mit.edu/A5
178CS50 deliberately removes the learner's own machinecs50.dev lets students "start programming with just a browser, without needing to install or configure anything locally on their own computer"https://cs50.readthedocs.io/cs50.dev/A5
179The closest prior art is gated behind the knowledge it should buildMDN, Set up a local testing server: "You need to first know how the Internet works, and what a Web server is." It also contains no instructions for reaching the server from another device.https://developer.mozilla.org/en-US/docs/Learn_web_development/Howto/Tools_and_setup/set_up_a_local_testing_serverA5
180Codecademy teaches the CLI as vocabulary inside a browser sandbox4 lessons (Navigating / Viewing & Changing the File System, Redirection, Environment); no networking, ports, HTTP, or servers; exercises run in an in-browser terminal.https://www.codecademy.com/learn/learn-the-command-lineA5
181Google IT Cert sequences networking before filesystem and never joins themCourse 2 covers IP, subnetting, ports/sockets, DNS bottom-up from the physical layer; the filesystem appears only in Course 3.https://www.coursera.org/learn/computer-networkingA5
182The Odin Project teaches web mechanics passively"How Does the Web Work?" is reading plus embedded videos with no hands-on component.https://www.theodinproject.com/lessons/foundations-how-does-the-web-workA5
183Ubuntu from the Microsoft Store (preferred install path for non-terminal learners)"Install a complete Ubuntu terminal environment in minutes with Windows Subsystem for Linux (WSL)." Store product id 9PDXGNCFSCZV. MS also lists the Store as a way to choose distros: "This can include choosing distributions from the Microsoft Store".https://apps.microsoft.com/detail/9pdxgncfsczv · https://learn.microsoft.com/en-us/windows/wsl/installA1, A3d
184WSL optional features must be on before a distro"You must first enable the "Windows Subsystem for Linux" optional feature before installing any Linux distributions on Windows." / "Before installing WSL 2, you must enable the Virtual Machine Platform optional feature."https://learn.microsoft.com/en-us/windows/wsl/install-manualA1, A3d
185Missing virtualisation features: 0x80370102 and "Catastrophic failure"MS: "Error: 0x80370102 The virtual machine could not be started because a required feature is not installed." — "Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS." Community fix for Store/WSL "Catastrophic failure": tick Windows Subsystem for Linux, Virtual Machine Platform, and Windows Hypervisor Platform in Turn Windows features on or off.https://learn.microsoft.com/en-us/windows/wsl/troubleshooting · https://stackoverflow.com/questions/79157482/A1, A3d, A4
186Windows Terminal from the Microsoft StoreStore product id 9N0DX20HK701. Install page: "Install Windows Terminal". MS WSL environment guide: "We recommend using WSL with Windows Terminal, especially if you plan to work with multiple command lines."https://apps.microsoft.com/detail/9n0dx20hk701 · https://learn.microsoft.com/en-us/windows/terminal/install · https://learn.microsoft.com/en-us/windows/wsl/setup/environmentA1, A3d

Ungrounded

Claims that could not be verified, and what was done about them.

Erase saved progress?

This erases all quiz scores, reading progress, project checklists, and your name on the certificate. It cannot be undone, and it affects only this course in this browser.