Skip to content

Commit 08c61e1

Browse files
nesquenaclaude
authored andcommitted
docs: add UI.md — UI/UX philosophy
Captures the design philosophy authored by Aron Prins (lead UI/UX) so contributors have a written bar to design against before touching primary surfaces. Modestly expanded from the source doc with concrete examples (mobile stress test, decision checklist, surface-by-surface guidance) but keeps the original principles and voice intact. Linked from CONTRIBUTING.md docs list. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
1 parent 4ed2765 commit 08c61e1

2 files changed

Lines changed: 178 additions & 0 deletions

File tree

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ Common files:
8484
- [ROADMAP.md](ROADMAP.md) for shipped features and sprint history
8585
- [ARCHITECTURE.md](ARCHITECTURE.md) for implementation details and design constraints
8686
- [TESTING.md](TESTING.md) for manual and automated verification guidance
87+
- [UI.md](UI.md) for the UI/UX philosophy — read this before touching primary surfaces
8788
- [CHANGELOG.md](CHANGELOG.md) when maintainers want release-note-ready entries
8889

8990
## Project-Specific Guidelines

UI.md

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
# Hermes WebUI — UI/UX Philosophy
2+
3+
**Author:** Aron Prins — Lead UI/UX, Hermes WebUI
4+
**Status:** Living document. The project is early; expect this to evolve.
5+
**Audience:** Anyone opening a PR that touches the Hermes WebUI.
6+
7+
## Foreword
8+
9+
This document exists because PRs are landing fast and many of them — well-intentioned, often great work — push against a UX vision that hasn't been written down yet. That's on me. This is the fix.
10+
11+
Everything below comes from love for the project and a desire to push it forward, not to gatekeep contributions. Read it before you touch the UI, and a lot of friction disappears.
12+
13+
If your change touches a primary surface (title bar, composer, sidebar items, message lines), this document is the bar your PR will be reviewed against.
14+
15+
---
16+
17+
## Core Philosophy
18+
19+
The Hermes WebUI is built around one guiding instinct:
20+
21+
> **Show the least possible to do the most possible.**
22+
23+
Every pixel of UI real estate is contested space. Every icon, counter, badge, and toggle has to earn its place — and "it's useful to me" is not enough. The default answer to *"should we add this here?"* is **no**, unless it's absolutely necessary at this surface.
24+
25+
This isn't minimalism for aesthetics' sake. It's a working principle. The UI has to scale across:
26+
27+
- Desktop browsers (today's primary surface)
28+
- Mobile browsers (a real, tested target — not a fallback)
29+
- A forthcoming desktop application
30+
- An expanding feature set as we reach parity with Hermes Agent
31+
32+
The only way to keep that scalable is **ruthless restraint now**. A surface we keep clean today is a surface we can extend tomorrow without rewriting it.
33+
34+
---
35+
36+
## The Four Principles
37+
38+
### 1. Cleanness & Emptiness
39+
40+
Empty space is a feature, not wasted real estate. Title bars, composer rows, message lines, sidebar items — all of these should default to *as empty as possible*. If we cram them now, we have nowhere to grow.
41+
42+
When you're tempted to fill empty space, ask: *what feature, six months from now, will I have to evict to make room?*
43+
44+
### 2. Space Is Scarce
45+
46+
There is no slack. The composer is already crowded. The chat history sidebar is already tight. Message line items have almost no horizontal room left. Treat every surface as if it's at 90% capacity, because it is.
47+
48+
A useful exercise before adding anything: open the UI on a 320px-wide mobile viewport. If the surface is tight there, it's tight everywhere — small screens just expose it first.
49+
50+
### 3. Progressive Disclosure (the Three-Click Rule)
51+
52+
Nothing should be more than **three clicks away**. Detail, configuration, and power-user features belong *behind* something — a menu, a panel, a settings screen — not on the primary surface.
53+
54+
- If you need it, it's reachable.
55+
- If you don't, it's out of sight.
56+
- Three clicks is a **ceiling**, not a target. Don't pad navigation to reach it.
57+
58+
The Hermes Control Center is the canonical home for depth. Most "useful but not always needed" controls belong there before they belong anywhere else.
59+
60+
### 4. Show Detail Where Detail Belongs
61+
62+
Information should appear at the surface where the user has signaled they want depth. Token counts, model metadata, performance stats — these are valuable, but they belong on a detail view, not on the conversation list or the title bar.
63+
64+
> **Right information, right surface.**
65+
66+
A token-per-second readout on a session list item competes with the conversation title. The same readout, on a per-message inspector or a session detail view, is genuinely useful — because the user clicked through specifically asking for that depth.
67+
68+
---
69+
70+
## Component Guidelines
71+
72+
### Title Bar
73+
74+
- Keep it **clean and as empty as possible**, especially at this stage.
75+
- The title bar is reserved space for the upcoming desktop app's window controls (close / minimize / expand). That's why certain icons live on the opposite side of the screen — leave them there.
76+
- Tokens-per-second readouts, latency meters, and similar telemetry **do not belong in the title bar**. They will be removed.
77+
- If you genuinely think something belongs here, open an issue first. The bar to land a new title bar element is high.
78+
79+
### Composer (Bottom Input Area)
80+
81+
- The composer is already at its limit. **Resist adding controls directly into it.**
82+
- We will introduce a **secondary row below the composer** to host overflow controls. Propose additions there, not in the composer itself.
83+
- On mobile, icons without labels become unreadable fast. Any control we add must remain comprehensible at small widths — that usually means *fewer* controls, not cleverer icons.
84+
- Model, profile, and workspace controls already live in the composer footer because they are needed *while composing*. Most other controls are not.
85+
86+
### Sidebar — The Three-Bar Structure
87+
88+
The three-bar layout (primary nav, secondary panel, content) is intentional and opens up significant room for future feature expansion.
89+
90+
- **Do not add a collapse toggle for the second bar** unless there is a genuinely compelling reason. The default answer is no.
91+
- Treat the second bar as load-bearing for upcoming features. Collapsing it would constrain choices we haven't made yet.
92+
- The primary nav is for top-level navigation only. New entries here should be rare and discussed.
93+
94+
### Chat History / Session Items
95+
96+
Session list items are one of the tightest surfaces in the entire UI. Anything added here directly competes with the conversation title — which is the whole point of the list.
97+
98+
**Approved on session items:**
99+
100+
- **Spinner** — indicates which conversation is actively working. High value across multiple open chats.
101+
- **Pin indicator** — tells the user this session is anchored.
102+
103+
That is the list. Token counters, message counts, model badges, and similar additions on individual session line items will be rejected. Surface that information elsewhere — typically a session detail/inspector view, or the Control Center.
104+
105+
If you believe a new indicator belongs in this list, the PR description should answer: *what is this displacing, and why is it more important than the conversation title?*
106+
107+
### Message Line Items
108+
109+
Same principle as session items: extremely scarce space, and the message itself is the content.
110+
111+
- Per-message token counters and similar metadata should not crowd the line.
112+
- If this data is valuable, it belongs in a **detail/inspector surface**, not inline.
113+
- Status indicators that materially change how the user reads the message (e.g., "this message is still streaming") are different from metadata about the message — the former can earn space, the latter generally cannot.
114+
115+
### Settings
116+
117+
Settings is a legitimate place for depth — this is where we *can* expose configuration. But the same principles apply within it:
118+
119+
- **Group related options.** A wall of toggles is just clutter at a different surface.
120+
- **Use clear, translated strings.** No raw translation keys, no missing keys, no English-only fallbacks shipped to non-English locales.
121+
- **Make scope unmistakable.** When a control's behavior is non-obvious — e.g., a button that refreshes models for *one* provider vs. *all* providers — prefer a small refresh icon next to the relevant item over a global button whose blast radius is unclear.
122+
- Settings should still feel calm. If a panel needs a search box, that's a sign it's grown too dense.
123+
124+
### Mobile
125+
126+
Mobile isn't a downgraded desktop view — it's the **stress test** for every decision above.
127+
128+
- If a surface only works on desktop because of icon density, that's a sign the desktop version is also too dense.
129+
- Design for mobile constraints and let desktop benefit from the breathing room.
130+
- Tap targets need real space. Hover-only interactions need a non-hover equivalent.
131+
- Test mobile during PR development, not after review.
132+
133+
---
134+
135+
## How to Contribute Well
136+
137+
1. **Default to "no" on additions to primary surfaces** (title bar, composer, sidebar items, message lines). Propose additions to detail views, settings, or the planned secondary composer row instead.
138+
139+
2. **If your PR adds visual elements, justify the surface.** Explain in the description *why this surface is the right home* for it, and what was considered and rejected. A one-line "added a token counter to the title bar" is not enough context for a reviewer.
140+
141+
3. **Three-click rule is a constraint, not a target.** Don't pad navigation to reach three; use it as a ceiling.
142+
143+
4. **Feature parity with Hermes is the current priority.** Net-new UI ideas are welcome but should be opened as discussion issues first if they touch the surfaces above.
144+
145+
5. **Translations matter.** No raw translation keys in the UI. If you add a string, add the key — and make sure it renders correctly in the locales we support.
146+
147+
6. **Mobile is not optional.** If you add or modify a primary surface, verify it works at mobile widths before opening the PR.
148+
149+
7. **When in doubt, ask before building.** A 5-minute conversation beats a rejected PR. Open a draft PR, an issue, or a discussion.
150+
151+
---
152+
153+
## A Quick Decision Checklist
154+
155+
Before you add anything to a primary surface, walk through this:
156+
157+
- [ ] Is this information needed *while doing the primary task on this surface*, or only sometimes?
158+
- [ ] Does it survive the mobile stress test at 320–375px wide?
159+
- [ ] Is there a detail view, settings panel, or Control Center entry where it would live more comfortably?
160+
- [ ] If five other contributors each added "just one small thing" to this surface, would it still feel calm?
161+
- [ ] What does this displace, and is the trade worth it?
162+
163+
If you can't answer those cleanly, the addition probably belongs somewhere else.
164+
165+
---
166+
167+
## Closing
168+
169+
The philosophy in one line:
170+
171+
> **Keep the surface quiet so the product can grow loud.**
172+
173+
Restraint now is what gives Hermes WebUI room to expand into a serious desktop app, a strong mobile experience, and full Hermes feature parity without collapsing under its own UI weight.
174+
175+
Thanks for building this with me.
176+
177+
— Aron Prins

0 commit comments

Comments
 (0)