diff --git a/src/components/LiteDownload.astro b/src/components/LiteDownload.astro
index 66966be..eb9a8d5 100644
--- a/src/components/LiteDownload.astro
+++ b/src/components/LiteDownload.astro
@@ -3,7 +3,10 @@
// takes one click instead of home → Lite page → install section → button.
//
// The download URLs and sizes come from the latest release's asset list at
-// build time (the file names carry the version). Without script, or for a machine there is
+// build time (the file names carry the version). Files are matched by the end of
+// their names (ThinkWatch-Lite--windows-x64-setup.exe ends in
+// -x64-setup.exe), which releases from before the - names share. The
+// Windows button stays on the installer; the portable zip is on the Lite page. Without script, or for a machine there is
// no build for (a phone, an Intel Mac), the button leads to the install
// section instead, which lists every option. So does a Linux machine while the
// latest release has no AppImage for it.
diff --git a/src/components/pages/LitePage.astro b/src/components/pages/LitePage.astro
index 33f6b9f..f2b46d6 100644
--- a/src/components/pages/LitePage.astro
+++ b/src/components/pages/LitePage.astro
@@ -32,7 +32,9 @@ const latestPage = `${releases}/latest`;
// The installers of the latest release. The file names carry the version, so
// they come from the release's asset list, looked up at build time, along with
// their sizes; without it, the buttons lead to the latest release page instead
-// and no size is shown.
+// and no size is shown. Names are ThinkWatch-Lite---…
+// (darwin, windows, linux); the installers, disk image and AppImages are matched
+// by the end of the name, which releases before the rename share.
const liteRelease = await getLatestLiteRelease();
const assetName = (suffix: string) => Object.keys(liteRelease?.assets ?? {}).find((n) => n.endsWith(suffix));
const assetUrl = (suffix: string) => {
@@ -54,6 +56,10 @@ const win = Object.fromEntries(
},
]),
) as Record<(typeof winArchs)[number], { url: string; sha: string | null; size: string | null }>;
+/** The Windows portable zips, linked from one line under the installer; the release page until a release has them */
+const winZip = Object.fromEntries(
+ winArchs.map((arch) => [arch, assetUrl(`-windows-${arch}-portable.zip`) ?? latestPage]),
+) as Record<(typeof winArchs)[number], string>;
const linuxArchs = ["x86_64", "aarch64"] as const;
const linux = Object.fromEntries(
linuxArchs.map((arch) => [
@@ -528,6 +534,14 @@ const archLabel = { x64: "x64", arm64: "ARM64" } as const;
)}
)}
+ {/* The portable zips as one line under the installer, this machine's architecture first */}
+ {winArchs.map((arch) => (
+
+ {c.install.windows.portable}{[arch, ...winArchs.filter((a) => a !== arch)].map((a, i) => (
+ {i > 0 && " · "}{archLabel[a]}
+ ))}
+
+ ))}
{c.install.windows.note}
@@ -786,6 +800,7 @@ const archLabel = { x64: "x64", arm64: "ARM64" } as const;
};
const apply = (arm) => {
show("win", arm && windows ? "arm64" : "x64");
+ show("winzip", arm && windows ? "arm64" : "x64");
show("linux", arm && linux ? "aarch64" : "x86_64");
};
const guess = linux && /aarch64|arm64/.test(s);
diff --git a/src/content/docs-lite/en/install.md b/src/content/docs-lite/en/install.md
index 6728cfa..6a2f5a1 100644
--- a/src/content/docs-lite/en/install.md
+++ b/src/content/docs-lite/en/install.md
@@ -12,7 +12,7 @@ The cask lives in [thinkwatchproject/tap](https://github.com/ThinkWatchProject/h
## macOS: disk image
-Download `ThinkWatch-Lite--arm64.dmg` from the [latest release](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest), check it against the sha256 published beside it, open it, and drag ThinkWatch Lite into Applications.
+Download `ThinkWatch-Lite--darwin-arm64.dmg` from the [latest release](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest), check it against the sha256 published beside it, open it, and drag ThinkWatch Lite into Applications.
The app is **not signed by a registered Apple developer**, so macOS quarantines a downloaded copy and refuses to open it until the attribute is removed:
@@ -22,12 +22,12 @@ xattr -dr com.apple.quarantine "/Applications/ThinkWatch Lite.app"
Without a terminal, the same takes one click after the first refused launch: System Settings › Privacy & Security › Open Anyway.
-## Windows
+## Windows: installer
-Download the installer for the machine's architecture from the [latest release](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest): `ThinkWatch-Lite--x64-setup.exe` for most PCs, or `ThinkWatch-Lite--arm64-setup.exe` for a PC with an ARM processor. The [Lite page](/lite#install) links to both installers of the latest release. Check the download against the sha256 published beside it:
+Download the installer for the machine's architecture from the [latest release](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest): `ThinkWatch-Lite--windows-x64-setup.exe` for most PCs, or `ThinkWatch-Lite--windows-arm64-setup.exe` for a PC with an ARM processor. The [Lite page](/lite#install) links to both installers of the latest release. Check the download against the sha256 published beside it:
```powershell
-Get-FileHash .\ThinkWatch-Lite--x64-setup.exe
+Get-FileHash .\ThinkWatch-Lite--windows-x64-setup.exe
```
The installer sets the app up for all users in Program Files, so Windows asks for administrator permission. It requires Windows 10 21H2 or later; WebView2, which Windows 11 already includes, is downloaded during installation if it is missing.
@@ -36,6 +36,20 @@ The installer is **not code-signed**, and no certificate will be bought. Running
Once installed, the app's icon sits in the notification area: a left click opens the main window, a right click opens the menu. Data is kept in `%APPDATA%\ThinkWatch`.
+Uninstalling through the system first closes ThinkWatch Lite, restores the connected clients and removes the `thinkwatch://` link, launch-at-login entry and notification registration that point to it. With "Also delete data (configuration, API keys, request history)" ticked it deletes `%APPDATA%\ThinkWatch` as well, except when a client could not be restored, in which case the data directory, with that client's backup, is kept. The uninstaller runs as an administrator: when a standard account uninstalls with an administrator's password, it restores the administrator's clients and deletes the administrator's data instead, so use Settings › Full uninstall first in that case.
+
+## Windows: portable
+
+The portable copy runs from the folder it is extracted to, with no installation and no administrator rights. Download `ThinkWatch-Lite--windows-x64-portable.zip` (or `ThinkWatch-Lite--windows-arm64-portable.zip` for a PC with an ARM processor) from the [latest release](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest), check it against the sha256 published beside it, extract it to any folder the user can write to and run `ThinkWatch Lite.exe`. The zip holds two files: `ThinkWatch Lite.exe` and the gateway, `twcore.exe`.
+
+Configuration, keys and request history stay in the `data\` folder next to the program, apart from the installed copy's `%APPDATA%\ThinkWatch`, so the two keep separate settings. In a folder that cannot be written to, the app says so and quits.
+
+The portable copy is not code-signed either, and SmartScreen is handled the same way as for the installer. It does not bring WebView2, which Windows 11 already includes; when it is missing, the app says so and can open Microsoft's download page.
+
+Only one of the installed and portable copies runs at a time. Opening one while the other is running offers to stop the running one: it exits once the requests in flight have finished, and the one just opened starts. `thinkwatch://` links and launch at login always point to the copy that is running, and the launch-at-login switch is shared by both.
+
+To remove it, use Settings › Full uninstall first, which restores the connected clients and removes launch at login and the other registry entries, then delete the whole folder.
+
## Linux
```bash
@@ -44,7 +58,7 @@ curl -fsSL https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest/
The script downloads the AppImage for the machine's architecture, checks it against the sha256 published beside it, installs it as `~/Applications/ThinkWatch-Lite.AppImage` and starts it. Running it again installs the latest version over the old one.
-To install by hand, download `ThinkWatch-Lite--x86_64.AppImage` or `ThinkWatch-Lite--aarch64.AppImage` from the [latest release](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest), check it with `sha256sum -c`, allow it to run (`chmod +x`, or Properties › "Allow executing file as program" in the file manager) and open it. Keep it in a folder the user can write to, such as `~/Applications`, so that it can update itself. The first launch adds ThinkWatch Lite to the application menu, together with its icon and the `thinkwatch://` link handler. Only the AppImage is published; there are no deb, rpm, Flatpak or Snap packages.
+To install by hand, download `ThinkWatch-Lite--linux-x86_64.AppImage` or `ThinkWatch-Lite--linux-aarch64.AppImage` from the [latest release](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest), check it with `sha256sum -c`, allow it to run (`chmod +x`, or Properties › "Allow executing file as program" in the file manager) and open it. Keep it in a folder the user can write to, such as `~/Applications`, so that it can update itself. The first launch adds ThinkWatch Lite to the application menu, together with its icon and the `thinkwatch://` link handler. Only the AppImage is published; there are no deb, rpm, Flatpak or Snap packages.
It requires Ubuntu 22.04, Debian 12, Fedora 36 or a later distribution of the same generation. An AppImage mounts itself with FUSE and needs `fusermount3` from the fuse3 package (libfuse2 is not needed). Most desktops already include it; otherwise:
@@ -69,7 +83,9 @@ When the automatic check finds a new version, the app posts a system notificatio
**Downloaded from the releases page on macOS:** one press on the install button does the rest. The app downloads the update, verifies it against a key compiled into itself, waits for the requests the gateway is serving to finish — up to three minutes — then replaces itself and restarts. A task in the middle of a response is not cut off to make room for the update.
-**On Windows:** the same single press. The app downloads the new installer, verifies it against the key compiled into itself, waits for the requests in flight to finish in the same way, then runs the installer, and the new version starts once it is done. The app is installed for all users, so Windows asks for administrator permission at every update; declining leaves the current version running.
+**With the Windows installer:** the same single press. The app downloads the new installer, verifies it against the key compiled into itself, waits for the requests in flight to finish in the same way, then runs the installer, and the new version starts once it is done. The app is installed for all users, so Windows asks for administrator permission at every update; declining leaves the current version running.
+
+**The Windows portable copy:** the same single press, and no administrator permission is needed. The app downloads the new zip, verifies it against the key compiled into itself, waits for the requests in flight to finish, then replaces the two program files in its folder and restarts. If replacing them fails, the old files are put back and the current version keeps running.
**On Linux:** the same single press, and no password is asked for. The app downloads the new AppImage, verifies it against the key compiled into itself, waits for the requests in flight to finish, then replaces its own file and restarts. The AppImage has to be in a folder the user can write to.
diff --git a/src/content/docs-lite/en/overview.md b/src/content/docs-lite/en/overview.md
index a3499be..4ff7743 100644
--- a/src/content/docs-lite/en/overview.md
+++ b/src/content/docs-lite/en/overview.md
@@ -2,7 +2,7 @@
ThinkWatch Lite is a local gateway for Claude Code, Codex and other AI clients, on macOS, Windows and Linux. Each client is connected once; after that, upstreams and models change in the gateway without touching the client. Every request is recorded with its cost and route, and the API keys in it can be replaced before it leaves the machine.
-> It runs on macOS 12 or later on Apple silicon, on Windows 10 21H2 or later on x64 or ARM64 and on Linux on x86_64 or aarch64, is [installed](/docs/lite/install) with Homebrew, a disk image, the Windows installer or an AppImage, and updates itself.
+> It runs on macOS 12 or later on Apple silicon, on Windows 10 21H2 or later on x64 or ARM64 and on Linux on x86_64 or aarch64, is [installed](/docs/lite/install) with Homebrew, a disk image, the Windows installer or portable zip, or an AppImage, and updates itself.
## Highlights
diff --git a/src/content/docs-lite/zh-CN/install.md b/src/content/docs-lite/zh-CN/install.md
index 009fc86..e5276e7 100644
--- a/src/content/docs-lite/zh-CN/install.md
+++ b/src/content/docs-lite/zh-CN/install.md
@@ -12,7 +12,7 @@ cask 位于 [thinkwatchproject/tap](https://github.com/ThinkWatchProject/homebre
## macOS:磁盘映像
-从 [最新版本的 release 页面](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest)下载 `ThinkWatch-Lite-<版本>-arm64.dmg`,与同页发布的 sha256 校验值核对后打开,把 ThinkWatch Lite 拖入「应用程序」。
+从 [最新版本的 release 页面](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest)下载 `ThinkWatch-Lite-<版本>-darwin-arm64.dmg`,与同页发布的 sha256 校验值核对后打开,把 ThinkWatch Lite 拖入「应用程序」。
应用**未经 Apple 注册开发者签名**,macOS 会为下载的副本添加隔离属性并拒绝打开,需先移除该属性:
@@ -22,12 +22,12 @@ xattr -dr com.apple.quarantine "/Applications/ThinkWatch Lite.app"
不使用终端时:首次打开被拒绝之后,在「系统设置 › 隐私与安全性」中点击「仍要打开」。
-## Windows
+## Windows:安装程序
-从 [最新版本的 release 页面](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest)下载与本机架构对应的安装程序:大多数电脑用 `ThinkWatch-Lite-<版本>-x64-setup.exe`,ARM 处理器的电脑用 `ThinkWatch-Lite-<版本>-arm64-setup.exe`。[Lite 页面](/zh-CN/lite#install)提供最新版本两个安装程序的下载链接。下载后与同页发布的 sha256 校验值核对:
+从 [最新版本的 release 页面](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest)下载与本机架构对应的安装程序:大多数电脑用 `ThinkWatch-Lite-<版本>-windows-x64-setup.exe`,ARM 处理器的电脑用 `ThinkWatch-Lite-<版本>-windows-arm64-setup.exe`。[Lite 页面](/zh-CN/lite#install)提供最新版本两个安装程序的下载链接。下载后与同页发布的 sha256 校验值核对:
```powershell
-Get-FileHash .\ThinkWatch-Lite-<版本>-x64-setup.exe
+Get-FileHash .\ThinkWatch-Lite-<版本>-windows-x64-setup.exe
```
安装程序为所有用户安装,装入 Program Files,因此 Windows 会请求管理员权限。需要 Windows 10 21H2 及以上版本;缺少 WebView2 时安装程序会自动下载(Windows 11 已自带)。
@@ -36,6 +36,20 @@ Get-FileHash .\ThinkWatch-Lite-<版本>-x64-setup.exe
安装后应用图标位于通知区域:左键打开主界面,右键打开菜单。数据保存在 `%APPDATA%\ThinkWatch`。
+通过系统卸载时,卸载程序先关闭 ThinkWatch Lite,还原已接管的客户端,移除指向它的 `thinkwatch://` 链接、开机启动项与系统通知登记。勾选「同时删除数据(配置、API 密钥、请求记录)」时一并删除 `%APPDATA%\ThinkWatch`;有客户端未能还原时数据目录保留,它的备份仍在其中。卸载程序以管理员身份运行:标准账户输入管理员密码卸载时,还原与删除的是管理员账户的客户端和数据,这种情况应先在「设置 › 完全卸载」中卸载。
+
+## Windows:绿色版
+
+绿色版无需安装,也不需要管理员权限。从 [最新版本的 release 页面](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest)下载 `ThinkWatch-Lite-<版本>-windows-x64-portable.zip`(ARM 处理器的电脑用 `ThinkWatch-Lite-<版本>-windows-arm64-portable.zip`),与同页发布的 sha256 校验值核对后解压到任意可写入的文件夹,运行其中的 `ThinkWatch Lite.exe`。压缩包里只有 `ThinkWatch Lite.exe` 与网关 `twcore.exe` 两个文件。
+
+配置、密钥与请求记录保存在程序旁边的 `data\` 文件夹中,与安装版的 `%APPDATA%\ThinkWatch` 互不相干,两者是两套独立的设置。文件夹不可写入时,应用会提示并退出。
+
+绿色版同样未经代码签名,首次运行时 SmartScreen 的处理与安装程序相同。绿色版不附带 WebView2(Windows 11 已自带);缺少时应用会说明,并可打开微软的下载页面。
+
+安装版与绿色版同一时间只运行一个。已有一个在运行时打开另一个,可以停止正在运行的那一个:它等进行中的请求结束后退出,新打开的这一个随即启动。`thinkwatch://` 链接与开机启动始终指向正在运行的那一个,开机启动的开关由两者共用。
+
+卸载时先在「设置 › 完全卸载」中卸载,还原已接管的客户端、移除开机启动项等注册项,再删除整个文件夹。
+
## Linux
```bash
@@ -44,7 +58,7 @@ curl -fsSL https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest/
脚本下载与本机架构对应的 AppImage,与同页发布的 sha256 校验值核对后安装为 `~/Applications/ThinkWatch-Lite.AppImage` 并启动。再次运行即用最新版本覆盖旧版本。
-手动安装时,从 [最新版本的 release 页面](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest)下载 `ThinkWatch-Lite-<版本>-x86_64.AppImage` 或 `ThinkWatch-Lite-<版本>-aarch64.AppImage`,用 `sha256sum -c` 核对后允许其执行(`chmod +x`,或在文件管理器的「属性」中勾选「允许作为程序执行文件」),然后打开。AppImage 应放在当前用户可写的目录中(如 `~/Applications`),以便自动更新替换。首次启动时会把 ThinkWatch Lite 添加到应用菜单,同时注册图标和 `thinkwatch://` 链接。Linux 版只发布 AppImage,不提供 deb、rpm、Flatpak 或 Snap 包。
+手动安装时,从 [最新版本的 release 页面](https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest)下载 `ThinkWatch-Lite-<版本>-linux-x86_64.AppImage` 或 `ThinkWatch-Lite-<版本>-linux-aarch64.AppImage`,用 `sha256sum -c` 核对后允许其执行(`chmod +x`,或在文件管理器的「属性」中勾选「允许作为程序执行文件」),然后打开。AppImage 应放在当前用户可写的目录中(如 `~/Applications`),以便自动更新替换。首次启动时会把 ThinkWatch Lite 添加到应用菜单,同时注册图标和 `thinkwatch://` 链接。Linux 版只发布 AppImage,不提供 deb、rpm、Flatpak 或 Snap 包。
需要 Ubuntu 22.04、Debian 12、Fedora 36 或同代及更新的发行版。AppImage 通过 FUSE 挂载自身,需要 fuse3 软件包中的 `fusermount3`(不需要 libfuse2)。多数桌面系统已自带;如缺少:
@@ -69,7 +83,9 @@ curl -fsSL https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest/
**在 macOS 上从 release 页面下载安装的**:点击一次安装按钮,其余步骤自动完成——下载更新包,用编译进应用的公钥验签,等待网关正在处理的请求结束(最多三分钟),然后替换并重新启动。正在输出的任务不会因更新而中断。
-**Windows 上**:同样点击一次即可。应用下载新版本的安装程序,用编译进应用的公钥验签,同样等待进行中的请求结束,然后运行安装程序,安装完成后新版本自动启动。应用为所有用户安装,因此每次更新 Windows 都会请求管理员权限;拒绝则继续运行当前版本。
+**Windows 安装版**:同样点击一次即可。应用下载新版本的安装程序,用编译进应用的公钥验签,同样等待进行中的请求结束,然后运行安装程序,安装完成后新版本自动启动。应用为所有用户安装,因此每次更新 Windows 都会请求管理员权限;拒绝则继续运行当前版本。
+
+**Windows 绿色版**:同样点击一次即可,不需要管理员权限。应用下载新版本的压缩包,用编译进应用的公钥验签,等待进行中的请求结束,然后替换文件夹中的两个程序文件并重新启动;替换失败时换回原来的文件,继续运行当前版本。
**Linux 上**:同样点击一次即可,不需要输入密码。应用下载新版本的 AppImage,用编译进应用的公钥验签,等待进行中的请求结束,然后替换自身文件并重新启动。AppImage 须位于当前用户可写的目录中。
diff --git a/src/content/docs-lite/zh-CN/overview.md b/src/content/docs-lite/zh-CN/overview.md
index a05ce62..ed73cfa 100644
--- a/src/content/docs-lite/zh-CN/overview.md
+++ b/src/content/docs-lite/zh-CN/overview.md
@@ -2,7 +2,7 @@
ThinkWatch Lite 是 Claude Code、Codex 等 AI 客户端的本地网关,支持 macOS、Windows 与 Linux。客户端只需接入一次,此后在网关中更换上游与模型,无需改动客户端。每个请求的费用与去向都有记录,发出前可替换其中的 API 密钥。
-> 支持 macOS 12 及以上(Apple silicon)、Windows 10 21H2 及以上(x64、ARM64)和 Linux(x86_64、aarch64),可用 Homebrew、磁盘映像、Windows 安装程序或 AppImage [安装](/zh-CN/docs/lite/install),安装后自动更新。
+> 支持 macOS 12 及以上(Apple silicon)、Windows 10 21H2 及以上(x64、ARM64)和 Linux(x86_64、aarch64),可用 Homebrew、磁盘映像、Windows 安装程序、Windows 绿色版或 AppImage [安装](/zh-CN/docs/lite/install),安装后自动更新。
## 要点
diff --git a/src/content/docs/_meta.ts b/src/content/docs/_meta.ts
index 243acc2..7d39e4d 100644
--- a/src/content/docs/_meta.ts
+++ b/src/content/docs/_meta.ts
@@ -162,8 +162,8 @@ export const products: Product[] = [
locales: both,
group: "getStarted",
summary: {
- en: "Homebrew, a disk image, the Windows installer or the Linux AppImage, the quarantine attribute and SmartScreen, and how updates reach each kind of install.",
- "zh-CN": "通过 Homebrew、磁盘映像、Windows 安装程序或 Linux AppImage 安装,隔离属性与 SmartScreen 的处理,以及各种安装方式如何更新。",
+ en: "Homebrew, a disk image, the Windows installer or portable zip, or the Linux AppImage, the quarantine attribute and SmartScreen, uninstalling, and how updates reach each kind of install.",
+ "zh-CN": "通过 Homebrew、磁盘映像、Windows 安装程序、Windows 绿色版或 Linux AppImage 安装,隔离属性与 SmartScreen 的处理,卸载,以及各种安装方式如何更新。",
},
},
{
diff --git a/src/i18n/pages/home.ts b/src/i18n/pages/home.ts
index 4d17869..7a85609 100644
--- a/src/i18n/pages/home.ts
+++ b/src/i18n/pages/home.ts
@@ -118,7 +118,7 @@ export const homeCopy = {
lite: {
runsAs: "Desktop app in the macOS menu bar, the Windows notification area or the Linux system tray",
builtFor: "Individual developers",
- status: "Available for macOS on Apple silicon (Homebrew or disk image), Windows on x64 or ARM64 (installer) and Linux on x86_64 or aarch64 (AppImage)",
+ status: "Available for macOS on Apple silicon (Homebrew or disk image), Windows on x64 or ARM64 (installer or portable zip) and Linux on x86_64 or aarch64 (AppImage)",
license: "MIT",
},
core: {
@@ -246,7 +246,7 @@ export const homeCopy = {
lite: {
runsAs: "桌面应用,常驻 macOS 菜单栏、Windows 通知区域或 Linux 系统托盘",
builtFor: "个人开发者",
- status: "已发布:macOS(Apple silicon)用 Homebrew 或磁盘映像安装,Windows(x64、ARM64)用安装程序,Linux(x86_64、aarch64)用 AppImage",
+ status: "已发布:macOS(Apple silicon)用 Homebrew 或磁盘映像安装,Windows(x64、ARM64)用安装程序或绿色版,Linux(x86_64、aarch64)用 AppImage",
license: "MIT",
},
core: {
diff --git a/src/i18n/pages/lite.ts b/src/i18n/pages/lite.ts
index d5aa7f0..fd8d064 100644
--- a/src/i18n/pages/lite.ts
+++ b/src/i18n/pages/lite.ts
@@ -251,7 +251,8 @@ export const liteCopy = {
body: "Installs the app for all users and keeps it up to date.",
download: { x64: "Download for Windows (x64)", arm64: "Download for Windows (ARM64)" },
otherLink: { x64: "x64 installer", arm64: "ARM64 installer" },
- note: "The installer is not code-signed. When SmartScreen shows “Windows protected your PC”, choose More info, then Run anyway. Installing needs administrator permission, and WebView2 is downloaded if it is missing.",
+ portable: "Portable build (ZIP, no installation): ",
+ note: "Neither the installer nor the portable build is code-signed. When SmartScreen shows “Windows protected your PC”, choose More info, then Run anyway. Installing needs administrator permission, and the installer downloads WebView2 if it is missing; the portable build offers its download page instead.",
},
linux: {
req: "Requires Ubuntu 22.04, Debian 12, Fedora 36 or a later distribution, on x86_64 or aarch64.",
@@ -492,7 +493,8 @@ export const liteCopy = {
body: "为所有用户安装,之后应用自动更新。",
download: { x64: "下载 Windows 版(x64)", arm64: "下载 Windows 版(ARM64)" },
otherLink: { x64: "x64 安装程序", arm64: "ARM64 安装程序" },
- note: "安装程序未经代码签名。SmartScreen 显示「Windows 已保护你的电脑」时,依次点「更多信息」「仍要运行」。安装需要管理员权限;缺少 WebView2 时会自动下载。",
+ portable: "绿色版(ZIP,免安装):",
+ note: "安装程序与绿色版均未经代码签名。SmartScreen 显示「Windows 已保护你的电脑」时,依次点「更多信息」「仍要运行」。安装需要管理员权限;缺少 WebView2 时安装程序会自动下载,绿色版则给出下载页面。",
},
linux: {
req: "需要 Ubuntu 22.04、Debian 12、Fedora 36 或更新的发行版,x86_64 或 aarch64。",
diff --git a/src/lib/structured-data.ts b/src/lib/structured-data.ts
index 536d3e0..861aa3f 100644
--- a/src/lib/structured-data.ts
+++ b/src/lib/structured-data.ts
@@ -126,9 +126,9 @@ export async function liteLd(lang: Lang): Promise {
const release = await getLatestLiteRelease();
const url = pageUrl(lang, "/lite");
const repo = `${GITHUB}/ThinkWatch-Lite`;
- // The installers of the latest release: disk image, Windows setup, AppImage.
+ // The installers of the latest release: disk image, Windows setup and portable zip, AppImage.
const installers = Object.entries(release?.assets ?? {})
- .filter(([name]) => /(\.dmg|-setup\.exe|\.AppImage)$/.test(name))
+ .filter(([name]) => /(\.dmg|-setup\.exe|-portable\.zip|\.AppImage)$/.test(name))
.map(([, href]) => href);
// Screenshots in the page's language; the English ones carry "-en", as on LitePage.astro.
// A feature without alt text (plugins) has no screenshot.