diff --git a/.idea/bluesky-bot.iml b/.idea/bluesky-bot.iml
index e7ffe8a..b4d9f0b 100644
--- a/.idea/bluesky-bot.iml
+++ b/.idea/bluesky-bot.iml
@@ -5,6 +5,7 @@
+
diff --git a/Cargo.toml b/Cargo.toml
index 379b2d3..80622dd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,7 @@
[workspace]
members = [
"post",
+ "infrastructure",
"scrapper",
]
resolver = "2"
diff --git a/infrastructure/Cargo.toml b/infrastructure/Cargo.toml
new file mode 100644
index 0000000..e666094
--- /dev/null
+++ b/infrastructure/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "infrastructure"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+tokio = { version = "1", features = ["full"] }
+# Note: This appears unused by the RustRover analyzer, but it works.
+# If in the future it stops working for whatever reason because the dependency has
+# the same name as the module, then we can try to rename it using `package`.
+redis = { version = "0.27.6", features = ["tokio-comp"] }
+md5 = "0.7.0"
+serde = { version = "1.0.216", features = ["derive"] }
+serde_json = "1.0.134"
+log = "0.4.22"
+
+[dev-dependencies]
+rand = "0.8.5"
+serial_test = "3.2.0"
+post = {path = "../post"}
\ No newline at end of file
diff --git a/infrastructure/readme.md b/infrastructure/readme.md
new file mode 100644
index 0000000..f466714
--- /dev/null
+++ b/infrastructure/readme.md
@@ -0,0 +1,7 @@
+# Infrastructure
+
+Implements shared infrastructure components.
+
+## RedisService
+
+A service for interacting with Redis.
\ No newline at end of file
diff --git a/infrastructure/src/lib.rs b/infrastructure/src/lib.rs
new file mode 100644
index 0000000..a340eb5
--- /dev/null
+++ b/infrastructure/src/lib.rs
@@ -0,0 +1,3 @@
+pub mod redis;
+
+pub use redis::RedisService;
diff --git a/scrapper/src/redis_service.rs b/infrastructure/src/redis.rs
similarity index 100%
rename from scrapper/src/redis_service.rs
rename to infrastructure/src/redis.rs
diff --git a/scrapper/Cargo.toml b/scrapper/Cargo.toml
index ccb8cca..3bfe165 100644
--- a/scrapper/Cargo.toml
+++ b/scrapper/Cargo.toml
@@ -13,12 +13,5 @@ clokwerk = "0.4.0"
log = "0.4.22"
ctrlc = "3.4.5"
clap = { version = "4.5.23", features = ["derive"] }
-redis = { version = "0.27.6", features = ["tokio-comp"] }
-md5 = "0.7.0"
-serde = { version = "1.0.216", features = ["derive"] }
-serde_json = "1.0.134"
post = {path = "../post"}
-
-[dev-dependencies]
-rand = "0.8.5"
-serial_test = "3.2.0"
\ No newline at end of file
+infrastructure = { path = "../infrastructure"}
\ No newline at end of file
diff --git a/scrapper/src/main.rs b/scrapper/src/main.rs
index 11adad2..db1ce75 100644
--- a/scrapper/src/main.rs
+++ b/scrapper/src/main.rs
@@ -1,9 +1,9 @@
use crate::cli::CliArgs;
-use crate::redis_service::RedisService;
use crate::scrapper::gfourmedia::G4Media;
use crate::scrapper::WebScrapperEngine;
use clap::Parser;
use clokwerk::{AsyncScheduler, Interval, TimeUnits};
+use infrastructure::RedisService;
use log::{debug, error, info};
use post::NewsPost;
use std::sync::atomic::{AtomicBool, Ordering};
@@ -13,7 +13,6 @@ use std::time::Duration;
use tokio::task::JoinHandle;
mod cli;
-mod redis_service;
mod scrapper;
/// Runs the scheduler in a separated thread.