{"id":31449396,"url":"https://github.com/yuler/typo","last_synced_at":"2026-04-22T03:04:45.920Z","repository":{"id":296734040,"uuid":"992332940","full_name":"yuler/typo","owner":"yuler","description":"An AI-powered desktop tool that refines your selected text with smart suggestions and corrections.","archived":false,"fork":false,"pushed_at":"2026-04-21T10:08:09.000Z","size":11279,"stargazers_count":3,"open_issues_count":14,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-21T10:37:06.103Z","etag":null,"topics":["ai","desktop","typo"],"latest_commit_sha":null,"homepage":"https://typo.yuler.cc","language":"Astro","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/yuler.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-05-29T01:45:34.000Z","updated_at":"2026-04-21T07:19:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"d82ab42e-3584-48e9-ad29-9c8f3c4830fb","html_url":"https://github.com/yuler/typo","commit_stats":null,"previous_names":["yuler/typo"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/yuler/typo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuler%2Ftypo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuler%2Ftypo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuler%2Ftypo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuler%2Ftypo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yuler","download_url":"https://codeload.github.com/yuler/typo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuler%2Ftypo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32119067,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T00:31:26.853Z","status":"online","status_checked_at":"2026-04-22T02:00:05.693Z","response_time":58,"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","desktop","typo"],"created_at":"2025-10-01T03:53:10.153Z","updated_at":"2026-04-22T03:04:45.910Z","avatar_url":"https://github.com/yuler.png","language":"Astro","funding_links":[],"categories":[],"sub_categories":[],"readme":"# typo\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/alpha-内测中-orange\" alt=\"Alpha: 内测中\" /\u003e\n  \u003cbr /\u003e\n  \u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e | \u003ca href=\"README.zh.md\"\u003e简体中文\u003c/a\u003e\n\u003c/p\u003e\n\n\u003e An AI-powered desktop tool that refines your selected text with smart suggestions and corrections.\n\n[Download](https://github.com/yuler/typo/releases)\n\n## Screenshots\n\n\u003c!-- TODO: need updated screenshots --\u003e\n\n\u003cvideo src=\"https://github.com/user-attachments/assets/fd2ff3f3-ea57-4ab9-934f-b9a92c5c5b0e\" controls playsinline width=\"720\"\u003e\u003c/video\u003e\n\n## Construct\n\n```\n.\n├── .agents/skills/      # Reusable skills for AI agents\n├── .github/workflows/  # CI pipelines\n├── apps/               # Client-facing apps\n│   ├── desktop/       # Tauri + Vue 3 (main product)\n│   └── www/           # Astro (marketing / SEO)\n├── packages/          # Shared code across apps\n│   ├── languages/     # i18n utilities and translation bundles\n│   └── utils/         # Shared helpers and constants\n├── scripts/           # Repo-wide automation scripts\n├── package.json      # Workspaces and top-level scripts\n└── README.md\n```\n\n## Setup\n\nFollow the [`setup` skill](.agents/skills/setup/SKILL.md) to install Node.js (from `.nvmrc`), pnpm (via Corepack, pinned in `package.json`), workspace dependencies, and the Rust toolchain for the Tauri desktop app.\n\n```bash\n/setup # run this skill/command in AI coding agent\n```\n\n### Run the desktop app\n\n```bash\npnpm desktop:dev\n```\n\n## Usage\n\n1. **Select** any text you want to improve.\n2. **Press** `Ctrl/Cmd + Shift + X` to activate the application.\n3. **Wait** for the AI response and let it replace the selected content automatically.\n\n## How it works\n\n1. **Capture**: Gets the currently selected text.\n2. **AI processing**: Sends it to AI with a custom prompt (configurable in settings).\n3. **Replacement**: Copies the AI's response to the clipboard, then pastes it at the current cursor position (using the clipboard helps avoid input method issues).\n\n## Features\n\n- **Multi-Model Support**: Works with DeepSeek and local Ollama models.\n- **Global Hotkeys**: Quick activation with `Ctrl/Cmd + Shift + X`.\n- **Intelligent Pasting**: Uses clipboard-based replacement for maximum compatibility.\n- **Customizable**: Tailor the AI behavior via system prompts.\n\n## Prompt shortcuts\n\nYou can define up to **5** custom prompt shortcuts in **Settings -\u003e Prompts**.\n\n- Each shortcut has a `key` (for example `/tr:zh` or `/prompt`) and an instruction `value`.\n- Trigger it from selected text with one of these forms:\n  - **Leading**: first line starts with `/command`\n  - **Trailing**: last line starts with `/command`\n- Template placeholders in shortcut values:\n  - `{{args}}`: arguments after the command on the same line, e.g. `/prompt xxx`\n  - `{{text}}`: cleaned selected text after command line is removed\n\nExample:\n\n```text\n/prompt Translate to Japanese in polite style\n\n你好啊\n```\n\n## FAQ\n\n### macOS\n\n- Run: `xattr -cr /Applications/typo.app`\n- Enable **Accessibility Permission** for the app in System Settings.\n\n### Linux Installation (AppImage)\n\nFor installation and auto-updates, we recommend using the AppImage version:\n\n```bash\n# Move the downloaded AppImage to a permanent location\nmv ~/Downloads/typo_*.AppImage ~/Applications/typo.appimage\n# Make it executable\nchmod +x ~/Applications/typo.appimage\n```\n\nCreate a desktop entry for easy access:\n\n```bash\nsudo vim /usr/share/applications/typo.desktop\n```\n\nAdd the following content (replace `\u003c$USER\u003e` with your username):\n\n```ini\n[Desktop Entry]\nName=Typo\nComment=AI-powered text improvement tool\nExec=/home/\u003c$USER\u003e/Applications/typo.appimage --no-sandbox\nIcon=typo\nType=Application\nCategories=Utility;TextEditor;\nTerminal=false\n```\n\nDownload the icon:\n\n```bash\nsudo curl -L -o /usr/share/icons/hicolor/256x256/apps/typo.png https://raw.githubusercontent.com/yuler/typo/main/resources/logo.png\n```\n\n### Linux Wayland Compatibility\n\nWayland restricts global hotkey listeners for security. Use a **System Shortcut** instead of the app-level internal hotkey.\n\n#### 1. Add a Custom Shortcut\n\n1. Open `Settings -\u003e Keyboard -\u003e Custom Shortcuts`.\n2. Add a command: `typo --selection` (or the full path to your AppImage).\n3. Set keys to: `Ctrl + Shift + X`.\n\n#### 2. Enhanced Clipboard Support (Recommended)\n\nTo ensure reliable selection capture and pasting on Wayland, we highly recommend using **ydotool** for keyboard simulation:\n\n- **ydotool**: Fast keyboard simulation but requires manual setup.\n  \u003cdetails open\u003e\n  \u003csummary\u003eSetup ydotool\u003c/summary\u003e\n\n  **Add your user to group input**\n\n  ```bash\n  sudo usermod -aG input $USER\n  ```\n\n  **Add udev rule for `uinput`**\n\n  ```bash\n  echo '## ydotoold fix\n  ```\n\n## \u003chttps://github.com/ReimuNotMoe/ydotool/issues/25#issuecomment-535842993\u003e\n\n`KERNEL==\"uinput\", GROUP=\"input\", MODE=\"0660\", OPTIONS+=\"static_node=uinput\"\n' | sudo tee /etc/udev/rules.d/80-uinput.rules \u003e /dev/null`\n\n**Autostart ydotool daemon**\nCreate `~/.config/autostart/ydotoold.desktop`:\n\n```ini\n[Desktop Entry]\nType=Application\nName=ydotool daemon\nExec=/usr/bin/ydotoold\n```\n\n\u003c/details\u003e\n\n### 3. XWayland Workaround (Optional)\n\nIf selection capture still fails in specific apps (like some Electron apps), running them in X11 mode can help:\n\n```bash\n# Force VS Code to use X11\ncode --ozone-platform=x11\n```\n\n### Ollama\n\n- Ensure Ollama is running (`ollama serve`).\n- See the [Ollama API Documentation](https://github.com/ollama/ollama/blob/main/docs/api.md) for more details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuler%2Ftypo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyuler%2Ftypo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuler%2Ftypo/lists"}