Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
351e021
集成 1.3.14 → beta(主窗 UI 大改 + 一批 fix/feat) (#761)
appergb Jul 4, 2026
3ca6883
fix(deps): patch tauri-plugin-shell CVE (GHSA-c9pr-q8gx-3mgp) (#763)
appergb Jul 4, 2026
f77bc8f
feat(asr): enable speaker diarization to filter non-primary speakers …
Shicongcoding Jul 5, 2026
7de0c04
docs: 用协调沉降定律重构 README 能力/增强叙事,凸显开屏即授权完基础设施 (#765)
appergb Jul 5, 2026
95e4cdf
fix(audio-cue): recover when resume() is rejected or wakes non-runnin…
appergb Jul 6, 2026
2e3c0f5
fix(windows-ime): stop explorer.exe AppHang from IME pipe server shut…
appergb Jul 6, 2026
d8789c7
feat: 统一聊天面板(官方 shadcn)+ 1.3.14 审计修复批 + CVE 补丁 (#767)
appergb Jul 6, 2026
4242020
fix(asr): 百炼连接检查修复验证必败(EmptyAudio)并真实校验连通性与协议头 (#773)
bigsongeth Jul 10, 2026
f2c2372
fix: preserve active style across settings saves (#747)
snvtac Jul 11, 2026
ef1561e
fix(asr): 修复 Windows 本地长语音只识别前段 (#769)
Duyi-Wang Jul 12, 2026
b8acb9b
feat(hotkey): 录音方式新增「自动」——短按=切换式,长按=按住说话 (#789)
bigsongeth Jul 12, 2026
9ed34da
feat(asr): 新增百炼 Qwen3-ASR-Flash 实时供应商(OpenAI Realtime WS 协议) (#775)
bigsongeth Jul 12, 2026
6958130
feat(ux): 三个小改进——Esc 立即收起胶囊 / 概览复制按钮 / 历史页 ⌘R 刷新 (#790)
bigsongeth Jul 12, 2026
414acf0
feat(settings): 设置项悬停显示功能说明,降低 Less Computer / 录音胶囊等的理解门槛 (#777)
bigsongeth Jul 12, 2026
01bff73
fix(prefs): 解析失败时逐字段抢救+备份,避免升级改 schema 静默清空设置 (#791)
bigsongeth Jul 13, 2026
a49d02b
fix(settings/overview): 清理 Windows 上不适用的 UI 选项/标签/布局 (#799)
bigsongeth Jul 14, 2026
a77cbd4
fix(dictation): 转写阶段可中断——按 Esc 立即取消在途 ASR 请求 (#798)
bigsongeth Jul 14, 2026
3f51eda
fix(local-asr): 本地 Qwen3 模型在云端 provider 下误标「当前使用」 (#794)
bigsongeth Jul 14, 2026
6e79a0c
feat(asr): 百炼 ASR 支持 fun-asr-flash 并统一三协议为单一入口 (#793)
bigsongeth Jul 14, 2026
6140a4b
fix(linux): prevent startup panic from unrealized capsule GDK window …
yuanchenglu Jul 14, 2026
ef6f1fa
fix(cask): update Homebrew package to v1.3.14 (#802)
appergb Jul 14, 2026
66d0847
fix(security): patch RustSec dependency advisories (#809)
appergb Jul 14, 2026
145a0ea
feat(asr): add ElevenLabs Scribe v2 provider (#807)
appergb Jul 14, 2026
6aaae67
fix(security): bound style-pack ZIP imports (#819)
appergb Jul 14, 2026
fa53f47
fix(security): redact Less Computer approval tokens (#820)
appergb Jul 14, 2026
c645b16
Disable background scrolling when settings open (#776)
H-Chris233 Jul 14, 2026
d6ca07a
fix(android): break IPC settings barrel cycle (#827)
appergb Jul 15, 2026
a5a9c7f
test: pin local tsx runner (#828)
appergb Jul 15, 2026
9991b32
test(windows): repair UI config contract (#829)
appergb Jul 15, 2026
472b914
fix(security): authenticate marketplace writes with GitHub OAuth (#816)
appergb Jul 15, 2026
e3e63ca
fix(security): harden remote pairing PIN persistence (#821)
appergb Jul 15, 2026
07b2e6a
fix(security): redact provider URL log secrets (#831)
appergb Jul 15, 2026
eb099c4
build(macos): 校验打包产物声明语音识别用途 (#825)
Breadswim Jul 15, 2026
4bdef5d
ci: run all frontend and contract tests (#832)
appergb Jul 15, 2026
664633f
fix(asr): Apple Speech 保留停顿分段,修复停顿前内容丢失 (#824)
Breadswim Jul 15, 2026
3143892
fix(updater): discover modern Beta release tags (#833)
appergb Jul 15, 2026
033eb5e
chore(release): prepare 1.3.15-Beta.1 (#834)
appergb Jul 15, 2026
842ae5f
feat(history): 详情页展示 ASR/LLM 模型与分步耗时,可观测的模型表现对比 (#826)
bigsongeth Jul 16, 2026
07f394f
fix: include selected text in follow-up context (#830)
H-Chris233 Jul 16, 2026
17fe67c
feat(asr): 接入阶跃星辰 StepAudio 2.5 批式转写,词典走一等 hotwords (#835)
bigsongeth Jul 18, 2026
ce3fd8d
feat(llm): 新增 StepFun 供应商预设;修复 Codex OAuth 默认模型不可用 (#836)
bigsongeth Jul 18, 2026
75918e0
fix(android): protect credentials with Android Keystore (#838)
appergb Jul 18, 2026
6b33ba2
fix(updater): prepare 1.3.15-Beta.2 after repository transfer
Jul 18, 2026
a1fe387
fix(history): 音频播放改用 Blob URL + 导出走 Tauri dialog save (#841)
aeoform Jul 20, 2026
857ea6d
Merge pull request #839 from Open-Less/release/1.3.15
appergb Jul 21, 2026
ef66246
Add Atlas Cloud LLM preset (#844)
binyangzhu000-sudo Jul 21, 2026
8263f6f
fix(asr): resolve Bailian ASR validation deadlock and surface error d…
lvsao Jul 21, 2026
f4bb056
fix(llm): make custom provider temperature configurable (#849)
Duyi-Wang Jul 22, 2026
b16950d
fix(hotkey): Esc 取消改走独立通道——修复转写/润色期间按 Esc 停不下来 (#853)
bigsongeth Jul 31, 2026
52e6ef4
feat(hotkey): 会话激活期间 Esc 由 OpenLess 独占——不再透传宿主应用 (#855)
bigsongeth Aug 1, 2026
93c6f6f
fix(hotkey): 修饰键热键被当组合键用时不再误唤起听写(150ms 仲裁 + 即时撤销,胶囊不再赖着) (#858)
bigsongeth Aug 1, 2026
1ab2d52
fix(asr): StepFun 实时转写不再随机白等 12 秒(13% 的听写中招) (#870)
bigsongeth Aug 1, 2026
5fd353d
fix(asr): WebSocket 建连补超时——握手挂死不再让热键彻底失灵 (#871)
bigsongeth Aug 1, 2026
83c4f7f
feat(asr): 火山引擎 ASR 新增方舟 API Key 鉴权模式 (#867)
YangLeiSX Aug 1, 2026
95edf89
fix(capsule): 润色/插入失败改走 error 态——失败提示不再被前端丢掉 (#874)
bigsongeth Aug 2, 2026
f0ffa8a
fix(capsule): 入场帧强制重注册 Space 贴附——胶囊不再被 macOS 26 钉死在单个桌面 (#875)
bigsongeth Aug 2, 2026
10ff058
feat(asr): support qwen audio batch transcription (#876)
MurphyLo Aug 2, 2026
8f49971
feat(asr): support additional Bailian speech models (#866)
LauraGPT Aug 2, 2026
c498746
fix(android): hide overview activity heatmap on mobile layout (#863)
HKLHaoBin Aug 2, 2026
cfd99be
fix(windows): 主窗口改为不透明——消除录音时 DWM/GPU 饱和导致的系统卡顿 (#882)
H-Chris233 Aug 2, 2026
761e6c5
fix(android): sync mobile style group nav with desktop sidebar (#864)
HKLHaoBin Aug 2, 2026
7ad24d3
fix(android): persist prefs/logs under app filesDir (#877)
HKLHaoBin Aug 2, 2026
2409036
fix(android): use app cache for Marketplace installs (#879)
HKLHaoBin Aug 2, 2026
e484cd1
fix(less-computer): 「hotkey disabled」只在状态翻转时打一次——日志不再被它刷爆 (#873)
bigsongeth Aug 2, 2026
e12c8dc
feat(hotkey-recorder): 快捷键录入交互重构——主行按钮移除、箭头右对齐、动画优化
Aug 3, 2026
c429007
fix(update-button): 检查更新按钮旋转方向与尺寸稳定
Aug 3, 2026
a55ec3e
refactor(coding-agent): Less Computer 后端/权限模式/模型选择改用官方 SelectLite
Aug 3, 2026
d679c32
feat(asr-models): 云端 ASR 模型预设下拉——加入千问 qwen3-asr-flash 系列
Aug 3, 2026
9e3d017
feat(local-asr): 本地模型三板块重构 + 下拉选择 + Whisper Large V3
Aug 3, 2026
3244df1
chore(i18n): 快捷键录入 / 本地模型 / 模型预设新增文案(zh-CN/en/ja/ko/zh-TW)
Aug 3, 2026
23bfc4f
feat(style-pack): 清晰结构 v3.0 Beta 提示词上线——人格化「语修」角色 + 场景优先级分型
Aug 3, 2026
65d7438
feat(style-pack): 内置包版本对账机制——提示词升级随 app 更新推向所有用户
Aug 3, 2026
e6d3779
fix(style-pack): 对账机制收窄为仅推进 prompt/version,补单元测试
Aug 3, 2026
dd90c13
chore(release): prepare 1.3.15-Beta.3
Aug 3, 2026
8a2febf
feat(windows): add selected-text polish workflow (#851)
SeanZhang226 Aug 3, 2026
006cb78
feat(capsule): 录音胶囊样式可选(流光 Siri / Openless 默认)+ 修复 beta 构建破坏 (#887)
appergb Aug 3, 2026
0063497
fix(linux): fcitx5 plugin crash on empty triggerKeyList with raw hotk…
leaion Aug 3, 2026
cd48a03
fix(less-computer): restore OpenCode model discovery and execution (#…
appergb Aug 3, 2026
73e65a4
chore(release): prepare 1.3.15-Beta.4 (#889)
appergb Aug 3, 2026
26cd012
fix(llm): 官方 OpenAI gpt-5 系列不下发 temperature,修复验证 400(#857) (#888)
H-Chris233 Aug 3, 2026
f5fc5fd
feat(android): expose advanced debug tools on mobile (#890)
HKLHaoBin Aug 3, 2026
9bfec8a
fix(dictation): 转写中按热键改为静默丢弃,移除排队接力(#856) (#891)
H-Chris233 Aug 3, 2026
a3d014b
chore(release): prepare 1.3.15(正式版版本号)+ 修复 bump 脚本误改依赖版本 (#893)
appergb Aug 3, 2026
5be28b1
feat(asr): 支持讯飞实时语音转写(RTASR)提供商(#842) (#894)
H-Chris233 Aug 3, 2026
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
74 changes: 66 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI

# 多平台跨语言质量门禁。release-tauri.yml 是发版流水线(仅打包构建),这里负责
# 在合并前快速验证两件事:
# 1. 前端 typecheck + vite bundle 通过(tsc + vite build,捕获跨 locale 类型 drift)
# 1. 全部前端/契约测试与 vite bundle 通过(捕获行为、合同及跨 locale 类型 drift)
# 2. Rust 后端在 macOS / Windows / Linux 都能 cargo check 过(捕获 cfg 漏分支 / 平台 API 误用)
# 跑 build-mac.sh / windows-package-msvc.ps1 / Tauri bundle 太重;只跑轻量 cargo check + vite build。

Expand Down Expand Up @@ -34,7 +34,7 @@ jobs:
shell: bash
run: |
set -euo pipefail
sdkmanager "ndk;26.1.10909125"
sdkmanager "ndk;26.1.10909125" "platforms;android-36" "build-tools;36.0.0"
ndk_dir="$ANDROID_HOME/ndk/26.1.10909125"
echo "ANDROID_NDK_HOME=$ndk_dir" >> "$GITHUB_ENV"
echo "NDK_HOME=$ndk_dir" >> "$GITHUB_ENV"
Expand All @@ -51,16 +51,27 @@ jobs:
echo "CXX_aarch64_linux_android=$prebuilt/bin/aarch64-linux-android24-clang++" >> "$GITHUB_ENV"
echo "AR_aarch64_linux_android=$prebuilt/bin/llvm-ar" >> "$GITHUB_ENV"
echo "CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$prebuilt/bin/aarch64-linux-android24-clang" >> "$GITHUB_ENV"
echo "CC_x86_64_linux_android=$prebuilt/bin/x86_64-linux-android24-clang" >> "$GITHUB_ENV"
echo "CXX_x86_64_linux_android=$prebuilt/bin/x86_64-linux-android24-clang++" >> "$GITHUB_ENV"
echo "AR_x86_64_linux_android=$prebuilt/bin/llvm-ar" >> "$GITHUB_ENV"
echo "CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=$prebuilt/bin/x86_64-linux-android24-clang" >> "$GITHUB_ENV"

- uses: actions/setup-node@v4
with:
node-version: "22"
cache: npm
cache-dependency-path: openless-all/app/package-lock.json

- uses: actions/setup-java@v4
with:
distribution: zulu
java-version: "17"

- uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android
targets: aarch64-linux-android,x86_64-linux-android

- uses: gradle/actions/setup-gradle@v4

- name: Install Linux check dependencies
run: |
Expand All @@ -80,6 +91,56 @@ jobs:
- name: Check Tauri backend (Android target)
run: cargo check --manifest-path src-tauri/Cargo.toml --target aarch64-linux-android

- name: Initialize generated Android project
run: npm run tauri -- android init --ci

- name: Generate Tauri Gradle dependency scripts
env:
TAURI_ANDROID_PROJECT_PATH: ${{ github.workspace }}/openless-all/app/src-tauri/gen/android
TAURI_ANDROID_PACKAGE_UNESCAPED: com.openless.app
WRY_ANDROID_LIBRARY: openless_lib
WRY_ANDROID_KOTLIN_FILES_OUT_DIR: ${{ github.workspace }}/openless-all/app/src-tauri/gen/android/app/src/main/java/com/openless/app/generated
WRY_ANDROID_PACKAGE: com.openless.app
run: |
mkdir -p "$WRY_ANDROID_KOTLIN_FILES_OUT_DIR"
cargo check --manifest-path src-tauri/Cargo.toml --target x86_64-linux-android

- name: Copy Android production and test scaffolding
run: node scripts/copy-android-scaffolding.mjs

- name: Run JVM credential tests and compile instrumentation tests
# These tests are Kotlin-only. The Rust target is checked above; direct Gradle
# rustBuild requires the live Tauri CLI RPC server used by `tauri android build`.
run: >-
src-tauri/gen/android/gradlew
--project-dir src-tauri/gen/android
:app:testX86_64DebugUnitTest
:app:assembleX86_64DebugAndroidTest
-x :app:rustBuildX86_64Debug
--no-daemon

- name: Enable KVM for Android instrumentation tests
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \
| sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: Run Android Keystore instrumentation tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 35
target: google_apis
arch: x86_64
# The instrumentation suite exercises AndroidKeyStore without launching Tauri.
script: >-
cd openless-all/app &&
src-tauri/gen/android/gradlew
--project-dir src-tauri/gen/android
:app:connectedX86_64DebugAndroidTest
-x :app:rustBuildX86_64Debug
--no-daemon

cross-platform:
name: ${{ matrix.label }} checks
strategy:
Expand Down Expand Up @@ -152,11 +213,8 @@ jobs:
}
}

- name: Check macOS capsule Spaces contract
run: npm run check:macos-capsule-spaces

- name: Build frontend (tsc + vite)
run: npm run build
- name: Build frontend and run frontend/contract tests
run: npm test

- name: Check Tauri backend (cargo check)
run: cargo check --manifest-path src-tauri/Cargo.toml
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
13 changes: 7 additions & 6 deletions Casks/openless.rb
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
cask "openless" do
arch arm: "aarch64", intel: "x64"

version "1.3.12"
sha256 arm: "d6cd007e7a08ae840e93a174c6a3b125608ca4da8d56305b8eac6d3137f02b74",
intel: "82e67ee081206fefcc3cb93698308fc425737deca1fdac679862c1c3d6d602e6"
version "1.3.14"
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 for macOS"
homepage "https://github.com/appergb/openless"
desc "Menu-bar voice input layer"
homepage "https://github.com/Open-Less/openless"

livecheck do
url :url
regex(/^v?(\d+(?:\.\d+)+)[._-]tauri$/i)
end

auto_updates true
depends_on macos: :monterey

app "OpenLess.app"

Expand Down
43 changes: 29 additions & 14 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 @@ -112,9 +112,22 @@ Place your cursor in any text field — ChatGPT, Claude, Cursor, Notion, an emai

Unlike dictation tools that simply emit a word-for-word transcript, OpenLess's headline capability is its **AI-prompt mode**: you speak freely, and it adds structure, captures your constraints, and produces a context-rich prompt that you can paste directly into ChatGPT, Claude, or Cursor.

## From tool to infrastructure

Advanced systems all do the same thing: **they turn today's communication into tomorrow's default rules.** The Internet won not because HTTP was faster, but because no one negotiates how data is transmitted anymore. Git won not because the code was better, but because teams stopped coordinating versions every day. Stripe won not because payments were faster, but because developers stopped coordinating with banks.

What OpenLess does is not "faster dictation" — it **eliminates every act of coordination between a thought and clean text.** Turning what's in your head into usable text used to mean deciding, over and over: what tone for this one? how is that name spelled? which input field, copy or paste? where does the model's key live, and who has access? OpenLess **sediments** those repeated negotiations, layer by layer, into defaults:

- **Tone** sediments into a **style pack** — named, switchable, live at a keystroke, never re-decided.
- **Proper nouns** sediment into **dictionary hotwords** — recognized by the ASR, hinted to the polish model, never re-corrected.
- **Where text lands** sediments into a **single insertion protocol** — hold → speak → it appears at the cursor, with an automatic clipboard fallback.
- **Model and credentials** sediment into the **OS vault** — authorized once at launch, never renegotiated.

That is what **authorizing the infrastructure once, at launch** means: on first run you grant the microphone, accessibility, and cloud credentials exactly once; from that moment, "speak → clean text at the cursor" is no longer a negotiation you run each time, but a default protocol you can forget is even there. Judge OpenLess not by how much faster it is, but by how much **coordination it removes.**

## ✨ What's new

Two features define how OpenLess feels in daily use:
Two capabilities that sediment yet more of the coordination you used to repeat every day into defaults:

- 🎨 **Style Pack Marketplace.** OpenLess no longer ships a single fixed "polish" voice. Build your own **style packs** with custom system prompts, switch between them with a hotkey, and **install community packs in one click** — or publish your own to share. When a style is tuned to your exact task (cold emails, commit messages, 小红书 posts, formal reports, your team's tone), the output is not merely cleaner — it is *noticeably better*, because the model is finally writing the way you intend.
- ⚡ **Streaming insertion.** Text now flows to your cursor **character by character** as it is polished, rather than making you wait for the complete result. Perceived latency drops sharply, so dictation feels nearly as fast as thinking — and it automatically falls back to a one-shot paste when an application cannot accept streamed keystrokes.
Expand Down Expand Up @@ -146,7 +159,7 @@ The closest alternatives are subscription SaaS products: a monthly fee, no optio
OpenLess targets the same end-user experience, but:

- **Fully open source, local-first.** The code lives in this repository, and all of your data stays on your machine.
- **Bring your own cloud credentials.** Volcengine streaming ASR with Ark / DeepSeek-compatible chat completions. No vendor lock-in.
- **Bring your own cloud credentials.** A dozen-plus ASR and polish providers — Volcengine, iFlytek, Alibaba Cloud Bailian, StepFun, OpenAI-compatible endpoints, and more — or any endpoint you bring. No vendor lock-in.
- **Tuned for AI prompts.** The structured mode reshapes loose speech into a prompt complete with context, constraints, and requests — ready to paste into ChatGPT, Claude, or Cursor.
- **It will not answer for you.** The model only cleans up your text. If you say "what features does this app still need?", it returns that as a clean question — it does not hand you a feature list. For that, ask the AI itself.

Expand Down Expand Up @@ -185,15 +198,17 @@ OpenLess does one thing: it **turns speech into usable written text — AI promp
| [Lazy](https://heylazy.com) | Closed-source notes / capture tool | Not a notes container — inserts straight into any input field |
| [Superwhisper](https://superwhisper.com) | Closed-source macOS, subscription | Open source; cloud ASR today, local ASR on the roadmap |

## Status (v1.3.6)
## Status

Every item below is one more layer sedimented into a default — a capability you authorize once and then never manage again. This is the infrastructure you stand on after launch:

- Tauri 2 backend in Rust with a React/TypeScript frontend. macOS 12+, Windows 10+.
- 🎨 **Style Pack Marketplace** — browse, install, and like community **style packs** from the in-app Marketplace, and publish your own (custom system prompt per pack, switchable by hotkey). Backed by a moderated marketplace backend; uploads are reviewed before they go public.
- ⚡ **Streaming insertion** — polished text is written to the cursor character by character to reduce perceived latency, with an automatic one-shot-paste fallback. Toggle in Settings → Recording.
- **Toggle and push-to-talk** recording modes, plus a **MediaPlayPause trigger** so wired-earbud inline controls can start and stop recording. `Esc` cancels at any phase, including polish and insertion.
- **Cloud ASR**: Volcengine streaming ASR, OpenAI Whisper-compatible batch ASR, Apple Speech (macOS).
- **Local ASR**: bundled Qwen3-ASR (0.6B / 1.7B) via vendored `Open-Less/qwen-asr`; Windows Foundry Local Whisper variants.
- **Polish providers**: Ark / DeepSeek / OpenAI / Doubao / Anthropic-compatible chat completions, plus any OpenAI-compatible endpoint you bring.
- **Cloud ASR**: Volcengine streaming ASR (bigasr), iFlytek realtime ASR (RTASR), Alibaba Cloud Bailian (classic realtime / Qwen3 realtime / Fun-ASR-Flash file transcription), StepFun StepAudio (batch + realtime), Zhipu GLM-ASR, Xiaomi MiMo ASR, ElevenLabs Scribe, OpenAI-compatible batch transcription (OpenAI Whisper / Groq / SiliconFlow SenseVoice / OpenRouter), and Apple Speech (macOS).
- **Local ASR**: bundled Qwen3-ASR (0.6B / 1.7B) via vendored `Open-Less/qwen-asr` (macOS); Windows Foundry Local Whisper and sherpa-onnx (experimental) variants.
- **Polish providers**: Ark (Volcengine), DeepSeek, OpenAI, Google Gemini, Codex OAuth, SiliconFlow, Atlas Cloud, Xiaomi MiMo, CometAPI, OpenRouter, Alibaba Cloud Coding Plan, CodingPlanX, MiniMax, and StepFun — plus any OpenAI-compatible endpoint you bring.
- **Four output modes**: raw, light polish, structured (**AI-prompt mode**), and formal. Plus a **translation hotkey** that converts speech directly into the configured target language ([#43](../../issues/43)).
- **Selection-ask QA panel** — a separate hotkey opens a floating panel that runs voice Q&A against the highlighted text in any app ([#118](../../issues/118)).
- **Main window**: Overview / History / Vocab / Style / Marketplace / Settings. Persistent tray icon, plus a mini status capsule that floats on screen and follows the display you are typing on (multi-monitor).
Expand Down Expand Up @@ -225,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 Expand Up @@ -322,6 +337,7 @@ New credential writes do not persist plaintext secrets. The repository contains
You will need:

- **Volcengine streaming ASR**: APP ID, Access Token, Resource ID.
- **iFlytek realtime ASR (RTASR)**: AppID, API Key. See [docs/xfyun-asr.md](docs/xfyun-asr.md).
- **Ark polish**: API Key, Model ID, Endpoint. The Ark default endpoint is `https://ark.cn-beijing.volces.com/api/v3/chat/completions`.

## Prompt-handling principles
Expand All @@ -348,7 +364,7 @@ Long-term reference rewrites are stored as `raw → polished → rule` triples a
The dictionary handles your proper nouns, product names, names of people, and new words. Today it supports:

- Manually adding the correct spelling, a category, and notes. You do not need to maintain misspellings or context hints.
- Enabled entries are sent as Volcengine ASR `context.hotwords` so they are recognized correctly during transcription.
- Enabled entries are sent to the ASR provider that supports hotwords (Volcengine `context.hotwords`, StepFun `hotwords`, Whisper-compatible `prompt`, Bailian vocabulary ID) so they are recognized correctly during transcription. iFlytek realtime ASR has no request-level hotword parameter — configure personalized hotwords in the iFlytek console instead.
- Entries are also injected into the polish prompt: the model decides per sentence whether to substitute. If "Cloud" clearly refers to the AI product `Claude` in context, it is corrected; if it genuinely means cloud computing, it is left as is.
- The app auto-learns candidate corrections such as `Claude`, `ChatGPT`, and `OpenLess` from your history and offers them later.

Expand All @@ -364,7 +380,7 @@ The active implementation is Tauri 2 (`openless-all/app/`). Releases are split i
types.rs Pure value types: DictationSession, PolishMode, HotkeyBinding, errors
hotkey.rs Global hotkey (CGEventTap on macOS, WH_KEYBOARD_LL on Windows, rdev on Linux)
recorder.rs Mic → 16 kHz mono Int16 PCM, RMS callback
asr/ Volcengine streaming ASR (WebSocket) + Whisper HTTP
asr/ Streaming ASR clients (Volcengine / Bailian / Qwen3 / StepFun / iFlytek over WebSocket) + Whisper-compatible batch HTTP
polish.rs OpenAI-compatible chat completions (Ark / DeepSeek / etc.)
insertion.rs AX focused-element → clipboard + Cmd+V → copy-only fallback
persistence.rs History / preferences / vocab JSON + platform credential vault
Expand All @@ -383,7 +399,6 @@ See [CLAUDE.md](CLAUDE.md) for invariants and module-wiring rules.

Planned but not yet shipped:

- Dictation translation mode: hold a separate hotkey, speak in your language, insert in the target language ([#43](../../issues/43)).
- Cross-session style memory: polish learns the user's tone over time ([#46](../../issues/46)).
- Snippets (no UI or trigger logic yet).
- History enhancements: copy button, search, re-polish, re-insert.
Expand Down
Loading
Loading