diff --git a/mo/web/templates/base.html b/mo/web/templates/base.html
index 782a7d7f1d5e56bf40df14af69b27d96149f8a53..183467a2d91745aa7632ccc5c5bd868417600616 100644
--- a/mo/web/templates/base.html
+++ b/mo/web/templates/base.html
@@ -20,6 +20,12 @@
 	</div>
 </header>
 <div id="nav-wrapper">
+	<!-- A fake / hidden checkbox is used as click receiver -->
+	<input class="hamburger" type="checkbox" />
+	<span></span>
+	<span></span>
+	<span></span>
+
 	<nav id="main-menu" class="content">
 		{% for item in get_menu() %}
 			<a {% if item.classes %}class="{{ " ".join(item.classes) }}"{% endif %} href="{{ item.url }}">{{ item.name }}</a>
diff --git a/static/mo.css b/static/mo.css
index 3c0c7d963e2d14778918eab4ab37883bf61b3d7b..8d394880052bac97b2e1ae2f1a8dc5923e9f3fe0 100644
--- a/static/mo.css
+++ b/static/mo.css
@@ -46,6 +46,7 @@ header h1 { margin: auto 20px 0px; color: #222; }
 	border: 1px #222 solid;
 	z-index: 10;
 }
+#nav-wrapper input.hamburger { display: none; }
 
 footer {
 	margin-top: auto;
@@ -563,4 +564,89 @@ table.data input.form-control {
 	header h1 {
 		font-size: 18px;
 	}
+
+	/* Hamburger responsive menu (original source: https://codepen.io/erikterwan/pen/EVzeRP) */
+	#nav-wrapper {
+		background-color: rgba(255, 255, 255, 0.8);
+		border: none;
+		z-index: 1;
+		padding-top: 10px;
+		user-select: none;
+	}
+	#nav-wrapper input.hamburger {
+		display: block;
+		margin-left: 10px;
+		width: 40px;
+		height: 32px;
+		position: absolute;
+		top: -2px;
+		left: -7px;
+
+		cursor: pointer;
+
+		opacity: 0; /* hide this */
+		z-index: 2; /* and place it over the hamburger */
+		-webkit-touch-callout: none;
+	}
+
+	/* Hamburger symbol */
+	#nav-wrapper span {
+		display: block;
+		width: 33px;
+		height: 4px;
+		margin-left: 10px;
+		margin-bottom: 5px;
+		position: relative;
+
+		background: #222;
+		border-radius: 3px;
+
+		z-index: 1;
+
+		transform-origin: 4px 0px;
+
+		transition: transform 0.5s cubic-bezier(0.77,0.2,0.05,1.0),
+			background 0.5s cubic-bezier(0.77,0.2,0.05,1.0),
+			opacity 0.55s ease;
+	}
+	#nav-wrapper span:first-child { transform-origin: 0% 0%; }
+	#nav-wrapper span:nth-last-child(2) { transform-origin: 0% 100%; }
+
+	/* Hamburger crossmark symbol */
+	#nav-wrapper input.hamburger:checked ~ span {
+		background-color: #fff;
+		opacity: 1;
+		transform: rotate(45deg) translate(-2px, -1px);
+	}
+	#nav-wrapper input.hamburger:checked ~ span:nth-last-child(3) {
+		opacity: 0;
+		transform: rotate(0deg) scale(0.2, 0.2);
+	}
+	#nav-wrapper input.hamburger:checked ~ span:nth-last-child(2) {
+		transform: rotate(-45deg) translate(0, -1px);
+	}
+
+	nav#main-menu {
+		position: absolute;
+		max-width: 300px;
+		max-height: 100vh;
+		top: 0px;
+		padding-top: 35px;
+
+		flex-direction: column;
+		flex-wrap: nowrap;
+
+		background: #222;
+		-webkit-font-smoothing: antialiased;
+		/* to stop flickering of text in safari */
+
+		transform: translate(-120%, 0);
+
+		transition: transform 0.5s cubic-bezier(0.77,0.2,0.05,1.0);
+		overflow-y: scroll;
+	}
+	#nav-wrapper input.hamburger:checked ~ nav#main-menu { transform: none; }
+
+	nav#main-menu > .right { margin-left: 0px; }
+	nav#main-menu > form > input { width: 100%; }
 }