Skip to content

v0.7.0 — Contextual rewrite: same-language tone shift on a hotkey

Choose a tag to compare

@hoangperry hoangperry released this 23 May 16:20

New feature: Contextual rewrite. Bind a hotkey to a tone and the app rewrites the current input line in that tone — same language, intent preserved. Built for the moment you typed something blunt or angry and need to soften it before sending. Always shows a preview before sending — never auto-paste.

How to use

  1. Settings → Contextual rewrite → Add binding
  2. Pick a tone — Polite, Professional, De-escalate, Friendly, Firm-but-polite, Concise, or Custom (your own free-text instruction)
  3. Click Change… to record a hotkey (e.g. ⌥R)
  4. Type a message that needs softening, press the hotkey
  5. Review the rewritten version in the preview HUD, edit if needed, hit Send

Example:

You typed Tone App rewrites
Chị ngu quá chị không hiểu gì hết Polite Chị ơi, chỗ này hơi khó hiểu một chút, để em giải thích lại rõ hơn cho mình nhé.
Trả tiền đi không tôi không giao hàng nữa đâu Firm but polite Anh/chị vui lòng hoàn tất thanh toán giúp em ạ, để bên em sắp xếp giao hàng đúng hẹn nhé.
Lỗi của shipper chứ đâu phải lỗi của tôi mà bắt đền De-escalate Em rất xin lỗi về sự cố vừa rồi ạ. Trường hợp này phát sinh từ khâu vận chuyển, em sẽ hỗ trợ kiểm tra và xử lý sớm cho mình.

Vietnamese-aware

The prompt preserves your existing anh/chị/em pronoun pairing exactly and adds politeness particles (ạ / dạ / nhé) as the tone requires.

Provider requirements

Rewrite needs an LLM provider — Gemini, Ollama, or any OpenAI-compatible API. DeepL and Google Translate cannot rewrite (translation-only, no instruction following) — Settings shows a warning when the active provider can't.

Safety

  • Always preview. A tone-changed message must be reviewed before it goes out.
  • Refusal handling. If the model declines on a profane draft, the app retries once with a stronger anti-refusal prompt; if it still refuses, your original text is kept and you get a clear error.
  • Original-text guard. Empty custom binding? Wrong provider? Network error? The app fails fast with an actionable message and never overwrites your input with garbage.

Auto-update

If you are on v0.6.1+, this arrives automatically via Sparkle — the app offers v0.7.0 with an "Install and Relaunch" prompt.

Compatibility

  • macOS 14 Sonoma minimum
  • Liquid Glass effects on macOS 26 Tahoe

Tests

  • 220 Swift tests / 50 suites GREEN
  • Apple notarization: DMG + zip both Accepted and stapled