APP_NAME renames an instance, but only the sign-in page, the title bar and a few headings used it. Two dozen sentences wrote "ihasmail" into themselves, so a renamed instance still told people to keep an "ihasmail" tab open, and offered to open mail links "in ihasmail".
What changed
Sentences that name the app take it as {app}, which also lets a translator put the name where their language wants it.
brand.ts grew useAppName() for components and currentAppName() for the few places that build strings outside React (the service worker's facts).
All nine catalogues keep their translations: the name inside each one became the placeholder. Three of the strings had no translation before and still fall back to English.
A test walks the sources and the catalogues so a new sentence can't hard-code the name again.
Left alone
"ihasmail" stays literal where it names something a person can go and look at, rather than the app:
the Files folder ihasmail that holds signature images and settings;
the Sieve script ihasmail;
ihasmail.org.
Checks
Type-check, lint, web tests (1403) and server tests (251) all pass.
`APP_NAME` renames an instance, but only the sign-in page, the title bar and a few headings used it. Two dozen sentences wrote "ihasmail" into themselves, so a renamed instance still told people to keep an "ihasmail" tab open, and offered to open mail links "in ihasmail".
### What changed
- Sentences that name the app take it as `{app}`, which also lets a translator put the name where their language wants it.
- `brand.ts` grew `useAppName()` for components and `currentAppName()` for the few places that build strings outside React (the service worker's facts).
- All nine catalogues keep their translations: the name inside each one became the placeholder. Three of the strings had no translation before and still fall back to English.
- A test walks the sources and the catalogues so a new sentence can't hard-code the name again.
### Left alone
"ihasmail" stays literal where it names something a person can go and look at, rather than the app:
- the Files folder `ihasmail` that holds signature images and settings;
- the Sieve script `ihasmail`;
- ihasmail.org.
### Checks
Type-check, lint, web tests (1403) and server tests (251) all pass.
**Merged** 2026-09-19 as coffey-labs/ihasmail@07b39eb9b608
<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.
APP_NAMErenames an instance, but only the sign-in page, the title bar and a few headings used it. Two dozen sentences wrote "ihasmail" into themselves, so a renamed instance still told people to keep an "ihasmail" tab open, and offered to open mail links "in ihasmail".What changed
{app}, which also lets a translator put the name where their language wants it.brand.tsgrewuseAppName()for components andcurrentAppName()for the few places that build strings outside React (the service worker's facts).Left alone
"ihasmail" stays literal where it names something a person can go and look at, rather than the app:
ihasmailthat holds signature images and settings;ihasmail;Checks
Type-check, lint, web tests (1403) and server tests (251) all pass.
Merged 2026-09-19 as coffey-labs/ihasmail@07b39eb9b6
Rebuilt from: git history, session transcript.