Merge with upstream
diff --git a/erpnext/public/js/hub/pages/profile.js b/erpnext/public/js/hub/pages/profile.js
index a57bc7c..9bfa85d 100644
--- a/erpnext/public/js/hub/pages/profile.js
+++ b/erpnext/public/js/hub/pages/profile.js
@@ -102,6 +102,8 @@
 				on_submit: this.update_profile.bind(this)
 			}
 		);
+
+		this.edit_profile_dialog.set_df_property('company_email', 'read_only', 1);
 	}
 
 	edit_profile() {
diff --git a/erpnext/public/js/hub/pages/publish.js b/erpnext/public/js/hub/pages/publish.js
index ce73d63..5eb3178 100644
--- a/erpnext/public/js/hub/pages/publish.js
+++ b/erpnext/public/js/hub/pages/publish.js
@@ -13,9 +13,6 @@
 		this.fetched_items = [];
 		this.fetched_items_dict = {};
 
-		this.cache = erpnext.hub.cache.items_to_publish;
-		this.cache = [];
-
 		frappe.realtime.on("items-sync", (data) => {
 			this.$wrapper.find('.progress-bar').css('width', data.progress_percent+'%');
 
@@ -110,6 +107,7 @@
 	}
 
 	update_items_data_to_publish(values) {
+		// Add item additional data
 		this.items_data_to_publish[values.item_code] = values;
 	}
 
@@ -249,6 +247,7 @@
 			item_codes_to_publish.push($(this).attr("data-id"));
 		});
 
+		// Retrieve item data
 		const items_data_to_publish = item_codes_to_publish.map(item_code => this.items_data_to_publish[item_code])
 
 		return frappe.call(
diff --git a/erpnext/public/less/hub.less b/erpnext/public/less/hub.less
index 88076c0..286e3be 100644
--- a/erpnext/public/less/hub.less
+++ b/erpnext/public/less/hub.less
@@ -50,6 +50,7 @@
 			margin-top: 0px;
 			margin-bottom: 15px;
 			background-color: #f9fbf7;
+			border-radius: 4px;
 			justify-content: space-between;
 		}
 
@@ -131,6 +132,8 @@
 
 	.hub-card-overlay-button {
 		position: absolute;
+		right: 15px;
+		bottom: 15px;
 	}
 
 	.hub-card-image {
@@ -215,6 +218,7 @@
 		height: 80px;
 		border-radius: 4px;
 		border: 1px solid @border-color;
+		border-style: dashed;
 		margin: 15px 0px;
 	}