diff --git a/src/main.rs b/src/main.rs
index a0b32e4fed09c523bf482b5d699f99ddb04f1143..7f0611d1d201c6306e8d91947b856076a2a671f3 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -22,7 +22,7 @@ struct Args {
 
 	/// The preset of the lecture. Can be a toml file or a known course slug.
 	#[clap(short, long)]
-	preset: String,
+	preset: Option<String>,
 
 	#[cfg(feature = "mem_limit")]
 	/// The memory limit for external tools like ffmpeg.
@@ -55,14 +55,16 @@ fn main() {
 
 	// process arguments
 	let directory = args.directory.canonicalize_utf8().unwrap();
-	let preset = Preset::find(&args.preset).unwrap();
-	let course = preset.course;
 
 	// let's see if we need to initialise the project
 	let project_path = directory.join("project.toml");
 	let mut project = if project_path.exists() {
 		toml::from_slice(&fs::read(&project_path).unwrap()).unwrap()
 	} else {
+		assert!(args.preset.is_some());
+		let preset = Preset::find(&args.preset.unwrap()).unwrap();
+		let course = preset.course;
+
 		let dirname = directory.file_name().unwrap();
 		let date =
 			parse_date(dirname).expect("Directory name is not in the expected format");
@@ -112,6 +114,8 @@ fn main() {
 				stereo: args.stereo,
 				start: None,
 				end: None,
+				transcode_lowest: args.transcode.or(preset.transcode),
+				transcode_highest: args.transcode_start.unwrap_or(preset.transcode_start),
 				fast: Vec::new(),
 				questions: Vec::new(),
 				metadata: None
@@ -214,10 +218,10 @@ fn main() {
 	});
 
 	// rescale the video
-	if let Some(lowest_res) = args.transcode.or(preset.transcode) {
+	if let Some(lowest_res) = project.source.transcode_lowest {
 		for res in Resolution::STANDARD_RESOLUTIONS.into_iter().rev() {
 			if res > project.source.metadata.as_ref().unwrap().source_res
-				|| res > args.transcode_start.unwrap_or(preset.transcode_start)
+				|| res > project.source.transcode_highest
 				|| res < lowest_res
 			{
 				continue;
diff --git a/src/project.rs b/src/project.rs
index 93d7a45b0d57730f9698348e2fe035862365e0b7..5e182e1fadd8ea1f7c10193e4bcb7f68dd4ff860 100644
--- a/src/project.rs
+++ b/src/project.rs
@@ -150,6 +150,11 @@ pub struct ProjectSource {
 	#[serde_as(as = "Option<DisplayFromStr>")]
 	pub end: Option<Time>,
 
+	#[serde_as(as = "Option<DisplayFromStr>")]
+	pub transcode_lowest: Option<Resolution>,
+	#[serde_as(as = "DisplayFromStr")]
+	pub transcode_highest: Resolution,
+
 	#[serde(default)]
 	#[serde_as(as = "Vec<(DisplayFromStr, DisplayFromStr)>")]
 	pub fast: Vec<(Time, Time)>,