diff --git a/lektord/src/app/routes.rs b/lektord/src/app/routes.rs
index a6953bbc277ae40ff7a4e4d6e03dc3329ff36dd7..cf23152101c32ba784c1e5849cb6fdc3c31e69d6 100644
--- a/lektord/src/app/routes.rs
+++ b/lektord/src/app/routes.rs
@@ -21,6 +21,7 @@ use lektor_utils::decode_base64_json;
 use rand::seq::SliceRandom;
 use std::ops::RangeBounds;
 use tokio::task::LocalSet;
+use tokio::task::spawn_blocking;
 
 /// Get informations abount the lektord server.
 #[axum::debug_handler(state = LektorStatePtr)]
@@ -557,7 +558,7 @@ macro_rules! extractor {
         => { $($match_pat:pat => $match_handle:expr,)+ }
         => |$arg:ident| $handle:expr $(,)?
     ) => {
-        async move {
+        move || {
             tokio::runtime::Builder::new_current_thread()
                 .build()
                 .context("failed to build the runtime")?
@@ -578,7 +579,7 @@ pub(crate) async fn search(
     Path(uri): Path<String>,
 ) -> Result<Json<Vec<KId>>, LektordError> {
     let SearchData { from, regex } = decode_base64_json(uri)?;
-    Ok(tokio::spawn(extractor! {
+    Ok(spawn_blocking(extractor! {
         match from
         => {
             SearchFrom::Database      => search_adaptors::database_extractor(&state).await,
@@ -603,7 +604,7 @@ pub(crate) async fn count(
     Path(uri): Path<String>,
 ) -> Result<Json<usize>, LektordError> {
     let SearchData { from, regex } = decode_base64_json(uri)?;
-    Ok(tokio::spawn(extractor! {
+    Ok(spawn_blocking(extractor! {
         match from
         => {
             SearchFrom::Database      => search_adaptors::database_extractor(&state).await,