Description
Opening any thread in hey tui fails with:
the service is refusing requests: API error: 500 Internal Server Error
This is not a local auth or install problem. hey doctor is clean, listing boxes works, and the same threads load in the HEY web app. The TUI (and hey thread read) fail because HEY's JSON body endpoint 500s for onboarding / sign_up_message entries.
Steps to Reproduce
On a new HEY account whose Imbox is still the default HEY Team welcome threads:
hey tui
- Open any Imbox thread (e.g. "Getting started with HEY")
Or from the CLI:
hey box view imbox --json # works; postings have topic_id
hey thread read TOPIC_ID # 500
Direct API (same OAuth token):
GET /topics/TOPIC_ID/entries.json → 200, kind=sign_up_message
GET /messages/ENTRY_ID.json → 500 HTML "Something went wrong."
GET /topics/TOPIC_ID (HTML) → 200, thread renders in the web app
Every Imbox thread on this account is kind: sign_up_message and every GET /messages/ENTRY_ID.json for those entry IDs returns 500. Examples:
| topic_id |
entry_id |
subject |
| 2109939384 |
2242475713 |
Getting started with HEY |
| 2109939378 |
2242475705 |
FAQs: Notifications, multiple accounts, apps, etc. |
Request id from a 500: bf55c710-8ccf-4762-a81f-cca704b7ce7b.
Expected Behavior
The TUI opens the thread. hey thread read returns the body (or at least a bodyless/partial result instead of aborting the whole load).
Actual Behavior
internal/threadload treats HTTP 500 as ErrSystemic ("the service is refusing requests") and aborts hydration. hey thread read --allow-partial still fails because the 500 is classified as systemic, not as a single failed body.
Verbose log:
GET (entries index) → 200
GET (message body) → 500, retried, then the TUI error overlay
Environment
- hey-cli 1.2.1 (
58c83f1e, 2026-08-26)
- Auth: OAuth, not expired, keyring
hey doctor: all ok
- OS: Linux
- HEY status page: operational (no incident on 2026-08-27)
Notes
This looks like a HEY API bug on Messages().Get / GET /messages/ENTRY_ID.json for sign_up_message. New accounts only have those threads, so the TUI looks completely broken until other mail arrives. The web UI still renders the same topics, so the content exists — the JSON message resource does not.
Possible client-side mitigations until the API is fixed:
- Do not treat a 500 on a single message hydrate as
ErrSystemic; record StateFailed so --allow-partial and the TUI can show the entry summary.
- Skip
Messages().Get for kind: sign_up_message (and similar non-message kinds) and render the entry summary instead of a fatal overlay.
Description
Opening any thread in
hey tuifails with:This is not a local auth or install problem.
hey doctoris clean, listing boxes works, and the same threads load in the HEY web app. The TUI (andhey thread read) fail because HEY's JSON body endpoint 500s for onboarding /sign_up_messageentries.Steps to Reproduce
On a new HEY account whose Imbox is still the default HEY Team welcome threads:
hey tuiOr from the CLI:
Direct API (same OAuth token):
Every Imbox thread on this account is
kind: sign_up_messageand everyGET /messages/ENTRY_ID.jsonfor those entry IDs returns 500. Examples:Request id from a 500:
bf55c710-8ccf-4762-a81f-cca704b7ce7b.Expected Behavior
The TUI opens the thread.
hey thread readreturns the body (or at least a bodyless/partial result instead of aborting the whole load).Actual Behavior
internal/threadloadtreats HTTP 500 asErrSystemic("the service is refusing requests") and aborts hydration.hey thread read --allow-partialstill fails because the 500 is classified as systemic, not as a single failed body.Verbose log:
Environment
58c83f1e, 2026-08-26)hey doctor: all okNotes
This looks like a HEY API bug on
Messages().Get/GET /messages/ENTRY_ID.jsonforsign_up_message. New accounts only have those threads, so the TUI looks completely broken until other mail arrives. The web UI still renders the same topics, so the content exists — the JSON message resource does not.Possible client-side mitigations until the API is fixed:
ErrSystemic; recordStateFailedso--allow-partialand the TUI can show the entry summary.Messages().Getforkind: sign_up_message(and similar non-message kinds) and render the entry summary instead of a fatal overlay.