diff --git a/src/http/mod.rs b/src/http/mod.rs
index e763efffaaf74acef19331155ac8c64f0fe488e5..6e67ff28a89e308d2ecdd36db7861fb570980963 100644
--- a/src/http/mod.rs
+++ b/src/http/mod.rs
@@ -603,15 +603,21 @@
                 username: &username,
                 csrf: &csrf,
                 repositories: &[],
+                recent_repositories: &[],
             },
         );
     }
     let result = repository_job(state, move |repositories| {
-        repositories.home(actor.0.as_deref())
+        let owned = match actor.0.as_deref() {
+            Some(owner) => repositories.home(Some(owner))?,
+            None => Vec::new(),
+        };
+        let recent = repositories.home(None)?;
+        Ok((owned, recent))
     })
     .await;
     match result {
-        Ok(repositories) => render_home(
+        Ok((repositories, recent_repositories)) => render_home(
             StatusCode::OK,
             &request_id.0,
             HomePage {
@@ -622,6 +628,7 @@
                 username: &username,
                 csrf: &csrf,
                 repositories: &repositories,
+                recent_repositories: &recent_repositories,
             },
         ),
         Err(_) => render_error(
@@ -677,6 +684,7 @@
                 username: actor.0.as_deref().unwrap_or_default(),
                 csrf: "",
                 repositories: &[],
+                recent_repositories: &[],
             },
         ),
     }
@@ -2282,6 +2290,18 @@
                     updated_at: repository.updated_at,
                 })
                 .collect(),
+            recent_repositories: page
+                .recent_repositories
+                .iter()
+                .map(|repository| HomeRepositoryView {
+                    owner: &repository.owner,
+                    slug: &repository.slug,
+                    visibility: &repository.visibility,
+                    state: &repository.state,
+                    description: &repository.description,
+                    updated_at: repository.updated_at,
+                })
+                .collect(),
         },
     )
 }
@@ -2294,6 +2314,7 @@
     username: &'a str,
     csrf: &'a str,
     repositories: &'a [crate::store::HomeRepositoryRecord],
+    recent_repositories: &'a [crate::store::HomeRepositoryRecord],
 }
 
 fn render_error(status: StatusCode, request_id: &str, heading: &str, message: &str) -> Response {
@@ -2401,6 +2422,7 @@
     username: &'a str,
     csrf: &'a str,
     repositories: Vec<HomeRepositoryView<'a>>,
+    recent_repositories: Vec<HomeRepositoryView<'a>>,
 }
 
 struct HomeRepositoryView<'a> {
diff --git a/templates/home.html b/templates/home.html
index 3119705c835ceb4772a28fb0ad7e7140ae68fd88..6805c686f9331d2677817a511f84c3200416deae 100644
--- a/templates/home.html
+++ b/templates/home.html
@@ -7,11 +7,8 @@
   <h1>{{ username }}</h1>
   <p><a href="/account">Open your account profile</a>.</p>
   <h2>Your repositories</h2>
-{% else %}
-  <h1>Recently updated public repositories</h1>
-{% endif %}
 {% if repositories.is_empty() %}
-  <p>No repositories are available.</p>
+  <p>You do not own a repository.</p>
 {% else %}
   <ul>
   {% for item in repositories %}
@@ -27,6 +24,23 @@
 {% else %}
     <li><a href="/{{ item.owner }}/{{ item.slug }}">{{ item.owner }}/{{ item.slug }}</a> · {{ item.visibility }} · updated <time datetime="{{ item.updated_at }}">{{ item.updated_at|human_time }}</time>{% if item.description.is_empty() %}{% else %}<br>{{ item.description }}{% endif %}</li>
 {% endif %}
+  {% endfor %}
+  </ul>
+{% endif %}
+  <h2>Recently updated public repositories</h2>
+{% else %}
+  <h1>Recently updated public repositories</h1>
+{% endif %}
+{% if recent_repositories.is_empty() %}
+{% if signed_in %}
+  <p>No public repositories are available.</p>
+{% else %}
+  <p>No repositories are available.</p>
+{% endif %}
+{% else %}
+  <ul>
+  {% for item in recent_repositories %}
+    <li><a href="/{{ item.owner }}/{{ item.slug }}">{{ item.owner }}/{{ item.slug }}</a> · updated <time datetime="{{ item.updated_at }}">{{ item.updated_at|human_time }}</time>{% if item.description.is_empty() %}{% else %}<br>{{ item.description }}{% endif %}</li>
   {% endfor %}
   </ul>
 {% endif %}
diff --git a/tests/serve.rs b/tests/serve.rs
index 32f07c38886ee2563fa0b8fe0343f5ae506ac218..74ed3604d91d0d1da4f54d05ed87faf9190ed058 100644
--- a/tests/serve.rs
+++ b/tests/serve.rs
@@ -228,7 +228,8 @@
     let signed_in_home = http_get_with_headers(http, "/", &[("Cookie", &cookies)]);
     assert!(signed_in_home.contains("<h1>alice</h1>"));
     assert!(signed_in_home.contains("<h2>Your repositories</h2>"));
-    assert!(signed_in_home.contains(">alice/example</a>"));
+    assert!(signed_in_home.contains("<h2>Recently updated public repositories</h2>"));
+    assert_eq!(signed_in_home.matches(">alice/example</a>").count(), 2);
     assert!(signed_in_home.contains("<a href=\"/account\">Account</a>"));
     assert!(signed_in_home.contains("<a href=\"/logout\">Log out</a>"));
     assert!(!signed_in_home.contains("<a href=\"/signup\">Create account</a>"));
