docs.ihasmail.org explains installing, configuring and using ihasmail, and nothing in the app pointed at it.
The profile menu is where someone looks for things that are about the app rather than about their mail, so it goes there — above Settings, opening in a new tab. Reading the docs is something you do beside your mail, not instead of it.
It renders a real link
MenuItem now renders an anchor when given an href, rather than a button calling window.open. The browser's own handling of a link comes with it — middle-click, a modifier-click, "open in new tab", the address on hover, copying it — none of which a button offers however carefully it's scripted, and all of which someone expects of a menu entry that leaves the app.
Items without an href are the button they always were.
And a line of CSS
The global rule for a coloured and underlined the one entry that is a link, so the menu had a blue underlined item among four plain ones — which reads as a mistake rather than a distinction.
Verified
Against the mock: the entry sits above Settings, is an anchor to https://docs.ihasmail.org with target="_blank" and rel="noopener noreferrer", and computes to the same colour, size and decoration as Settings beside it.
338 web and 77 server tests pass. npm run typecheck clean.
docs.ihasmail.org explains installing, configuring and using ihasmail, and nothing in the app pointed at it.
The profile menu is where someone looks for things that are about *the app* rather than about their mail, so it goes there — above Settings, opening in a new tab. Reading the docs is something you do beside your mail, not instead of it.
### It renders a real link
`MenuItem` now renders an anchor when given an `href`, rather than a button calling `window.open`. The browser's own handling of a link comes with it — middle-click, a modifier-click, "open in new tab", the address on hover, copying it — none of which a button offers however carefully it's scripted, and all of which someone expects of a menu entry that leaves the app.
Items without an `href` are the button they always were.
### And a line of CSS
The global rule for `a` coloured and underlined the one entry that is a link, so the menu had a blue underlined item among four plain ones — which reads as a mistake rather than a distinction.
### Verified
Against the mock: the entry sits above Settings, is an anchor to `https://docs.ihasmail.org` with `target="_blank"` and `rel="noopener noreferrer"`, and computes to the same colour, size and decoration as Settings beside it.
338 web and 77 server tests pass. `npm run typecheck` clean.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
**Merged** 2026-08-27 as coffey-labs/ihasmail@312a833d78eb
<sub>Rebuilt from: git history, session transcript.</sub>
This repo is archived. You cannot comment on issues.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
docs.ihasmail.org explains installing, configuring and using ihasmail, and nothing in the app pointed at it.
The profile menu is where someone looks for things that are about the app rather than about their mail, so it goes there — above Settings, opening in a new tab. Reading the docs is something you do beside your mail, not instead of it.
It renders a real link
MenuItemnow renders an anchor when given anhref, rather than a button callingwindow.open. The browser's own handling of a link comes with it — middle-click, a modifier-click, "open in new tab", the address on hover, copying it — none of which a button offers however carefully it's scripted, and all of which someone expects of a menu entry that leaves the app.Items without an
hrefare the button they always were.And a line of CSS
The global rule for
acoloured and underlined the one entry that is a link, so the menu had a blue underlined item among four plain ones — which reads as a mistake rather than a distinction.Verified
Against the mock: the entry sits above Settings, is an anchor to
https://docs.ihasmail.orgwithtarget="_blank"andrel="noopener noreferrer", and computes to the same colour, size and decoration as Settings beside it.338 web and 77 server tests pass.
npm run typecheckclean.🤖 Generated with Claude Code
Merged 2026-08-27 as coffey-labs/ihasmail@312a833d78
Rebuilt from: git history, session transcript.