mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
feat(landing-page): retitle HA page for brand-defense SEO across 18 locales (#2618)
Some checks failed
visual-baseline / Capture visual baselines (push) Waiting to run
ci / Detect CI change scopes (push) Successful in 1s
landing-page-ci / Validate landing page (push) Failing after 3s
landing-page-deploy / Deploy landing page (push) Has been skipped
nix-check / build (push) Failing after 2s
ci / Validate Nix flake (push) Failing after 1s
ci / Preflight (push) Failing after 1s
ci / Core package tests (push) Failing after 1s
ci / Tools workspace tests (push) Failing after 1s
ci / Daemon workspace tests (1/2) (push) Failing after 1s
ci / Daemon workspace tests (2/2) (push) Failing after 1s
ci / Web workspace tests (push) Failing after 1s
ci / E2E vitest (push) Failing after 1s
ci / Playwright critical (starters) (push) Failing after 2s
ci / Playwright critical (core) (push) Failing after 1s
ci / Build workspaces (push) Failing after 1s
ci / App workspace tests (push) Failing after 1s
ci / Validate workspace (push) Failing after 1s
ci / Runtime trace (push) Has been skipped
Some checks failed
visual-baseline / Capture visual baselines (push) Waiting to run
ci / Detect CI change scopes (push) Successful in 1s
landing-page-ci / Validate landing page (push) Failing after 3s
landing-page-deploy / Deploy landing page (push) Has been skipped
nix-check / build (push) Failing after 2s
ci / Validate Nix flake (push) Failing after 1s
ci / Preflight (push) Failing after 1s
ci / Core package tests (push) Failing after 1s
ci / Tools workspace tests (push) Failing after 1s
ci / Daemon workspace tests (1/2) (push) Failing after 1s
ci / Daemon workspace tests (2/2) (push) Failing after 1s
ci / Web workspace tests (push) Failing after 1s
ci / E2E vitest (push) Failing after 1s
ci / Playwright critical (starters) (push) Failing after 2s
ci / Playwright critical (core) (push) Failing after 1s
ci / Build workspaces (push) Failing after 1s
ci / App workspace tests (push) Failing after 1s
ci / Validate workspace (push) Failing after 1s
ci / Runtime trace (push) Has been skipped
Replaces the HA page `<title>` from the previous descriptive form
("HTML Anything — your local AI agent writes the HTML, you ship
it | Open Design") with a noun-stack that captures three high-value
brand-defense queries:
- "open source html anything" — researching alternatives
- "html anything official" — verifying the canonical source
- "open source html anything official" — precise long tail
Why
- The descriptive title before this change told the story but didn't
match what users actually type when they land on this page from
search. The brand has been growing fast (4.1K+ stars on the repo);
visitors increasingly arrive with intent to verify ("is this the
real one?"), to compare alternatives, or to find the canonical
install path. The new title format leads with the tokens those
queries hit.
- Joey called the change explicitly. The brand has reached a stage
where SEO defense beats descriptive copy on a one-line surface.
What
- New `OPEN_SOURCE_OFFICIAL_TITLE` constant maps every landing-page
locale to its translated title. Pattern: `{open-source} HTML Anything
{official}` with no separator. Word order follows what's natural in
each locale (German: Offiziell at end; French/Romance: adjectives
after the noun; CJK: adjectives before).
- The three explicit copy blocks (`HTML_ANYTHING_COPY_EN`,
`_ZH`, `_ZH_TW`) all reference the constant rather than holding
their own literal title strings, so future title changes update
in one place.
- `derivedHtmlAnythingCopy()` (which builds copy for the 15
non-explicit locales by spreading EN over locale UI strings) now
pulls the title from the same constant via `[locale]` lookup with
EN as a defensive fallback.
- Adds three new `SoftwareApplication.alternateName` entries for the
same query stack. Schema-level signal complements the title-level
signal: the structured-data entity now matches whichever shape the
user typed regardless of UI locale, since these are proper-noun
query variants that don't translate.
Surface area
- Marketing site only. Single file: `app/pages/html-anything/index.astro`.
- No `apps/web`, no `apps/daemon`, no contracts, no CLI.
- No new dependencies.
Validation
- `pnpm --filter @open-design/landing-page typecheck` — 0 errors.
- Local dev: every locale's HA page renders the new title.
- en → `<title>Open Source HTML Anything Official</title>`
- zh → `<title>开源 HTML Anything 官方</title>`
- ja → `<title>オープンソース HTML Anything 公式</title>`
- de → `<title>Open Source HTML Anything Offiziell</title>`
- ar → `<title>HTML Anything مفتوح المصدر الرسمي</title>`
- …same shape across all 18 landing locales.
Co-authored-by: Joey-nexu <joeylee12629@gmail.com>
This commit is contained in:
parent
3db1e27b81
commit
4cb5778669
1 changed files with 47 additions and 4 deletions
|
|
@ -27,6 +27,43 @@ const HA_REPO = 'nexu-io/html-anything';
|
|||
const HA_URL = `https://github.com/${HA_REPO}`;
|
||||
const HA_REPO_API = `https://api.github.com/repos/${HA_REPO}`;
|
||||
|
||||
/*
|
||||
* SEO-targeted page titles per locale. Pattern: noun-stack with no
|
||||
* separators — `{open-source} HTML Anything {official}`. The English
|
||||
* tokens "Open Source" and "Official" capture brand-defense queries:
|
||||
* - "open source html anything" (researching alternatives)
|
||||
* - "html anything official" (verifying the canonical source)
|
||||
* - "open source html anything official" (precise long tail)
|
||||
*
|
||||
* Each non-English locale translates the surrounding tokens so a
|
||||
* user searching in their own language still lands on a title that
|
||||
* matches their query, while "HTML Anything" stays untranslated as
|
||||
* a brand. Word order follows whatever feels natural in each locale
|
||||
* (German: Offiziell at end; French: adjectives after noun; CJK:
|
||||
* adjectives before noun) rather than a slavish copy of the English
|
||||
* stack — Google tokenizes regardless of order.
|
||||
*/
|
||||
const OPEN_SOURCE_OFFICIAL_TITLE: Record<LandingLocaleCode, string> = {
|
||||
en: 'Open Source HTML Anything Official',
|
||||
zh: '开源 HTML Anything 官方',
|
||||
'zh-tw': '開源 HTML Anything 官方',
|
||||
ja: 'オープンソース HTML Anything 公式',
|
||||
ko: '오픈 소스 HTML Anything 공식',
|
||||
de: 'Open Source HTML Anything Offiziell',
|
||||
fr: 'HTML Anything Open Source Officiel',
|
||||
ru: 'HTML Anything Open Source Официальный',
|
||||
es: 'HTML Anything Open Source Oficial',
|
||||
'pt-br': 'HTML Anything Open Source Oficial',
|
||||
it: 'HTML Anything Open Source Ufficiale',
|
||||
vi: 'HTML Anything Open Source Chính thức',
|
||||
pl: 'HTML Anything Open Source Oficjalny',
|
||||
id: 'HTML Anything Open Source Resmi',
|
||||
nl: 'HTML Anything Open Source Officieel',
|
||||
ar: 'HTML Anything مفتوح المصدر الرسمي',
|
||||
tr: 'HTML Anything Açık Kaynak Resmi',
|
||||
uk: 'HTML Anything Open Source Офіційний',
|
||||
};
|
||||
|
||||
/*
|
||||
* Imagery sourced directly from the HA repo via raw.githubusercontent.com.
|
||||
* This is a temporary CDN — for production polish a follow-up should mirror
|
||||
|
|
@ -153,7 +190,7 @@ type HtmlAnythingCopy = {
|
|||
};
|
||||
|
||||
const HTML_ANYTHING_COPY_EN: HtmlAnythingCopy = {
|
||||
title: 'HTML Anything — your local AI agent writes the HTML, you ship it | Open Design',
|
||||
title: OPEN_SOURCE_OFFICIAL_TITLE.en,
|
||||
description:
|
||||
'HTML Anything is the agentic HTML editor from the Open Design family. Reuse the coding-agent CLI you already authenticated — Claude Code, Codex, Cursor, Gemini, Copilot, OpenCode, Qwen, Aider — to turn Markdown, CSV, or JSON into ship-ready HTML for WeChat, X, Zhihu, and Xiaohongshu. Open-source, Apache-2.0.',
|
||||
label: 'Sister project',
|
||||
|
|
@ -294,7 +331,7 @@ const HTML_ANYTHING_COPY_EN: HtmlAnythingCopy = {
|
|||
|
||||
const HTML_ANYTHING_COPY_ZH: HtmlAnythingCopy = {
|
||||
...HTML_ANYTHING_COPY_EN,
|
||||
title: 'HTML Anything — 本地 AI Agent 写 HTML,你负责发布 | Open Design',
|
||||
title: OPEN_SOURCE_OFFICIAL_TITLE.zh,
|
||||
description:
|
||||
'HTML Anything 是 Open Design 家族里的 Agent 原生 HTML 编辑器。复用你已经登录的 Claude Code、Codex、Cursor、Gemini、Copilot、OpenCode、Qwen、Aider,把 Markdown、CSV 或 JSON 变成可交付 HTML。',
|
||||
label: '姊妹项目',
|
||||
|
|
@ -395,7 +432,7 @@ const HTML_ANYTHING_COPY_ZH: HtmlAnythingCopy = {
|
|||
|
||||
const HTML_ANYTHING_COPY_ZH_TW: HtmlAnythingCopy = {
|
||||
...HTML_ANYTHING_COPY_ZH,
|
||||
title: 'HTML Anything — 本地 AI Agent 寫 HTML,你負責發布 | Open Design',
|
||||
title: OPEN_SOURCE_OFFICIAL_TITLE['zh-tw'],
|
||||
description:
|
||||
'HTML Anything 是 Open Design 家族裡的 Agent 原生 HTML 編輯器。複用你已經登入的 Claude Code、Codex、Cursor、Gemini、Copilot、OpenCode、Qwen、Aider,把 Markdown、CSV 或 JSON 變成可交付 HTML。',
|
||||
label: '姊妹專案',
|
||||
|
|
@ -509,7 +546,7 @@ function derivedHtmlAnythingCopy(locale: LandingLocaleCode): HtmlAnythingCopy {
|
|||
|
||||
return {
|
||||
...HTML_ANYTHING_COPY_EN,
|
||||
title: `${product.htmlAnythingName} — ${product.htmlAnythingBlurb} | Open Design`,
|
||||
title: OPEN_SOURCE_OFFICIAL_TITLE[locale] ?? OPEN_SOURCE_OFFICIAL_TITLE.en,
|
||||
description: `${product.htmlAnythingBlurb} ${summary}`,
|
||||
label: product.product,
|
||||
heading: product.htmlAnythingBlurb,
|
||||
|
|
@ -699,6 +736,12 @@ const jsonLd: Array<Record<string, unknown>> = [
|
|||
'htmlanything',
|
||||
'HTML Anything Editor',
|
||||
'The agentic HTML editor',
|
||||
// Brand-defense + canonical-source queries: keep these stacked
|
||||
// alongside the descriptive variants above so the structured
|
||||
// entity matches whichever shape the user typed.
|
||||
'open source html anything',
|
||||
'html anything official',
|
||||
'open source html anything official',
|
||||
],
|
||||
applicationCategory: 'DeveloperApplication',
|
||||
operatingSystem: 'macOS, Linux, Windows',
|
||||
|
|
|
|||
Loading…
Reference in a new issue