diff --git a/crates/cachekit/Cargo.toml b/crates/cachekit/Cargo.toml
index 3a56b4b..db4e126 100644
--- a/crates/cachekit/Cargo.toml
+++ b/crates/cachekit/Cargo.toml
@@ -24,6 +24,9 @@ workers = ["dep:worker", "dep:js-sys", "dep:getrandom"]
encryption = ["cachekit-core/encryption"]
l1 = ["dep:moka"]
macros = ["dep:cachekit-macros"]
+# Opt into ?Send / Rc on native targets (for tokio::task::LocalSet, single-threaded
+# runtimes, etc.). Same code paths that wasm32 already uses.
+unsync = []
[dependencies]
cachekit-core = { version = "0.2", features = ["messagepack"] }
diff --git a/crates/cachekit/src/backend/cachekitio.rs b/crates/cachekit/src/backend/cachekitio.rs
index 4182f54..f28b416 100644
--- a/crates/cachekit/src/backend/cachekitio.rs
+++ b/crates/cachekit/src/backend/cachekitio.rs
@@ -119,7 +119,8 @@ pub(crate) fn from_http_status_sanitized(status: u16, body: &[u8], api_key: &str
// ── Backend impl ──────────────────────────────────────────────────────────────
#[cfg(not(target_arch = "wasm32"))]
-#[async_trait]
+#[cfg_attr(not(feature = "unsync"), async_trait)]
+#[cfg_attr(feature = "unsync", async_trait(?Send))]
impl Backend for CachekitIO {
async fn get(&self, key: &str) -> Result