diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53462ef..1d13c59 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,11 @@
All notable changes are documented here. Releases follow [SemVer](https://semver.org).
Image tags published to Docker Hub (`krippler52/starr`) and GHCR (`ghcr.io/krippler/starr`).
+## [Unreleased]
+
+### Added
+- **Rearrangeable dashboard** — the main panels (Connection, Repair Log, Operations, Trends, Backups, Schedules, Notifications) are now drag-to-rearrange cards. Hover a panel header to reveal a grip handle and drag it to reorder or move it between columns. On wide screens the panels flow into 2–3 responsive columns (single column on narrow/mobile, identical to before); each width remembers its own arrangement, saved per-browser in `localStorage` (same mechanism as the existing panel collapse-state). A **Reset layout** button restores the default. The live run status (shutdown warning, progress bar, result tiles) stays in a fixed strip above the grid so it never moves mid-repair. Purely a frontend enhancement — no API or backend changes.
+
## [1.2.10] — 2026-07-16
### Fixed
diff --git a/app/templates/index.html b/app/templates/index.html
index c7b20dd..5257a9d 100644
--- a/app/templates/index.html
+++ b/app/templates/index.html
@@ -123,6 +123,33 @@
.phase.failed { border-color: var(--err); }
.phase.failed .phase-num, .phase.failed .phase-label { color: var(--err); }
.panel { background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius); margin-bottom: 14px; overflow: hidden; }
+
+/* ── Rearrangeable dashboard (drag cards between responsive columns) ─────────── */
+.dashboard { display: flex; align-items: flex-start; gap: 14px; }
+.dash-col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; }
+/* Cards keep their own styling; the column's flex-gap replaces per-card margin. */
+.dash-col > .dash-card { margin-bottom: 14px; }
+.dash-card { position: relative; }
+/* Grip handle injected into each card header by JS. Hidden until you hover the
+ card (or while a drag is in progress), Fresharr-style. */
+.drag-handle {
+ cursor: grab; user-select: none; flex-shrink: 0;
+ font-size: 14px; line-height: 1; color: var(--muted);
+ opacity: 0; transition: opacity .15s; padding: 0 6px 0 0; margin-right: -2px;
+}
+.dash-card:hover .drag-handle, .dashboard.dnd-active .drag-handle { opacity: .5; }
+.drag-handle:hover { opacity: 1; color: var(--app); }
+.drag-handle:active { cursor: grabbing; }
+.dash-card.is-dragging { opacity: .35; }
+.dash-col.drop-into { outline: 2px dashed var(--app); outline-offset: -2px; border-radius: var(--radius); }
+.dash-card.drop-before { box-shadow: 0 -3px 0 -1px var(--app); }
+.dash-card.drop-after { box-shadow: 0 3px 0 -1px var(--app); }
+#resetLayoutBtn { display: none; }
+#layoutTools.show #resetLayoutBtn { display: inline-flex; }
+#layoutTools { display: flex; justify-content: flex-end; gap: 8px; margin: -4px 0 10px; }
+#runStatus:empty { display: none; }
+.layout-hint { font-size: 10px; color: var(--muted); align-self: center; margin-right: auto; opacity: .8; }
+@media (max-width: 720px) { .drag-handle { display: none; } .layout-hint { display: none; } }
.panel-head {
display: flex; align-items: center; justify-content: space-between;
padding: 11px 16px; border-bottom: 1px solid var(--border);
@@ -478,7 +505,17 @@
STARR DB REPAIR
-
+
+
+ Drag a panel's ⠿ grip to rearrange your dashboard
+
+
+
+
+
@@ -546,7 +583,7 @@
STARR DB REPAIR
-
+
REPAIR LOG
@@ -563,7 +600,7 @@
STARR DB REPAIR
-
+
@@ -608,7 +645,7 @@
STARR DB REPAIR
-
+
@@ -622,7 +659,7 @@
STARR DB REPAIR
-
+
@@ -684,7 +721,7 @@
STARR DB REPAIR
-
+
@@ -765,7 +802,7 @@
STARR DB REPAIR
-
+
@@ -823,6 +860,8 @@
STARR DB REPAIR
+
+
@@ -1116,7 +1155,7 @@
STARR DB REPAIR
function toggleSection(name, ev) {
// Don't toggle when the click landed on an interactive child of the header
// (e.g. retention