diff --git a/src/render/mod.rs b/src/render/mod.rs
index 7b50c91993c69f6d5295eca1896811b9c3508ea8..cc4decb3f8d2d3e51d586e594593fd255ec2a957 100644
--- a/src/render/mod.rs
+++ b/src/render/mod.rs
@@ -131,6 +131,20 @@ fn svg2mp4(svg: PathBuf, mp4: PathBuf, duration: Time) -> anyhow::Result<()> {
 	ffmpeg.run()
 }
 
+fn svg2png(svg: &Path, png: &Path, size: usize) -> anyhow::Result<()> {
+	let mut cmd = cmd();
+	let size = size.to_string();
+	cmd.arg("inkscape").arg("-w").arg(&size).arg("-h").arg(&size);
+	cmd.arg(svg).arg("-o").arg(png);
+	
+	let status = cmd.status()?;
+		if status.success() {
+			Ok(())
+		} else {
+			bail!("inkscape failed with exit code {:?}", status.code())
+		}
+}
+
 impl<'a> Renderer<'a> {
 	pub(crate) fn new(directory: &'a Path, project: &Project) -> anyhow::Result<Self> {
 		let slug = format!(
@@ -150,20 +164,6 @@ impl<'a> Renderer<'a> {
 	pub(crate) fn preprocess(&self, project: &mut Project) -> anyhow::Result<()> {
 		assert!(!project.progress.preprocessed);
 
-		let logo = self.target.join("logo.svg");
-		fs::write(
-			&logo,
-			include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/assets/logo.svg"))
-		)?;
-		let fastforward = self.target.join("fastforward.svg");
-		fs::write(
-			&fastforward,
-			include_bytes!(concat!(
-				env!("CARGO_MANIFEST_DIR"),
-				"/assets/fastforward.svg"
-			))
-		)?;
-
 		let recording_txt = self.target.join("recording.txt");
 		let mut file = File::create(&recording_txt)?;
 		for filename in &project.source.files {
@@ -201,6 +201,7 @@ impl<'a> Renderer<'a> {
 			source_sample_rate
 		});
 
+		// render intro to svg then mp4
 		let intro_svg = self.target.join("intro.svg");
 		fs::write(
 			&intro_svg,
@@ -214,6 +215,7 @@ impl<'a> Renderer<'a> {
 			micros: 0
 		})?;
 
+		// render outro to svg then mp4
 		let outro_svg = self.target.join("outro.svg");
 		fs::write(
 			&outro_svg,
@@ -225,6 +227,27 @@ impl<'a> Renderer<'a> {
 			micros: 0
 		});
 
+		// copy logo then render to png
+		let logo_svg = self.target.join("logo.svg");
+		fs::write(
+			&logo_svg,
+			include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/assets/logo.svg"))
+		)?;
+		let logo_png = self.target.join("logo.png");
+		svg2png(&logo_svg, &logo_png, 150 * 1920 / source_res.width())?;
+
+		// copy fastforward then render to png
+		let fastforward_svg = self.target.join("fastforward.svg");
+		fs::write(
+			&fastforward_svg,
+			include_bytes!(concat!(
+				env!("CARGO_MANIFEST_DIR"),
+				"/assets/fastforward.svg"
+			))
+		)?;
+		let fastforward_png = self.target.join("fastforward.png");
+		svg2png(&fastforward_svg, &fastforward_png, 128 * 1920 / source_res.width())?;
+
 		Ok(())
 	}
 }