Repository navigation
Write the UI for the person using it, not the person who built it - #44
Conversation
A sweep of every user-visible string, on the premise that the reader manages a team and does not care how any of this works. The dashboard footer was 76 words, most of them a pricing table: cache read 0.1x input, cache writes 1.25x / 2x, OpenAI cached input ~10%. Nobody reading a dashboard is recomputing a total by hand, and the one thing in there that changes what they do with the numbers -- these are not a bill -- was competing with it. Down to 52 words, and both remaining facts are actionable: where the real spend lives, and which tools these figures cover. That second half stayed deliberately. Someone looking for Cursor and finding nothing has no other way to learn it is never coming, and I nearly cut it before noticing that an unexplained absence reads as a broken product. The admin footer explained that organizations are isolated by a dedicated hotdata database rather than a query filter. That is a fact about the storage engine, sitting permanently at the bottom of the page where somebody administers their colleagues; it belongs to whoever operates the server and is already written down for them in docs/operating.md. 31 words to 13. "Collector" is gone from everywhere a person reads. It is the name of a component, and the thing it names is a machine -- which is what the table on that page has always been called. So: "Nobody has installed hotusage yet" rather than "nobody has signed in a collector or a skill", "Sign out this machine" rather than "Revoke", a page titled "approve this machine", and a tooltip that says a machine has not reported rather than a collector. The team-invite warning is half its old length and says the dangerous part plainly: without a domain, anyone with the link can join and see your team's usage. That is the one control on the page that can hand a stranger everyone's data, and it is the default until a domain is typed, so it got shorter but not softer. The remove-member dialog leads with the consequence that cannot be undone from that page -- the account goes -- instead of a conditional clause about how many organizations they happen to be in, which the person clicking Remove can see. On the install page: the explanation of what the client does became "install hotusage on a machine you code on and the dashboard fills up"; "Run this on your machine" became "paste this into a terminal"; the promise that the page advances by itself is gone, since it demonstrates that by doing it, while the one thing someone can get wrong -- which account to approve as -- stays. The Windows instructions are a link and one command instead of a four-step recipe. Nothing load-bearing moved. The device page still requires the code to be typed, still renders the machine's self-reported name as quoted data, and still warns against approving a sign-in you did not start. node --check clean on all three scripts, 57 tests across six suites.
| <div class="alt">On Windows? <a | ||
| href="https://github.com/hotdata-dev/hotusage-client/releases">Download | ||
| it here</a> and run <code>hotusage install</code>.</div> |
There was a problem hiding this comment.
nit: (not blocking) The new Windows text drops the PATH step. A Windows user downloads the release .zip, extracts it, then types hotusage install. That command fails with "not recognized" until hotusage.exe sits on PATH. No other page or document in this repository covers Windows installation, so this block is the only instruction available. Restore the PATH step, or point the link at a client-repo page that states the PATH step.
| <!-- The one thing here that changes what someone does with these numbers is | ||
| that they are not a bill. The per-model multipliers behind them, and | ||
| where the rows come from, answer questions nobody reading a dashboard | ||
| is asking; both are in the README for anyone who is. --> |
There was a problem hiding this comment.
nit: (not blocking) The README does not hold the per-model multipliers. README.md:35-41 states only that the figures are list-price equivalents worked out at published rates. A search of every *.md file finds no mention of cache reads, cache writes, or cached input. So this change removes the only record of cache read 0.1x, cache writes 1.25x / 2x, and OpenAI cached input ~10%. Add those rates to README.md, or delete the README claim from the comment.
| .filter(Boolean).join(', and '); | ||
| const revoke = action('Revoke', true, () => { | ||
| if (!confirm(`Revoke ${c.hostname || 'that machine'}? It ${loses}.`)) return; | ||
| if (!confirm(`Sign out ${c.hostname || 'that machine'}? It ${loses}.`)) return; |
There was a problem hiding this comment.
nit: (not blocking) The machine action keeps two names. The button label stays Revoke at admin.js:205, and admin.html:16 now tells a member that an admin can "sign out a machine". An admin clicks a button labelled Revoke and reads a dialog that asks about signing out. Rename the machine action label to Sign out. The invite action at admin.js:186 keeps Revoke, which matches an invite rather than a machine.
| <h1>hotusage</h1> | ||
| </div> | ||
| <div class="sub" id="sub">Install the client to start collecting</div> | ||
| <div class="sub" id="sub">Install hotusage</div> |
There was a problem hiding this comment.
super nit: (not blocking) The word "client" survives twice on this page. install.html:6 sets the browser tab title to hotusage - install the client. install.html:59 replaces the subtitle with Client connected once a machine reports.
Write the UI for the person using it, not the person who built it
A sweep of every user-visible string, on the premise that the reader manages a
team and does not care how any of this works.
The dashboard footer was 76 words, most of them a pricing table: cache read
0.1x input, cache writes 1.25x / 2x, OpenAI cached input ~10%. Nobody reading a
dashboard is recomputing a total by hand, and the one thing in there that
changes what they do with the numbers -- these are not a bill -- was competing
with it. Down to 52 words, and both remaining facts are actionable: where the
real spend lives, and which tools these figures cover. That second half stayed
deliberately. Someone looking for Cursor and finding nothing has no other way
to learn it is never coming, and I nearly cut it before noticing that an
unexplained absence reads as a broken product.
The admin footer explained that organizations are isolated by a dedicated
hotdata database rather than a query filter. That is a fact about the storage
engine, sitting permanently at the bottom of the page where somebody
administers their colleagues; it belongs to whoever operates the server and is
already written down for them in docs/operating.md. 31 words to 13.
"Collector" is gone from everywhere a person reads. It is the name of a
component, and the thing it names is a machine -- which is what the table on
that page has always been called. So: "Nobody has installed hotusage yet"
rather than "nobody has signed in a collector or a skill", "Sign out this
machine" rather than "Revoke", a page titled "approve this machine", and a
tooltip that says a machine has not reported rather than a collector.
The team-invite warning is half its old length and says the dangerous part
plainly: without a domain, anyone with the link can join and see your team's
usage. That is the one control on the page that can hand a stranger everyone's
data, and it is the default until a domain is typed, so it got shorter but not
softer.
The remove-member dialog leads with the consequence that cannot be undone from
that page -- the account goes -- instead of a conditional clause about how many
organizations they happen to be in, which the person clicking Remove can see.
On the install page: the explanation of what the client does became "install
hotusage on a machine you code on and the dashboard fills up"; "Run this on
your machine" became "paste this into a terminal"; the promise that the page
advances by itself is gone, since it demonstrates that by doing it, while the
one thing someone can get wrong -- which account to approve as -- stays. The
Windows instructions are a link and one command instead of a four-step recipe.
Nothing load-bearing moved. The device page still requires the code to be typed,
still renders the machine's self-reported name as quoted data, and still warns
against approving a sign-in you did not start.
node --check clean on all three scripts, 57 tests across six suites.