diff --git a/src/api/client/media.rs b/src/api/client/media.rs
index cfb10c3dd611f1c69393749b2768a15707f09b07..44978caf2a934de12cc533093d66ad961cd1a8af 100644
--- a/src/api/client/media.rs
+++ b/src/api/client/media.rs
@@ -2,6 +2,7 @@
 
 use std::{io::Cursor, sync::Arc, time::Duration};
 
+use conduit::{debug, error, utils::math::ruma_from_usize, warn};
 use image::io::Reader as ImgReader;
 use ipaddress::IPAddress;
 use reqwest::Url;
@@ -12,7 +13,6 @@
 		get_media_preview,
 	},
 };
-use tracing::{debug, error, warn};
 use webpage::HTML;
 
 use crate::{
@@ -44,7 +44,7 @@ pub(crate) async fn get_media_config_route(
 	_body: Ruma<get_media_config::v3::Request>,
 ) -> Result<get_media_config::v3::Response> {
 	Ok(get_media_config::v3::Response {
-		upload_size: services().globals.max_request_size().into(),
+		upload_size: ruma_from_usize(services().globals.config.max_request_size),
 	})
 }
 
diff --git a/src/api/router/request.rs b/src/api/router/request.rs
index 59639eaa87b803b4ecafa0dcb842301fe504c417..56c766192521a251560394daf4dd7d66908a2fb8 100644
--- a/src/api/router/request.rs
+++ b/src/api/router/request.rs
@@ -29,12 +29,7 @@ pub(super) async fn from(request: hyper::Request<axum::body::Body>) -> Result<Re
 	let query = serde_html_form::from_str(parts.uri.query().unwrap_or_default())
 		.map_err(|_| Error::BadRequest(ErrorKind::Unknown, "Failed to read query parameters"))?;
 
-	let max_body_size = services()
-		.globals
-		.config
-		.max_request_size
-		.try_into()
-		.expect("failed to convert max request size");
+	let max_body_size = services().globals.config.max_request_size;
 
 	let body = axum::body::to_bytes(body, max_body_size)
 		.await
diff --git a/src/core/config/mod.rs b/src/core/config/mod.rs
index b808f196484940d956111c5420d646c3f6b6f71e..f9a5ec4c70bbd30aa7b8991211daa4b7e9be91e8 100644
--- a/src/core/config/mod.rs
+++ b/src/core/config/mod.rs
@@ -114,7 +114,7 @@ pub struct Config {
 	pub ip_lookup_strategy: u8,
 
 	#[serde(default = "default_max_request_size")]
-	pub max_request_size: u32,
+	pub max_request_size: usize,
 	#[serde(default = "default_max_fetch_prev_events")]
 	pub max_fetch_prev_events: u16,
 
@@ -930,7 +930,7 @@ fn default_dns_timeout() -> u64 { 10 }
 
 fn default_ip_lookup_strategy() -> u8 { 5 }
 
-fn default_max_request_size() -> u32 {
+fn default_max_request_size() -> usize {
 	20 * 1024 * 1024 // Default to 20 MB
 }
 
diff --git a/src/router/layers.rs b/src/router/layers.rs
index 4fe3516449b489f996938295b6497bf38a7ee582..db664b38aa4779e2109c13a8f20f4ca3cd6b14f1 100644
--- a/src/router/layers.rs
+++ b/src/router/layers.rs
@@ -138,15 +138,7 @@ fn cors_layer(_server: &Server) -> CorsLayer {
 		.max_age(Duration::from_secs(86400))
 }
 
-fn body_limit_layer(server: &Server) -> DefaultBodyLimit {
-	DefaultBodyLimit::max(
-		server
-			.config
-			.max_request_size
-			.try_into()
-			.expect("failed to convert max request size"),
-	)
-}
+fn body_limit_layer(server: &Server) -> DefaultBodyLimit { DefaultBodyLimit::max(server.config.max_request_size) }
 
 #[allow(clippy::needless_pass_by_value)]
 #[tracing::instrument(skip_all)]
diff --git a/src/service/globals/mod.rs b/src/service/globals/mod.rs
index 3c0e66c0ad1b2b07524c145f0dda2c851717f351..f28299b2994857ec4c055197ea24108c14a9a5ae 100644
--- a/src/service/globals/mod.rs
+++ b/src/service/globals/mod.rs
@@ -201,8 +201,6 @@ pub async fn watch(&self, user_id: &UserId, device_id: &DeviceId) -> Result<()>
 
 	pub fn server_name(&self) -> &ServerName { self.config.server_name.as_ref() }
 
-	pub fn max_request_size(&self) -> u32 { self.config.max_request_size }
-
 	pub fn max_fetch_prev_events(&self) -> u16 { self.config.max_fetch_prev_events }
 
 	pub fn allow_registration(&self) -> bool { self.config.allow_registration }