diff --git a/login/login.ftl b/login/login.ftl
new file mode 100644
index 0000000..21f3f95
--- /dev/null
+++ b/login/login.ftl
@@ -0,0 +1,105 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=!messagesPerField.existsError('username','password') displayInfo=realm.password && realm.registrationAllowed && !registrationDisabled??; section>
+ <#if section = "header">
+ ${msg("loginAccountTitle")}
+ <#elseif section = "form">
+
+ <#elseif section = "info" >
+ <#if realm.password && realm.registrationAllowed && !registrationDisabled??>
+
+ #if>
+ <#elseif section = "socialProviders" >
+ <#if realm.password && social.providers??>
+
+ #if>
+ #if>
+
+@layout.registrationLayout>
diff --git a/login/messages/messages_en.properties b/login/messages/messages_en.properties
new file mode 100644
index 0000000..49015dd
--- /dev/null
+++ b/login/messages/messages_en.properties
@@ -0,0 +1,3 @@
+usernameOrEmail=Logon Name:
+password=Password:
+loginAccountTitle=Type a logon name and password to log on to the Cooperative Computer Network.
diff --git a/makefile b/makefile
new file mode 100644
index 0000000..a16779a
--- /dev/null
+++ b/makefile
@@ -0,0 +1,20 @@
+default: run
+
+run:
+ @docker run \
+ -p 8080:8080 \
+ -v $$(pwd)/hacktheplanet:/opt/keycloak/themes/hacktheplanet \
+ -e KEYCLOAK_ADMIN=admin \
+ -e KEYCLOAK_ADMIN_PASSWORD=admin \
+ --name keycloakdev \
+ keycloak/keycloak:20.0.1 \
+ start-dev \
+ --spi-theme-static-max-age=-1 \
+ --spi-theme-cache-themes=false \
+ --spi-theme-cache-templates=false \
+
+shell:
+ @docker exec -it keycloakdev /bin/bash
+
+stop:
+ @docker stop keycloakdev && docker rm keycloakdev