{"id":51459324,"url":"https://github.com/vectorleap-pulse/grammar-ai","last_synced_at":"2026-07-06T04:00:26.376Z","repository":{"id":355431563,"uuid":"1227731736","full_name":"vectorleap-pulse/grammar-ai","owner":"vectorleap-pulse","description":"Grammar AI is a lightweight FREE desktop application built with Python for grammar correction and text polishing. It provides a simple local UI for entering text, sending it to an AI service, and reviewing polished output.","archived":false,"fork":false,"pushed_at":"2026-06-25T13:50:11.000Z","size":9574,"stargazers_count":8,"open_issues_count":0,"forks_count":4,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T15:33:03.855Z","etag":null,"topics":["ai","ai-writing-assistant","ai-writing-assistant-free","english","fix","grammar","grammar-checker","grammar-checker-and-plagiarism-check","grammarly-alternative","grammerly","language","llm","python","spelling","tkinter","typo","ui"],"latest_commit_sha":null,"homepage":"https://github.com/vectorleap-pulse/grammar-ai/releases/latest","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vectorleap-pulse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-03T04:54:54.000Z","updated_at":"2026-06-25T13:50:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/vectorleap-pulse/grammar-ai","commit_stats":null,"previous_names":["alpha5611331/grammar-ai","vectorleap-pulse/grammar-ai"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/vectorleap-pulse/grammar-ai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vectorleap-pulse%2Fgrammar-ai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vectorleap-pulse%2Fgrammar-ai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vectorleap-pulse%2Fgrammar-ai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vectorleap-pulse%2Fgrammar-ai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vectorleap-pulse","download_url":"https://codeload.github.com/vectorleap-pulse/grammar-ai/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vectorleap-pulse%2Fgrammar-ai/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35177220,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-writing-assistant","ai-writing-assistant-free","english","fix","grammar","grammar-checker","grammar-checker-and-plagiarism-check","grammarly-alternative","grammerly","language","llm","python","spelling","tkinter","typo","ui"],"created_at":"2026-07-06T04:00:23.541Z","updated_at":"2026-07-06T04:00:26.351Z","avatar_url":"https://github.com/vectorleap-pulse.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"resources/icon.png\" alt=\"Grammar AI\" width=\"120\" /\u003e\n\n# Grammar AI\n\n**A lightweight, FREE-forever desktop grammar corrector and text polisher.**\n\n[![Latest Release](https://img.shields.io/github/v/release/vectorleap-pulse/grammar-ai?label=Download\u0026color=blue\u0026cacheSeconds=86400)](https://github.com/vectorleap-pulse/grammar-ai/releases/latest)\n[![Platform](https://img.shields.io/badge/platform-Windows-0078D6?logo=windows\u0026logoColor=white)](https://github.com/vectorleap-pulse/grammar-ai/releases/latest)\n[![Python](https://img.shields.io/badge/python-3.12-3776AB?logo=python\u0026logoColor=white)](https://www.python.org/)\n\n\u003c/div\u003e\n\n---\n\n## Overview\n\n**Grammar AI** is a lightweight desktop application built with Python for grammar correction and text polishing. Tired of premium grammar tools like Grammarly and LanguageTool? Enjoy **FREE FOREVER** grammar correction with the free tier of the [Groq](https://groq.com/) API key.\n\nIt has two core modes, each with its own tab and global hotkey: **Polish**, for rewriting text in a chosen tone and goal, and **Translate**, for quick, direct translation.\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"media/how-to-use.gif\" alt=\"Usage demo\" width=\"420\" /\u003e\n\n_Select text anywhere, press the hotkey, pick a polished version - done._\n\n\u003c/div\u003e\n\n\u003e 🎬 Prefer video? See [`media/how-to-use.mp4`](media/how-to-use.mp4) for the full walkthrough.\n\n---\n\n## ✍️ Polish\n\nRewrite text into one or more **tones**, each generated for several writing **goals** (inform, persuade, clarify, and more) at once.\n\n1. In Settings, choose which **goals** to generate and optionally set a **context** to tailor output to your domain (see [Configuration](#configuration)).\n2. Enter or paste text on the **Polish** tab, or select text anywhere and double-tap **Shift** to send it there directly. You can also use the **Trigger** button in the app.\n3. Select a **tone** and review the generated polished versions.\n4. Click **Use** next to the version you want, to paste it back where you copied it from.\n\nEvery polished result is saved to **History** for later reference.\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"media/feat-polish.png\" alt=\"Polish tab\" width=\"420\" /\u003e\n\n_The Polish tab, with several goals generated at once for the chosen tone._\n\n\u003c/div\u003e\n\n### Cross-lingual polishing\n\nChoose a **Polish language** in Settings and Grammar AI translates any source language into it before polishing.\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"media/cfg-polish-langs.png\" alt=\"Polish language selection\" width=\"420\" /\u003e\n\n_Pick from a curated list of languages - or type any language the model understands._\n\n\u003c/div\u003e\n\n- The model translates any source language into the selected Polish language before polishing.\n- If you choose **English**, the app polishes text using American English conventions.\n- If you choose another language, the app writes polished text naturally in that language.\n\n---\n\n## 🌐 Translate\n\nNeed a straight translation without a tone/goal rewrite? The **Translate** tab is a dedicated mode for that, separate from Polish.\n\n1. Enter or paste text on the **Translate** tab, or select text anywhere and double-tap **Ctrl** to send it there directly.\n2. Pick a **target language** from the dropdown - your choice is remembered independently of the Polish tab's language.\n3. Click **Translate** (or use the hotkey) to get the translated text, then **Copy** it to your clipboard.\n\nTranslations are not written to the History log; only Polish results are saved there.\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"media/feat-trans.png\" alt=\"Translate tab\" width=\"420\" /\u003e\n\n_The Translate tab, for quick, direct translation._\n\n\u003c/div\u003e\n\nThe **Translate language** can also be set in advance from Settings:\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"media/cfg-ui-translate-langs.png\" alt=\"Translate language selection\" width=\"420\" /\u003e\n\n_Choose a default target language for the Translate tab._\n\n\u003c/div\u003e\n\n---\n\n## Localized Interface\n\nThe whole interface is localized, so you can use Grammar AI in your own language.\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"media/cfg-ui-langs.png\" alt=\"Interface language selection\" width=\"420\" /\u003e\n\n_Switch the interface language independently of the Polish and Translate languages._\n\n\u003c/div\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"media/ui-spanish.png\" alt=\"Spanish interface\" width=\"320\" /\u003e\u003cbr/\u003e\n      \u003csub\u003e\u003cb\u003eEspañol\u003c/b\u003e\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"media/ui-french.png\" alt=\"French interface\" width=\"320\" /\u003e\u003cbr/\u003e\n      \u003csub\u003e\u003cb\u003eFrançais\u003c/b\u003e\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Configuration\n\nGrammar AI supports any LLM provider that is OpenAI-compatible, including OpenAI, Anthropic, Google, and more.\n\n### Example Configuration ([Groq](https://groq.com/) Free Tier)\n\n- **Base URL**: `https://api.groq.com/openai/v1/`\n- **Model**: `openai/gpt-oss-120b`\n- **API Key**: `YOUR_GROQ_API_KEY`\n\n### Example Configuration (OpenAI)\n\n- **Base URL**: `https://api.openai.com/v1`\n- **Model**: `gpt-5.4-mini`\n- **API Key**: `YOUR_OPENAI_API_KEY`\n\nTo configure:\n\n1. Launch the application.\n2. Open Settings and enter your API configuration.\n\n---\n\n## Installation\n\n### Prebuilt Release (Windows)\n\n**[⬇️ Download latest release →](https://github.com/vectorleap-pulse/grammar-ai/releases/latest)**\n\nAll releases: [github.com/vectorleap-pulse/grammar-ai/releases](https://github.com/vectorleap-pulse/grammar-ai/releases)\n\n### From Source\n\n1. Clone the repository.\n2. Install dependencies: `uv sync`\n3. Build the UI (needs [Node.js](https://nodejs.org/) + `pnpm`): `cd frontend \u0026\u0026 pnpm install \u0026\u0026 pnpm build`\n4. Run: `uv run python main.py`\n\n### Building from Source\n\nTo build a standalone executable:\n\n1. Install dependencies including build tools: `uv sync --extra dev`\n2. Run the build script (it builds the UI via `pnpm` first, then packages with PyInstaller):\n   - Release build: `python build.py` or `build.bat`\n   - Debug build (with console): `python build.py --debug` or `build.bat debug`\n3. The executable will be created in the `build/grammar-ai/` folder.\n\n---\n\n## Tech Stack\n\n- Python 3.12\n- `pywebview` (embedded WebView2) hosting a React + TypeScript UI, built with Vite, Tailwind v4,\n  and shadcn components\n- `openai`-compatible AI integration\n- `uiautomation` for reading/writing text in the focused window (Polish; no clipboard, no simulated keystrokes)\n- `pystray` and `Pillow` for system tray\n- `loguru` for logging\n- `pydantic` for schema validation\n- `ruff` and `mypy` for linting\n\n---\n\n## How capture works\n\n**Polish** reads the focused control's text directly via Windows UI Automation and, on \"Use\",\nwrites the result back the same way - it never reads, writes, or clears your system clipboard.\nThis means Polish capture works in most modern apps and browsers, but not everywhere: an app has\nto expose its text field to Windows' accessibility APIs for this to work. Custom-rendered editors\n(for example, VS Code's code-editing pane) may not be supported.\n\n**Translate** captures via your system clipboard and simulated Ctrl+C (selecting all text first\nif nothing is selected), restoring your previous clipboard contents afterward. This trades a\nbrief, restored clipboard touch for broader compatibility across apps that don't expose text via\naccessibility APIs. Clipboard is otherwise only touched when you explicitly click a \"Copy\" button.\n\n---\n\n## Storage\n\n- Local SQLite database and log files are stored in `~/.grammar-ai/`.\n- History entries include original text, polished text, tone, and timestamp.\n- API keys are stored locally in the app database.\n\n---\n\n## Project Files\n\n- `main.py` - application entry point\n- `app/` - core application modules (`app/ui/webview/web/` is the built UI - generated by\n  `frontend/`, not committed)\n- `frontend/` - React + TypeScript UI source (Vite/Tailwind/shadcn)\n- `pyproject.toml` - project metadata, dependencies, and linting configuration\n- `build.py` - builds the UI, then packages with PyInstaller\n\n---\n\n## Support\n\nIf you found this helpful, please ⭐ **star this repository** and 👤 **follow me**!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvectorleap-pulse%2Fgrammar-ai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvectorleap-pulse%2Fgrammar-ai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvectorleap-pulse%2Fgrammar-ai/lists"}