docs(readme,landing): introduce the desktop app (#201)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Yaowei ZhengandClaude Fable 5 authored and GitHub committed 2026-08-05 00:21:15 +08:00
1 parent e0f6b122c8
commit 1cf0e4d9bc
21 files changed
+342 -17

No files matched your search

+37
View File
@@ -80,3 +80,40 @@ export const blogAssetUrl = (name: string): string => `${COMMUNITY_RAW}/blog-ass
/** API key consoles (same URLs the in-app Models page links to). */
export const DEEPSEEK_KEYS_URL = "https://platform.deepseek.com/api_keys";
export const OPENROUTER_KEYS_URL = "https://openrouter.ai/workspaces/default/keys";
/**
* Desktop app downloads. The installers carry version-less names (see
* packages/desktop/electron-builder.yml), which is what makes static links possible on a
* Pages-hosted site: GitHub's `releases/latest/download/<name>` always serves the newest
* release, no client-side resolution needed. The OSS mirror stores immutable per-tag
* directories instead, so mirror links DO need the current tag — the download page reads
* it from the bucket's `latest.json` pointer (the same file install.sh resolves) and
* falls back to the GitHub links when that fetch fails (e.g. CORS not configured, or the
* mirror unreachable).
*/
export const OSS_ORIGIN = "https://penguin-harness-releases.oss-cn-beijing.aliyuncs.com";
export const OSS_LATEST_JSON_URL = `${OSS_ORIGIN}/latest.json`;
export const GITHUB_LATEST_DOWNLOAD = `${REPO_URL}/releases/latest/download`;
export interface DesktopInstaller {
/** Stable asset file name, identical on GitHub Releases and the OSS mirror. */
file: string;
/** Language-neutral variant tag rendered on the button (arch / package format). */
variant: string;
}
/** Installers per platform card, in display order. */
export const DESKTOP_INSTALLERS: Record<"mac" | "windows" | "linux", DesktopInstaller[]> = {
mac: [
{ file: "penguin-desktop-darwin-arm64.dmg", variant: "Apple Silicon" },
{ file: "penguin-desktop-darwin-x64.dmg", variant: "Intel" },
],
windows: [{ file: "penguin-desktop-win32-x64.exe", variant: "x64" }],
linux: [
{ file: "penguin-desktop-linux-x64.AppImage", variant: "AppImage" },
{ file: "penguin-desktop-linux-x64.deb", variant: "deb" },
],
};
/** Checksum list covering every desktop installer of a release. */
export const DESKTOP_SHA256SUMS = "SHA256SUMS.desktop";
+2 -1
View File
@@ -13,7 +13,7 @@ export const SECTION_IDS = [
] as const;
export type SectionId = (typeof SECTION_IDS)[number];
export type ActiveNavItem = SectionId | "blog" | null;
export type ActiveNavItem = SectionId | "blog" | "download" | null;
function isSectionId(value: string): value is SectionId {
return SECTION_IDS.some((id) => id === value);
@@ -21,6 +21,7 @@ function isSectionId(value: string): value is SectionId {
export function getActiveNavItem(pathname: string, hash: string): ActiveNavItem {
if (pathname === "/blog" || pathname.startsWith("/blog/")) return "blog";
if (pathname === "/download") return "download";
if (pathname !== "/") return null;
const id = hash.startsWith("#") ? hash.slice(1) : hash;
+31
View File
@@ -25,6 +25,7 @@ export const en: Strings = {
contract: "CONTRACT.md",
features: "Features",
blog: "Blog",
download: "Download",
docs: "Docs",
github: "GitHub",
openMenu: "Open menu",
@@ -78,6 +79,36 @@ export const en: Strings = {
windows: "After unzipping you can also just double-click install.cmd.",
},
offlineRelease: "Download offline packages from GitHub Releases",
desktopNote:
"Prefer a standalone app? The desktop app packages the Web interface and the server into a terminal-free installer (macOS / Windows / Linux), sharing the same local data as a CLI install.",
desktopPage: "Go to the desktop download page",
},
download: {
eyebrow: "Download",
title: "Download the desktop app",
subtitle:
"The full Web experience as a standalone application: it embeds the server and opens already signed in — no terminal, no login page; data lives in the same ~/.penguin/data root as a CLI install.",
recommended: "Your system",
platforms: {
mac: { name: "macOS", require: "macOS 11 or later, dmg disk image (pick your chip)" },
windows: { name: "Windows", require: "Windows 10 or later (x64), NSIS installer" },
linux: {
name: "Linux",
require: "x64 — AppImage runs in place, deb goes to your package manager",
},
},
statusOss: (version: string) =>
`Connected to the OSS mirror (${version}) — downloads are served from the mirror.`,
statusGithub: "Downloads point at the latest GitHub Release.",
altGithub: "Download from GitHub instead",
altOss: "Use the OSS mirror instead",
checksums: "Checksums (SHA256SUMS.desktop)",
allReleases: "All releases",
unsignedNote:
'Current builds are unsigned: on first launch use right-click → Open on macOS, and "More info → Run anyway" past Windows SmartScreen.',
cliHint: "Just need the CLI, or the Web UI in a browser?",
cliHintLink: "See the quick start",
},
copy: {
+27
View File
@@ -26,6 +26,7 @@ export const zh = {
contract: "CONTRACT.md",
features: "功能",
blog: "博客",
download: "下载",
docs: "文档",
github: "GitHub",
openMenu: "打开菜单",
@@ -84,6 +85,32 @@ export const zh = {
windows: "解压后也可直接双击 install.cmd 完成安装。",
},
offlineRelease: "前往 GitHub Releases 下载离线安装包",
desktopNote:
"更喜欢独立应用?桌面端把 Web 界面与服务端打包成免终端的安装程序(macOS / Windows / Linux),与 CLI 安装共用同一份本地数据。",
desktopPage: "前往桌面端下载页",
},
download: {
eyebrow: "下载",
title: "下载桌面端",
subtitle:
"完整的 Web 体验打包为独立应用:内嵌服务端,打开即已登录——无需终端、无登录页;数据与 CLI 安装共用同一个 ~/.penguin/data 目录。",
recommended: "当前系统",
platforms: {
mac: { name: "macOS", require: "macOS 11 及以上,dmg 安装镜像(按芯片选择)" },
windows: { name: "Windows", require: "Windows 10 及以上(x64),NSIS 安装程序" },
linux: { name: "Linux", require: "x64,AppImage 免安装运行,或 deb 交给包管理器" },
},
statusOss: (version: string) => `已连接 OSS 国内镜像(${version}),点击即从镜像高速下载。`,
statusGithub: "下载指向 GitHub Releases 的最新版本。",
altGithub: "改从 GitHub 下载",
altOss: "改用 OSS 镜像下载",
checksums: "校验和(SHA256SUMS.desktop)",
allReleases: "全部版本",
unsignedNote:
"当前构建暂未签名:macOS 首次启动请右键 →「打开」;Windows 在 SmartScreen 提示中选「更多信息 → 仍要运行」。",
cliHint: "只需要命令行或浏览器里的 Web 界面?",
cliHintLink: "参见快速开始",
},
copy: {