docs(readme,landing): introduce the desktop app (#201)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e0f6b122c8
commit
1cf0e4d9bc
21 files changed
+342
-17
No files matched your search
@@ -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";
|
||||
@@ -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;
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
Reference in new issue
Block a user