diff --git a/.gitignore b/.gitignore
index 31b925bd..53492bb0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -95,3 +95,4 @@ scripts/resilience/reports/
# Local evidence screenshots; intentional UI screenshots should live under an
# app/docs asset path with a descriptive filename.
Screenshot *.png
+uploads/
diff --git a/neode-ui/src/views/Dashboard.vue b/neode-ui/src/views/Dashboard.vue
index a0ec5888..d28f4e42 100644
--- a/neode-ui/src/views/Dashboard.vue
+++ b/neode-ui/src/views/Dashboard.vue
@@ -85,7 +85,11 @@
diff --git a/neode-ui/src/views/mesh/mesh-styles.css b/neode-ui/src/views/mesh/mesh-styles.css
index 7282127d..50e8ec90 100644
--- a/neode-ui/src/views/mesh/mesh-styles.css
+++ b/neode-ui/src/views/mesh/mesh-styles.css
@@ -12,6 +12,18 @@
height: 100%;
overflow: hidden;
}
+
+@media (min-width: 921px) {
+ .mesh-dashboard-panel.mobile-scroll-pad {
+ padding-bottom: 0;
+ }
+}
+
+@media (min-width: 921px) and (max-width: 1279px) {
+ .mesh-dashboard-panel {
+ overflow-y: auto;
+ }
+}
.mesh-header { justify-content: space-between; align-items: center; gap: 16px; flex-shrink: 0; }
.mesh-header-left { flex: 1; }
.mesh-title { font-size: 1.5rem; font-weight: 700; color: rgba(255, 255, 255, 0.95); margin: 0; }
@@ -152,6 +164,19 @@
.mesh-mobile-back-btn:hover { color: rgba(255, 255, 255, 0.9); }
}
+@media (min-width: 921px) and (max-width: 1279px) {
+ .mesh-view {
+ padding: 24px;
+ }
+}
+
+@media (max-width: 920px) {
+ .mesh-view {
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
+
.mesh-session-badge { font-size: 0.75rem; margin-right: 6px; opacity: 0.7; }
.mesh-session-rotate { background: transparent; border: 1px solid rgba(255,255,255,0.15); color: rgba(255,255,255,0.7); font-size: 0.75rem; line-height: 1; padding: 2px 6px; margin-right: 8px; border-radius: 10px; cursor: pointer; transition: background 0.15s ease, color 0.15s ease; }
.mesh-session-rotate:hover:not(:disabled) { background: rgba(251,146,60,0.2); color: #fff; border-color: rgba(251,146,60,0.4); }
diff --git a/scripts/deploy-to-target.sh b/scripts/deploy-to-target.sh
index 5770bc7a..112c1cf3 100755
--- a/scripts/deploy-to-target.sh
+++ b/scripts/deploy-to-target.sh
@@ -165,7 +165,7 @@ if [[ "$DRY_RUN" == "true" ]]; then
rsync -avn --exclude '.git' --exclude 'target' --exclude 'node_modules' \
--exclude 'dist' --exclude 'web/dist' --exclude '*.iso' \
--exclude 'image-recipe/_archived/build' --exclude 'image-recipe/_archived/results' \
- --exclude '.codex-target-*' --exclude '.codex-tmp' \
+ --exclude '.codex-target-*' --exclude '.codex-tmp' --exclude 'uploads' \
"$PROJECT_DIR/" "$TARGET_HOST:$TARGET_DIR/" 2>/dev/null | \
grep -E '^[<>]|^deleting' | head -50 || echo " (rsync check failed — SSH may be unavailable)"
echo ""
@@ -550,6 +550,7 @@ rsync -avz --delete \
--exclude '.git' \
--exclude '.codex-target-*' \
--exclude '.codex-tmp' \
+ --exclude 'uploads' \
--exclude 'image-recipe/build' \
--exclude 'image-recipe/results' \
--exclude 'image-recipe/_archived/build' \