diff --git a/Cargo.lock b/Cargo.lock
index fd43989..76e82bc 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1510,6 +1510,7 @@ dependencies = [
  "dioxus-cli-config",
  "dioxus-logger",
  "dotenvy",
+ "tokio",
 ]
 
 [[package]]
@@ -2156,6 +2157,15 @@ version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
 
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "slab"
 version = "0.4.9"
@@ -2327,7 +2337,9 @@ dependencies = [
  "bytes",
  "libc",
  "mio",
+ "parking_lot",
  "pin-project-lite",
+ "signal-hook-registry",
  "socket2",
  "tokio-macros",
  "windows-sys 0.52.0",
diff --git a/Cargo.toml b/Cargo.toml
index 8dfe1d1..3304734 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,11 +9,13 @@ dioxus = { version = "0.6", features = ["fullstack"] }
 dioxus-cli-config = "0.6"
 dioxus-logger = "0.6"
 dotenvy = { version = "0.15", optional = true }
+tokio = { version = "1", features = ["full"], optional = true }
 
 [features]
 default = []
-server = ["dioxus/server", "dotenvy"]
+server = ["dioxus/server", "tokio", "dotenvy"]
 web = ["dioxus/web"]
+tokio = ["dep:tokio"]
 
 [profile]
 
diff --git a/src/domain/entities/site.rs b/src/domain/entities/site.rs
index 0be8a4c..2ee7b18 100644
--- a/src/domain/entities/site.rs
+++ b/src/domain/entities/site.rs
@@ -2,3 +2,13 @@ pub struct SiteMetadata {
     pub domain: String,
     pub title: String,
 }
+
+pub struct PageInfo {
+    pub title: String,
+    pub name: String,
+}
+
+pub struct SiteInfo {
+    pub info: SiteMetadata,
+    pub pages: Vec<PageInfo>,
+}
diff --git a/src/inbound/renderer/mod.rs b/src/inbound/renderer/mod.rs
index 602797f..30b366f 100644
--- a/src/inbound/renderer/mod.rs
+++ b/src/inbound/renderer/mod.rs
@@ -2,9 +2,10 @@
 
 use dioxus::prelude::*;
 
-#[component]
+mod server;
+
 pub fn App() -> Element {
     rsx! {
-        h1 { "hello world" }
+        h1 { "Hello, world!" }
     }
 }
diff --git a/src/inbound/renderer/server.rs b/src/inbound/renderer/server.rs
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/inbound/renderer/server.rs
@@ -0,0 +1 @@
+
diff --git a/src/main.rs b/src/main.rs
index c00cb1a..67dc143 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,5 @@
-use dioxus::prelude::*;
+use dioxus::prelude::server_only;
 use dioxus_logger::tracing::Level;
-use outbound::repository::adapters::static_data::StaticData;
 
 mod domain;
 mod inbound;
@@ -16,10 +15,13 @@ fn main() {
 
     let mut builder = dioxus::LaunchBuilder::new();
     server_only! {
+        use outbound::repository::adapters::static_data::StaticData;
+        use outbound::services::site::SiteService;
+
         builder = builder
             .with_context_provider(
                 || {
-                    Box::new(outbound::services::site::SiteService::new(StaticData{}))
+                    Box::new(SiteService::new(StaticData{}))
                 }
             );
     }
diff --git a/src/outbound/repository/adapters/static_data.rs b/src/outbound/repository/adapters/static_data.rs
index f655a72..523d5a6 100644
--- a/src/outbound/repository/adapters/static_data.rs
+++ b/src/outbound/repository/adapters/static_data.rs
@@ -1,12 +1,28 @@
-use crate::{domain::entities::site::SiteMetadata, outbound::repository::site::SiteRepository};
+use crate::{
+    domain::entities::site::{PageInfo, SiteMetadata},
+    outbound::repository::site::SiteRepository,
+};
 
 pub struct StaticData {}
 
 impl SiteRepository for StaticData {
-    async fn get_site_by_domain(domain: &str) -> SiteMetadata {
+    async fn get_site_by_domain(&self, domain: &str) -> SiteMetadata {
         SiteMetadata {
             domain: domain.to_string(),
             title: "Test site".to_string(),
         }
     }
+
+    async fn get_pages_for_site(&self, _: &str) -> Vec<PageInfo> {
+        vec![
+            PageInfo {
+                title: "Home".to_string(),
+                name: "/".to_string(),
+            },
+            PageInfo {
+                title: "Cool page".to_string(),
+                name: "cool".to_string(),
+            },
+        ]
+    }
 }
diff --git a/src/outbound/repository/site.rs b/src/outbound/repository/site.rs
index a6751c4..38408b7 100644
--- a/src/outbound/repository/site.rs
+++ b/src/outbound/repository/site.rs
@@ -1,5 +1,6 @@
-use crate::domain::entities::site::SiteMetadata;
+use crate::domain::entities::site::{PageInfo, SiteMetadata};
 
 pub trait SiteRepository {
-    async fn get_site_by_domain(domain: &str) -> SiteMetadata;
+    async fn get_site_by_domain(&self, domain: &str) -> SiteMetadata;
+    async fn get_pages_for_site(&self, domain: &str) -> Vec<PageInfo>;
 }
diff --git a/src/outbound/services/site.rs b/src/outbound/services/site.rs
index 42031b1..e928e77 100644
--- a/src/outbound/services/site.rs
+++ b/src/outbound/services/site.rs
@@ -1,4 +1,4 @@
-use crate::outbound::repository::site::SiteRepository;
+use crate::{domain::entities::site::SiteInfo, outbound::repository::site::SiteRepository};
 
 pub struct SiteService<SiteRepo: SiteRepository> {
     site_repository: SiteRepo,
@@ -8,4 +8,25 @@ impl<SiteRepo: SiteRepository> SiteService<SiteRepo> {
     pub fn new(site_repository: SiteRepo) -> Self {
         Self { site_repository }
     }
+
+    pub async fn get_site(&self, domain: &str) -> SiteInfo {
+        let info = self.site_repository.get_site_by_domain(domain).await;
+        let pages = self.site_repository.get_pages_for_site(&info.domain).await;
+        SiteInfo { info, pages }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::SiteService;
+    use crate::outbound::repository::adapters::static_data::StaticData;
+
+    #[tokio::test]
+    async fn gets_site_info() {
+        let service = SiteService::new(StaticData {});
+        let info = service.get_site("example.com").await;
+        assert_eq!(info.info.domain, "example.com");
+        assert_eq!(info.info.title, "Test site");
+        assert_eq!(info.pages.len(), 2);
+    }
 }