Sitelet https://github.com/hotdata-dev/hototel-server/pull/44
Skip to content

Write the UI for the person using it, not the person who built it - #44

Merged
eddietejeda merged 1 commit into
mainfrom
plain-language
Sep 14, 2026
Merged

eddietejeda merged 1 commit into
mainfrom
plain-language

Conversation

@eddietejeda

Copy link
Copy Markdown
Contributor

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.

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.
Comment on lines +37 to +39
<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>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread server/static/index.html
Comment on lines +81 to +84
<!-- 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. -->

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread server/static/admin.js
.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;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@eddietejeda
eddietejeda merged commit a2a239e into main Sep 14, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant