diff --git a/js/src/main/scala/cs214/webapp/client/Pages.scala b/js/src/main/scala/cs214/webapp/client/Pages.scala
index 99c093e83e55dd7f891595a1404365ebd21dd7f5..c94551b3bfa496c6ce150dcc49464404f90591b7 100644
--- a/js/src/main/scala/cs214/webapp/client/Pages.scala
+++ b/js/src/main/scala/cs214/webapp/client/Pages.scala
@@ -28,16 +28,16 @@ object Page:
 abstract class AppCatalogPage extends Page:
   def render(apps: Seq[AppInfo]): Frag
 
-  def selectApp(appId: AppId): Unit =
-    WebClient.navigateTo(InstanceCreationPage(appId))
-
-  def renderApp(appInfo: AppInfo): Frag =
-    figure(
-      onclick := (() => selectApp(appInfo.id)),
-      img(src := s"/static/${appInfo.id}.png"),
-      figcaption(
-        h4(appInfo.name),
-        p(appInfo.description)
+  def renderApp(appInfo: AppInfo, classes: String): Frag =
+    a(
+      cls := "app " + classes,
+      href := WebClient.url(InstanceCreationPage(appInfo.id)),
+      figure(
+        img(src := s"/static/${appInfo.id}.png"),
+        figcaption(
+          h4(appInfo.name),
+          p(appInfo.description)
+        )
       )
     )
 
@@ -57,7 +57,7 @@ object HomePage extends AppCatalogPage:
           h2(year.toString),
           section(cls := "app-grid",
             apps.sortBy(_.name).map: appInfo =>
-              renderApp(appInfo)
+              renderApp(appInfo, classes="")
           )
       )
     )
diff --git a/jvm/src/main/resources/www/static/main.css b/jvm/src/main/resources/www/static/main.css
index 0f301ef7db71d08ec24a26dedfc75b7d84b165f0..e7531e76f975f51d515ea856553cb3f69340f523 100644
--- a/jvm/src/main/resources/www/static/main.css
+++ b/jvm/src/main/resources/www/static/main.css
@@ -171,6 +171,14 @@ form > *:last-child {
     grid-gap: 1rem;
 }
 
+.app-grid > a {
+    color: inherit;
+    display: grid;
+    text-decoration: none;
+    grid-template-columns: minmax(0, 1fr);
+    grid-template-rows: minmax(0, 1fr);
+}
+
 .app-grid figure {
     word-wrap: break-word;
     border-radius: 0.5rem;