diff --git a/lint-staged.config.mjs b/lint-staged.config.mjs
index 1b56c8b9..c75f993b 100644
--- a/lint-staged.config.mjs
+++ b/lint-staged.config.mjs
@@ -1,6 +1,8 @@
/** @type {import('lint-staged').Configuration} */
export default {
'**/*': (files) => `prettier --write --ignore-unknown ${files.join(' ')}`,
+ '{src,public}/**/*.{png,jpg,jpeg,webp}': (images) =>
+ `node scripts/images.lint.js ${images.join(' ')}`,
'**/*.{astro,ts,mjs,js}': (files) => `eslint --fix ${files.join(' ')}`,
'src/content/**/*.{md,mdx}': (files) => [
`pnpm remark ${files.join(' ')} --ext mdx --frail --no-stdout --quiet`,
diff --git a/public/learning-course/getting-started/website-feature-guide/slide1.png b/public/learning-course/getting-started/website-feature-guide/slide1.png
deleted file mode 100644
index a16d7601..00000000
Binary files a/public/learning-course/getting-started/website-feature-guide/slide1.png and /dev/null differ
diff --git a/public/learning-course/getting-started/website-feature-guide/slide1.webp b/public/learning-course/getting-started/website-feature-guide/slide1.webp
new file mode 100644
index 00000000..91b30504
Binary files /dev/null and b/public/learning-course/getting-started/website-feature-guide/slide1.webp differ
diff --git a/public/learning-course/getting-started/website-feature-guide/slide2.png b/public/learning-course/getting-started/website-feature-guide/slide2.png
deleted file mode 100644
index fcefff53..00000000
Binary files a/public/learning-course/getting-started/website-feature-guide/slide2.png and /dev/null differ
diff --git a/public/learning-course/getting-started/website-feature-guide/slide2.webp b/public/learning-course/getting-started/website-feature-guide/slide2.webp
new file mode 100644
index 00000000..869bdbed
Binary files /dev/null and b/public/learning-course/getting-started/website-feature-guide/slide2.webp differ
diff --git a/public/learning-course/stage0/conditionals/else.png b/public/learning-course/stage0/conditionals/else.png
deleted file mode 100644
index 4541bf16..00000000
Binary files a/public/learning-course/stage0/conditionals/else.png and /dev/null differ
diff --git a/public/learning-course/stage0/conditionals/else.webp b/public/learning-course/stage0/conditionals/else.webp
new file mode 100644
index 00000000..8927b166
Binary files /dev/null and b/public/learning-course/stage0/conditionals/else.webp differ
diff --git a/public/learning-course/stage0/conditionals/ifstatement.png b/public/learning-course/stage0/conditionals/ifstatement.png
deleted file mode 100644
index d69581df..00000000
Binary files a/public/learning-course/stage0/conditionals/ifstatement.png and /dev/null differ
diff --git a/public/learning-course/stage0/conditionals/ifstatement.webp b/public/learning-course/stage0/conditionals/ifstatement.webp
new file mode 100644
index 00000000..86cfa5cf
Binary files /dev/null and b/public/learning-course/stage0/conditionals/ifstatement.webp differ
diff --git a/public/learning-course/stage0/java-fundamentals/ErrorExample1.png b/public/learning-course/stage0/java-fundamentals/ErrorExample1.png
deleted file mode 100644
index 631a5223..00000000
Binary files a/public/learning-course/stage0/java-fundamentals/ErrorExample1.png and /dev/null differ
diff --git a/public/learning-course/stage0/java-fundamentals/ErrorExample1.webp b/public/learning-course/stage0/java-fundamentals/ErrorExample1.webp
new file mode 100644
index 00000000..30418575
Binary files /dev/null and b/public/learning-course/stage0/java-fundamentals/ErrorExample1.webp differ
diff --git a/public/learning-course/stage0/java-fundamentals/ErrorExample2.png b/public/learning-course/stage0/java-fundamentals/ErrorExample2.png
deleted file mode 100644
index 67d8072b..00000000
Binary files a/public/learning-course/stage0/java-fundamentals/ErrorExample2.png and /dev/null differ
diff --git a/public/learning-course/stage0/java-fundamentals/ErrorExample2.webp b/public/learning-course/stage0/java-fundamentals/ErrorExample2.webp
new file mode 100644
index 00000000..a695488a
Binary files /dev/null and b/public/learning-course/stage0/java-fundamentals/ErrorExample2.webp differ
diff --git a/public/learning-course/stage1/stage1b/2910-robot.png b/public/learning-course/stage1/stage1b/2910-robot.png
deleted file mode 100644
index 921907c0..00000000
Binary files a/public/learning-course/stage1/stage1b/2910-robot.png and /dev/null differ
diff --git a/public/learning-course/stage1/stage1b/2910-robot.webp b/public/learning-course/stage1/stage1b/2910-robot.webp
new file mode 100644
index 00000000..469df147
Binary files /dev/null and b/public/learning-course/stage1/stage1b/2910-robot.webp differ
diff --git a/public/learning-course/stage1/stage1b/human-flow-diagram.png b/public/learning-course/stage1/stage1b/human-flow-diagram.png
deleted file mode 100644
index 9990a9e6..00000000
Binary files a/public/learning-course/stage1/stage1b/human-flow-diagram.png and /dev/null differ
diff --git a/public/learning-course/stage1/stage1b/human-flow-diagram.webp b/public/learning-course/stage1/stage1b/human-flow-diagram.webp
new file mode 100644
index 00000000..3a6b6be9
Binary files /dev/null and b/public/learning-course/stage1/stage1b/human-flow-diagram.webp differ
diff --git a/public/learning-course/stage1/stage1b/robot-flow-diagram.png b/public/learning-course/stage1/stage1b/robot-flow-diagram.png
deleted file mode 100644
index 07e14564..00000000
Binary files a/public/learning-course/stage1/stage1b/robot-flow-diagram.png and /dev/null differ
diff --git a/public/learning-course/stage1/stage1b/robot-flow-diagram.webp b/public/learning-course/stage1/stage1b/robot-flow-diagram.webp
new file mode 100644
index 00000000..ce65fda9
Binary files /dev/null and b/public/learning-course/stage1/stage1b/robot-flow-diagram.webp differ
diff --git a/scripts/images.lint.js b/scripts/images.lint.js
new file mode 100644
index 00000000..daea4021
--- /dev/null
+++ b/scripts/images.lint.js
@@ -0,0 +1,24 @@
+import { styleText } from 'node:util';
+import sharp from 'sharp';
+
+const [, , ...images] = process.argv;
+
+/** @type {string[]} */
+const offending = [];
+
+for (const image of images) {
+ if (!image.endsWith('.webp')) {
+ offending.push(image);
+ continue;
+ }
+ const meta = await sharp(image).metadata();
+ if (meta.format !== 'webp') {
+ offending.push(image);
+ }
+}
+if (offending.length >= 1) {
+ process.stderr.write(
+ `${styleText('red', '✖')} All images should be in WebP format. See contribution guidelines for more info. Offending files: \n - ${offending.map((img) => img.replace(process.cwd() + '/', '')).join('\n - ')}\n`,
+ );
+ process.exit(1);
+}
diff --git a/src/content/docs/learning-course/getting-started/website-feature-guide.mdx b/src/content/docs/learning-course/getting-started/website-feature-guide.mdx
index 8a6597c6..527180eb 100644
--- a/src/content/docs/learning-course/getting-started/website-feature-guide.mdx
+++ b/src/content/docs/learning-course/getting-started/website-feature-guide.mdx
@@ -55,9 +55,9 @@ Examples for different concepts are shown in an "Example" box like this one.
### Slideshows
- Navigate the slideshows by pressing the arrows on the sides.
+ Navigate the slideshows by pressing the arrows on the sides.
- The dots below the caption indicate the slide you're on.
+ The dots below the caption indicate the slide you're on.
They can also be clicked to navigate to slides.
diff --git a/src/content/docs/learning-course/stage0/conditionals.mdx b/src/content/docs/learning-course/stage0/conditionals.mdx
index 53177479..9688c0bd 100644
--- a/src/content/docs/learning-course/stage0/conditionals.mdx
+++ b/src/content/docs/learning-course/stage0/conditionals.mdx
@@ -64,7 +64,7 @@ If `condition` is false, the code inside the `if` block will be skipped.
This is also described in the flowchart below
@@ -104,7 +104,7 @@ If the `if` statement's condition is `false`, the `if` block will be skipped, an
This is also described in the flowchart below
diff --git a/src/content/docs/learning-course/stage0/java-fundamentals.mdx b/src/content/docs/learning-course/stage0/java-fundamentals.mdx
index dfdef996..84a85353 100644
--- a/src/content/docs/learning-course/stage0/java-fundamentals.mdx
+++ b/src/content/docs/learning-course/stage0/java-fundamentals.mdx
@@ -22,9 +22,9 @@ Error messages will not tell you exactly what's wrong with your code.
If you’re unsure on what the error message means, you can look it up to get additional context.
- An example of a syntax error (note the squiggly line)
+ An example of a syntax error (note the squiggly line)
- An example of a syntax error popup
+ An example of a syntax error popup
diff --git a/src/content/docs/learning-course/stage1/stage1b/command-based-overview.mdx b/src/content/docs/learning-course/stage1/stage1b/command-based-overview.mdx
index 820eff38..6c75ad3d 100644
--- a/src/content/docs/learning-course/stage1/stage1b/command-based-overview.mdx
+++ b/src/content/docs/learning-course/stage1/stage1b/command-based-overview.mdx
@@ -19,7 +19,7 @@ When your alarm clock rings, you turn it off, then tumble out of bed.
When your belly rumbles, you walk to the fridge, then get a snack.
When the clock strikes 8 AM, you open the front door to leave for school.
-
+
Notice how none of these actions had a predefined order; rather, they were a reaction to
certain kinds of stimuli.
@@ -31,7 +31,7 @@ Command-based programming models robot behavior in a similar way.
For instance, a command-based robot might have the following structure:
-
+
Here, everything on the left is a `Trigger`, while everything on the right is a `Command`.