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
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: OpenLess issue / PR 规范
url: https://github.com/appergb/openless
url: https://github.com/Open-Less/openless
about: 提交前请确认中文正文、upstream 兼容标题、issue-first 和单一职责 PR 规则。
2 changes: 1 addition & 1 deletion .github/workflows/android-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ jobs:
working-directory: openless-all/app
env:
OPENLESS_UPDATE_APK_DIR: ${{ steps.apk.outputs.out_dir }}
OPENLESS_UPDATE_REPO: appergb/openless
OPENLESS_UPDATE_REPO: Open-Less/openless
OPENLESS_UPDATE_MIRROR_BASE_URL: https://fastgit.cc/https://github.com
OPENLESS_RELEASE_CHANNEL: ${{ env.OPENLESS_RELEASE_CHANNEL }}
OPENLESS_RELEASE_TAG: ${{ github.ref_name }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-tauri.yml
Original file line number Diff line number Diff line change
Expand Up @@ -499,7 +499,7 @@ jobs:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
OPENLESS_UPDATE_TARGET: ${{ matrix.updater-target }}
OPENLESS_UPDATE_ARCH: ${{ matrix.updater-arch }}
OPENLESS_UPDATE_REPO: appergb/openless
OPENLESS_UPDATE_REPO: Open-Less/openless
OPENLESS_UPDATE_MIRROR_BASE_URL: https://fastgit.cc/https://github.com
# beta 渠道时输出 latest-{tgt}-{arch}-beta.json,stable 沿用旧文件名。
OPENLESS_RELEASE_CHANNEL: ${{ env.OPENLESS_RELEASE_CHANNEL }}
Expand Down
4 changes: 2 additions & 2 deletions Casks/openless.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
sha256 arm: "4bfa85f48714626ec010b92d22a5ab98c834f60b5c7e5f6281e12a11ad90ad9f",
intel: "929ad6c047fc8942724b7e1edb5dc0d88affbd2ec4184b2dd3d482c0e06d999f"

url "https://github.com/appergb/openless/releases/download/v#{version}-tauri/OpenLess_#{version}_#{arch}.dmg"
url "https://github.com/Open-Less/openless/releases/download/v#{version}-tauri/OpenLess_#{version}_#{arch}.dmg"
name "OpenLess"
desc "Menu-bar voice input layer"
homepage "https://github.com/appergb/openless"
homepage "https://github.com/Open-Less/openless"

livecheck do
url :url
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,17 @@
<p align="center">
<a href="https://openless.top"><strong>Website</strong></a>
&nbsp;·&nbsp;
<a href="https://github.com/appergb/openless/releases/latest"><strong>Download</strong></a>
<a href="https://github.com/Open-Less/openless/releases/latest"><strong>Download</strong></a>
&nbsp;·&nbsp;
<a href="README.md">English</a>
&nbsp;/&nbsp;
<a href="README.zh.md">中文</a>
</p>

<p align="center">
<a href="https://github.com/appergb/openless/releases/latest"><img alt="Release" src="https://img.shields.io/github/v/release/appergb/openless?style=flat-square&color=2c5282" /></a>
<a href="https://github.com/appergb/openless/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/appergb/openless?style=flat-square&color=2f855a" /></a>
<a href="https://github.com/appergb/openless/stargazers"><img alt="Stars" src="https://img.shields.io/github/stars/appergb/openless?style=flat-square&color=805ad5" /></a>
<a href="https://github.com/Open-Less/openless/releases/latest"><img alt="Release" src="https://img.shields.io/github/v/release/Open-Less/openless?style=flat-square&color=2c5282" /></a>
<a href="https://github.com/Open-Less/openless/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/Open-Less/openless?style=flat-square&color=2f855a" /></a>
<a href="https://github.com/Open-Less/openless/stargazers"><img alt="Stars" src="https://img.shields.io/github/stars/Open-Less/openless?style=flat-square&color=805ad5" /></a>
<a href="https://discord.gg/vTZHTFGFm"><img alt="Discord" src="https://img.shields.io/badge/Discord-Join-5865F2?style=flat-square&logo=discord&logoColor=white" /></a>
</p>

Expand Down Expand Up @@ -240,7 +240,7 @@ Go to [Releases](../../releases) and download:
- If unsure, run `adb shell getprop ro.product.cpu.abi` and pick the matching APK.
- **macOS (Homebrew)**:
```bash
brew tap appergb/openless https://github.com/appergb/openless
brew tap Open-Less/openless https://github.com/Open-Less/openless
brew install --cask openless
xattr -cr /Applications/OpenLess.app

Expand Down
10 changes: 5 additions & 5 deletions README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,17 @@
<p align="center">
<a href="https://openless.top"><strong>官网</strong></a>
&nbsp;·&nbsp;
<a href="https://github.com/appergb/openless/releases/latest"><strong>下载</strong></a>
<a href="https://github.com/Open-Less/openless/releases/latest"><strong>下载</strong></a>
&nbsp;·&nbsp;
<a href="README.md">English</a>
&nbsp;/&nbsp;
<a href="README.zh.md">中文</a>
</p>

<p align="center">
<a href="https://github.com/appergb/openless/releases/latest"><img alt="Release" src="https://img.shields.io/github/v/release/appergb/openless?style=flat-square&color=2c5282" /></a>
<a href="https://github.com/appergb/openless/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/appergb/openless?style=flat-square&color=2f855a" /></a>
<a href="https://github.com/appergb/openless/stargazers"><img alt="Stars" src="https://img.shields.io/github/stars/appergb/openless?style=flat-square&color=805ad5" /></a>
<a href="https://github.com/Open-Less/openless/releases/latest"><img alt="Release" src="https://img.shields.io/github/v/release/Open-Less/openless?style=flat-square&color=2c5282" /></a>
<a href="https://github.com/Open-Less/openless/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/Open-Less/openless?style=flat-square&color=2f855a" /></a>
<a href="https://github.com/Open-Less/openless/stargazers"><img alt="Stars" src="https://img.shields.io/github/stars/Open-Less/openless?style=flat-square&color=805ad5" /></a>
<a href="https://discord.gg/vTZHTFGFm"><img alt="Discord" src="https://img.shields.io/badge/Discord-Join-5865F2?style=flat-square&logo=discord&logoColor=white" /></a>
</p>

Expand Down Expand Up @@ -240,7 +240,7 @@ OpenLess 只做一件事:**把语音变成可用的书面文字(尤其是 AI 提
- 不确定时执行 `adb shell getprop ro.product.cpu.abi`,下载对应 ABI 的包。
- **macOS(Homebrew)**:
```bash
brew tap appergb/openless https://github.com/appergb/openless
brew tap Open-Less/openless https://github.com/Open-Less/openless
brew install --cask openless
xattr -cr /Applications/OpenLess.app

Expand Down
4 changes: 2 additions & 2 deletions USAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@

### macOS

1. 从 [Releases](https://github.com/appergb/openless/releases/latest) 下载 `OpenLess_<版本>_aarch64.dmg`。
1. 从 [Releases](https://github.com/Open-Less/openless/releases/latest) 下载 `OpenLess_<版本>_aarch64.dmg`。
2. 打开 dmg,将 OpenLess.app 拖入「应用程序」文件夹。
3. 双击启动。

### Windows

1. 从 [Releases](https://github.com/appergb/openless/releases/latest) 下载 `OpenLess_<版本>_x64-setup.exe`。
1. 从 [Releases](https://github.com/Open-Less/openless/releases/latest) 下载 `OpenLess_<版本>_x64-setup.exe`。
2. 运行安装程序,按提示完成安装。
3. 从开始菜单启动 OpenLess。

Expand Down
4 changes: 2 additions & 2 deletions openless-all/app/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion openless-all/app/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "openless-app",
"private": true,
"version": "1.3.15-Beta.1",
"version": "1.3.15-Beta.2",
"type": "module",
"scripts": {
"pretest": "npm run build",
Expand Down
1 change: 1 addition & 0 deletions openless-all/app/scripts/frontend-test-runner.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ for (const expected of [
'scripts/check-hotkey-injection.mjs',
'scripts/macos-capsule-spaces-contract.test.mjs',
'scripts/macos-speech-usage-description-contract.test.mjs',
'scripts/repository-owner-contract.test.mjs',
'scripts/windows-ui-config.test.mjs',
'src/lib/hotkeyRecorder.test.ts',
'src/lib/windowHotkeyFallback.test.ts',
Expand Down
43 changes: 43 additions & 0 deletions openless-all/app/scripts/repository-owner-contract.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import assert from 'node:assert/strict';
import { readFile } from 'node:fs/promises';
import { join } from 'node:path';
import { fileURLToPath } from 'node:url';

const repoRoot = fileURLToPath(new URL('../../..', import.meta.url));
const currentRepo = 'Open-Less/openless';
const legacyRepo = 'appergb/openless';

const repositoryReferences = [
'.github/ISSUE_TEMPLATE/config.yml',
'.github/workflows/android-apk.yml',
'.github/workflows/release-tauri.yml',
'Casks/openless.rb',
'README.md',
'README.zh.md',
'USAGE.md',
'openless-all/app/src-tauri/src/android/updater_logic.rs',
'openless-all/app/src-tauri/src/commands/mod.rs',
'openless-all/app/src-tauri/src/commands/settings.rs',
'openless-all/app/src-tauri/tauri.conf.json',
'openless-all/app/src/components/AutoUpdate.tsx',
'openless-all/app/src/components/SettingsModal.tsx',
'openless-all/app/src/pages/settings/AboutSection.tsx',
'openless-all/app/scripts/write-updater-manifest.mjs',
];

for (const relativePath of repositoryReferences) {
const content = await readFile(join(repoRoot, relativePath), 'utf8');
assert(!content.includes(legacyRepo), `${relativePath} still references the pre-transfer repository`);
}

const tauriConfig = JSON.parse(
await readFile(join(repoRoot, 'openless-all/app/src-tauri/tauri.conf.json'), 'utf8'),
);
const updaterEndpoints = tauriConfig?.plugins?.updater?.endpoints;
assert(Array.isArray(updaterEndpoints) && updaterEndpoints.length > 0, 'desktop updater endpoints are missing');
assert(
updaterEndpoints.every((endpoint) => endpoint.includes(currentRepo)),
'desktop updater endpoints must use the current GitHub repository',
);

console.log('repository-owner-contract.test.mjs passed');
2 changes: 1 addition & 1 deletion openless-all/app/scripts/write-updater-manifest.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { fileURLToPath } from 'node:url';

const target = process.env.OPENLESS_UPDATE_TARGET;
const arch = process.env.OPENLESS_UPDATE_ARCH;
const repo = process.env.OPENLESS_UPDATE_REPO || 'appergb/openless';
const repo = process.env.OPENLESS_UPDATE_REPO || 'Open-Less/openless';
const mirrorBaseUrl = process.env.OPENLESS_UPDATE_MIRROR_BASE_URL || 'https://fastgit.cc/https://github.com';
const rawChannel = (process.env.OPENLESS_RELEASE_CHANNEL || 'stable').toLowerCase();
if (rawChannel !== 'stable' && rawChannel !== 'beta') {
Expand Down
2 changes: 1 addition & 1 deletion openless-all/app/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion openless-all/app/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "openless"
version = "1.3.15-Beta.1"
version = "1.3.15-Beta.2"
description = "OpenLess — local voice input that types where your cursor is"
authors = ["OpenLess"]
edition = "2021"
Expand Down
14 changes: 7 additions & 7 deletions openless-all/app/src-tauri/src/android/updater_logic.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//! Pure Android updater helpers (manifest URLs, version compare). Testable on all targets.

pub const MIRROR_BASE: &str = "https://fastgit.cc/https://github.com/appergb/openless";
pub const DIRECT_BASE: &str = "https://github.com/appergb/openless";
pub const MIRROR_BASE: &str = "https://fastgit.cc/https://github.com/Open-Less/openless";
pub const DIRECT_BASE: &str = "https://github.com/Open-Less/openless";

/// Must match `plugins.updater.pubkey` in `tauri.conf.json` (TAURI_SIGNING_PRIVATE_KEY pair).
pub const UPDATER_PUBKEY_B64: &str =
Expand Down Expand Up @@ -104,11 +104,11 @@ mod tests {
let body = r#"<feed>
<entry>
<updated>2026-07-15T07:00:00Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/appergb/openless/releases/tag/v1.3.15-Beta.1-tauri"/>
<link rel="alternate" type="text/html" href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-Beta.1-tauri"/>
</entry>
<entry>
<updated>2026-06-17T15:41:46Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/appergb/openless/releases/tag/v1.3.10-4-beta-tauri"/>
<link rel="alternate" type="text/html" href="https://github.com/Open-Less/openless/releases/tag/v1.3.10-4-beta-tauri"/>
</entry>
</feed>"#;
let latest = crate::commands::parse_latest_beta_from_atom(body)
Expand All @@ -125,9 +125,9 @@ mod tests {
#[test]
fn beta_manifest_urls_skip_malformed_modern_tags_from_atom() {
let body = r#"<feed>
<entry><link href="https://github.com/appergb/openless/releases/tag/v-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/garbage-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1.3.15-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/garbage-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-Beta.1-tauri"/></entry>
</feed>"#;
let latest = crate::commands::parse_latest_beta_from_atom(body)
.expect("Android updater must skip malformed Beta tags");
Expand Down
40 changes: 20 additions & 20 deletions openless-all/app/src-tauri/src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1261,21 +1261,21 @@ mod tests {
<entry>
<id>tag:github.com,2008:Repository/X/v1.2.23-tauri</id>
<updated>2026-05-07T09:05:00Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/appergb/openless/releases/tag/v1.2.23-tauri"/>
<link rel="alternate" type="text/html" href="https://github.com/Open-Less/openless/releases/tag/v1.2.23-tauri"/>
<title>OpenLess v1.2.23-tauri</title>
</entry>
<entry>
<id>tag:github.com,2008:Repository/X/v1.2.24-2-beta-tauri</id>
<updated>2026-05-08T01:27:23Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/appergb/openless/releases/tag/v1.2.24-2-beta-tauri"/>
<link rel="alternate" type="text/html" href="https://github.com/Open-Less/openless/releases/tag/v1.2.24-2-beta-tauri"/>
<title>OpenLess v1.2.24-2-beta-tauri</title>
</entry>
</feed>"#;
let got = parse_latest_beta_from_atom(body).expect("must find a Beta entry");
assert_eq!(got.tag_name, "v1.2.24-2-beta-tauri");
assert_eq!(
got.html_url,
"https://github.com/appergb/openless/releases/tag/v1.2.24-2-beta-tauri"
"https://github.com/Open-Less/openless/releases/tag/v1.2.24-2-beta-tauri"
);
assert_eq!(got.published_at, "2026-05-08T01:27:23Z");
}
Expand All @@ -1286,15 +1286,15 @@ mod tests {
<feed>
<entry>
<updated>2026-07-15T08:00:00Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/appergb/openless/releases/tag/v1.3.15-tauri"/>
<link rel="alternate" type="text/html" href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-tauri"/>
</entry>
<entry>
<updated>2026-07-15T07:00:00Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/appergb/openless/releases/tag/v1.3.15-Beta.1-tauri"/>
<link rel="alternate" type="text/html" href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-Beta.1-tauri"/>
</entry>
<entry>
<updated>2026-06-17T15:41:46Z</updated>
<link rel="alternate" type="text/html" href="https://github.com/appergb/openless/releases/tag/v1.3.10-4-beta-tauri"/>
<link rel="alternate" type="text/html" href="https://github.com/Open-Less/openless/releases/tag/v1.3.10-4-beta-tauri"/>
</entry>
</feed>"#;

Expand All @@ -1307,21 +1307,21 @@ mod tests {
#[test]
fn parse_latest_beta_from_atom_skips_malformed_modern_tags() {
let body = r#"<feed>
<entry><link href="https://github.com/appergb/openless/releases/tag/v-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/garbage-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/1.3.15-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1.3-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1.3.15.0-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1..15-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1.3.x-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1.3.15-Beta.-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1.3.15-Beta.x-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1.3.15-Beta.1-extra-tauri"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1.3.15-Beta.1-tauri-extra"/></entry>
<entry><link href="https://github.com/appergb/openless/releases/tag/v1.3.15-Beta.2-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/garbage-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/1.3.15-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1.3-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1.3.15.0-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1..15-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1.3.x-Beta.1-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-Beta.-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-Beta.x-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-Beta.1-extra-tauri"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-Beta.1-tauri-extra"/></entry>
<entry><link href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-Beta.2-Beta.1-tauri"/></entry>
<entry>
<updated>2026-07-15T07:00:00Z</updated>
<link href="https://github.com/appergb/openless/releases/tag/v1.3.15-Beta.1-tauri"/>
<link href="https://github.com/Open-Less/openless/releases/tag/v1.3.15-Beta.1-tauri"/>
</entry>
</feed>"#;

Expand All @@ -1335,7 +1335,7 @@ mod tests {
fn parse_latest_beta_from_atom_returns_none_when_only_stable_releases() {
let body = r#"<feed>
<entry>
<link rel="alternate" type="text/html" href="https://github.com/appergb/openless/releases/tag/v1.2.23-tauri"/>
<link rel="alternate" type="text/html" href="https://github.com/Open-Less/openless/releases/tag/v1.2.23-tauri"/>
<updated>2026-05-07T09:05:00Z</updated>
</entry>
</feed>"#;
Expand Down
Loading
Loading