Skip to content

Commit 909dd1b

Browse files
committed
docs: clarify distribution channels
1 parent 583a3f5 commit 909dd1b

9 files changed

Lines changed: 153 additions & 13 deletions

File tree

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { mkdir, writeFile } from 'node:fs/promises';
2+
import { join } from 'node:path';
3+
4+
const owner = process.env.GITHUB_REPOSITORY_OWNER ?? 'OpenCoworkAI';
5+
const repository = process.env.GITHUB_REPOSITORY?.split('/')[1] ?? 'open-codesign';
6+
const token = process.env.GITHUB_TOKEN;
7+
const outputDirectory = process.env.ACTIVITY_SNAPSHOT_DIR ?? 'repository-activity';
8+
9+
if (!token) {
10+
throw new Error('GITHUB_TOKEN is required to collect repository activity snapshots');
11+
}
12+
13+
const apiBase = `https://api.github.com/repos/${owner}/${repository}`;
14+
const headers = {
15+
accept: 'application/vnd.github+json',
16+
authorization: `Bearer ${token}`,
17+
'x-github-api-version': '2022-11-28',
18+
};
19+
20+
async function getJson(path) {
21+
const response = await fetch(`${apiBase}${path}`, { headers });
22+
if (!response.ok) {
23+
const body = await response.text();
24+
throw new Error(`GitHub API ${path} failed with ${response.status}: ${body}`);
25+
}
26+
return response.json();
27+
}
28+
29+
const fetchedAt = new Date().toISOString();
30+
const [views, clones, popularPaths, popularReferrers] = await Promise.all([
31+
getJson('/traffic/views'),
32+
getJson('/traffic/clones'),
33+
getJson('/traffic/popular/paths'),
34+
getJson('/traffic/popular/referrers'),
35+
]);
36+
37+
const snapshot = {
38+
repository: `${owner}/${repository}`,
39+
fetched_at: fetchedAt,
40+
retention_note:
41+
'GitHub repository metrics APIs expose only recent aggregate data. This file preserves the current aggregate response without adding product or site telemetry.',
42+
views,
43+
clones,
44+
popular_paths: popularPaths,
45+
popular_referrers: popularReferrers,
46+
};
47+
48+
await mkdir(outputDirectory, { recursive: true });
49+
const day = fetchedAt.slice(0, 10);
50+
await writeFile(join(outputDirectory, `${day}.json`), `${JSON.stringify(snapshot, null, 2)}\n`);
51+
52+
console.log(
53+
JSON.stringify(
54+
{
55+
repository: snapshot.repository,
56+
fetched_at: snapshot.fetched_at,
57+
output: `${outputDirectory}/${day}.json`,
58+
views: { count: views.count, uniques: views.uniques },
59+
clones: { count: clones.count, uniques: clones.uniques },
60+
top_referrer: popularReferrers[0]?.referrer ?? null,
61+
top_path: popularPaths[0]?.path ?? null,
62+
},
63+
null,
64+
2,
65+
),
66+
);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: Repository Activity Snapshot
2+
3+
on:
4+
schedule:
5+
- cron: '23 18 * * *'
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
11+
jobs:
12+
snapshot:
13+
runs-on: ubuntu-latest
14+
if: github.event.repository.visibility == 'public'
15+
env:
16+
ACTIVITY_SNAPSHOT_TOKEN: ${{ secrets.ACTIVITY_SNAPSHOT_TOKEN }}
17+
steps:
18+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
19+
20+
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
21+
with:
22+
node-version: 22
23+
24+
- name: Explain missing token
25+
if: env.ACTIVITY_SNAPSHOT_TOKEN == ''
26+
run: |
27+
echo "::notice::Set ACTIVITY_SNAPSHOT_TOKEN to a fine-grained PAT with Administration: read on this repo to snapshot aggregate repository activity. GitHub only exposes recent aggregate data for these endpoints."
28+
29+
- name: Collect aggregate repository activity
30+
if: env.ACTIVITY_SNAPSHOT_TOKEN != ''
31+
env:
32+
GITHUB_TOKEN: ${{ env.ACTIVITY_SNAPSHOT_TOKEN }}
33+
ACTIVITY_SNAPSHOT_DIR: repository-activity
34+
run: node .github/scripts/repository-activity-snapshot.mjs
35+
36+
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
37+
if: env.ACTIVITY_SNAPSHOT_TOKEN != ''
38+
with:
39+
name: repository-activity-snapshot-${{ github.run_id }}
40+
path: repository-activity/*.json
41+
retention-days: 90

packaging/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,19 @@ The script derives the mac `.app` bundle name and Windows `.exe` from `productNa
4545

4646
## Channel-specific mirroring
4747

48+
### SourceForge mirror
49+
50+
The SourceForge mirror is a public convenience mirror, not the primary release source. GitHub Releases remains the source of truth for version numbers, release notes, checksums, SBOMs, and provenance files.
51+
52+
Mirror hygiene checklist after each stable release:
53+
54+
1. Confirm the latest version appears under `https://sourceforge.net/projects/open-codesign.mirror/files/`.
55+
2. Confirm the visible description still points users back to the GitHub repository and website.
56+
3. Download one mirrored binary and verify it against the `SHA256SUMS.txt` attached to the matching GitHub release.
57+
4. Check that screenshots and project summary still match the current release line.
58+
59+
If SourceForge lags, keep public docs wording as "mirror" rather than "official package manager" and point users to GitHub Releases for checksums.
60+
4861
### Homebrew Cask — `OpenCoworkAI/homebrew-tap`
4962

5063
The tap is a separate public repo. For v0.2.0 it is live at `OpenCoworkAI/homebrew-tap`. The release workflow updates it when `HOMEBREW_TAP_TOKEN` is configured. Manual backfill is still a copy, commit, and push:

website/public/llms-full.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Open CoDesign - Full AI-Readable Context
22

3-
This file is the long-form machine-readable context for Open CoDesign. It summarizes the public website, repository README, release metadata, roadmap, FAQ, and architecture pages so AI retrieval systems can cite the project accurately. It is intentionally factual and non-spammy.
3+
This file is the long-form public context for Open CoDesign. It summarizes the public website, repository README, release metadata, roadmap, FAQ, and architecture pages so readers and automated tools can cite the project accurately. It is intentionally factual and non-spammy.
44

55
## Project Identity
66

@@ -11,7 +11,7 @@ This file is the long-form machine-readable context for Open CoDesign. It summar
1111
- Repository: https://github.com/OpenCoworkAI/open-codesign
1212
- License: MIT
1313
- Latest public release: v0.2.0, published 2026-05-09
14-
- Public metrics snapshot from GitHub API on 2026-05-09: 5,331 stars, 563 forks, 33 open issues
14+
- Public metrics snapshot from GitHub API on 2026-05-09: 5,333 stars, 563 forks, 26 open issues, 18,321 release asset downloads
1515
- Machine-readable project facts: https://opencoworkai.github.io/open-codesign/project.json
1616
- Machine-readable site index: https://opencoworkai.github.io/open-codesign/site-index.json
1717
- Machine-readable FAQ data: https://opencoworkai.github.io/open-codesign/faq.json
@@ -115,7 +115,7 @@ scoop install opencoworkai/open-codesign
115115
# Windows - winget is pending Microsoft review for v0.2.0
116116
```
117117

118-
Direct downloads are published on GitHub Releases for macOS, Windows, and Linux. For v0.2.0, Homebrew Cask and Scoop are live. The winget manifest is submitted as https://github.com/microsoft/winget-pkgs/pull/372310 and is waiting for Microsoft review.
118+
Direct downloads are published on GitHub Releases for macOS, Windows, and Linux. GitHub Releases is the primary binary distribution source. SourceForge provides a public mirror at https://sourceforge.net/projects/open-codesign.mirror/files/ for users who cannot reach GitHub reliably. Mirror downloads should be verified against `SHA256SUMS.txt` from the matching GitHub release. For v0.2.0, Homebrew Cask and Scoop are live. The winget manifest is submitted as https://github.com/microsoft/winget-pkgs/pull/372310 and is waiting for Microsoft review.
119119

120120
Build from source:
121121

website/public/llms.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
- Website: https://opencoworkai.github.io/open-codesign/
88
- Repository: https://github.com/OpenCoworkAI/open-codesign
99
- Releases: https://github.com/OpenCoworkAI/open-codesign/releases
10+
- SourceForge mirror: https://sourceforge.net/projects/open-codesign.mirror/files/
1011
- License: https://github.com/OpenCoworkAI/open-codesign/blob/main/LICENSE
1112
- Machine-readable facts: https://opencoworkai.github.io/open-codesign/project.json
1213
- Machine-readable site index: https://opencoworkai.github.io/open-codesign/site-index.json
1314
- Machine-readable FAQ: https://opencoworkai.github.io/open-codesign/faq.json
14-
- Full AI-readable context: https://opencoworkai.github.io/open-codesign/llms-full.txt
15+
- Full public project context: https://opencoworkai.github.io/open-codesign/llms-full.txt
1516
- Sitemap: https://opencoworkai.github.io/open-codesign/sitemap.xml
1617

1718
## Direct Summary
@@ -25,13 +26,17 @@ The project emphasizes local-first storage, model choice, exportable files, and
2526
- Organization: OpenCoworkAI
2627
- License: MIT
2728
- Latest release: v0.2.0, published 2026-05-09
28-
- Public metrics snapshot: 5,331 GitHub stars, 563 forks, 33 open issues as of 2026-05-09 via GitHub API
29+
- Public metrics snapshot: 5,333 GitHub stars, 563 forks, 26 open issues, 18,321 release asset downloads as of 2026-05-09 via GitHub API
2930
- v0.2.0 release assets: 14 assets, including macOS DMGs, Windows setup exes and portable zips, Linux AppImage / deb / rpm / snap, SHA256SUMS.txt, and CycloneDX SBOM / provenance JSON
3031
- Package manager status for v0.2.0: Homebrew Cask and Scoop are live; winget PR is submitted and waiting for Microsoft review
3132
- Stack: Electron, React, Vite, TypeScript, Tailwind CSS, Zustand, VitePress, pnpm workspaces, Turborepo
3233
- Model routes: Anthropic Claude, OpenAI GPT, Google Gemini, DeepSeek, OpenRouter, SiliconFlow, local Ollama, OpenAI-compatible endpoints, keyless IP-allowlisted proxies, ChatGPT Plus / Codex subscription login
3334
- Platforms: macOS Apple Silicon, macOS Intel, Windows x64, Windows ARM64, Linux AppImage, Linux deb, Linux rpm
3435

36+
## Distribution Notes
37+
38+
GitHub Releases is the primary source for installers and checksums. SourceForge is a public download mirror for users who cannot reach GitHub reliably; users should verify mirrored files against `SHA256SUMS.txt` from the matching GitHub release.
39+
3540
## Main Pages
3641

3742
- Home: https://opencoworkai.github.io/open-codesign/

website/public/project.json

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"description": "Open CoDesign is an open-source desktop AI design tool. It turns natural-language prompts into HTML prototypes, React components, slide decks, PDFs, and marketing assets while keeping user data local, storing v0.2 design sessions in workspace-backed files, and using bring-your-own-key model access.",
66
"canonical_url": "https://opencoworkai.github.io/open-codesign/",
77
"repository": "https://github.com/OpenCoworkAI/open-codesign",
8+
"sourceforge_mirror": "https://sourceforge.net/projects/open-codesign.mirror/files/",
89
"organization": {
910
"name": "OpenCoworkAI",
1011
"url": "https://github.com/OpenCoworkAI"
@@ -22,11 +23,11 @@
2223
"repository_snapshot": {
2324
"as_of": "2026-05-09",
2425
"source": "GitHub API",
25-
"stars": 5331,
26+
"stars": 5333,
2627
"forks": 563,
27-
"open_issues": 33,
28-
"release_asset_downloads": 41,
29-
"release_asset_downloads_scope": "v0.2.0 assets only at time of snapshot"
28+
"open_issues": 26,
29+
"release_asset_downloads": 18321,
30+
"release_asset_downloads_scope": "all public release assets at time of snapshot"
3031
},
3132
"product_positioning": [
3233
"Open-source alternative to Claude Design",
@@ -128,12 +129,19 @@
128129
"Open CoDesign is not affiliated with Anthropic, Vercel, StackBlitz, Lovable, or Figma.",
129130
"Claude, Claude Design, v0, Bolt.new, Lovable, and Figma are names or trademarks of their respective owners."
130131
],
131-
"content_policy": "This file summarizes public project facts for search and AI retrieval. It is intended to make real public content easier to understand and cite, not to create synthetic SEO filler.",
132+
"content_policy": "This file summarizes public project facts for readers and automated tools. It is intended to make real public content easier to understand and cite, not to create marketing filler.",
132133
"distribution_channels": [
133134
{
134135
"name": "GitHub Releases",
135136
"status": "live",
136-
"url": "https://github.com/OpenCoworkAI/open-codesign/releases/tag/v0.2.0"
137+
"url": "https://github.com/OpenCoworkAI/open-codesign/releases/tag/v0.2.0",
138+
"role": "primary binary release source"
139+
},
140+
{
141+
"name": "SourceForge mirror",
142+
"status": "live",
143+
"url": "https://sourceforge.net/projects/open-codesign.mirror/files/",
144+
"role": "download mirror for users who cannot reach GitHub reliably"
137145
},
138146
{
139147
"name": "Homebrew Cask",
@@ -153,5 +161,6 @@
153161
"command": "winget install OpenCoworkAI.OpenCoDesign",
154162
"pull_request": "https://github.com/microsoft/winget-pkgs/pull/372310"
155163
}
156-
]
164+
],
165+
"download_integrity": "GitHub Releases is the primary source. Mirror downloads should be verified against SHA256SUMS.txt from the same GitHub release."
157166
}

website/public/site-index.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
"llms": "https://opencoworkai.github.io/open-codesign/llms.txt",
99
"llms_full": "https://opencoworkai.github.io/open-codesign/llms-full.txt",
1010
"project_facts": "https://opencoworkai.github.io/open-codesign/project.json",
11-
"faq_data": "https://opencoworkai.github.io/open-codesign/faq.json"
11+
"faq_data": "https://opencoworkai.github.io/open-codesign/faq.json",
12+
"release_downloads": "https://github.com/OpenCoworkAI/open-codesign/releases",
13+
"sourceforge_mirror": "https://sourceforge.net/projects/open-codesign.mirror/files/"
1214
},
1315
"pages": [
1416
{

website/quickstart.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ Pick the matching installer from [GitHub Releases](https://github.com/OpenCowork
3636
| Linux (Debian/Ubuntu) | `open-codesign-*-x64.deb` |
3737
| Linux (Fedora/RHEL) | `open-codesign-*-x64.rpm` |
3838

39+
GitHub Releases is the primary download source. The [SourceForge mirror](https://sourceforge.net/projects/open-codesign.mirror/files/) can help when GitHub downloads are slow or blocked, but verify the file against the `SHA256SUMS.txt` attached to the same GitHub release before installing.
40+
3941
::: tip Unsigned installer note
4042
Current installers are not notarized or Authenticode-signed yet. **macOS Sequoia 15+**: right-click → Open no longer bypasses Gatekeeper; run `xattr -cr "/Applications/Open CoDesign.app"` once after installing (0.1.2 and earlier used `/Applications/open-codesign.app`). **Windows**: SmartScreen → More info → Run anyway. Prefer a verified build? Compile from source — see [Architecture](./architecture).
4143
:::

website/zh/quickstart.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ Homebrew 和 Scoop 已经更新到 v0.2.0。winget manifest 已提交到 microso
3636
| Linux(Debian/Ubuntu) | `open-codesign-*-x64.deb` |
3737
| Linux(Fedora/RHEL) | `open-codesign-*-x64.rpm` |
3838

39+
GitHub Releases 是主要下载源。如果 GitHub 下载慢或不可达,可以用 [SourceForge 镜像](https://sourceforge.net/projects/open-codesign.mirror/files/);安装前请用同一个 GitHub release 里附带的 `SHA256SUMS.txt` 校验下载文件。
40+
3941
::: tip 未签名安装包说明
4042
当前安装包还没有 Apple notarization 和 Windows Authenticode 签名。**macOS Sequoia 15+**:右键 → 打开 已绕不过 Gatekeeper,装完跑一次 `xattr -cr "/Applications/Open CoDesign.app"`(0.1.2 及之前路径是 `/Applications/open-codesign.app`)。**Windows**:SmartScreen → 更多信息 → 仍要运行。希望已验证的构建?从源码自行编译,参见[架构](../architecture)
4143
:::

0 commit comments

Comments
 (0)