Sprint 21: Mobile responsive layout + Docker support (Issues #21, #7)#40
Sprint 21: Mobile responsive layout + Docker support (Issues #21, #7)#40
Conversation
Mobile responsive (Issue #21): - Hamburger sidebar: slide-in overlay on mobile (<640px) with backdrop. Tap hamburger in topbar to open, tap outside to close. Full session list, project chips, all panel content accessible. - Bottom navigation bar: 5-tab fixed bar (Chat, Tasks, Skills, Memory, Spaces) replaces sidebar nav tabs on mobile. iOS-style layout. Tapping a tab opens the sidebar overlay with that panel active. - Right panel slide-over: Files button in topbar chips opens workspace panel as a slide-over from the right on mobile/tablet. - Touch targets: all interactive elements get min 44x44px touch areas. Session items, approval buttons, composer buttons all sized for fingers. - Composer positioned above bottom nav bar with proper spacing. - Sidebar nav tabs and bottom section hidden on mobile (replaced by bottom nav + topbar chips). - Clicking a session auto-closes the sidebar overlay. - Desktop layout completely unchanged — all mobile elements are display:none by default, only shown inside @media(max-width:640px). Docker (Issue #7): - Dockerfile: python:3.12-slim, HERMES_WEBUI_HOST=0.0.0.0, port 8787. - docker-compose.yml: named volume for state persistence, optional ~/.hermes mount for agent features, password env var documented. - README: Docker quick start section with compose and manual commands. Tests: 392 passed, 23 pre-existing failures, 0 regressions. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
BUG-1 (critical): CSS cascade — .sidebar{position:relative} and
.rightpanel{position:relative} at line 528/530 appeared after the
@media(max-width:640px) block and silently overrode the position:fixed
overlay behavior needed for the mobile slide-in. Wrapped both in
@media(min-width:641px) so they only apply on desktop.
BUG-2 (medium): mobileSwitchPanel() in boot.js always reopened the
sidebar overlay after closing it, with a stale comment saying 'close
after a moment' but no actual auto-close. For the 'chat' panel, the
content lives in the main area — reopening the sidebar obstructs it.
Fixed: only open sidebar for non-chat panels; chat tap closes sidebar.
BUG-3 (medium): Dockerfile was missing 'pip install -r requirements.txt'.
pyyaml (required by api/config.py) is not in the python:3.12-slim base
image — the container would fail at startup with ImportError.
SEC-2 (medium): No .dockerignore — COPY . /app included .git/, tests/,
and .env* in every image. Added .dockerignore excluding these.
NIT-3: docker-compose.yml used ${HERMES_HOME:-~/.hermes} but Docker
Compose does not shell-expand ~ in default values. Changed to
${HERMES_HOME:-${HOME}/.hermes}.
Tests: 415 passed, 0 failed (same as pre-fix).
Agent Review — PR #40 Sprint 21 Mobile Responsive + DockerVerdict: APPROVED WITH FIXES — 5 issues found and fixed directly on the branch (commit 574cd2c). All 415 tests pass post-fix. Security AuditAll mandatory security checks passed:
Bugs Fixed (commit 574cd2c)BUG-1 [CRITICAL] — CSS cascade broke entire mobile slide-in feature The Fix: Wrapped both rules in BUG-2 [MEDIUM] — mobileSwitchPanel() always reopened the sidebar The function closed the sidebar then immediately reopened it. A code comment said "close after a moment" but no Fix: Only open the sidebar for non-chat panels. Tapping Chat on the bottom nav now closes the sidebar so the chat area is unobstructed. BUG-3 [MEDIUM] — Dockerfile missing
Fix: Added SEC-2 [MEDIUM] — No .dockerignore
Fix: Added NIT-3 [LOW] — docker-compose tilde expansion
Fix: Changed to Other Findings (Not Fixed — Informational)SEC-1 [MEDIUM] — Docker: unauthenticated by default, bound to 0.0.0.0
SEC-3 [LOW] — Container runs as root No NIT-2 — Right panel has no close-by-tap-outside mechanism on mobile The hamburger sidebar has Test Results
What Looks Good
Ready to merge after your sign-off. All 5 fixes are in commit 574cd2c on this branch. |
- CHANGELOG: add v0.23 Sprint 21 entry (mobile + Docker) - SPRINTS: Sprint 21 marked COMPLETED, footer updated - index.html: version label v0.22 -> v0.23 - docker-compose.yml: bind to 127.0.0.1 by default (SEC-1 fix) - README: add security note about Docker port binding Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
BUG-1 (critical): CSS cascade — .sidebar{position:relative} and
.rightpanel{position:relative} at line 528/530 appeared after the
@media(max-width:640px) block and silently overrode the position:fixed
overlay behavior needed for the mobile slide-in. Wrapped both in
@media(min-width:641px) so they only apply on desktop.
BUG-2 (medium): mobileSwitchPanel() in boot.js always reopened the
sidebar overlay after closing it, with a stale comment saying 'close
after a moment' but no actual auto-close. For the 'chat' panel, the
content lives in the main area — reopening the sidebar obstructs it.
Fixed: only open sidebar for non-chat panels; chat tap closes sidebar.
BUG-3 (medium): Dockerfile was missing 'pip install -r requirements.txt'.
pyyaml (required by api/config.py) is not in the python:3.12-slim base
image — the container would fail at startup with ImportError.
SEC-2 (medium): No .dockerignore — COPY . /app included .git/, tests/,
and .env* in every image. Added .dockerignore excluding these.
NIT-3: docker-compose.yml used ${HERMES_HOME:-~/.hermes} but Docker
Compose does not shell-expand ~ in default values. Changed to
${HERMES_HOME:-${HOME}/.hermes}.
Tests: 415 passed, 0 failed (same as pre-fix).
Sprint 21: Mobile responsive layout + Docker support (Issues nesquena#21, nesquena#7)
BUG-1 (critical): CSS cascade — .sidebar{position:relative} and
.rightpanel{position:relative} at line 528/530 appeared after the
@media(max-width:640px) block and silently overrode the position:fixed
overlay behavior needed for the mobile slide-in. Wrapped both in
@media(min-width:641px) so they only apply on desktop.
BUG-2 (medium): mobileSwitchPanel() in boot.js always reopened the
sidebar overlay after closing it, with a stale comment saying 'close
after a moment' but no actual auto-close. For the 'chat' panel, the
content lives in the main area — reopening the sidebar obstructs it.
Fixed: only open sidebar for non-chat panels; chat tap closes sidebar.
BUG-3 (medium): Dockerfile was missing 'pip install -r requirements.txt'.
pyyaml (required by api/config.py) is not in the python:3.12-slim base
image — the container would fail at startup with ImportError.
SEC-2 (medium): No .dockerignore — COPY . /app included .git/, tests/,
and .env* in every image. Added .dockerignore excluding these.
NIT-3: docker-compose.yml used ${HERMES_HOME:-~/.hermes} but Docker
Compose does not shell-expand ~ in default values. Changed to
${HERMES_HOME:-${HOME}/.hermes}.
Tests: 415 passed, 0 failed (same as pre-fix).
Sprint 21: Mobile responsive layout + Docker support (Issues nesquena#21, nesquena#7)
Summary
Mobile responsive layout + Docker support. Closes #21 and #7.
Mobile Responsive (Issue #21)
The app was unusable on mobile — the sidebar was
display:nonebelow 640px with no way to access sessions, settings, or workspace. Now it has a proper mobile layout:Desktop UI is completely unchanged. All mobile elements are
display:noneby default, only activated inside@media(max-width:640px). Verified by audit:Docker (Issue #7)
python:3.12-slim, binds to0.0.0.0:8787~/.hermesmount for agent features, password env var documenteddocker compose up -dand manualdocker runcommandsTest plan
pytest tests/— 392 passed, 23 pre-existing failures, 0 regressionsdocker compose upstarts server on port 8787Closes #21, closes #7.
Generated with Claude Code