Skip to content
Open
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
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Use **Check for Updates…** from the app menu to check manually in either the p
1. Open Inklet from your Applications folder. For a source build, run `scripts/run-local-app.sh` from the repository root, then use `/Applications/Inklet Local.app`.
2. Click the Inklet menu bar icon and open Settings.
3. Grant Accessibility permission when macOS asks. Inklet uses this one generic permission to read selections, perform a configured copy fallback, return focus to the previous app, and paste confirmed results. Inklet stays in the background while System Settings is open and returns to General settings when you close it.
4. Enter your OpenAI API key in General. Inklet uses this one key for writing, realtime dictation, selection translation, and pronunciation.
4. Choose a provider in General and enter its API key. With OpenAI, the default, one key covers writing, realtime dictation, selection translation, and pronunciation. With any other provider, writing and selection translation use that provider, while realtime dictation and pronunciation still need an OpenAI API key in the separate optional field.
5. Configure Writing Assistant with the model, writing shortcut, generation settings, prompt modes, Dictation hold shortcut, and microphone you want to use. Advanced Dictation exposes only the recovery model; the recovery endpoint is not editable. The realtime model is fixed by Inklet.
6. Optional: configure Selection Assistant with a translation language, Force Selection mode, AI pronunciation voice, and pronunciation speed, then preview the voice in Settings.
7. Grant Microphone permission on the first valid Dictation hold. Opening Inklet, visiting Settings, or pressing the Dictation shortcut outside the active source editor does not request it.
Expand Down Expand Up @@ -79,9 +79,9 @@ The Dictation shortcut is source-local and hold-only. You can change its modifie
- Keeps simulated `Command+C` off by default. Menu Copy remains the safe Force Selection fallback; you can explicitly enable simulated copy as an advanced fallback for apps without a usable Copy menu, but it may interfere with games, remote desktops, or virtual machines.
- Serializes temporary clipboard reads and restores the prior snapshot only while the same read still owns the observed copy result; newer clipboard contents win. The double-copy trigger is passive: it consumes the copy the user already made without issuing another synthetic copy or restoring older clipboard data. Right-click remains native and never starts a selection read.
- Does not use browser-specific selection code and does not request browser Automation. Chrome, Safari, Edge, and native apps use the same generic path.
- Lets you edit prompt modes, OpenAI model, timeout, writing shortcut, Dictation hold shortcut, microphone, recovery model, selection translation language, selection Translate prompt, Force Selection mode, simulated-copy permission, AI pronunciation voice, and AI pronunciation speed.
- Lets you edit prompt modes, provider, model, custom OpenAI-compatible endpoint, timeout, writing shortcut, Dictation hold shortcut, microphone, recovery model, selection translation language, selection Translate prompt, Force Selection mode, simulated-copy permission, AI pronunciation voice, and AI pronunciation speed.
- Shows local History for successful Write and Selection results, with consecutive duplicate entries collapsed, selectable source/result text, a result copy control, and a clear-all action. Existing legacy Voice entries remain readable.
- Uses one shared OpenAI API key for writing, realtime dictation, selection translation, and pronunciation.
- Writes and translates with OpenAI, Anthropic, Google Gemini, DeepSeek, Alibaba Qwen, Moonshot Kimi, Zhipu GLM, MiniMax, SiliconFlow, Volcengine Ark, Tencent Hunyuan, Baichuan, 01.AI Yi, xAI, Groq, Mistral, OpenRouter, Perplexity, Together AI, Cerebras, or any custom OpenAI-compatible endpoint, such as a local model server. Realtime dictation and pronunciation always use OpenAI.
- Provides English, Simplified Chinese, Traditional Chinese, Japanese, Korean, Spanish, French, German, Portuguese, and Italian app UI localization.
- Adapts compact selection menus and constrained settings/writing controls to translated labels; language changes refresh open UI while preserving writing content.

Expand All @@ -102,7 +102,7 @@ Inklet is an early MVP. The repository currently includes:
- Full Xcode is recommended for XCTest support.
- Accessibility permission for Inklet, required for generic selection reading, configured copy fallback, returning focus to the previous app, and pasting the generated result.
- Microphone permission for realtime dictation while the shortcut is held.
- An OpenAI API key.
- An API key for OpenAI or another supported provider. Realtime dictation and pronunciation require an OpenAI API key.

## Build And Run

Expand Down Expand Up @@ -183,18 +183,18 @@ If macOS blocks automatic access to the matching legacy container, Settings keep

## Privacy

- Inklet uses your configured OpenAI API key to call OpenAI for writing, realtime dictation, selection translation, and pronunciation.
- Inklet sends writing and selection translation requests to the provider you choose in Settings, using that provider's API key. Realtime dictation and pronunciation always use your OpenAI API key and OpenAI.
- While you hold the Dictation shortcut, active microphone audio is streamed directly to OpenAI Realtime transcription. Inklet also keeps one temporary local recovery recording. It remains local until the fallback request actually begins, is uploaded at most once to `https://api.openai.com/v1/audio/transcriptions` using the same existing OpenAI API key used by realtime dictation, and is deleted on every terminal session path.
- Your OpenAI API key is stored locally on your Mac.
- Your API keys are stored locally on your Mac, one per provider.
- Inklet uses Accessibility permission for generic selection reading, configured copy fallback, returning focus to the previous app, and pasting text.
- Inklet uses Microphone permission only during a valid Dictation hold in the active Writing Assistant source editor. Finishing dictation leaves an editable draft and does not insert into another app.
- Inklet temporarily uses the clipboard for insertion and configured Force Selection fallback reads. A Force Selection read restores the previous clipboard only if Inklet's temporary copied value is still current, and does not overwrite a later external clipboard change.
- Inklet saves successful Write and Selection source/result text locally in History until you clear it in Settings, while skipping consecutive duplicate entries. An unprocessed dictated draft creates no History entry; existing legacy Voice entries remain locally readable.
- Selection Actions capture the source app and selection location, validate that source before and during the read, and use Accessibility to read its current selection. If Accessibility does not return selected text, the configured Force Selection mode can briefly invoke menu Copy and read the resulting clipboard text through the protected transaction described above. Simulated `Command+C` is off by default and runs only after an explicit advanced opt-in. You can turn Force Selection off in Settings. This path sends no browser-targeted Apple Events and does not request browser Automation. Pressing `Command+C` twice quickly after selecting text explicitly reads the copy you already made. Inklet does not save merely selected text unless a successful action is recorded in local History.
- Selection Assistant caches successful translation results locally for 7 days using hashed cache keys to speed repeated translations.
- Selection Assistant translation sends selected text and your custom Translate instructions to OpenAI when no local cached translation is available; AI pronunciation sends selected text to OpenAI.
- Selection Assistant translation sends selected text and your custom Translate instructions to your selected provider when no local cached translation is available; AI pronunciation sends selected text to OpenAI.
- Inklet fetches the public model catalog from `models.dev` at most once per day. This request does not include your text, audio, API keys, or app settings.
- Do not send private text or audio to OpenAI unless you trust OpenAI's data handling policies.
- Do not send private text or audio to OpenAI or your selected provider unless you trust their data handling policies.

## Contributing

Expand Down
16 changes: 8 additions & 8 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Inklet 仅通过 GitHub Releases 检查更新。正式版大约每 24 小时从
1. 从 Applications 文件夹打开 Inklet。需要运行源码构建时,请在仓库根目录执行 `scripts/run-local-app.sh`,然后使用 `/Applications/Inklet Local.app`。
2. 点击菜单栏里的 Inklet 图标,打开 Settings。
3. 按 macOS 提示授予 Accessibility 权限。Inklet 用这一个通用权限读取选区、执行已配置的复制备用流程、回到上一个应用并粘贴确认后的结果。系统设置打开期间 Inklet 会留在后台;关闭系统设置后 Inklet 会返回 General 设置页。
4. 在 General 中填写 OpenAI API key。Inklet 会用这一把 key 处理写作、实时听写、选区翻译和发音。
4. 在 General 中选择服务商并填写它的 API key。默认的 OpenAI 用一把 key 处理写作、实时听写、选区翻译和发音。选择其他服务商时,写作和选区翻译使用该服务商;实时听写和发音仍需要在单独的可选字段中填写 OpenAI API key。
5. 在 Writing Assistant 中配置模型、写作快捷键、生成参数、Prompt 模式、听写长按快捷键和麦克风。高级听写只提供恢复模型,不提供端点设置;恢复端点不可编辑。实时模型由 Inklet 固定。
6. 可选:在 Selection Assistant 中配置翻译语言、强制取词模式、AI 发音声音和发音速度,并在设置中试听该声音。
7. 第一次有效长按听写快捷键时授予 Microphone 权限。只打开 Inklet、查看 Settings,或在原文编辑器之外按快捷键都不会请求权限。
Expand Down Expand Up @@ -79,9 +79,9 @@ Inklet 仅通过 GitHub Releases 检查更新。正式版大约每 24 小时从
- 默认关闭模拟 `Command+C`。菜单复制仍是安全的强制取词备用方式;对于没有可用复制菜单的 App,可以显式开启模拟复制这一高级备用选项,但它可能干扰游戏、远程桌面或虚拟机。
- 临时剪贴板读取会串行执行。只有同一次读取仍持有已观察到的复制结果时,Inklet 才恢复之前的快照;较新的剪贴板内容优先。双击复制触发是被动流程:它只读取用户已经完成的复制,不会再发一次合成复制,也不会恢复更旧的剪贴板数据。右键点击保留原生行为,不会开始选区读取。
- 不包含浏览器专用的选区代码,也不会请求浏览器 Automation。Chrome、Safari、Edge 和原生 App 使用同一条通用流程。
- 可以编辑 Prompt 模式、OpenAI 模型、timeout、写作快捷键、听写长按快捷键、麦克风、恢复模型、选区翻译语言、选区 Translate prompt、强制取词模式、模拟复制权限、AI 发音声音和 AI 发音速度。
- 可以编辑 Prompt 模式、服务商、模型、自定义 OpenAI 兼容接口地址、timeout、写作快捷键、听写长按快捷键、麦克风、恢复模型、选区翻译语言、选区 Translate prompt、强制取词模式、模拟复制权限、AI 发音声音和 AI 发音速度。
- 在本地 History 中查看成功的写作和选区结果,连续重复项会自动合并,原文/结果文本可选择,可一键复制结果或清空全部历史;旧版 Voice History 仍可读取。
- 使用一把共享的 OpenAI API key 处理写作、实时听写、选区翻译和发音。
- 写作和翻译可使用 OpenAI、Anthropic、Google Gemini、DeepSeek、阿里通义千问(Alibaba Qwen)、月之暗面 Kimi、智谱 GLM、MiniMax、硅基流动(SiliconFlow)、火山方舟(Volcengine Ark)、腾讯混元、百川、零一万物 Yi、xAI、Groq、Mistral、OpenRouter、Perplexity、Together AI、Cerebras,或任意自定义 OpenAI 兼容接口(例如本地模型服务)。实时听写和发音始终使用 OpenAI。
- 提供英文、简体中文、繁体中文、日文、韩文、西班牙文、法文、德文、葡萄牙文和意大利文应用界面。
- 紧凑选区菜单以及设置、写作界面中的受限控件会根据译文调整布局;切换语言时刷新已打开的界面并保留写作内容。

Expand All @@ -102,7 +102,7 @@ Inklet 是早期 MVP。当前仓库包含:
- 推荐安装完整 Xcode,以获得 XCTest 支持。
- Accessibility 权限,用于通用选区读取、按设置启用的复制备用流程、回到上一个应用并粘贴生成结果。
- Microphone 权限,仅在有效长按听写快捷键时用于实时听写。
- 一个 OpenAI API key。
- OpenAI 或其他受支持服务商的 API key。实时听写和发音需要 OpenAI API key。

## 从源码构建和运行

Expand Down Expand Up @@ -183,18 +183,18 @@ docs/ 手动测试说明和隐私政策

## 隐私

- Inklet 使用你配置的 OpenAI API key 调用 OpenAI,处理写作、实时听写、选区翻译和发音。
- Inklet 会使用你在设置中选择的服务商及其 API key 处理写作和选区翻译。实时听写和发音始终使用你的 OpenAI API key 调用 OpenAI。
- 长按听写快捷键期间,活动麦克风音频会直接流式发送到 OpenAI Realtime 转写服务。Inklet 还会保存一份临时本地恢复录音;它在备用请求真正开始前始终只保存在本机,最多上传一次到 `https://api.openai.com/v1/audio/transcriptions`,使用实时听写所用的同一把现有 OpenAI API key,并在每个会话终止路径中删除。
- OpenAI API key 存储在你的 Mac 本地。
- API key 按服务商分别存储在你的 Mac 本地。
- Inklet 使用 Accessibility 权限完成通用选区读取、按设置启用的复制备用流程、回到上一个应用并粘贴文本。
- Inklet 只在写作助手原文编辑器内有效长按听写快捷键时使用 Microphone 权限。听写完成后仍停留在可编辑草稿,不会插入其他 App。
- Inklet 会临时使用剪贴板完成插入和已配置的强制取词备用读取。强制取词仅在 Inklet 的临时复制内容仍是当前内容时恢复原剪贴板,不会覆盖之后发生的外部剪贴板变化。
- Inklet 会把成功的写作和选区原文/结果作为本地 History 保存,直到你在 Settings 中清空;连续重复项会自动跳过。未经处理的听写草稿不会创建 History;已有的旧版 Voice 条目仍可在本机读取。
- 选区动作会捕获来源 App 和选区位置,在读取前和读取期间验证来源,然后通过 Accessibility 读取该 App 的当前选区。如果 Accessibility 没有返回选中文本,设置中的强制取词模式可以短暂调用菜单复制,并通过上面所述的受保护剪贴板事务读取复制出的文本。模拟 `Command+C` 默认关闭,只有显式开启高级选项后才会运行。你可以在设置中关闭强制取词。此流程不会发送针对浏览器的 Apple Events,也不会请求浏览器 Automation。选中文本后快速按两次 `Command+C`,会显式读取你已经完成的复制。Inklet 不会保存仅被选中的文本;只有成功完成的动作会进入本地 History。
- Selection Assistant 会把成功的翻译结果用哈希缓存键在本地缓存 7 天,以加速重复翻译。
- 当本地没有可用缓存时,Selection Assistant 翻译会把选中文本和自定义 Translate 指令发送到 OpenAI;AI 发音会把选中文本发送到 OpenAI。
- 当本地没有可用缓存时,Selection Assistant 翻译会把选中文本和自定义 Translate 指令发送到你选择的服务商;AI 发音会把选中文本发送到 OpenAI。
- Inklet 最多每天从 `models.dev` 获取一次公开模型目录。该请求不包含你的文本、音频、API keys 或应用设置。
- 除非你信任 OpenAI 的数据处理政策,否则不要发送私密文本或音频。
- 除非你信任 OpenAI 或所选服务商的数据处理政策,否则不要发送私密文本或音频。

## 贡献

Expand Down
Loading
Loading