Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added site/public/fonts/bricolage-grotesque-latin.woff2
Binary file not shown.
6 changes: 4 additions & 2 deletions site/public/robots.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,12 @@ Disallow: /
User-agent: Meta-ExternalAgent
Disallow: /

# Undeclared bulk crawlers
# ByteDance crawler — allowed: it powers Doubao search (a major CN AI search surface)
# and does not separate retrieval from training, so blocking it drops us from CN AI search.
User-agent: Bytespider
Disallow: /
Allow: /

# Undeclared bulk crawlers
User-agent: PetalBot
Disallow: /

Expand Down
17 changes: 15 additions & 2 deletions site/public/sitemap.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://pawwork.ai/</loc>
<lastmod>2026-06-05</lastmod>
<xhtml:link rel="alternate" hreflang="en" href="https://pawwork.ai/" />
<xhtml:link rel="alternate" hreflang="zh-CN" href="https://pawwork.ai/zh-CN/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://pawwork.ai/" />
<lastmod>2026-06-06</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://pawwork.ai/zh-CN/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://pawwork.ai/" />
<xhtml:link rel="alternate" hreflang="zh-CN" href="https://pawwork.ai/zh-CN/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://pawwork.ai/" />
<lastmod>2026-06-06</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
</urlset>
243 changes: 243 additions & 0 deletions site/src/components/Home.astro

Large diffs are not rendered by default.

152 changes: 124 additions & 28 deletions site/src/i18n.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
// EN/CN copy dictionary: single source of truth.
// The server renders EN on first paint (basic SEO); the client swaps to the
// chosen language. Values carry a few inline tags (<b> <span> <u> <br>) and are
// injected as HTML.
// EN/CN copy dictionary: single source of truth for both language pages.
// Each language renders as its own static page (/ and /zh-CN/) — the server
// renders the full localized HTML at build time, there is no client-side
// language swap. Values carry a few inline tags (<b> <span> <u>) injected as
// HTML via set:html, so keep markup balanced and escape bare ampersands.

export type Lang = "en" | "cn";

Expand All @@ -10,9 +11,10 @@ export type Dict = Record<string, string>;
export const I18N: Record<Lang, Dict> = {
en: {
title: "PawWork — Real work, done on your desktop",
desc: "Free, open-source AI desktop app for macOS and Windows. No terminal, no API key, no paid plan — open PawWork, choose a folder, and ask in plain language.",
brand: "PawWork",
"nav.feat": "What it does",
tag: "Open-source · Free to use",
tag: "Open-source, free to use",
h1: 'Real work, done on your <span class="o">desktop</span>',
sub: "<b>No terminal. No API key. No paid plan.</b> Open PawWork, choose a folder, and ask in plain language.",
"dl.mac.t": "Download for macOS",
Expand All @@ -21,9 +23,9 @@ export const I18N: Record<Lang, Dict> = {
"dl.intel.s": "Intel",
"dl.win.t": "Windows",
"dl.win.s": "x64",
gh2: "On GitHub? <u>Grab the latest release</u>",
gh2: "On GitHub? <u>Grab the latest release</u>",
wnote:
'<b>Windows:</b> If SmartScreen shows a warning on first launch, click "More info" "Run anyway". The macOS build is signed and notarized — just open and go.',
'<b>Windows:</b> If SmartScreen shows a warning on first launch, click "More info", then "Run anyway". The macOS build is signed and notarized — just open and go.',
shotnote: "Illustration, not a screenshot",
"mock.title": "PawWork — new task",
"mock.you": "Turn these 12 invoices into a spreadsheet I can review.",
Expand All @@ -32,31 +34,79 @@ export const I18N: Record<Lang, Dict> = {
"mock.s2": "Extracted vendor, date, total",
"mock.s3": "Building spreadsheet…",
"mock.rd": "ready to review",
"feat.h2": "What PawWork does",
"cap1.h": "Documents & data",
"cap1.p": "Extract invoice fields into a spreadsheet, generate a CSV summary, merge multiple PDFs.",
"cap2.h": "Research & writing",
"cap2.p": "Search the web, compare multiple pages and compile a memo, turn rough notes into a clean draft.",
"cap3.h": "Code & technical",
"cap3.p": "Understand a codebase, review a pull request, debug issues using logs and source code.",
foot: "Apache-2.0 · Built on OpenCode",
"def.d1": '<b>PawWork</b> is a <span class="o">free, open-source desktop AI agent</span> for macOS and Windows.',
"def.d2": "An open alternative to Codex App and Claude Desktop (Cowork) — for everyday work, not just browser chat or IDE coding.",
"can.h": "See what it ships",
"can.hint": "Real outputs from plain-language tasks, across files, the web, and code.",
"t1.lab": "12 invoices into one spreadsheet",
"t1.h1": "Vendor",
"t1.h2": "Date",
"t1.h3": "Total",
"t1.foot": "+ 9 more rows, exported to invoices.xlsx",
"t4.lab": "Office files, handled locally",
"t4.badge": "Read &amp; edit on your machine via bundled OfficeCLI",
"t2.lab": "Research into a decision memo",
"t2.mt": "Vendor comparison",
"t2.l1": "18% lower quote, same SLA tier.",
"t2.l2": "Cheapest, but slow support response.",
"t2.pt": "Recommendation: Globex, on price and support",
"t3.lab": "Review a PR, flag the risks",
"t3.rh": "PR #214, 7 files changed",
"t3.f1a": "Unbounded retry loop in",
"t3.f1b": "— can hammer the API.",
"t3.f2a": "Missing null check in",
"t3.f2b": "— minor.",
"m.h": "Your models, your accounts",
"m.num": "model providers supported",
"m.lead":
"<b>Start free</b> with the built-in OpenCode Zen plan and web search. Or connect your own: API keys, ChatGPT OAuth, OpenAI-compatible, and local models.",
"m.search": "Search models",
"m.zen": "Free, web search included",
"m.free": "FREE",
"m.foot": "GLM, Ollama, LM Studio, and 70+ more",
"c.h": "How PawWork compares",
"c.hint": "Next to Codex App and Claude Desktop (Cowork).",
"c.claude": "Claude Desktop",
"c.r1": "Open-source",
"c.r2": "Bring your own key",
"c.r2pw": "75+ providers",
"c.r2cx": "OpenAI only",
"c.r2cl": "Anthropic only",
"c.r4": "Free, no subscription",
"c.r4cx": "Limited",
"c.r4cl": "Pro $20/mo",
"c.r5": "Local models",
"c.r5cx": "CLI only",
"c.r5cl": "Via gateway",
"c.r6": "Office files",
yes: "Yes",
no: "No",
"g.h": "Get PawWork",
"g.sub": "<b>Free and open-source.</b> Download for macOS or Windows and start in minutes.",
"g.mac": "<b>macOS</b> — Apple Silicon and Intel, signed and notarized.",
"g.win": "<b>Windows</b> — x64, currently unsigned installer, so SmartScreen may appear on first launch.",
"g.privacy":
"<b>Your files stay on your machine.</b> You choose the workspace, review every action before it runs, and the code is open-source and auditable.",
"f.readme": "README",
foot: "Apache-2.0, built on OpenCode",
},
cn: {
title: "爪印 — 真能干活,跑在你电脑上",
desc: "免费开源的桌面 AI 工作助手,支持 macOS 和 Windows。不用终端、不用 API key、不用付费。打开爪印,选个文件夹,说一声就行。",
brand: "爪印",
"nav.feat": "功能",
tag: "开源 · 下载即用",
h1: '<span class="o">真能干活</span>,<br>跑在你电脑上',
sub: "<b>不用终端,不用 API key,不用付费。</b>打开爪印,选个文件夹,直接告诉它你要什么。",
tag: "开源下载即用",
h1: '真能<span class="o">干活</span>,跑在你电脑上',
sub: "<b>不用终端,不用 API key,不用付费。</b>打开爪印,选个文件夹,说一声就行。",
"dl.mac.t": "下载 macOS 版",
"dl.mac.s": "Apple 芯片",
"dl.intel.t": "macOS",
"dl.intel.s": "Intel",
"dl.win.t": "Windows",
"dl.win.s": "x64",
gh2: "有 GitHub?<u>去 Releases 下最新版 →</u>",
gh2: "有 GitHub?<u>去 Releases 下载最新版</u>",
wnote:
"<b>Windows 用户</b>首次打开时如果弹出 SmartScreen 提示,点「更多信息」「仍要运行」。macOS 版已签名公证,不会出现此提示。",
"<b>Windows 用户</b>首次打开时如果弹出 SmartScreen 提示,点「更多信息」,再点「仍要运行」。macOS 版已签名公证,不会出现此提示。",
shotnote: "示意,非实拍",
"mock.title": "爪印 — 新任务",
"mock.you": "帮我把这 12 张发票整理成一张表格,方便逐笔核对。",
Expand All @@ -65,13 +115,59 @@ export const I18N: Record<Lang, Dict> = {
"mock.s2": "抽出供应商、日期、金额",
"mock.s3": "正在生成表格…",
"mock.rd": "待核对",
"feat.h2": "爪印能做什么",
"cap1.h": "文档与数据",
"cap1.p": "从发票提取信息填入表格、为 CSV 生成摘要、合并多个 PDF。",
"cap2.h": "研究与写作",
"cap2.p": "上网查资料、对比多篇网页整理成备忘、把零散笔记写成一篇稿子。",
"cap3.h": "代码与技术",
"cap3.p": "理解一个项目、review 他人的 PR、根据日志和源码定位错误。",
foot: "Apache-2.0 · 基于 OpenCode",
"def.d1": '<b>爪印</b>是一款<span class="o">免费、开源的桌面 AI agent</span>,支持 macOS 和 Windows。',
"def.d2": "Codex App 和 Claude Desktop(Cowork)的开源替代,为日常工作设计,不止是聊天或写代码的工具。",
"can.h": "看看它能做什么",
"can.hint": "用大白话说一声,文件、网页、代码,直接出结果。",
"t1.lab": "12 张发票,变成一张表",
"t1.h1": "供应商",
"t1.h2": "日期",
"t1.h3": "金额",
"t1.foot": "还有 9 行,已导出 invoices.xlsx",
"t4.lab": "Office 文件,本地处理",
"t4.badge": "通过内置 OfficeCLI 在你电脑上读写",
"t2.lab": "调研写成一份决策备忘",
"t2.mt": "供应商对比",
"t2.l1": "报价低 18%,SLA 同档。",
"t2.l2": "最便宜,但支持响应慢。",
"t2.pt": "建议:选 Globex,价格和支持更好",
"t3.lab": "review PR,标出风险",
"t3.rh": "PR #214,改了 7 个文件",
"t3.f1a": "",
"t3.f1b": "存在无限重试循环,可能把 API 打爆。",
"t3.f2a": "",
"t3.f2b": "缺空值检查,是次要问题。",
"m.h": "你的模型,你的账号",
"m.num": "家模型供应商",
"m.lead":
"<b>免费就能用</b>:内置 OpenCode Zen 免费版和联网搜索。想用自己的也行:API key、ChatGPT OAuth、OpenAI 兼容服务、本地模型都接得上。",
"m.search": "搜索模型",
"m.zen": "免费,含联网搜索",
"m.free": "免费",
"m.foot": "GLM、Ollama、LM Studio,还有 70+ 家",
"c.h": "同类对比",
"c.hint": "对比 Codex App 和 Claude Desktop(Cowork)。",
"c.claude": "Claude Desktop",
"c.r1": "开源",
"c.r2": "自带 key",
"c.r2pw": "75+ 家",
"c.r2cx": "仅 OpenAI",
"c.r2cl": "仅 Anthropic",
"c.r4": "免订阅可用",
"c.r4cx": "有限",
"c.r4cl": "需 Pro($20/月)",
"c.r5": "本地模型",
"c.r5cx": "仅 CLI",
"c.r5cl": "经网关",
"c.r6": "Office 文件",
yes: "是",
no: "否",
"g.h": "下载爪印",
"g.sub": "<b>免费、开源。</b>下载 macOS 或 Windows 版,几分钟就能上手。",
"g.mac": "<b>macOS</b>,支持 Apple 芯片与 Intel,已签名公证。",
"g.win": "<b>Windows</b>,x64,当前为未签名安装包,首次打开可能弹出 SmartScreen。",
"g.privacy": "<b>文件留在你电脑上。</b>工作目录你选,每个动作执行前你都能审,代码开源、可审计。",
"f.readme": "说明文档",
foot: "Apache-2.0,基于 OpenCode",
},
};
20 changes: 16 additions & 4 deletions site/src/layouts/Base.astro
Original file line number Diff line number Diff line change
@@ -1,26 +1,35 @@
---
// Page shell: basic SEO tags in <head> plus the anti-flash theme script.
// Language switching happens on the client; first paint renders English.
// Page shell: head SEO/meta tags plus the anti-flash theme script.
// Language is fixed per static route: the `lang` prop sets html lang,
// canonical, hreflang, and og:locale. There is no client-side swap.
import "../styles/global.css";
import type { Lang } from "../i18n";

interface Props {
title: string;
description: string;
lang?: Lang;
image?: string;
}

const { title, description, image = "/og-image.png" } = Astro.props;
const { title, description, lang = "en", image = "/og-image.png" } = Astro.props;
const htmlLang = lang === "cn" ? "zh-CN" : "en";
const canonical = new URL(Astro.url.pathname, Astro.site).href;
const ogImage = new URL(image, Astro.site).href;
const enUrl = new URL("/", Astro.site).href;
const cnUrl = new URL("/zh-CN/", Astro.site).href;
---

<!doctype html>
<html lang="en" data-theme="light" data-lang="en">
<html lang={htmlLang} data-theme="light" data-lang={lang}>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/svg+xml" href="/app-icon.svg" />
<link rel="canonical" href={canonical} />
<link rel="alternate" hreflang="en" href={enUrl} />
<link rel="alternate" hreflang="zh-CN" href={cnUrl} />
<link rel="alternate" hreflang="x-default" href={enUrl} />
<title>{title}</title>
<meta name="description" content={description} />
<meta name="theme-color" content="#ff5910" />
Expand All @@ -30,6 +39,8 @@ const ogImage = new URL(image, Astro.site).href;
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:url" content={canonical} />
<meta property="og:locale" content={lang === "cn" ? "zh_CN" : "en_US"} />
<meta property="og:locale:alternate" content={lang === "cn" ? "en_US" : "zh_CN"} />
<meta property="og:image" content={ogImage} />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
Expand All @@ -47,6 +58,7 @@ const ogImage = new URL(image, Astro.site).href;
"name": "PawWork",
"applicationCategory": "BusinessApplication",
"operatingSystem": "macOS, Windows",
"inLanguage": lang === "cn" ? "zh-CN" : "en",
"description": description,
"url": "https://pawwork.ai",
"downloadUrl": "https://github.com/Astro-Han/pawwork/releases/latest",
Expand Down
Loading
Loading