diff --git a/js/src/main/scala/cs214/webapp/client/Pages.scala b/js/src/main/scala/cs214/webapp/client/Pages.scala
index 2cc7a02eeda5b97e7487fb54f666da518cd53c3c..797deed4c442c765bfd9d22b5776eb8725fdbd8c 100644
--- a/js/src/main/scala/cs214/webapp/client/Pages.scala
+++ b/js/src/main/scala/cs214/webapp/client/Pages.scala
@@ -262,16 +262,12 @@ case class AppPage(appId: AppId, uiId: UIId, instanceId: InstanceId, userId: Use
     )
     maybeApp.get
 
-  enum ProtocolInfo(secure: String, insecure: String):
-    case WebSocket extends ProtocolInfo("wss", "ws")
-    case Http extends ProtocolInfo("https", "http")
-    def proto: String = if dom.window.location.protocol.startsWith("https") then secure else insecure
-
   def substituteInstanceInfo(endpointTemplate: String, protocolInfo: ProtocolInfo): String =
     val port = dom.window.location.port
     val hostname = dom.window.location.hostname
+    val tls = dom.window.location.protocol.startsWith("https")
     endpointTemplate
-      .replace("{{protocol}}", protocolInfo.proto)
+      .replace("{{protocol}}", protocolInfo.proto(tls))
       .replace("{{authority}}", hostname + (if port.nonEmpty then f":$port" else ""))
       .replace("{{userId}}", URLEncoder.encode(userId, "UTF-8"))
 
diff --git a/shared/src/main/scala/cs214/webapp/Common.scala b/shared/src/main/scala/cs214/webapp/Common.scala
index 75a6a81ec84045cb9751540fd78df8e037a1f41d..abf60dbff535d44f6f77460d0fc462c8bf44b6a8 100644
--- a/shared/src/main/scala/cs214/webapp/Common.scala
+++ b/shared/src/main/scala/cs214/webapp/Common.scala
@@ -45,3 +45,8 @@ object Endpoints:
   val App = "/app"
   val WebSocket = "/ws"
 
+/** Known protocols */
+enum ProtocolInfo(secure: String, insecure: String):
+  case WebSocket extends ProtocolInfo("wss", "ws")
+  case Http extends ProtocolInfo("https", "http")
+  def proto(tls: Boolean): String = if tls then secure else insecure