INBUXA's name and site where the webmail still said ihasmail

- The sign-in footer names the build "INBUXA webmail" and links to
  inbuxa.org, next to its AGPL source link.
- About gives the INBUXA webmail version, and credits ihasmail on a line
  of its own.
- The user menu's "About ihasmail" is "About INBUXA", to inbuxa.org. The
  Documentation entry pointed at ihasmail's docs; it's gone until INBUXA
  has documentation of its own.
- The startup log says "mail server:" rather than naming the server
  software.

"About INBUXA" and "Built on {ihasmail}" are translated in all nine
catalogues.
This commit is contained in:
2026-09-19 10:09:28 -07:00
parent cee4f74257
commit cfa661de20
13 changed files with 31 additions and 10 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ async function main() {
const app = createApp();
const server = serve({ fetch: app.fetch, hostname: config.host, port: config.port }, (info) => {
console.log(`[ihasmail] ${config.appName} listening on http://${info.address}:${info.port}`);
console.log(`[ihasmail] upstream Stalwart: ${config.stalwartUrl}`);
console.log(`[ihasmail] mail server: ${config.stalwartUrl}`);
console.log(`[ihasmail] static dir: ${config.staticDir}`);
});
+2
View File
@@ -832,6 +832,8 @@ export const catalog: Catalog = {
"Default mail app": "Standard-E-Mail-Programm",
"Documentation": "Dokumentation",
"About ihasmail": "Über ihasmail",
"About INBUXA": "Über INBUXA",
"Built on {ihasmail}": "Basiert auf {ihasmail}",
"Server": "Server",
"Server capabilities": "Server-Funktionen",
"Accounts": "Konten",
+2
View File
@@ -828,6 +828,8 @@ export const catalog: Catalog = {
"Default mail app": "Aplicación de correo predeterminada",
"Documentation": "Documentación",
"About ihasmail": "Acerca de ihasmail",
"About INBUXA": "Acerca de INBUXA",
"Built on {ihasmail}": "Basado en {ihasmail}",
"About": "Acerca de",
"Server": "Servidor",
"Server capabilities": "Funciones del servidor",
+2
View File
@@ -834,6 +834,8 @@ export const catalog: Catalog = {
"Default mail app": "Application de messagerie par défaut",
"Documentation": "Documentation",
"About ihasmail": "À propos de ihasmail",
"About INBUXA": "À propos dINBUXA",
"Built on {ihasmail}": "Basé sur {ihasmail}",
"About": "À propos",
"Server": "Serveur",
"Server capabilities": "Fonctionnalités du serveur",
+2
View File
@@ -828,6 +828,8 @@ export const catalog: Catalog = {
"Default mail app": "既定のメールアプリ",
"Documentation": "ドキュメント",
"About ihasmail": "ihasmail について",
"About INBUXA": "INBUXA について",
"Built on {ihasmail}": "{ihasmail} をベースに構築",
"About": "情報",
"Server": "サーバー",
"Server capabilities": "サーバーの機能",
+2
View File
@@ -827,6 +827,8 @@ export const catalog: Catalog = {
"Default mail app": "Standaard e-mailprogramma",
"Documentation": "Documentatie",
"About ihasmail": "Over ihasmail",
"About INBUXA": "Over INBUXA",
"Built on {ihasmail}": "Gebouwd op {ihasmail}",
"About": "Over",
"Server": "Server",
"Server capabilities": "Servermogelijkheden",
+2
View File
@@ -831,6 +831,8 @@ export const catalog: Catalog = {
"Default mail app": "Aplicativo de e-mail padrão",
"Documentation": "Documentação",
"About ihasmail": "Sobre o ihasmail",
"About INBUXA": "Sobre o INBUXA",
"Built on {ihasmail}": "Baseado no {ihasmail}",
"About": "Sobre",
"Server": "Servidor",
"Server capabilities": "Recursos do servidor",
+2
View File
@@ -831,6 +831,8 @@ export const catalog: Catalog = {
"Default mail app": "Почтовая программа по умолчанию",
"Documentation": "Документация",
"About ihasmail": "О программе ihasmail",
"About INBUXA": "О программе INBUXA",
"Built on {ihasmail}": "Основано на {ihasmail}",
"About": "О программе",
"Server": "Сервер",
"Server capabilities": "Возможности сервера",
+2
View File
@@ -825,6 +825,8 @@ export const catalog: Catalog = {
"Default mail app": "Поштова програма за замовчуванням",
"Documentation": "Документація",
"About ihasmail": "Про ihasmail",
"About INBUXA": "Про INBUXA",
"Built on {ihasmail}": "Створено на основі {ihasmail}",
"About": "Про програму",
"Server": "Сервер",
"Server capabilities": "Можливості сервера",
+2
View File
@@ -827,6 +827,8 @@ export const catalog: Catalog = {
"Default mail app": "默认邮件应用",
"Documentation": "文档",
"About ihasmail": "关于 ihasmail",
"About INBUXA": "关于 INBUXA",
"Built on {ihasmail}": "基于 {ihasmail} 构建",
"About": "关于",
"Server": "服务器",
"Server capabilities": "服务器功能",
+5 -4
View File
@@ -1,6 +1,6 @@
import { lazy, Suspense, useEffect, useRef, useState, type ReactNode } from "react";
import { Link, useLocation } from "wouter";
import { BookOpen, Calendar, ChevronsUpDown, FolderOpen, Globe, HelpCircle, LogOut, Mail, Menu as MenuIcon, Moon, PenSquare, Plus, RefreshCw, Settings, ShieldCheck, Sun, Upload, Users, X } from "lucide-react";
import { Calendar, ChevronsUpDown, FolderOpen, Globe, HelpCircle, LogOut, Mail, Menu as MenuIcon, Moon, PenSquare, Plus, RefreshCw, Settings, ShieldCheck, Sun, Upload, Users, X } from "lucide-react";
import { useSession } from "@/store/session";
import { withBase } from "@/lib/basePath";
import { DEFAULT_APP_NAME } from "@/lib/brand";
@@ -187,11 +187,12 @@ export function AppShell({ children }: { children: ReactNode }) {
</div>
</div>
<MenuSep />
<MenuItem icon={<BookOpen size={16} />} label={t("Documentation")} href="https://docs.ihasmail.org" external />
{/* The project site. It is linked from the login screen footer, which
is a page a signed-in user never sees again -- so from inside the
app there was no way back to it. */}
<MenuItem icon={<Globe size={16} />} label={t("About ihasmail")} href="https://ihasmail.org" external />
app there was no way back to it.
ihasmail-inbuxa: INBUXA's site, and no Documentation entry until
INBUXA has documentation of its own to point at. */}
<MenuItem icon={<Globe size={16} />} label={t("About INBUXA")} href="https://inbuxa.org" external />
<MenuItem icon={<Settings size={16} />} label={t("Settings")} onClick={() => navigate("/settings")} />
{/* Only for an account whose Stalwart role manages other accounts.
Nobody else is shown an entry that would open onto refusals. */}
+3 -2
View File
@@ -151,9 +151,10 @@ export function LoginPage() {
One <p> with a break rather than two: .foot carries a 20px
margin-top, which a second paragraph would repeat as a gap.
*/}
<span className="notranslate" translate="no">ihasmail v{APP_VERSION}</span>
{/* ihasmail-inbuxa: this build is INBUXA's webmail, and its site is INBUXA's. */}
<span className="notranslate" translate="no">INBUXA webmail v{APP_VERSION}</span>
<br />
<a href="https://ihasmail.org" target="_blank" rel="noopener noreferrer">{t("ihasmail.org")}</a>
<a href="https://inbuxa.org" target="_blank" rel="noopener noreferrer" className="notranslate" translate="no">inbuxa.org</a>
{" · "}
<a href={withBase(SOURCE_ARCHIVE)} target="_blank" rel="noopener noreferrer">{t("AGPL-3.0 source")}</a>
{" "}
+4 -3
View File
@@ -11,8 +11,8 @@ export function AboutSettings() {
// The exact source of this build, written next to the app by the build.
return (
<div>
{/* ihasmail-inbuxa: INBUXA's webmail, built on ihasmail, whose version
and source stay here as its credit and the AGPL's offer. */}
{/* ihasmail-inbuxa: INBUXA's webmail, built on ihasmail. The version and
source are this build's, the AGPL's offer; ihasmail keeps its credit. */}
<h1>{t("About INBUXA webmail")}</h1>
<p className="lead">{tNode("A fast, friendly, open-source webmail for {server}, built on JMAP.", { server: <span className="notranslate" translate="no">INBUXA</span> })}</p>
<div className="row" style={{ gap: 16, alignItems: "center", marginBottom: 16 }}>
@@ -20,7 +20,8 @@ export function AboutSettings() {
<div>
<InbuxaWordmark height={26} />
{/* A product name and a version string: neither is a word to translate. */}
<div style={{ fontWeight: 700 }} className="notranslate" translate="no">ihasmail v{APP_VERSION}</div>
<div style={{ fontWeight: 700 }} className="notranslate" translate="no">INBUXA webmail v{APP_VERSION}</div>
<div className="hint">{tNode("Built on {ihasmail}", { ihasmail: <a href="https://ihasmail.org" target="_blank" rel="noopener noreferrer" className="notranslate" translate="no">ihasmail</a> })}</div>
<div className="hint">{tNode("AGPL-3.0-or-later · {source}", { source: <a href={withBase(SOURCE_ARCHIVE)} target="_blank" rel="noopener noreferrer" className="notranslate" translate="no">source.tar.gz ({SOURCE_ID})</a> })}</div>
</div>
</div>