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
3 changes: 3 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ on:
- "README.en.md"
- "USAGE.md"
- "ARCHITECTURE.md"
- "VERSION"
- "VERSIONING.md"
- "docs/openclaw.md"
- "assets/demo1.mp4"
Expand All @@ -33,6 +34,8 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Set up Node.js
uses: actions/setup-node@v7
Expand Down
7 changes: 7 additions & 0 deletions site/app/components/mobile-navigation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
SheetTrigger,
} from "~/components/ui/sheet"
import { LOCALES } from "~/content/locales"
import { pageCopyFor } from "~/content/pages"
import { publicRouteFor, type LocaleId } from "~/content/routes"
import { cn } from "~/lib/utils"

Expand Down Expand Up @@ -59,6 +60,12 @@ export function MobileNavigation({ locale }: { locale: LocaleId }) {
>
{ui.skill}
</a>
<a
className={cn(buttonVariants({ variant: "ghost" }), "min-h-11 justify-start")}
href={publicRouteFor(locale, "developers")}
>
{pageCopyFor(locale, "developers").eyebrow}
</a>
</nav>
<div className="mt-auto flex items-center justify-between border-t p-4">
<span className="text-sm text-muted-foreground">{ui.footerTagline}</span>
Expand Down
10 changes: 10 additions & 0 deletions site/app/components/site-footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { ExternalLink } from "lucide-react"

import { FooterWordmark } from "~/components/footer-wordmark"
import { LOCALES } from "~/content/locales"
import { pageCopyFor } from "~/content/pages"
import { publicRouteFor, type LocaleId } from "~/content/routes"

export function SiteFooter({ locale }: { locale: LocaleId }) {
Expand All @@ -25,6 +26,15 @@ export function SiteFooter({ locale }: { locale: LocaleId }) {
</p>
</div>
<nav className="flex flex-wrap gap-x-5 gap-y-2 text-sm" aria-label="Footer">
{(["developers", "about", "contact"] as const).map((pageKey) => (
<a
className="min-h-11 py-3 hover:underline"
href={publicRouteFor(locale, pageKey)}
key={pageKey}
>
{pageCopyFor(locale, pageKey).eyebrow}
</a>
))}
<a className="min-h-11 py-3 hover:underline" href={publicRouteFor(locale, "privacy")}>
{ui.privacy}
</a>
Expand Down
370 changes: 366 additions & 4 deletions site/app/content/document-content.json

Large diffs are not rendered by default.

66 changes: 45 additions & 21 deletions site/app/content/legacy-content.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,22 +629,30 @@
"ko": {
"privacy": {
"title": "개인정보 처리 안내 - kmsg",
"description": "kmsg 정적 웹사이트의 데이터 처리와 외부 서비스 이용 범위를 안내합니다.",
"description": "kmsg 정적 웹사이트와 로컬 CLI의 데이터 처리, 외부 서비스, 보안 문의 범위를 안내합니다.",
"eyebrow": "법적 안내",
"heading": "개인정보 처리 안내",
"intro": "kmsg 웹사이트는 계정, 입력 폼, 분석 도구 없이 정적으로 제공됩니다.",
"intro": "이 안내는 kmsg 정적 웹사이트와 사용자의 Mac에서 실행되는 kmsg CLI·MCP server의 데이터 경계를 구분해 설명합니다. 웹사이트에는 계정, 입력 폼, 광고 추적기 또는 자체 분석 service가 없습니다.",
"sections": [
{
"title": "웹사이트가 수집하는 정보",
"body": "이 웹사이트는 방문자의 계정, 메시지, 연락처 또는 입력 내용을 서버에 수집하지 않습니다."
"body": "이 웹사이트는 방문자의 계정, KakaoTalk 메시지, 연락처, 검색어 또는 입력 내용을 운영자 server에 수집하지 않습니다. GitHub Pages가 정적 파일을 전달하는 과정에서 GitHub와 그 infrastructure provider가 IP address, request header, 접속 시각 같은 통상적인 network log를 처리할 수 있으며, 그 처리는 GitHub의 개인정보 정책을 따릅니다. kmsg 프로젝트는 해당 platform log를 별도 사용자 profile과 결합하지 않습니다."
},
{
"title": "외부 서비스",
"body": "GitHub와 YouTube 링크를 열면 해당 서비스의 개인정보 처리방침과 이용 조건이 적용됩니다."
"title": "CLI와 MCP의 로컬 데이터 처리",
"body": "kmsg는 사용자의 Mac에서 Accessibility API를 통해 화면에 표시된 KakaoTalk 정보를 읽고 명령을 수행합니다. chat content, contact name, local chat identity와 command result는 이 웹사이트로 업로드되지 않습니다. login credential과 lock-mode에 필요한 값은 사용자의 local configuration에 암호화해 저장하며, 사용자는 해당 file의 접근 권한과 backup을 직접 관리해야 합니다."
},
{
"title": "KakaoTalk 메시지",
"body": "kmsg CLI가 사용자의 Mac에서 처리하는 KakaoTalk 내용은 이 웹사이트로 전송되지 않습니다."
"title": "외부 서비스와 링크",
"body": "GitHub repository, GitHub Issues, GitHub Releases, Homebrew tap, YouTube example 등 외부 link를 열면 각 service의 개인정보 처리방침과 이용 조건이 적용됩니다. issue나 email로 log를 공유할 때는 실제 사람 이름, message body, 전화번호, account identifier, local path, password, token과 encryption key를 제거하고 synthetic reproduction을 사용하세요."
},
{
"title": "보관, 삭제와 사용자의 선택",
"body": "정적 웹사이트 자체에는 사용자가 삭제를 요청할 account database가 없습니다. local kmsg credential, cache와 실행 log는 사용자의 Mac에 있으므로 사용자가 configuration과 file을 직접 검토하고 삭제할 수 있습니다. 공개 GitHub issue에 작성한 내용은 repository 운영 기록이 되며 수정이나 삭제가 필요하면 해당 issue에서 요청해야 합니다."
},
{
"title": "문의와 변경 기록",
"body": "일반적인 privacy 질문은 contact page의 공식 channel을 사용하고, 공개하면 안 되는 취약점이나 민감한 개인정보 문제는 iam@chann.dev로 최소한의 정보만 보내세요. 실제 credential이나 private message archive는 보내지 마세요. 처리 방식이 바뀌면 이 페이지의 source와 Git history를 함께 갱신해 변경 시점과 내용을 확인할 수 있게 합니다."
}
]
},
Expand Down Expand Up @@ -717,22 +725,30 @@
"jp": {
"privacy": {
"title": "プライバシー - kmsg",
"description": "kmsgの静的ウェブサイトにおけるデータ処理と外部サービスの範囲を説明します。",
"description": "kmsgの静的ウェブサイトとローカルCLIにおけるデータ処理、外部サービス、問い合わせ範囲を説明します。",
"eyebrow": "法的情報",
"heading": "プライバシー",
"intro": "kmsgのウェブサイトは、アカウント、入力フォーム、解析サービスを持たない静的サイトです。",
"intro": "この案内は、kmsgの静的ウェブサイトと利用者のMacで動くCLI・MCP serverのデータ境界を説明します。サイトにはアカウント、入力フォーム、解析サービス、広告trackerはありません。",
"sections": [
{
"title": "このサイトが収集する情報",
"body": "このサイトは訪問者のアカウント、メッセージ、連絡先、入力内容をサーバーに収集しません。"
"body": "このサイトは訪問者のaccount、KakaoTalk message、contact、検索語、入力内容を運営者serverへ収集しません。GitHub Pagesが静的fileを配信する際、GitHubとinfrastructure providerがIP address、request header、時刻など一般的なnetwork logを処理する場合があり、その処理にはGitHubのprivacy policyが適用されます。"
},
{
"title": "CLIとMCPのローカル処理",
"body": "kmsgは利用者のMacでAccessibility APIを使い、画面に表示されたKakaoTalk情報を読み取ります。chat content、local identity、command resultはこのサイトへuploadされません。loginやlock-modeに必要なcredentialはlocal configurationへ暗号化して保存され、file permissionとbackupは利用者が管理します。"
},
{
"title": "外部サービス",
"body": "GitHubやYouTubeのリンクを開くと、各サービスのプライバシーポリシーと利用条件が適用されます。"
"title": "外部サービスと共有",
"body": "GitHub repository、Issues、Releases、Homebrew tap、YouTubeなど外部linkを開くと各serviceのpolicyが適用されます。issueやemailへlogを添付する前に、氏名、message、電話番号、account ID、local path、password、token、encryption keyを削除し、synthetic reproductionを使ってください。"
},
{
"title": "KakaoTalkメッセージ",
"body": "Mac上のkmsg CLIが処理するKakaoTalkの内容は、このウェブサイトへ送信されません。"
"title": "保存と削除",
"body": "静的サイトには削除対象となる独自account databaseがありません。local credential、cache、実行logは利用者のMacにあり、利用者が確認・削除できます。公開GitHub issueの内容を変更または削除したい場合は、そのissue上で依頼してください。"
},
{
"title": "問い合わせ",
"body": "一般的なprivacy質問はcontact pageの公式channelを使い、公開できない脆弱性や個人情報問題はiam@chann.devへ必要最小限の情報だけを送ってください。実際のcredentialやprivate message archiveは送信しないでください。変更はこのpageとGit historyへ記録します。"
}
]
},
Expand Down Expand Up @@ -761,22 +777,30 @@
"cn": {
"privacy": {
"title": "隐私说明 - kmsg",
"description": "说明kmsg静态网站的数据处理方式与外部服务范围。",
"description": "说明kmsg静态网站与本地CLI的数据处理、外部服务及隐私咨询范围。",
"eyebrow": "法律信息",
"heading": "隐私说明",
"intro": "kmsg网站为静态网站,不提供账户、输入表单或分析服务。",
"intro": "本说明区分kmsg静态网站与在用户Mac上运行的CLI、MCP server的数据边界。网站不提供账户、输入表单、广告tracker或自有analytics service。",
"sections": [
{
"title": "本网站收集的信息",
"body": "本网站不会在服务器上收集访客账户、消息、联系人或提交内容。"
"body": "本网站不会把访客account、KakaoTalk message、contact、搜索词或输入内容收集到运营者server。GitHub Pages在发送静态file时,GitHub及其infrastructure provider可能处理IP address、request header和访问时间等常规network log,此类处理遵循GitHub的privacy policy。"
},
{
"title": "CLI与MCP的本地处理",
"body": "kmsg在用户Mac上通过Accessibility API读取屏幕中显示的KakaoTalk信息。chat content、local identity与command result不会上传到本网站。login及lock-mode所需credential会加密保存在local configuration中,用户负责管理file permission与backup。"
},
{
"title": "外部服务与信息共享",
"body": "打开GitHub repository、Issues、Releases、Homebrew tap或YouTube等外部link后,将适用各service的policy。提交issue或email前,请从log中删除姓名、message、电话号码、account ID、local path、password、token及encryption key,并优先使用synthetic reproduction。"
},
{
"title": "外部服务",
"body": "打开GitHub或YouTube链接后,将适用相应服务的隐私政策与使用条款。"
"title": "保留与删除",
"body": "静态网站没有可供删除的自有account database。local credential、cache和执行log位于用户Mac,用户可自行检查和删除。公开GitHub issue属于repository记录,如需修改或删除其中内容,应在相应issue中提出请求。"
},
{
"title": "KakaoTalk消息",
"body": "kmsg CLI在您的Mac上处理的KakaoTalk内容不会发送到本网站。"
"title": "咨询与变更记录",
"body": "一般privacy问题请使用contact page中的官方渠道;不应公开的漏洞或敏感个人资料可将最少必要信息发送至iam@chann.dev。请勿发送真实credential或private message archive。处理方式变化时会同步更新本页面source与Git history。"
}
]
},
Expand Down
3 changes: 2 additions & 1 deletion site/app/content/pages.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import legacyContent from "./legacy-content.json"
import trustContent from "./trust-content.json"
import type { LocaleId, PageKey } from "./routes"

export interface PageCopy {
Expand All @@ -19,7 +20,7 @@ export interface PageCopy {
secondTime?: string
}

const pages = legacyContent.pages as unknown as Array<
const pages = [...legacyContent.pages, ...trustContent.pages] as unknown as Array<
PageCopy & { locale: LocaleId; pageKey: string; source: string }
>

Expand Down
9 changes: 9 additions & 0 deletions site/app/content/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ export const PAGE_KEYS = [
"mcp",
"skill",
"versioning",
"developers",
"about",
"contact",
"privacy",
"terms",
] as const
Expand All @@ -29,6 +32,9 @@ const pageSlugs: Record<PageKey, string> = {
mcp: "mcp",
skill: "skill",
versioning: "versioning",
developers: "developers",
about: "about",
contact: "contact",
privacy: "privacy",
terms: "terms",
}
Expand Down Expand Up @@ -69,6 +75,9 @@ export function routeFromPath(pathname: string): {
}
if (!path.startsWith("/")) path = `/${path}`
if (!path.endsWith("/")) path = `${path}/`
if (path === "/ko/") path = "/"
else if (path.startsWith("/ko/")) path = path.slice(3)
path = path.replace(/\/openclaw\/$/, "/mcp/")
return routeLookup.get(path) ?? null
}

Expand Down
124 changes: 124 additions & 0 deletions site/app/content/trust-content.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
{
"pages": [
{
"locale": "ko",
"pageKey": "about",
"title": "kmsg 소개 — 프로젝트, 운영 주체와 설계 원칙",
"description": "kmsg가 누구를 위해 만들어졌고 어떻게 운영되는지, 독립 오픈소스 프로젝트의 범위와 신뢰 근거를 설명합니다.",
"eyebrow": "kmsg 소개",
"source": "site/content/ko/about.md",
"sourceLabel": "site/content/ko/about.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "ko",
"pageKey": "contact",
"title": "kmsg 연락처와 지원 안내",
"description": "kmsg 버그 신고, 기능 제안, 보안·개인정보 문의에 사용할 공식 공개 채널과 안전한 문의 방법을 안내합니다.",
"eyebrow": "연락처",
"source": "site/content/ko/contact.md",
"sourceLabel": "site/content/ko/contact.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "ko",
"pageKey": "developers",
"title": "kmsg 개발자 리소스 — CLI, JSON, 인증과 MCP 서버",
"description": "kmsg CLI·구조화 JSON·로컬 인증·stdio MCP 서버의 개발자 문서와 지원 범위를 한곳에 정리합니다.",
"eyebrow": "개발자 리소스",
"source": "site/content/ko/developers.md",
"sourceLabel": "site/content/ko/developers.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "en",
"pageKey": "about",
"title": "About kmsg — project identity and design principles",
"description": "Who kmsg is for, how the independent open source project is maintained, and which technical and trust boundaries apply.",
"eyebrow": "About kmsg",
"source": "site/content/en/about.md",
"sourceLabel": "site/content/en/about.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "en",
"pageKey": "contact",
"title": "Contact and support for kmsg",
"description": "Official public channels for kmsg bug reports, feature requests, security concerns, and privacy questions.",
"eyebrow": "Contact",
"source": "site/content/en/contact.md",
"sourceLabel": "site/content/en/contact.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "en",
"pageKey": "developers",
"title": "kmsg developer resources — CLI, JSON, auth, and MCP",
"description": "A predictable index for the kmsg CLI, structured JSON, local authentication, architecture, and native stdio MCP server.",
"eyebrow": "Developers",
"source": "site/content/en/developers.md",
"sourceLabel": "site/content/en/developers.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "jp",
"pageKey": "about",
"title": "kmsgについて — プロジェクトと設計原則",
"description": "kmsgの目的、独立したオープンソース運営、技術的な範囲と信頼の根拠を説明します。",
"eyebrow": "kmsgについて",
"source": "site/content/jp/about.md",
"sourceLabel": "site/content/jp/about.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "jp",
"pageKey": "contact",
"title": "kmsgへの連絡とサポート",
"description": "バグ報告、機能提案、セキュリティおよびプライバシーに関する公式窓口を案内します。",
"eyebrow": "連絡先",
"source": "site/content/jp/contact.md",
"sourceLabel": "site/content/jp/contact.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "jp",
"pageKey": "developers",
"title": "kmsg開発者リソース — CLI、JSON、認証、MCP",
"description": "kmsgのCLI、構造化JSON、ローカル認証、アーキテクチャ、stdio MCPサーバーの索引です。",
"eyebrow": "開発者向け",
"source": "site/content/jp/developers.md",
"sourceLabel": "site/content/jp/developers.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "cn",
"pageKey": "about",
"title": "关于kmsg — 项目身份与设计原则",
"description": "说明kmsg的用途、独立开源项目的维护方式、技术边界与可信依据。",
"eyebrow": "关于kmsg",
"source": "site/content/cn/about.md",
"sourceLabel": "site/content/cn/about.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "cn",
"pageKey": "contact",
"title": "联系kmsg与获取支持",
"description": "提供kmsg错误报告、功能建议、安全问题与隐私咨询的官方公开渠道。",
"eyebrow": "联系方式",
"source": "site/content/cn/contact.md",
"sourceLabel": "site/content/cn/contact.md",
"lastModified": "2026-08-24T05:43:35+09:00"
},
{
"locale": "cn",
"pageKey": "developers",
"title": "kmsg开发者资源 — CLI、JSON、认证与MCP",
"description": "集中提供kmsg CLI、结构化JSON、本地认证、架构以及stdio MCP服务器文档。",
"eyebrow": "开发者资源",
"source": "site/content/cn/developers.md",
"sourceLabel": "site/content/cn/developers.md",
"lastModified": "2026-08-24T05:43:35+09:00"
}
]
}
Loading
Loading