Commit Graph
29 Commits
Author SHA1 Message Date
H-Chris233 4d9b63aab3 Route qwen-asr through the organization fork
Keep the submodule pinned to the reviewed commit while moving the fetch URL to Open-Less/qwen-asr, then document the review checklist future upgrades must follow.\n\nConstraint: #301 identified the personal upstream submodule URL as a supply-chain risk.\nRejected: Updating the submodule commit together with the URL change | would mix provenance hardening with unreviewed upstream code changes.\nConfidence: high\nScope-risk: narrow\nDirective: Do not point .gitmodules back to antirez/qwen-asr; sync upstream into the organization fork and review the diff first.\nTested: gh repo view Open-Less/qwen-asr; git submodule update --init --recursive openless-all/app/src-tauri/vendor/qwen-asr; git diff --check; npm run build; cargo check --manifest-path src-tauri/Cargo.toml\nNot-tested: macOS INSTALL=0 ./scripts/build-mac.sh C-link verification.
2026-05-12 18:48:03 +08:00
TRIPandbaiqing b7685cadda docs(release): make macOS xattr workaround discoverable (#347)
发现的真因:v1.2.23 Stable 和 v1.2.24-1 Beta 的 macOS DMG 都是 ad-hoc 签名 + 未经 Apple 公证(仓库没配 APPLE_CERTIFICATE 等 secrets)。macOS 14+ Gatekeeper 默认拒绝运行未公证的 app,弹"OpenLess 已损坏"。
build-mac.sh:40-41 注释已经写明这是已知限制:
  "用户免手工 xattr 的根本方案是 Developer ID 签名 + Apple notarization"

之前 README 只在 brew install 段写了 xattr -cr 指令,DMG 直装路径没写。
用户首次装 Beta 不知道要做这一步,看到"已损坏"以为 release 坏了。

本 PR:
- README.md / README.zh.md 的「下载与安装」段,DMG 直装路径加上 xattr -cr 指令 + 一句解释为什么需要(ad-hoc 签名、未公证)
- release-tauri.yml 的 Create release step 加 body 模板,所有未来 release 自动 prepend 一段:macOS xattr 指令 + Beta/Stable 渠道说明。用 append_body: true 让它放在 generated notes 之前

不在本 PR:配 Apple Developer 证书 + secrets——那是根治方案,需要 $99/年 Apple Developer 账号 + 用户决定要不要走那条路。

Co-authored-by: baiqing <lbx12309@icloud.com>
2026-05-08 09:27:16 +08:00
cooper e331784b3b docs: add Cooper's circular avatar image
- Add assets/people/cooper.png (circular avatar)
- Replace GitHub API link with local image file
- Match TRIP and Chris233's avatar style
2026-05-08 00:34:48 +08:00
cooper 620e817939 docs: make Cooper avatar circular
Add border-radius: 50% to Cooper's avatar to match TRIP and Chris233's circular style.
2026-05-08 00:32:29 +08:00
cooper dd96d64672 docs: add website URLs back to developer section
- Add website URLs below each developer's name
- Increase cell width from 110 to 140 to accommodate URLs
- Keep circular avatars and table layout
2026-05-08 00:27:31 +08:00
cooper 712e9564f2 docs: refine developer section 2026-05-08 00:02:23 +08:00
TRIPandbaiqing fd79a051bd feat(updater): manual-download Beta opt-in in Settings → About (#332)
* feat(updater): manual-download Beta opt-in in Settings → About

接入 PR-B-2:客户端「加入 Beta 渠道」开关 + 文档完善。

为什么不走 auto-update 切 endpoint:
  tauri-plugin-updater 2.10 的 Builder 不暴露 endpoints() 运行时 API,
  endpoints 只能从 tauri.conf.json 编译期读,不能跑时切。继续用 plugin
  自带 check 路径意味着 Beta 包会被推到所有用户,违背「Beta 不溢出正式
  版」原则。fork plugin 或自实现 update flow ~500 行高风险,本轮采用
  最稳路径:plugin 永远只读正式版 manifest(旧文件名),Beta 改成手动
  下载——Settings 里展示最新 prerelease 的下载入口,用户点了跳浏览器。

Rust 端:
- types.rs:UpdateChannel enum (Stable | Beta) + UserPreferences::update_channel
  字段;UserPreferencesWire / Default / Deserialize 全套兼容(旧 prefs 反序列化
  默认 Stable,迁移无痛)。
- commands.rs:三个新命令——
  - get_update_channel:读 prefs
  - set_update_channel:写 prefs,复用 persist_settings + emit prefs:changed
  - fetch_latest_beta_release:reqwest 调 GitHub Releases API,过滤
    prerelease=true 且 tag 以 -beta-tauri 结尾的最新一条
- lib.rs:三个命令注册到 invoke_handler

前端:
- ipc.ts:UpdateChannel + LatestBetaRelease 类型 + 三个 invoke 包装
- SettingsModal.tsx:在 AboutMini 末尾加 BetaChannelControl 组件——
  Toggle 切换渠道;切到 beta 时拉一次最新 prerelease 信息,展示
  「最新 Beta:v1.x.x-beta-tauri」+「前往下载」按钮(openExternal 跳
  GitHub release 页面)+ 重新查询按钮。切回 stable 立即清空状态。
- Settings.tsx:把 Toggle 组件 export,让 SettingsModal 复用同一开关样式。
- i18n 五个 locale(zh-CN / zh-TW / en / ja / ko)的 settings.about 都补
  齐 betaChannel* 9 个 key(zh-CN 是 source of truth)。

文档:
- README.md / README.zh.md:把 PR-A 的「opt-in,尚未接入」占位换成
  manual-download 路径的说明 + tag 约定。
- CLAUDE.md:把「Channel distribution (in progress)」整段重写为已接入
  状态,含 tag 约定 / wiring 位置 / 新加的 release verification checklist
  (5 条,发版后一定要走一遍,含 stable/beta 双向 cross-check 与 endpoint
  采样验证)。

cargo check + npm run build 本地都过。本 PR base = chore/branching-workflow
(PR-A),等 PR-A merge 后会自动指向 beta;与 PR-B-1(CI 端)解耦,可独立
review / merge。

* docs(readme): refresh Status / Architecture / Maintainer release checklist

把 README 的产品/发版描述更新到当前真实状态,配合 PR-A / PR-B 系列工作流改造:

Status (v1.2) 章节:
- 把云端 ASR / 本地 ASR / 润色 provider 三类拆开列;本地 ASR 提及内置
  Qwen3-ASR + Windows Foundry Local Whisper 两条线
- 加翻译热键、QA 浮窗、Beta 渠道 opt-in、Homebrew Cask 分发渠道四个要点
- 把「中英双语」改成多语言 UI(实际已支持 zh-CN / zh-TW / en / ja / ko)

Architecture 顶句:
- 由「Auto-updates ride on Tauri updater plugin」改为双渠道描述:Stable
  (v<v>-tauri) 自动推送,Beta (v<v>-beta-tauri) 手动下载

Maintainer release checklist:
- 完全重写为双渠道流程:通用准备(5 处版本号 + 冒烟 + secrets)+
  Beta 流程(在 beta 分支打 v<v>-beta-tauri tag)+ 正式版流程
  (beta→main 后在 main 打 v<v>-tauri tag)
- 把 CI 的 Verify version sync 5-file 校验显式提一次,避免维护者
  漏改 Cargo.lock / package-lock 撞 CI 红灯
- 末尾引用 CLAUDE.md 的 5 步 release verification checklist

Roadmap 章节保持原样(多个项目实际状态我无法在不引入回归的前提下
确认,避免误判)。

* docs: drop reference to non-existent bump-version.sh; describe manual bump

---------

Co-authored-by: baiqing <lbx12309@icloud.com>
2026-05-07 22:00:33 +08:00
TRIPandbaiqing 2fe5f2e0d4 docs: introduce Beta/Stable two-channel branching workflow (#327)
把分支模型从「dev/main」改造为「Beta/正式版」双渠道,渠道语义直接由分支名承载:

- `beta` — Beta 渠道(开发版),默认分支、集成缓冲区,所有 PR 一律打到这里。
  Beta 包不推送给普通用户,只面向主动加入 Beta 渠道的用户。
- `main` — 正式版渠道(Stable),始终可发布。仅由维护者在双端冒烟测试通过后从
  beta 合入;普通用户默认拿到的就是这条线。

文档与 CI 改动:
- README.md / README.zh.md:把「Contributing workflow / 贡献流程」章节
  改写为 Beta/正式版双渠道,含分支流向 ASCII 图、6 条核心规则,
  以及「Beta 不溢出正式版」的隔离要求。
- CLAUDE.md:把 `### Branch & contribution workflow` 改名为
  `### Branch & release-channel workflow`,明确「分支名=渠道名」。
- ci.yml:触发分支从 [main, dev] 改为 [main, beta]。

仓库侧已同步:
- 远端 dev 分支已重命名为 beta(git push origin dev:beta + 删除旧 dev)
- GitHub 仓库默认分支已切到 beta
- release-tauri.yml 用 v*-tauri tag 触发,跟分支无关,发版机制不受影响

Beta 包的 opt-in 分发机制(per-channel updater endpoint + 设置页开关)
将在独立 PR 中接入。在它落地之前,所有 v*-tauri tag 都按正式版对待,
不要从 beta 分支直接打 tag。

Co-authored-by: baiqing <lbx12309@icloud.com>
2026-05-07 21:55:31 +08:00
kiruno 9543a5a86f feat: Add Homebrew Cask install option (#322)
Adds Casks/openless.rb + update-cask.yml workflow + README install docs. Closes #254 #5.

Note: Formula/openless.rb known to fail in Homebrew sandbox (per author); will be removed in follow-up. Cask version will be bumped to current 1.2.23 in same follow-up.
2026-05-07 20:32:35 +08:00
cooper 188efa7e68 docs: add Cooper to developer list 2026-05-07 19:59:38 +08:00
H-Chris233 13ccf85a48 Store credentials in the system vault
Provider credentials should follow the platform credential-store threat model instead of continuing normal plaintext JSON writes. The vault now stores the existing multi-provider credentials payload in the OS credential store, migrates the legacy JSON file only when the vault has no entry, removes the legacy file after a successful write, and keeps raw credential IPC restricted to the main settings window.

Constraint: User explicitly chose Keychain/Credential Manager/Linux keyring for issue #230.

Constraint: Preserve the existing provider schema and active-provider routing with minimal frontend churn.

Rejected: Keep plaintext JSON as the documented product choice | user rejected this direction.

Rejected: Split every credential field into separate vault entries | larger migration surface and risks losing active provider state.

Confidence: medium

Scope-risk: moderate

Directive: Security-model and storage-strategy choices must be confirmed with the user before implementation.

Tested: cargo check --manifest-path src-tauri/Cargo.toml; npm run -s build; git diff --check; grep for stale plaintext/Keychain fallback wording.

Not-tested: Manual migration on macOS Keychain, Windows Credential Manager, or Linux desktop keyring.

Related: https://github.com/appergb/openless/issues/230
2026-05-06 14:39:40 +08:00
whoa bfc718323b docs(readme): document macOS-only qwen-asr submodule init step 2026-05-06 06:29:38 +08:00
H-Chris233 2861a30cbe Add end-of-file acknowledgements for sponsors, developers, and LinuxDo community
README updates now place a unified acknowledgement section near the end (before License) in both English and Chinese, explicitly thanking sponsors, developers/contributors, and the LinuxDo community with a neutral non-endorsement disclaimer.

Constraint: Keep existing sponsor/developer showcase blocks intact while adding final acknowledgement wording

Rejected: Put acknowledgement near top profile blocks | user requested end-of-file placement

Confidence: high

Scope-risk: narrow

Directive: Keep acknowledgement wording neutral and avoid implying official affiliation

Tested: Manual README markdown diff review

Not-tested: Render preview in GitHub UI
2026-05-04 20:26:11 +08:00
Chris233 d08f649f15 docs(readme): add Chris233 to Developers section 2026-05-03 17:55:00 +08:00
baiqing bba13b1b42 docs(readme): 增加官方网站 openless.top 链接
在中英 README 顶部加官方网站链接,并在描述段落中补一句官网地址,方便读者直达。
2026-05-03 16:37:51 +08:00
baiqing cd41267483 docs(readme): jiangmuran 移到赞助商栏
上一个 PR 把 jiangmuran 错放到了开发者栏。修正:

- 赞助商栏(Sponsors):悠雾云数据 + jiangmuran,圆形头像 48×48
  与悠雾云 logo 高度(48)对齐
- 开发者栏(Developers):仅 TRIP

英文 sponsor → Sponsors(多于一个)。
2026-05-03 15:53:24 +08:00
baiqing 64b9132553 docs(readme): 加开发者栏目(圆形头像)+ 资源整理
- 新增"开发者 / Developers"栏(QQ 群、赞助商之下):
  - TRIP — https://tripmc.top/
  - jiangmuran — https://jiangmuran.com/
- 头像本地化到 assets/people/,每张 200×200 圆形透明 PNG
  (ffmpeg geq alpha mask 抗锯齿;GitHub markdown sanitizer 不支持
  border-radius 内联样式,预处理图片是唯一稳定路径)
- 赞助商栏(悠雾云数据)保留不动
2026-05-03 15:48:50 +08:00
baiqing 36afec52ba docs(readme): 加赞助商悠雾云数据栏目
QQ 群下方新增「赞助商 / Sponsor」一栏,内容:
- 名称:悠雾云数据
- 站点:https://www.knin.net (logo + 文字均可点击跳转)
- Logo:https://www.knin.net/upload/logo.png(按文件名语义择 logo.png;
  另一张 login.png 看起来是后台登录配图,暂不用,必要时一行替换)

中英文 README 同步。
2026-05-03 15:17:30 +08:00
baiqing 1683224403 docs(readme): 更新到 v1.2 — 双语 / auto-update / single-instance;清理 Swift 遗留
- Status (v1.1) → (v1.2);加 i18n / 自动更新 / 单实例锁 / push-to-talk / vocab hits 累计
- Whisper 已上线,从 roadmap 移到当前状态
- 移除 Swift legacy build / 发版指引(Swift 整套已在 commit 34d2823 删除)
- Architecture 段从'Sparkle for legacy users'改为'Tauri updater 签名 artifact'
- Roadmap 加上 #43(翻译模式)+ #46(风格记忆);都是当前 open feature issue
- 维护者发版检查加 TAURI_SIGNING_PRIVATE_KEY secret 提示

中英 README 同步改。
2026-04-30 17:53:11 +08:00
TRIPandbaiqing 7a3a51a1ed fix(readme): 修复 README 中破损的图片引用 (#80)
Resources/AppIcon.png 已在 commit 170283e(清理 Swift 残留)中删除,但 README.md
和 README.zh.md 顶部的 hero 图片仍然指向它,GitHub 上显示破图。

改为指向 Tauri 自身的图标:openless-all/app/src-tauri/icons/128x128@2x.png

Co-authored-by: baiqing <lbx12309@icloud.com>
2026-04-30 14:27:46 +08:00
Chris233 85045c3ff4 chore(repo): 统一项目目录命名 (#39)
* Remove fragile space from active app path

The Tauri app lived under a path containing a literal space, which made CI paths and local commands easy to quote incorrectly. Rename the active tree to openless-all and update repository references so scripts, docs, and release workflows use the same space-free path.

Constraint: Preserve the existing app layout and move only the containing directory name.

Rejected: Add compatibility symlinks | would keep two app paths and leave quoting hazards in place.

Confidence: high

Scope-risk: moderate

Tested: npm run build

Tested: cargo clean && cargo check

Tested: git diff --check

Tested: grep -R for old openless -all and openless%20-all references

* Keep Windows build docs aligned with space-free path

The app directory was renamed to openless-all, but the GNU/MinGW route still described the new name as if it contained a space. Update the wording so the rationale matches the current path and keeps the helper-script guidance focused on consistent GNU setup.

Constraint: Documentation-only code review follow-up.

Confidence: high

Scope-risk: narrow

Tested: git diff --check
2026-04-30 10:44:31 +08:00
baiqing 7f83bca5b6 docs: 更新 README / USAGE / CLAUDE.md 至 Tauri v1.1 现状
- 两个 README 改为描述 Tauri 2 + Rust + React/TS,macOS 12+ 和 Windows
- Badges:去掉 Swift/macOS15+,加 Tauri/Rust/Windows/macOS12+
- 状态章节:v1.0 Swift → v1.1 Tauri
- 构建说明:Tauri 优先,Swift 降为 legacy
- 架构章节:更新为 Tauri 模块表
- Roadmap:删除已完成项(Developer ID + Sparkle)
- 下载说明:更新为 DMG/MSI 安装流程
- 发布检查:更新为 tag CI 流程
- 新增 USAGE.md(快速上手指南,中文)
- QQ 群号 1078960553 加入显眼位置(README 标题区 + USAGE)
- CLAUDE.md:补充 whisper ASR、HotkeySettingsContext、cargo check
2026-04-30 09:12:31 +08:00
TRIPandbaiqing 56c3e09983 feat: hold-to-talk + UX fixes + structured prompt overhaul
* feat: add hold-to-talk hotkey mode (closes #1)

OpenLessHotkey now emits explicit .pressed / .released edge events on
the modifier-key trigger; the coordinator interprets them per the new
HotkeyMode preference (toggle stays the default, hold = press-and-hold).

Hold mode rules: .pressed on idle starts the session; .released stops
it from .listening; releasing during .starting cancels (no audio
useful was captured yet). Esc-cancel sets a one-shot suppress flag so
the trailing .released after a cancel does not re-trigger end.

Settings hub gets a "录音方式" segmented picker and a one-line hint
explaining the tradeoff. Bump version to 1.1.0; update README roadmap
and USAGE walkthrough to document the new mode.

* test: update HotkeyEventTests for pressed/released split

* chore: tag hold-to-talk build as 1.0.01 / A1003

* fix: stop window-background drag eating text selection; add eye toggle on secret fields

Settings window had isMovableByWindowBackground = true, so any drag
inside the content view dragged the whole window — making it
impossible to select words inside a TextField. Disable it; the native
title-bar strip (with the traffic lights) still drags the window.

PasteableCredentialField now exposes an eye / eye.slash toggle when
secure: true, so users can verify pasted API keys before saving.

* fix: stop pretending polish ran when it was skipped or errored

When the user removes the Ark API key (or the Ark call errors out),
DictationCoordinator was still showing the green "已插入" capsule and
recording the session in history under the originally-selected polish
mode. From the user's side it looked like polish had succeeded, even
though only the raw transcript reached the cursor.

Track a PolishOutcome (ok / skippedNoCredentials / failed) through
insertText. Capsule now uses a new CapsuleState.warning (orange) state
to surface honest messages — "已插入原文 · 未润色" / "润色失败 · 已用原文" —
and history saves the session as PolishMode.raw whenever polish
didn't actually run. The error capsule + 1.5s artificial sleep that
preceded a fake "success" insert is gone; warning state stays for the
normal 2.5s.

* feat(polish): make Structured mode prompt force a 1./1)/a. hierarchy

Some weaker chat models would emit a single flat list when the user
asked for Structured polish, even when the dictation clearly covered
multiple topics. The mode is meant to produce something pasteable as
an AI prompt or a working doc, not a wall of bullets.

Rewrite the .structured system prompt to be prescriptive: when the
input contains ≥2 themes, emit three explicit levels — top "1./2./3."
sections, "1)/2)/3)" sub-points indented 3 spaces, and "a./b./c."
detail items indented another 3 — and to fall back to a plain
paragraph when the input is short / single-topic. Add a concrete
format example so weaker models have a pattern to copy.

---------

Co-authored-by: baiqing <lbx12309@icloud.com>
2026-04-27 18:57:41 +08:00
baiqing 1f155b8e40 docs: make English the default README, swap Talk reference for Typeless
Promote the English README to README.md and move the Chinese version to
README.zh.md so the default GitHub view ships in English. Replace the
incorrect "Talk (Talktastic)" reference in the comparison and intro
with Typeless (typeless.com), which is the actual product OpenLess is
positioned against. Update the cross-language switch in both files.
2026-04-27 16:48:15 +08:00
baiqing d138b0f590 docs: add hero icon, badges, and a concrete AI-prompt example
Add a centered icon header pulling Resources/AppIcon.png, language switch,
and shield badges for release / license / macOS / Swift / stars. Lead with
a tangible "say this, get this prompt" SQL example so the AI-prompt
positioning is obvious within the first screenful. Mirror in English.
2026-04-27 15:44:54 +08:00
baiqing 7dbdd0f002 docs: position OpenLess as an open-source alternative to Wispr Flow / Talk / Lazy
Reframe README around the AI-prompt use case (dictate loose speech →
get a usable AI prompt) and mark OpenLess as the open-source
counterpart to Wispr Flow, Talk (Talktastic), Lazy, and Superwhisper.
Add a comparison table, a "why open source" section, and use cases.

Add an English mirror at README.en.md and cross-link both languages.
2026-04-27 15:31:17 +08:00
baiqing c78bb44c23 chore: cut 1.0.0 release with usage docs and MIT license
Bump APP_VERSION to 1.0.0 / BUILD_NUMBER to 1; refresh README to clarify
project direction and add quarantine-removal guidance for the unsigned
release artifact; add USAGE.md as the end-user walkthrough; add MIT LICENSE.
2026-04-27 15:25:28 +08:00
baiqing 4f8e6b914e feat: add dock main window and fixed navigation 2026-04-27 14:07:12 +08:00
baiqing f5a0c810fa feat: add dictionary hotwords and insights UI 2026-04-27 13:53:18 +08:00