diff --git a/index.html b/index.html
index 5b407de..62cc848 100644
--- a/index.html
+++ b/index.html
@@ -46,7 +46,8 @@
width: calc(100vw - env(safe-area-inset-left, 0px) - env(safe-area-inset-right, 0px));
height: calc(100vh - env(safe-area-inset-top, 0px));
height: calc(100dvh - env(safe-area-inset-top, 0px)); }
- #hint { position: fixed; bottom: 8px; width: 100%; text-align: center;
+ /* desktop key hint — up in the empty top-right corner now that the rack owns the bottom edge */
+ #hint { position: fixed; top: 6px; right: 10px; text-align: right;
font: 400 10px Silkscreen, monospace; color: #6b7688; }
@media (pointer: coarse) { #hint, #intro .kb { display: none; } }
#intro { position: fixed; inset: 0; z-index: 10; touch-action: none; display: grid; place-items: center;
diff --git a/render.js b/render.js
index d84a931..ae8211b 100644
--- a/render.js
+++ b/render.js
@@ -463,7 +463,8 @@ function drawMgRacket() { // horde: the player braces the racket forward and up-
// the courtside weapon rack along the bottom: PLAIN + the four tins. Tap a tile (or 1–5) to
// pick which one your next serve throws; empty tins dim out. Geometry is shared with input
// via rackHit so a tap lands on the tile you see.
-const RACK_BOT = 8; // px of breathing room below the rack (floats it up off the screen edge)
+const RACK_BOT = 0; // px below the rack: none — it sits ON the bottom edge. SAFE.bottom still lifts
+ // it clear of the home indicator, which is the only gap that has to be there.
const RACK_GRAB = 7; // px the TOUCH band extends above the drawn rack (below, it runs to the screen edge)
export const METER_Y = () => H - TUNE.rackH - RACK_BOT - 17 - SAFE.bottom; // the draw meter's fixed bottom slot
function rackGeom() {