Skip to content

Commit 67c608a

Browse files
ohmohm
authored andcommitted
refactor: split curriculum by category
1 parent ca5caaa commit 67c608a

14 files changed

Lines changed: 833 additions & 752 deletions

File tree

‎src/data/curriculum.ts‎

Lines changed: 0 additions & 752 deletions
This file was deleted.

‎src/data/curriculum/addressing.ts‎

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import type { CurriculumModule } from "@/types/curriculum";
2+
3+
import { module } from "./shared";
4+
5+
export const networkLayerConceptModules: CurriculumModule[] = [
6+
["ip-address", "IP address", "A logical address for network delivery."],
7+
["ipv4-addressing", "IPv4 addressing", "32-bit addresses written as four octets."],
8+
["ipv6", "IPv6", "128-bit addressing for modern networks."],
9+
["subnet-mask", "Subnet mask", "Marks network bits and host bits."],
10+
["cidr", "CIDR", "Prefix notation for subnet size."],
11+
["default-gateway", "Default gateway", "Where packets go when the destination is remote."],
12+
["routing-basics", "Routing basics", "How routers choose a next hop for packets."],
13+
["icmp", "ICMP", "Control messages used for errors and diagnostics."],
14+
["ping", "Ping", "Tests reachability with ICMP echo."],
15+
["traceroute", "Traceroute", "Reveals hops along a path."],
16+
["routing-table", "Routing table", "Rules routers use to choose next hops."],
17+
["static-routing", "Static routing", "Manually configured network paths."],
18+
["dynamic-routing", "Dynamic routing", "Routers learn paths from protocols."],
19+
["nat", "NAT", "Translates private addresses to public addresses."],
20+
["fragmentation", "Fragmentation", "Splits oversized packets for smaller links."]
21+
].map(([id, title, shortDescription]) =>
22+
module({
23+
id,
24+
title,
25+
shortDescription,
26+
category: "Network Layer",
27+
difficulty: id === "dynamic-routing" || id === "nat" ? "intermediate" : "beginner",
28+
estimatedTime: "10 min",
29+
prerequisites: ["ip-address"],
30+
relatedModules: ["subnet-visualizer", "routing-visualizer"],
31+
osiLayer: 3,
32+
protocols: title.includes("IPv4")
33+
? ["IPv4"]
34+
: title.includes("IPv6")
35+
? ["IPv6"]
36+
: title === "ICMP"
37+
? ["ICMP"]
38+
: [],
39+
type: ["IPv4 addressing", "IPv6", "ICMP"].includes(title) ? "protocol" : "concept"
40+
})
41+
);
42+
43+
export const networkLayerLabModules: CurriculumModule[] = [
44+
module({
45+
id: "subnet-visualizer",
46+
title: "Subnet Visualizer",
47+
shortDescription: "Split an IPv4 address into network and host bits.",
48+
category: "Network Layer",
49+
difficulty: "beginner",
50+
estimatedTime: "12 min",
51+
prerequisites: ["binary-converter", "cidr"],
52+
relatedModules: ["default-gateway", "routing-visualizer"],
53+
osiLayer: 3,
54+
protocols: ["IPv4"],
55+
type: "lab"
56+
}),
57+
module({
58+
id: "routing-visualizer",
59+
title: "Routing Visualizer",
60+
shortDescription: "Watch packets follow the lowest-cost path.",
61+
category: "Network Layer",
62+
difficulty: "beginner",
63+
estimatedTime: "10 min",
64+
prerequisites: ["ip-address", "router"],
65+
relatedModules: ["routing-table", "traceroute"],
66+
osiLayer: 3,
67+
protocols: ["IPv4"],
68+
type: "lab"
69+
})
70+
];

‎src/data/curriculum/application.ts‎

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import type { CurriculumModule } from "@/types/curriculum";
2+
3+
import { module } from "./shared";
4+
5+
export const upperLayerConceptModules: CurriculumModule[] = [
6+
["sessions", "Sessions", "State that links related exchanges.", 5],
7+
[
8+
"connection-management",
9+
"Connection management",
10+
"Creating, maintaining, and ending sessions.",
11+
5
12+
],
13+
["tls-session-basics", "TLS session basics", "Secure session setup at a high level.", 5],
14+
["presentation-encoding", "Encoding", "Representing data in agreed formats.", 6],
15+
["compression", "Compression", "Reducing payload size before transfer.", 6],
16+
["encryption", "Encryption", "Protecting content from observers.", 6],
17+
["serialization", "Serialization", "Turning objects into transferable bytes.", 6]
18+
].map(([id, title, shortDescription, osiLayer]) =>
19+
module({
20+
id: String(id),
21+
title: String(title),
22+
shortDescription: String(shortDescription),
23+
category: Number(osiLayer) === 5 ? "Session Layer" : "Presentation Layer",
24+
difficulty: "intermediate",
25+
estimatedTime: "8 min",
26+
prerequisites: ["tcp-basics"],
27+
relatedModules: ["tls-basics"],
28+
osiLayer: Number(osiLayer),
29+
type: "concept"
30+
})
31+
);
32+
33+
export const applicationProtocolModules: CurriculumModule[] = [
34+
["dns-basics", "DNS", "Turns names into addresses.", ["DNS"]],
35+
["dhcp", "DHCP", "Automatically assigns host network settings.", ["DHCP"]],
36+
["http-basics", "HTTP", "Request and response protocol for the web.", ["HTTP"]],
37+
["https-tls", "HTTPS/TLS", "HTTP protected by TLS encryption.", ["HTTPS", "TLS"]],
38+
["ssh", "SSH", "Secure remote shell access.", ["SSH"]],
39+
["smtp", "SMTP", "Email transfer between mail servers.", ["SMTP"]],
40+
["ftp-sftp", "FTP/SFTP", "File transfer protocols.", ["FTP", "SFTP"]],
41+
["ntp", "NTP", "Keeps system clocks synchronized.", ["NTP"]]
42+
].map(([id, title, shortDescription, protocols]) =>
43+
module({
44+
id: String(id),
45+
title: String(title),
46+
shortDescription: String(shortDescription),
47+
category: "Application Layer",
48+
difficulty: "beginner",
49+
estimatedTime: "10 min",
50+
prerequisites: ["client-server-model", "ports"],
51+
relatedModules: ["dns-flow", "tcp-handshake"],
52+
osiLayer: 7,
53+
protocols: protocols as string[],
54+
type: "protocol"
55+
})
56+
);
57+
58+
export const applicationLabModules: CurriculumModule[] = [
59+
module({
60+
id: "dns-flow",
61+
title: "DNS Flow Visualizer",
62+
shortDescription: "Follow a recursive lookup from browser to answer.",
63+
category: "Application Layer",
64+
difficulty: "beginner",
65+
estimatedTime: "10 min",
66+
prerequisites: ["dns-basics", "client-server-model"],
67+
relatedModules: ["http-basics", "routing-visualizer"],
68+
osiLayer: 7,
69+
protocols: ["DNS"],
70+
type: "lab"
71+
}),
72+
module({
73+
id: "osi-model",
74+
title: "OSI Model Visualizer",
75+
shortDescription: "Inspect layers and encapsulation from data to bits.",
76+
category: "OSI Map",
77+
difficulty: "beginner",
78+
estimatedTime: "10 min",
79+
prerequisites: ["communication-basics"],
80+
relatedModules: ["tcp-handshake", "routing-visualizer"],
81+
type: "lab"
82+
})
83+
];

‎src/data/curriculum/cloud.ts‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import type { CurriculumModule } from "@/types/curriculum";
2+
3+
import { module } from "./shared";
4+
5+
export const cloudModules: CurriculumModule[] = [
6+
["load-balancer", "Load balancer", "Distributes requests across services."],
7+
["cdn", "CDN", "Caches content close to users."],
8+
["reverse-proxy", "Reverse proxy", "Fronts services and forwards requests."],
9+
["api-gateway", "API gateway", "Central entry point for APIs."],
10+
["vpc", "VPC", "A private cloud network boundary."],
11+
["cloud-subnets", "Subnets in cloud", "Address ranges inside a cloud network."],
12+
["security-groups", "Security groups", "Cloud-native traffic rules."],
13+
["zero-trust", "Zero Trust basics", "Verify access continuously instead of trusting location."]
14+
].map(([id, title, shortDescription]) =>
15+
module({
16+
id,
17+
title,
18+
shortDescription,
19+
category: "Cloud & Modern Networks",
20+
difficulty: "intermediate",
21+
estimatedTime: "10 min",
22+
prerequisites: ["subnet-visualizer", "firewalls"],
23+
relatedModules: ["vpc", "security-groups"],
24+
type: "concept"
25+
})
26+
);

‎src/data/curriculum/devices.ts‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { CurriculumModule } from "@/types/curriculum";
2+
3+
import { module } from "./shared";
4+
5+
export const deviceModules: CurriculumModule[] = [
6+
["host", "Host", "An endpoint that sends or receives data.", "Devices", 1],
7+
["nic", "NIC", "Hardware that connects a host to a network.", "Devices", 1],
8+
["hub", "Hub", "A simple repeater for physical signals.", "Devices", 1],
9+
["switch", "Switch", "Forwards Ethernet frames inside a LAN.", "Devices", 2],
10+
["router", "Router", "Moves packets between networks.", "Devices", 3],
11+
["access-point", "Access point", "Connects wireless clients to a LAN.", "Devices", 2],
12+
["modem", "Modem", "Connects local networks to an ISP link.", "Devices", 1],
13+
["firewall", "Firewall", "Allows or blocks traffic by rule.", "Devices", 3],
14+
["gateway", "Gateway", "The next hop out of a local network.", "Devices", 3],
15+
["server", "Server", "Provides applications or resources to clients.", "Devices", 7]
16+
].map(([id, title, shortDescription, category, osiLayer]) =>
17+
module({
18+
id: String(id),
19+
title: String(title),
20+
shortDescription: String(shortDescription),
21+
category: String(category),
22+
difficulty: "beginner",
23+
estimatedTime: "5 min",
24+
prerequisites: ["communication-basics"],
25+
relatedModules: ["client-server-model"],
26+
osiLayer: Number(osiLayer),
27+
type: "concept"
28+
})
29+
);

‎src/data/curriculum/foundations.ts‎

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import type { CurriculumModule } from "@/types/curriculum";
2+
3+
import { module } from "./shared";
4+
5+
export const foundationModules: CurriculumModule[] = [
6+
module({
7+
id: "communication-basics",
8+
title: "What is communication?",
9+
shortDescription: "Two systems exchange meaning through agreed signals.",
10+
category: "Foundation",
11+
difficulty: "beginner",
12+
estimatedTime: "6 min",
13+
prerequisites: [],
14+
relatedModules: ["client-server-model", "packet-switching"],
15+
type: "concept"
16+
}),
17+
module({
18+
id: "data-bits-bytes",
19+
title: "Data, bits, and bytes",
20+
shortDescription: "See how information becomes binary values.",
21+
category: "Foundation",
22+
difficulty: "beginner",
23+
estimatedTime: "8 min",
24+
prerequisites: ["communication-basics"],
25+
relatedModules: ["binary-converter"],
26+
type: "concept"
27+
}),
28+
module({
29+
id: "binary-converter",
30+
title: "Binary Converter",
31+
shortDescription: "Convert decimal octets into binary bits.",
32+
category: "Foundation",
33+
difficulty: "beginner",
34+
estimatedTime: "8 min",
35+
prerequisites: ["data-bits-bytes"],
36+
relatedModules: ["ipv4-addressing", "subnet-visualizer"],
37+
type: "tool"
38+
}),
39+
module({
40+
id: "bandwidth",
41+
title: "Bandwidth",
42+
shortDescription: "How much data a link can carry.",
43+
category: "Foundation",
44+
difficulty: "beginner",
45+
estimatedTime: "7 min",
46+
prerequisites: ["data-bits-bytes"],
47+
relatedModules: ["throughput", "latency"],
48+
osiLayer: 1,
49+
type: "concept"
50+
}),
51+
module({
52+
id: "latency",
53+
title: "Latency",
54+
shortDescription: "How long a packet takes to arrive.",
55+
category: "Foundation",
56+
difficulty: "beginner",
57+
estimatedTime: "7 min",
58+
prerequisites: ["packet-switching"],
59+
relatedModules: ["jitter", "traceroute"],
60+
type: "concept"
61+
}),
62+
module({
63+
id: "throughput",
64+
title: "Throughput",
65+
shortDescription: "The actual delivered data rate.",
66+
category: "Foundation",
67+
difficulty: "beginner",
68+
estimatedTime: "7 min",
69+
prerequisites: ["bandwidth"],
70+
relatedModules: ["latency", "congestion-control"],
71+
type: "concept"
72+
}),
73+
module({
74+
id: "jitter",
75+
title: "Jitter",
76+
shortDescription: "Variation in packet delay.",
77+
category: "Foundation",
78+
difficulty: "beginner",
79+
estimatedTime: "5 min",
80+
prerequisites: ["latency"],
81+
relatedModules: ["udp-basics", "wi-fi-congestion-lab"],
82+
type: "concept"
83+
}),
84+
module({
85+
id: "packet-switching",
86+
title: "Packet switching",
87+
shortDescription: "Data moves as small independent packets.",
88+
category: "Foundation",
89+
difficulty: "beginner",
90+
estimatedTime: "8 min",
91+
prerequisites: ["communication-basics"],
92+
relatedModules: ["routing-visualizer", "circuit-switching"],
93+
type: "concept"
94+
}),
95+
module({
96+
id: "circuit-switching",
97+
title: "Circuit switching",
98+
shortDescription: "A dedicated path is reserved before communication.",
99+
category: "Foundation",
100+
difficulty: "beginner",
101+
estimatedTime: "5 min",
102+
prerequisites: ["communication-basics"],
103+
relatedModules: ["packet-switching"],
104+
type: "concept"
105+
}),
106+
module({
107+
id: "client-server-model",
108+
title: "Client-server model",
109+
shortDescription: "Clients request resources from always-on services.",
110+
category: "Foundation",
111+
difficulty: "beginner",
112+
estimatedTime: "6 min",
113+
prerequisites: ["communication-basics"],
114+
relatedModules: ["http-basics", "dns-basics"],
115+
type: "concept"
116+
}),
117+
module({
118+
id: "peer-to-peer-model",
119+
title: "Peer-to-peer model",
120+
shortDescription: "Hosts act as both clients and servers.",
121+
category: "Foundation",
122+
difficulty: "beginner",
123+
estimatedTime: "6 min",
124+
prerequisites: ["client-server-model"],
125+
relatedModules: ["ports"],
126+
type: "concept"
127+
})
128+
];

0 commit comments

Comments
 (0)