TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
翻译准备中
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Free, open-source, Native voice input and Voice Agent for macOS. Press Fn to dictate; press Fn twice to rewrite, translate, or ask. BYOK.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Promotional illustration. Actual app screenshots are below.
SayKuku is a free, native macOS voice app. Press Fn to dictate at the cursor; press Fn twice to tell Voice Agent what you need. Ask a question, draft text, or follow up without selecting anything; select text when you want it rewritten or translated. It uses Qwen cloud models, so you bring your own Alibaba Cloud Model Studio API key and pay any model charges on your account.查看完整 README ↗简体中文 · Download · Setup guide (Chinese) · Privacy (Chinese)
Promotional illustration. Actual app screenshots are below.
SayKuku is a free, native macOS voice app. Press Fn to dictate at the cursor; press Fn twice to tell Voice Agent what you need. Ask a question, draft text, or follow up without selecting anything; select text when you want it rewritten or translated. It uses Qwen cloud models, so you bring your own Alibaba Cloud Model Studio API key and pay any model charges on your account.
| Gesture | What happens |
|---|---|
| Fn | Voice Input transcribes speech and tries to insert the result at the original cursor. Choose hold-to-talk or tap-to-start/tap-to-stop. Adjust language, number formatting, and spoken-word cleanup in Settings. |
| Fn Fn | Voice Agent uses your request and the context you allow to draft text, answer a question, or follow up without a selection, or rewrite and translate selected text. It checks the original target before writing. Running a Shortcut requires confirmation; opening a link or searching the web requires confirmation when untrusted context is involved. |
You can also use configurable global shortcuts. The defaults are ⌃⌘V for Voice Input and ⌃⌘A for Voice Agent. A single modifier can start Voice Input, and Voice Agent can use a double tap of that same key. Writing into another app depends on that app's text controls; check important text before sending it.
Home screen from a signed development build. The interface is shown in Simplified Chinese.
Privacy settings from a development build. These are real UI screenshots; the image notes describe their source and limits.
You need macOS 14 or newer, an internet connection for Qwen processing, and your own Qwen API key. Model usage may incur charges.
If Fn conflicts with a macOS keyboard setting, follow the in-app guidance or use the configurable global shortcuts. The setup guide (Chinese) covers permissions and Qwen configuration.
| Data or permission | What SayKuku does |
|---|---|
| Microphone | Captures audio only for Voice Input, Voice Agent, or a microphone level test. Voice audio goes to the selected Qwen region; the level test is neither saved nor uploaded. |
| Voice Agent context | Selected text, current app, window title, and visible text in the current window are allowed by default. Clipboard text and the Safari/Chrome page URL are off by default. Each source has a switch in Settings → Privacy. Visible text is limited to 2,000 characters and is sent only with that request, without being stored in History or logs. Voice Input does not read screen text. |
| Voice Input context | With Use text near the cursor on (the default), Voice Input sends up to 800 characters before and 200 after the cursor in the focused text field, leaving out any selection, so names, terms, and similar-sounding words match what you are writing. It goes only with that request and is not stored in History or logs. Turn it off in Settings → Voice Input. Password fields, secure input, and password managers are never read. |
| Voice Input cleanup | Automatic cleanup removes fillers, repeats, and self-corrections during recognition. Automatic paragraphs and lists is on by default; turning it off retains explicitly dictated formatting. Cleanup preference → Prefer quality sends the transcript, never the audio or nearby cursor text, to a Qwen text model in the same region for one extra check. Long text uses a compact prompt and waits up to 12 seconds; short text waits up to 2 seconds. Failures keep the first result. Prefer speed is the default for users who have not chosen a preference and skips this check. Keep spoken wording preserves fillers and repeats. Each app can override these choices in Settings → Voice Input → Per-app settings. |
| Local data | The API key is stored in this Mac’s Keychain. History, Memory, correction suggestions, and local usage totals are saved in ~/Library/Application Support/SayKuku/store.json; saved recordings are in ~/Library/Application Support/SayKuku/Audio/*.wav. |
| History defaults | New history is kept for 30 days and recording storage is on by default. Starred entries are exempt from automatic deletion. Settings → History → Don’t keep stops new history and recordings; it does not delete older entries. |
| Local usage statistics | Daily totals contain counts, speaking time, app names, and task categories, without text or audio. Collection starts with this feature; older history is not backfilled. Days follow the local time zone at collection and weeks follow regional preferences. Comparisons use equal numbers of complete days with uninterrupted collection. History deletion does not clear totals. Pause or clear them separately in . Turning off omits app names from new statistics. |
SayKuku blocks recording and content access in secure text fields and known password managers. Private browsing windows are not detected separately. It does not request Input Monitoring permission or record keystrokes. Read the full privacy and permissions explanation (Chinese) before enabling optional context sources.
The project uses Swift 6, SwiftUI, AppKit, and Swift Package Manager, with no third-party Swift package dependencies. It targets macOS 14+; packaging requires Xcode 26 or newer for the macOS 26 SDK.
swift test
Scripts/package-app.sh debug
open Build/SayKuku.app
The debug package requires a stable Apple Development signing identity. swift run SayKuku is useful for source-level work, but its process identity and resources do not represent a signed App Bundle; use the packaged app to verify permissions, Keychain access, menu bar behavior, and resources. Default tests do not need a live Qwen API, network, microphone, or Accessibility authorization.
| Area | Where to look |
|---|---|
| App and UI | Sources/SayKuku/ |
| Tests | Tests/SayKukuTests/ |
| Product and implementation notes | SayKuku.md |
| Local packaging and release | docs/LOCAL_PACKAGING.md |
| App analytics and privacy boundaries | docs/APP_ANALYTICS.md |
| Compatibility test plan | docs/COMPATIBILITY.md |
| Mixed-language evaluation | docs/MIXED_LANGUAGE_EVAL.md |
| Dictation polish evaluation | docs/DICTATION_POLISH_EVAL.md |
| Contributor and agent guidance | AGENTS.md |
Release builds are signed, notarized, and packaged locally and published to the existing R2 bucket and website through Scripts/release.sh --notes FILE; the repository does not use GitHub Actions for macOS release validation. Release builds use Sparkle 2 for background downloads and install on normal Quit without relaunching; automatic checks and downloads default to on. Follow the local release guide rather than running a Release package step on its own.
SayKuku source code is licensed under Apache License 2.0. The Lucide-derived icon assets carry their own notices.
| Usage analytics | Release builds send a random installation ID, app version, fixed event names, and the character count of completed output to a self-hosted Umami service. No speech, text content, window titles, URLs, or API key is included. This is on by default and can be turned off in Settings → Privacy. Development builds and tests do not send it. |
| Update checks | Release builds check a version file after launch and periodically; automatic checks can be turned off in Settings → About. Updates open the download page in your browser rather than installing inside the app. |