Skip to content

feat(site): add the landing page in five languages - #38

Merged
houko merged 15 commits into
mainfrom
feat/site
Nov 9, 2026
Merged

houko merged 15 commits into
mainfrom
feat/site

Conversation

@houko

@houko houko commented Nov 9, 2026

Copy link
Copy Markdown
Member

Summary

Adds Kando's landing page, to be served from GitHub Pages at https://kando.yldm.ai, in the five interface languages: / (English), /zh-CN/, /zh-TW/, /ja/, /ko/.

  • No new toolchain or dependency. apps/site is a stdlib-only Go module (added to go.work) that renders templates/ with content/<lang>.json into static HTML: go run ./apps/site -out apps/site/dist. No Node, no npm, no third-party modules, and the pages load nothing from other hosts (no web fonts, scripts, analytics or CDNs).
  • Each language is its own page, with <html lang>, canonical, reciprocal hreflang alternates plus x-default, Open Graph/Twitter tags, its own screenshots from docs/assets/<lang>/, and a switcher naming each language in itself. On a first visit, / sends a reader whose browser prefers Chinese, Japanese or Korean to that page; a choice made in the switcher is remembered and never overridden. Also 404.html, robots.txt, sitemap.xml, CNAME, favicons drawn from the app icon.
  • Content: hero with the library screenshot; how it works (link or file → yt-dlp → whisper.cpp on your computer → any OpenAI-compatible model → bilingual player and .srt); features, including a works-with strip of the featured site logos from the app's catalog and its 929-site count; player and settings screenshots; get started (download, the three programs with the Homebrew command, model and AI service setup, building from source).
  • Claims follow the code: there is no release yet, so the download button opens GitHub Releases and says builds will appear there; releases carry only macOS and Linux packages (Windows is held back by Windows: tests fail on local videos, the signed-in CLI and Unix assumptions #6, as release.yml says), so Windows readers are pointed to building from source; sound plays on macOS only; upload needs your own Google OAuth client id and storage keys.
  • Deployment: .github/workflows/site.yml, modeled on ai-logo's: GitHub-hosted runner, least-privilege permissions, every action pinned to a commit SHA, builds and tests on pushes to main that touch the site, its pictures, the site catalog or the icon, then deploys with actions/deploy-pages. ci.yml now also tests ./apps/site/... on every pull request.

Also in this PR:

  • The five READMEs now say there is no Windows build yet and that Kando offers to update an outdated yt-dlp. The Japanese settings picture caption uses the app's 表示言語.
  • TestScreenshotsReadme shoots the README library picture without the failed demo jobs, so the first product picture (and every link preview's og:image) no longer shows three red "Download failed" cards.

How it was built

A workflow of 25 agents: one built the generator and the English page, four wrote the zh-CN, zh-TW, ja and ko copy as native copywriters using the app's own UI wording from its catalogs, nine reviewed it (visual QA at four widths in light and dark, claim accuracy against the code, accessibility and SEO, deployment and privacy, and one native reviewer per language), a skeptical verifier checked every finding, and 43 of the 44 confirmed findings were fixed (the last one went away with another fix).

Screenshots

The page in English and Simplified Chinese at 1440 px, and in Japanese (dark) and Korean at 390 px:

English, 1440 px
Simplified Chinese, 1440 px
Japanese, 390 px, dark
Korean, 390 px

The README library picture, before and after:

README library, before
README library, after

Before it goes live

  • The DNS record is in place: kando.yldm.ai is a proxied CNAME to yldm-tech.github.io in Cloudflare, set up the same way as ailogo.yldm.ai.
  • GitHub Pages still has to be enabled for this repository with GitHub Actions as the source; the first deploy after merge then binds the domain through the CNAME file.

Test plan

  • gofmt -l apps/site, go vet ./apps/site/..., go test -count=1 ./apps/site/... (pages render for all five languages; every content file has en.json's keys and placeholders; every page has lang, canonical, all alternates, og:image and switcher links; every local href/src resolves; no external hosts beyond the allowed links; images have width, height and alt; no inline script or style; 404 marks no current page)
  • CGO_ENABLED=0 go test ./apps/kando/... ./packages/core/... ./packages/media/...
  • Playwright screenshots of all five pages at 1440 and 390 px, light and dark: no failed images, no console errors, no horizontal overflow, no layout shift as images load; redirect behavior checked for ja, zh-HK, fr and ?lang=en

houko added 15 commits November 9, 2026 18:05
A stdlib-only Go generator, go run ./apps/site -out apps/site/dist, renders kando.yldm.ai from html/template templates and one content file per language: a page for each language that has a content file, with canonical, hreflang alternates, Open Graph and Twitter tags and a language switcher, plus 404.html, robots.txt, sitemap.xml and CNAME. It copies the README screenshots of each language and the featured sites' logos from the app's catalog, and makes the favicons and the touch icon from the app icon.

The English content is the source; notes.json holds a translator's note for each key. The root page sends a first-time reader whose browser prefers Chinese, Japanese or Korean to that page, unless they picked a language before or the address pins one with ?lang=.
The tests render the site once and check each page's lang, canonical, alternates, social tags and switcher, that every local link resolves inside dist, that nothing points outside the repository, EveryAPI and the site itself, and that every content file and notes.json has exactly en.json's keys. make test runs them.
On a push to main that changes the site, the screenshots, the site catalog, the app icon or the workflow, and by hand: build and test apps/site on a GitHub-hosted runner, then deploy apps/site/dist with the Pages actions, pinned to commit SHAs.
Commands in Get started wrap instead of scrolling under the copy button, which now sits in the corner of the block; a hidden scrollbar on macOS and iOS made a cut-off line look like the whole command.

The hero's build link is underlined, kept on one line and spaced in CSS, without the extra space after a Chinese or Japanese full stop. The line through the how-it-works numbers ends at the fifth circle. Step numbers use the darker gradient and the initials' plates are darkened, so white text reaches 4.5:1.

Elements with a lang of their own get their own CJK font stack, Simplified Chinese gets an SC-first one, and Japanese text breaks by phrase with strict line breaking, so no line starts with ー. 404.html marks no language as the current page, and Build from source is no longer numbered as a third step.
The logo strip took the catalog's Simplified Chinese names on every page. content/sites.zh-TW.json gives the Traditional forms by domain, and a name in Chinese characters on a page in another language is marked lang="zh-Hans", so screen readers read it as Chinese. sites.json stays the app's catalog as it is.
With storage blocked, choosing English in the switcher could not be remembered, and the root page sent the reader straight back to their browser language; the 404 page's home link did the same even with storage. The root page now redirects only a reader who did not come from another page of the site.
Download names macOS and Linux and sends Windows readers to build from source, since the release publishes no Windows build. Upload says that signing in needs your own KANDO_GOOGLE_CLIENT_ID and uploading your storage's keys. The player card says the side panel makes 4 to 12 equal clips, and the player line says the translation sits on top by default, as the screenshot shows. Get started says the tools must be on PATH, that Kando offers to update an outdated yt-dlp, and, in a new line, how to get a whisper model and set up translation. Build from source is the alternative to downloading, and its note gives the command for a Windows without make. A dropped file is not downloaded, the settings heading no longer promises minutes, and the meta descriptions fit in a search result.

In the translations: zh-CN and zh-TW name Kando in the logo's accessible name, sizes keep their units on one line, ja's alt text uses the app's 表示言語, ko uses 표지 and a natural sentence for the translate step, zh-TW's presets belong to Settings › AI Service, and zh-CN's unsigned and player sentences read as Chinese.
The release publishes only macOS and Linux packages, and Update and Retry updates an outdated yt-dlp. The Japanese Settings › General picture names the row 表示言語, as the app does.
The Site workflow runs only on main, so a pull request that renamed a screenshot, changed sites.json or a logo, or left a content key behind passed CI and then broke the deploy. apps/site joins the packages CI builds, vets and tests, and the go mod tidy and govulncheck loops.
The library is the first picture of the READMEs and the landing page and the one link previews show, and its three red download-failed cards read as a broken app. TestScreenshotsReadme now renders it without the failed jobs, and docs/assets/<lang>/library.png is rendered again in all five languages; the other three pictures come out byte for byte the same.
The extra right padding kept for the wider Japanese copied label split yt-dlp and the clone URL at 360 px for good; the label shows for 1.6 seconds after a click, so the commands get the full width instead.
@github-actions github-actions Bot added area: app The app shell and state in apps/kando area: docs Markdown files and agent rules area: ci .github area: dependencies go.mod, go.sum and go.work files feature A new feature (feat) size/XL 1000 or more changed lines labels Nov 9, 2026
@houko
houko merged commit eac18af into main Nov 9, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: app The app shell and state in apps/kando area: ci .github area: dependencies go.mod, go.sum and go.work files area: docs Markdown files and agent rules feature A new feature (feat) size/XL 1000 or more changed lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant