Skip to content

About

Correct, rewrite and translate text in any application with one hotkey. Windows, Linux and macOS. Works with Gemini, any OpenAI-compatible endpoint, or fully offline with Ollama.

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

 
 

Repository files navigation

ZyntaxAI

Correct, rewrite and translate text anywhere on your desktop — with one hotkey.

Select text in any application, press the hotkey, and see exactly what changed before it touches your document. Point it at a hosted model or one running entirely on your own machine.

Download · Features · Platform support · Privacy · Build from source

Version 1.1.0 Licence GPL-3.0-or-later Windows, Linux and macOS

Fork notice

This is a modified fork of ZyntaxAI by TheHolyOneZ, maintained by kabeep. Fork modifications were made on 2026-09-29 and 2026-09-30. Original authorship and copyright notices are retained. See NOTICE for attribution and distribution notices. The fork adds custom request-body parameters, per-persona custom instructions, validation and build checks, and disables upstream update operations. See CHANGELOG.md.

This fork remains licensed under GPL-3.0-or-later; see LICENSE. It is provided without warranty, to the extent permitted by law. Download this fork from its Releases page, rather than the upstream site. For distributing installers and their corresponding source, see the release guide.

A correction shown over a text editor, with the changed words highlighted


ZyntaxAI is a ground-up rewrite of Grammar Fixer, which was Windows-only, hardcoded to a single AI provider, and built on a backend that resisted testing or extension. This version is Rust and TypeScript on Tauri 2. It runs on all three desktop platforms, works with three different kinds of provider — including a fully local one — and shows you the correction before it is applied rather than after.


How it works

1 · Select

Highlight text in any application — your editor, your browser, a chat window, a form field. Nothing is copied and your clipboard is left alone.

2 · Press

Ctrl+Alt+G, or whatever you have bound. The correction runs where you configured it — a cloud model, or one on your own machine.

3 · Review

The overlay appears at your cursor with a word-level diff. Apply it, copy it, switch persona, retry, or dismiss it with Esc. Nothing is changed until you say so.

Prefer it invisible? Set the output mode to replace, append, prepend or copy, and the correction is applied straight away with no overlay at all.


Download

Fork downloads: GitHub Releases. The fork version is 1.1.0; binaries are published after the release workflow succeeds.

Platform File Notes
Windows .msi Windows 10 and 11
Linux .AppImage Runs anywhere; the only Linux build that can update itself in place
Linux .deb / .rpm For Debian, Ubuntu, Fedora and relatives
macOS .dmg One for Apple silicon, one for Intel

Then open Providers, pick a provider and add a key — or select Ollama if you already have it running and want to keep everything on your own machine.


Features

Everything ZyntaxAI does, panel by panel.

Hotkeys

The key combination that corrects your selected text, anywhere on your desktop.

The Hotkeys panel

  • Any combination you like, captured by pressing it rather than typed out
  • At least one modifier is required, so a hotkey can never fire while you are typing
  • Suggestions that are known to be free on Windows, macOS and the common Linux desktops
  • Conflicts are reported, not swallowed — if another application already owns the combination, the panel says so instead of leaving you with a key that quietly does nothing
  • Pressing it during a correction cancels that correction rather than queueing a second one
  • The default is Ctrl+Alt+G, deliberately not Ctrl+Alt+T, which most Linux desktops use to open a terminal

Behavior

What happens when you press the hotkey.

The Behavior panel

  • Processing depth — Fast, Normal or Detailed: how much latitude the model has to rewrite rather than only fix errors
  • Where the text comes from — your selection, or the clipboard
  • What happens to the result — show it first in the overlay, replace the selection, copy it, append it, or prepend it
  • Also copy the correction, whatever else happens to it
  • Desktop notifications for corrections applied without the overlay; failures are always shown whatever the setting
  • A sound on success, using your desktop's own notification sound
  • Keep running in the tray when the window is closed, or quit outright
  • Record corrections — powers the fix count and the Usage panel, and can be turned off entirely. Only counts and token totals are stored; your text is never written to disk

Personas

The writing style applied on top of grammar correction.

The Personas panel

  • Five built-in personas — Standard, Friendly, Professional, Concise and Creative, each with instructions you can read before you pick one
  • Your own personas, with free-form instructions — a house style, a tone for one particular client, a voice for a game character
  • Create, edit and delete your own; the built-in five cannot be broken
  • Switchable from the overlay without leaving the correction you are looking at

Languages

The language corrections come back in, and whether to translate.

The Languages panel

  • Automatic detection by default — the correction comes back in the language you wrote it in
  • Thirteen built-in languages to target explicitly, from English and German to Japanese and Chinese
  • Translate into the selected language, correcting and translating in a single pass
  • Add your own by name and tag, for anything not in the list

Providers & models

Which AI service corrects your text. You can switch at any time.

The Providers panel

Provider Key required Notes
Google Gemini Yes A free tier is available and is enough for everyday use
OpenAI-compatible Yes OpenAI, OpenRouter, Groq, LM Studio, vLLM — set the endpoint
Ollama No Runs entirely on your machine. No key, no network, and your text never leaves the computer
  • Live model lists, fetched from the provider rather than hardcoded, so they never go stale
  • API keys in your OS keychain — Windows Credential Manager, Secret Service, macOS Keychain — with an AES-256-GCM encrypted file where no keychain exists, and the panel says which is in use
  • The key is never sent to the interface; it only ever learns whether one exists
  • Show/hide toggle while typing a key, and a direct link to the provider's console to get one
  • A custom endpoint for anything speaking the OpenAI API
  • Errors that name the cause and the fix — a rejected key, a rate limit with its retry window, a model that does not exist, a server that is down, a request that timed out

Advanced request parameters

In Providers & models, expand Edit JSON parameters to set additional HTTP request-body fields for the selected provider. This is JSON body data, not HTTP headers or a complete request. Keep keys in Authentication and URLs in Endpoint. The placeholder is an example only; new and existing profiles default to {}.

Click Save to apply a draft. Format only pretty-prints it; Clear only clears the draft until you save; Revert restores the saved value. Drafts survive provider switches and collapsing the editor. Leaving the panel offers Save, Discard or Cancel; quitting the application discards unsaved drafts. Parameters stay with their provider when its model or endpoint changes, so check compatibility.

Objects merge recursively into the normal generation request. Custom values win at matching paths, while unspecified fields retain the defaults from Processing depth. Arrays and null replace values; null does not delete a field. Clearing and saving restores all defaults. For example, overriding only Ollama's temperature keeps the application's calculated options.num_predict budget:

{
  "think": false,
  "options": {
    "temperature": 0.7
  }
}

OpenAI-compatible fields go at the root (for example temperature and max_tokens). On DeepSeek models that support it, {"thinking":{"type":"disabled"}} disables thinking. Gemini fields go under generationConfig, including model-specific thinkingConfig options. These are provider-specific, not universal switches; local validation cannot guarantee that the selected API or model accepts them.

The editor checks strict JSON, duplicate keys, a 64 KiB UTF-8 limit, at most 16 container levels, safe integer values, and known parameter types. Model/message fields, streaming, tool calls and alternative response protocols are protected. Unknown non-reserved parameters are allowed. Model-list requests are unaffected. Settings store a JSON object; generation requests send compact JSON, preserving whitespace inside string values. API rejection is shown as an error, with no automatic fallback that removes your parameters.

Appearance

How ZyntaxAI looks on your desktop.

The Appearance panel

  • Dark, light, or match your system
  • Window opacity, applied to both this window and the correction overlay, so your desktop genuinely shows through rather than the window merely darkening

Usage & costs

Token consumption and estimated spend, computed at each model's own price.

The Usage panel

  • Today, 7 days, 30 days and all time — corrections and tokens for each
  • Tokens per day across the last month
  • A breakdown by model, with its provider, fix count, tokens and cost
  • Prices you set per model, separately for input and output tokens, in your own currency
  • Unpriced models are marked as such rather than silently counted as free

System

Start-up and desktop integration.

The System panel

  • Start with your computer — Windows registry, XDG autostart or a macOS LaunchAgent, whichever your platform uses
  • Start hidden in the tray, so logging in leaves you with the hotkey and nothing else
  • Signed updates, checked once at start-up and installed only when you choose to
  • What this session can and cannot do — display server, whether your selection can be read, whether text can be replaced in place, and whether the hotkey reached the system
  • Clear correction history, which removes the fix count and every usage record

Logs

What ZyntaxAI has been doing. Useful when something did not behave as expected.

The Logs panel

  • A live stream of what the application is doing, at the level you would want when something goes wrong
  • Follow new entries, or scroll back without being dragged to the bottom
  • Rolling files on disk as well, so a problem that happened yesterday is still there
  • Clear whenever you like

About

The About panel

  • Version, licence, and where the project lives
  • Exactly where your data is — settings, history and logs, by path
  • A plain statement of what is stored and what is not

The window itself

  • Group the sidebar however you think — create your own groups, rename them, drag panels between them, collapse what you never touch, and reset the lot if you regret it
  • A status line that is always there — the master switch, your fix count and when the last one ran, at the foot of the sidebar
  • Its own titlebar, so the window is frameless on every platform and can be genuinely transparent
  • Size and position remembered between runs, without dragging back the decorations you turned off

The tray

The tray menu

  • A master switch, in the tray and in the window, that stops the hotkey doing anything at all. It is checked before your selection is even read, so with it off no text leaves your screen
  • Correct clipboard text without touching a selection
  • The hotkey stays registered on purpose — it answers "ZyntaxAI is off" rather than going dead, which is indistinguishable from a broken application

The overlay

The overlay with deletions shown

  • A word-level diff: additions highlighted inline, deletions on request
  • Switch persona and retry without starting over
  • Apply, Copy, or dismiss with Esc
  • Tokens used and how long it took, so cost and latency are never a mystery
  • Appears at your cursor rather than in the middle of your primary monitor, sized to its content, and nudged so it always lands fully on screen

Platform support

Every feature is available on Windows and on Linux under X11. Wayland restricts what any application is allowed to do to another window, so a few things there depend on your compositor.

Windows macOS Linux · X11 Linux · Wayland
Global hotkey Yes Yes Yes Via the desktop portal, else bind zyntax fix yourself
Read your selection Yes Needs Accessibility permission Yes, directly Where the compositor supports it
Replace text in place Yes Needs Accessibility permission Yes Needs wtype or ydotool
Install updates in place Yes Yes AppImage only AppImage only

Where something is unavailable the app says so in System, names what to install, and falls back to putting the correction on your clipboard. It never fails silently.

If your compositor has no global-shortcuts portal, bind a key to zyntax fix in its own configuration and the running instance will pick it up.

macOS receives Rust checks when Rust changes and installer builds during releases, but has not yet been run on real hardware; treat it as best-effort until it has.


Privacy

The text you correct is sent to whichever provider you configure, over HTTPS, and to nothing else. It is never written to disk. History records counts, token totals and timings — never content. Choose Ollama and nothing leaves your machine at all.

There is no telemetry and no analytics. This fork does not check for or install upstream updates. Provider requests and actions you explicitly open in a browser remain available.

API keys are held in your operating system's keychain, never in a configuration file, and are never handed to the user interface.

Updates

This fork does not check for or install upstream updates. Startup checks default to off, and all update controls in System are disabled. Obtain fork builds from GitHub Releases. The original updater implementation and configuration are retained but inactive.

Building from source

Requires Rust 1.85+, Node 20+, pnpm 10+ and the Tauri system dependencies for your platform. On Debian or Ubuntu:

sudo apt install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
git clone https://github.com/kabeep/ZyntaxAI.git
cd ZyntaxAI
pnpm install

pnpm tauri dev      # run it
pnpm tauri build    # installers land in target/release/bundle

Build through pnpm tauri, not cargo directly: a plain cargo build --release leaves out Tauri's custom-protocol feature, so the binary looks for the dev server instead of its embedded frontend and opens a window that never paints.

AppImage bundling fails on Arch and other rolling distributions

linuxdeploy bundles a 2024-era binutils, whose strip cannot parse the .relr.dyn sections that current Arch system libraries contain. It fails with unknown type [0x13] section '.relr.dyn'.

Skip the stripping step:

NO_STRIP=1 pnpm tauri build

The AppImage is larger as a result. .deb and .rpm are unaffected, and CI builds on Ubuntu do not hit this.

Cutting a release

The fork publishes ordinary installers to its own GitHub Releases. Automatic update checks remain disabled; no updater key or upstream manifest is used.

pnpm check
pnpm release

Run from a clean committed checkout. pnpm release builds the current platform and places installers, LICENSE, NOTICE, build metadata and checksums in dist/release/<version>/<platform>/. It does not upload.

For automatic GitHub distribution, choose the next SemVer release and synchronize the metadata described in docs/RELEASING.md. Keep version numbers unchanged during ordinary development. For example, when releasing 1.1.0:

git add package.json apps/desktop/package.json Cargo.toml Cargo.lock src-tauri/tauri.conf.json README.md CHANGELOG.md
git commit -m "Bump version 1.1.0"
git tag -a v1.1.0 -m "Bump version 1.1.0"
git push origin main
git push origin v1.1.0

Every platform must pass lint, types, tests and binding checks before packaging. The tag workflow builds Windows, both macOS architectures and Linux installers; verifies artifacts; adds matching source archives, notices, checksums and Markdown commit changes; then publishes the release only after all uploads succeed. It does not publish to npm or enable the application's updater.

Actions → Release → Run workflow remains available to prepare a draft for review instead. Manual runs include Windows and macOS by default, with Linux optional; they do not auto-publish. CI artifacts are temporary and may be accessible to repository readers before release publication.

Published releases cannot be overwritten by this workflow. A draft can be retried only for the same source commit and version. Prerelease tags containing - do not trigger automatic publication. See docs/RELEASING.md for requirements and limitations. The retained site:sync tool and zyntaxai/PUBLISHING.md describe upstream website distribution; they are not used by the fork release workflow.

Project layout and tests
pnpm rs:test                                           # Rust tests, isolated binding exports
pnpm rs:lint                                           # Rust lints
pnpm typecheck                                          # TypeScript
pnpm test                                               # frontend tests

Ordinary CI selects frontend, Rust, tooling and workflow checks from changed paths. Frontend-only changes do not run Cargo; docs-only changes skip source checks. Tests are selected when relevant or explicitly requested. Version-tag releases run full checks and bundle platform installers. See CONTRIBUTING.md.

The layout separates what can be tested from what needs a desktop:

crates/
  zyntax-core/       domain model, prompt building, diff — no I/O at all
  zyntax-providers/  Gemini, OpenAI-compatible and Ollama behind one trait
  zyntax-platform/   hotkeys, selection capture, text injection, capability detection
  zyntax-store/      settings, OS keychain, SQLite history
src-tauri/           a thin shell: IPC commands, windows, tray
apps/desktop/        React 19 + TypeScript frontend

TypeScript types for the IPC boundary are generated from the Rust structs by ts-rs, and committed so the frontend builds from a fresh clone. Test scripts export into an ignored temporary directory; contract checks and releases compare them with committed types without editing source. Use pnpm bindings:generate to explicitly update the source bindings.

Provider behaviour is tested against a mock HTTP server, so the full request and response handling — auth failures, rate limits, truncation and malformed payloads — runs in CI without any API key.


Licence

GNU General Public License v3.0 or later.

In short: you are free to use, study, share and modify ZyntaxAI. If you distribute it — modified or not — you must pass on those same freedoms and make your source available under the same licence.


Download · Source · Original project · Original author

Built with Rust, Tauri and React · © 2026 TheHolyOneZ

Custom persona instructions

In Settings > Personas, create or edit a custom persona and set Prompt mode to Custom instructions. The mode is saved per persona, not globally. Existing personas default to Style instruction. Built-in personas retain the original grammar-correction behavior.

In Custom instructions mode, the persona instruction replaces the default role, task, style wrapper and output contract. If Languages > Translate is on, the selected target-language instructions are still appended; a specific target language is required. If Translate is off, no language instructions are added. Switching personas never changes your saved Languages settings.

Write the task, tone and output requirements yourself, including returning only the final text when needed. Selected text is sent without delimiter markers. Model output is preserved without the original correction cleanup (including whitespace and code fences). Processing depth and advanced request parameters continue to apply. Instructions are limited to 64 KiB of UTF-8 text. Save explicitly; failed saves retain your draft, and closing an unsaved edit offers save, discard or cancel. Personal prompts are not bundled with the application.

Updates in this fork

This fork does not check for or install updates from the upstream project. Settings disables startup checks, manual checks, installation/restart and the upstream download action; startup checking defaults to off. Previously enabled settings cannot trigger checks, and updater commands reject operations before accessing the upstream service. The original updater implementation and endpoints are retained for future configuration of a fork-owned update channel. The fork release workflow distributes ordinary installers and does not configure automatic updates.

About

Correct, rewrite and translate text in any application with one hotkey. Windows, Linux and macOS. Works with Gemini, any OpenAI-compatible endpoint, or fully offline with Ollama.

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages