{"id":51282319,"url":"https://github.com/mcxen/qx","last_synced_at":"2026-06-30T03:00:30.797Z","repository":{"id":366580876,"uuid":"1276891631","full_name":"mcxen/qx","owner":"mcxen","description":"Qx source-available repository for code review only","archived":false,"fork":false,"pushed_at":"2026-06-30T02:35:37.000Z","size":8519,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-30T03:00:17.315Z","etag":null,"topics":["code-review-only","no-forks","non-commercial","source-available"],"latest_commit_sha":null,"homepage":"https://github.com/mcxen/qx-releases/releases","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mcxen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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-06-22T11:44:23.000Z","updated_at":"2026-06-30T02:35:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mcxen/qx","commit_stats":null,"previous_names":["mcxen/qx"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mcxen/qx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcxen%2Fqx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcxen%2Fqx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcxen%2Fqx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcxen%2Fqx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mcxen","download_url":"https://codeload.github.com/mcxen/qx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mcxen%2Fqx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34950329,"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-06-30T02:00:05.919Z","response_time":92,"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":["code-review-only","no-forks","non-commercial","source-available"],"created_at":"2026-06-30T03:00:20.314Z","updated_at":"2026-06-30T03:00:30.784Z","avatar_url":"https://github.com/mcxen.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Qx — macOS Productivity Launcher\n\n\u003cimg src=\"README.assets/%E5%B7%B2%E7%94%9F%E6%88%90%E5%9B%BE%E5%83%8F%202.png\" alt=\"Qx app icon\" width=\"160\" /\u003e\n\n**English** | [中文](#qx--macos-效率启动器)\n\nQx is a **menu-bar resident desktop launcher** for macOS, inspired by Raycast. It pops up with a global hotkey, giving you instant access to search, clipboard history, screen recording (GIF), RSS feeds, AI chat, V2EX browsing, macros, and more — all within a unified, keyboard-first interface.\n\nBuilt with **Tauri v2**, **React 19**, **TypeScript**, and **Rust**. It uses the macOS native frosted-glass appearance, Mach kernel APIs for system stats, and vendored native search for fast file lookups.\n\n\u003e **Status**: v0.4.34 — active development\n\n---\n\n## Features\n\n| Module | Description |\n|--------|-------------|\n| **Launcher** | Fuzzy-search installed apps, files, built-in commands, plugin actions, and user aliases/tags |\n| **Clipboard** | Persisted clipboard history with text/image support, pinning, filtering, inline preview |\n| **Screen Recording** | Region-based GIF recording at 15fps (gifski), auto-saves to history |\n| **RSS Reader** | Add feeds, inline article reading, star/bookmark, OPML import/export, background auto-refresh |\n| **QxAI** | Built-in AI chat assistant with multi-provider support (DuckDuckGo, BYOK OpenAI-compatible), streaming responses, persistent memory, and per-conversation model switching |\n| **V2EX** | Browse and search v2ex.com topics (latest/hot), read articles inline with HTML sanitization, node-based filtering |\n| **Macros** | Record and replay keyboard/mouse macro sequences |\n| **Dev Tools** | Text / JSON / Markdown utility tools |\n| **GitHub Calendar** | View your GitHub contribution graph inline |\n| **Plugin System** | Sandboxed iframe-based plugin runtime with RPC bridge, marketplace, archive import, ed25519 signature verification, and `context.ai` SDK for plugin AI capabilities |\n| **AI Agent Settings** | Configure AI agent mode, default provider/model, tool toggles (bash, grep, memory, MCP, background tasks), and bash/grep execution parameters |\n| **Settings** | General, appearance (light/dark/system theme with Geist design system), keyboard shortcuts, macOS permissions, plugin management |\n\n---\n\n## Technology Stack\n\n| Layer | Technology |\n|-------|-----------|\n| **Desktop Shell** | [Tauri v2](https://v2.tauri.app) (macOS private API, tray icon, frosted glass) |\n| **Frontend** | React 19 + TypeScript + Vite 7 |\n| **Styling** | Tailwind CSS v4 + CSS custom properties (Geist-inspired 10-step design tokens) |\n| **State** | Zustand (global, plugin registry, per-module stores) |\n| **Animation** | Framer Motion v12 |\n| **Backend** | Rust (async via tokio, Tauri commands) |\n| **Database** | SQLite via rusqlite (apps cache, clipboard history, RSS, plugin data) |\n| **AI Runtime** | Multi-provider chat (DuckDuckGo, custom OpenAI-compatible), streaming, agent tool-calling with gating |\n| **i18n** | English / Simplified Chinese |\n| **Plugin Runtime** | Sandboxed iframe + postMessage RPC bridge with `context.ai` SDK |\n\n### Rust Dependencies (key)\n\n| Crate | Purpose |\n|-------|---------|\n| `xcap` | Display enumeration helpers |\n| `scrap` + `gifski` | Screen recording → GIF encoding |\n| `rdev` + `enigo` | Macro record/replay |\n| `feed-rs` | RSS/Atom parsing |\n| `reqwest` | HTTP client (RSS fetch, marketplace, GitHub API, AI provider requests) |\n| `rusqlite` | App data persistence |\n| `battery` | Battery / power status |\n| `objc2` / `core-graphics` | macOS native APIs |\n| `window-vibrancy` | Frosted glass effect |\n| `ed25519-dalek` | Plugin signature verification |\n\n---\n\n## Architecture\n\n```\n┌──────────────────────────────────────────────────────────┐\n│                    Tauri v2 Shell                         │\n│  ┌────────────────────────────────────────────────────┐  │\n│  │              React 19 + TypeScript                  │  │\n│  │  ┌──────────┐ ┌──────────┐ ┌──────────────────┐   │  │\n│  │  │ Launcher │ │ Clipboard│ │ RSS / V2EX /      │   │  │\n│  │  │ (search) │ │ History  │ │ QxAI / Settings   │   │  │\n│  │  └──────────┘ └──────────┘ └──────────────────┘   │  │\n│  │  ┌──────────────────────────────────────────────┐  │  │\n│  │  │  Plugin System (iframe sandbox + RPC bridge) │  │  │\n│  │  │  + context.ai SDK (chat, stream, bash,       │  │  │\n│  │  │    memory, grep, background tasks)            │  │  │\n│  │  └──────────────────────────────────────────────┘  │  │\n│  └────────────────────────────────────────────────────┘  │\n│  ┌────────────────────────────────────────────────────┐  │\n│  │              Rust Backend (Tauri Commands)          │  │\n│  │  apps  |  clipboard  |  screencap   |  rss          │  │\n│  │  g4f   |  plugin_api |  settings    |  system_     │  │\n│  │        |             |              |  stats        │  │\n│  │  macros | file_search | history | ocr | github_    │  │\n│  │        |             |         |     | calendar     │  │\n│  │  v2ex  | system_info | storage | permissions       │  │\n│  └────────────────────────────────────────────────────┘  │\n└──────────────────────────────────────────────────────────┘\n```\n\n### Shell Layout\n\n```\n┌──────────────────────────────────────────────┐\n│ Top Bar: Back + Search + Quick Actions       │\n├──────────────────────────────────────────────┤\n│ Main Area (content)       │ Context Panel    │\n│                           │ (240–340px)      │\n├──────────────────────────────────────────────┤\n│ Esc      [ Dynamic Island ]          Actions │\n└──────────────────────────────────────────────┘\n```\n\nThe Dynamic Island is always centered via `position: absolute; left: 50%; transform: translateX(-50%)`. Three visual styles are available: `solid`, `elevated`, and `glass`. The island supports idle modes (system info, date display with lunar calendar), notice, progress, activity, playback, and error states with marquee scrolling.\n\n---\n\n## Screenshots\n\n\u003e *Screenshots to be added.*\n\n| View | Preview |\n|------|---------|\n| Launcher + Search Results | \u003cimg src=\"README.assets/PixPin_2026-06-25_22-57-00.png\" alt=\"PixPin_2026-06-25_22-57-00\" style=\"zoom: 25%;\" /\u003e |\n| Clipboard History | \u003cimg src=\"README.assets/PixPin_2026-06-25_22-57-25.png\" alt=\"PixPin_2026-06-25_22-57-25\" style=\"zoom:25%;\" /\u003e |\n| RSS Reader | \u003cimg src=\"README.assets/PixPin_2026-06-25_22-57-39.png\" alt=\"PixPin_2026-06-25_22-57-39\" style=\"zoom:25%;\" /\u003e |\n| Settings — Appearance | `\u003c!-- screenshot --\u003e` |\n|                           |                                                              |\n\n---\n\n## Installation\n\n### Homebrew (recommended)\n\n```bash\nbrew tap mcxen/qx\nbrew install --cask qx\n```\n\n\u003e **Note for users in China**: If GitHub is inaccessible, use SSH: `git clone git@github.com:mcxen/homebrew-qx.git /opt/homebrew/Library/Taps/mcxen/homebrew-qx`\n\n### Manual\n\n1. Download `qx_\u003cversion\u003e_aarch64-apple-darwin.app.zip` from [Releases](https://github.com/mcxen/qx/releases)\n2. Unzip and move `Qx.app` to `/Applications`\n3. Right-click → Open (first launch needs Gatekeeper override)\n4. Qx lives in the menu bar — click the icon or press the global hotkey to open\n\n### Update\n\n```bash\nbrew update\nbrew upgrade --cask qx\n```\n\n---\n\n## Usage\n\n### Global Hotkey\n\n| Action | Default Shortcut |\n|--------|-----------------|\n| Toggle Qx window | `⌘Space` (configurable in Settings → Shortcuts) |\n\n### Launcher\n\nType anything into the search bar. Results include:\n\n- **Apps** — fuzzy-matched from LaunchServices DB\n- **Files** — native file search (kMDQuery)\n- **Commands** — `settings`, `clipboard`, `rss`, `gif`, `macro`, `qxai`, `v2ex`\n- **Calculator** — inline expression evaluation (`42 * 3.14`, `sqrt(144)`)\n- **Plugin commands** — from installed plugins\n\n### Keyboard Navigation\n\n| Key | Action |\n|-----|--------|\n| `↑` / `↓` | Navigate results |\n| `Enter` | Select / confirm |\n| `Esc` | 3-level cascade: close detail → clear search → back to launcher |\n| `⌘K` | Open Actions menu for current selection |\n| `⌘,` | Open Settings |\n| `⌘P` | Toggle pin (clipboard) |\n| `⌘⌫` | Delete current entry |\n\n### Modules\n\n**Clipboard** — every copy is saved automatically. Open via `⌘⇧V` or search `clipboard`. Supports text, images, pinning, and type filtering.\n\n**Screen Recording** — search `gif` / `screencap`. Region-select and record up to 180s. Output is auto-encoded to animated GIF via gifski.\n\n**RSS Reader** — search `rss`. Add feeds by URL, read articles inline with a detail pane, star to bookmark. Supports OPML import/export.\n\n**QxAI** — search `qxai`. Built-in AI chat assistant supporting multi-turn conversations with streaming responses. Configure providers in Settings → QxAI: the built-in DuckDuckGo provider works out of the box; add custom OpenAI-compatible providers (BYOK) with auto-fetched model lists. Each conversation can switch provider/model independently. Persistent memory stores user preferences accessible to both QxAI and plugins.\n\n**V2EX** — search `v2ex`. Browse v2ex.com topics in latest or hot mode, search by keyword, and read articles with rendered HTML inline. Configure a V2EX API token and favorite nodes in the module preferences for extended features.\n\n**Macros** — search `macro`. Record keyboard/mouse sequences and replay them. Saved macros persist in history.\n\n**Settings** — search `settings` or press `⌘,`. Configure theme, shortcuts, RSS, plugins, AI agent, and advanced options.\n\n**AI Agent** — open Settings → AI Agent to configure the AI agent runtime: enable/disable agent mode, set default provider and model, and toggle tool groups including bash execution, grep search, memory, app/file search, HTTP fetch, MCP, notifications, and background tasks. Bash and grep have additional configuration for working directory, timeout, search root, and result limits. These settings gate plugin `context.ai` tool access at runtime.\n\n**Permissions** — open Settings → Permissions to check macOS Screen Recording, Accessibility, and Input Monitoring access. Green means Qx already has access; red means the feature needs approval. Use Request/Open to jump to the right System Settings privacy pane, then refresh the status after changing access.\n\n**Plugins** — open Settings → Extensions to manage installed plugins, browse the marketplace, or import a plugin archive. Installed supports search and `All / Built-in / External / Enabled / Disabled` filtering, with details showing version, path, permissions, preferences, and SHA256 on the right. Browse shows marketplace search results with metadata and install status. Qx accepts local `.zip` / `.qx-plugin` packages, GitHub repository URLs, direct GitHub archive URLs such as release assets or `https://github.com/\u003cowner\u003e/\u003crepo\u003e/archive/refs/heads/main.zip`, and Raycast extension tree URLs. Repository URLs are downloaded as the `main` branch archive. The archive may contain the plugin at the zip root or inside a GitHub-generated top-level folder; Qx locates `manifest.json`, installs that plugin root into `~/.qx/plugins/\u003cplugin-id\u003e`, verifies ed25519 signatures when present, and enables the plugin automatically.\n\n---\n\n## Plugin System\n\nPlugins are sandboxed JavaScript modules running in iframes that communicate with the host via `postMessage` RPC. Each plugin declares its capabilities in a `manifest.json` and requests permissions for protected APIs.\n\n### Plugin AI SDK (`context.ai`)\n\nPlugins declaring the `ai` permission gain access to a rich AI SDK:\n\n| API | Permission | Description |\n|-----|-----------|-------------|\n| `ai.providers()` | `ai` | List available AI providers |\n| `ai.models(provider?)` | `ai` | List models for a provider |\n| `ai.defaultModel()` | `ai` | Get user's default provider/model |\n| `ai.agentSettings()` | `ai` | Get agent runtime configuration |\n| `ai.chat(input, options?)` | `ai` | Synchronous AI completion (string, messages, or multimodal) |\n| `ai.stream(input, onChunk, options?)` | `ai` | Streaming AI output with chunk callback |\n| `ai.runBash(script, options?)` | `ai-bash` | Execute bash with cwd and timeout |\n| `ai.memory.list()` | `ai-memory` | List persistent memory entries |\n| `ai.memory.add(text, tags?)` | `ai-memory` | Add a memory entry |\n| `ai.memory.delete(id)` | `ai-memory` | Delete a memory entry |\n| `ai.search.grep(query, options?)` | `ai-tools` | Grep-style code/file search |\n| `ai.tasks.submit(input)` | `ai` + `ai-background` | Submit a background AI task |\n| `ai.tasks.list()` | `ai-background` | List plugin's background tasks |\n| `ai.tasks.get(id)` | `ai-background` | Get task status/result |\n| `ai.tasks.cancel(id)` | `ai-background` | Cancel a running task |\n\nAI chat supports string prompts, message arrays, OpenAI-compatible content parts, and `images` (base64 with detail control). Tool calls are gated by both plugin permissions and the AI Agent Settings toggles at runtime.\n\n### Plugin Security\n\n- Plugins run in sandboxed iframes (`allow-scripts` only, no `allow-same-origin`).\n- Permission-based access control — every RPC call is checked against the plugin's declared permissions.\n- Dangerous commands (file deletion, system modification, etc.) require exact `invoke:\u003ccommand\u003e` permission.\n- Agent tools (bash, memory, grep, background tasks) require both plugin permissions and runtime agent settings to be enabled.\n- Plugin packages may include `pubkey` and `signature` for ed25519 verification at install time.\n\n### Raycast Extension Compatibility\n\nQx includes a conversion script (`scripts/convert-raycast-extension.mjs`) that transforms Raycast extension directories into Qx plugins. Paste a GitHub Raycast extension tree URL into the plugin manager to trigger automatic conversion and installation.\n\n---\n\n## Development\n\n### Prerequisites\n\n- [Rust](https://rustup.rs) (edition 2021)\n- Node.js ≥ 20\n- macOS 14+ (for Tauri v2 + macOS private APIs)\n\n### Setup\n\n```bash\ngit clone https://github.com/mcxen/qx.git\ncd qx\nnpm install\n```\n\n### Development\n\n```bash\nnpm run tauri dev\n```\n\nThis starts a Vite dev server on `:1420` and opens a Tauri window.\n\n### Build for Distribution\n\n```bash\nnpm run tauri build -- --target aarch64-apple-darwin --bundles app\n```\n\n### Validation\n\n```bash\ncd src-tauri \u0026\u0026 cargo check\nnpx tsc --noEmit\n```\n\n---\n\n## Project Structure\n\n```\nsrc/                          # Frontend (React + TypeScript)\n├── App.tsx                   # Root component + tab routing\n├── App.css                   # Global styles + CSS variable references\n├── store.ts                  # Global Zustand store\n├── ThemeProvider.tsx         # Light/dark/system theme provider\n├── i18n.ts                   # EN / zh-CN translations\n├── Launcher.tsx              # Main launcher with search + results\n├── modules/                  # Feature modules\n│   ├── clipboard/            # Clipboard history panel\n│   ├── rss/                  # RSS reader (list + detail + store)\n│   ├── qx-ai/               # AI chat assistant (chat + settings + store)\n│   ├── v2ex/                # V2EX forum viewer (panel + detail)\n│   ├── settings/            # Settings (10 sub-panels + store)\n│   ├── screencap/           # Screen recorder + GIF history\n│   ├── macros/              # Macro recorder + replayer\n│   ├── documents/           # Dev text/JSON/MD tools\n│   └── github-calendar/     # GitHub contributions viewer\n├── launcher/                 # Launcher sub-modules\n│   ├── LauncherContext.tsx   # Right-side context panel (quick entries, history)\n│   ├── LauncherActionPopover.tsx # Floating action menu for selected item\n│   ├── launcherActions.ts   # Context-sensitive action factory\n│   └── useLauncherHistory.ts # Launch + search history hook\n├── plugin/                   # Plugin system\n│   ├── types.ts              # Plugin manifest/command/panel/AI SDK types\n│   ├── registry.ts           # Zustand registry + topological sort\n│   ├── runtime.ts            # iframe sandbox + RPC bridge + context.ai\n│   ├── builtin.ts            # Built-in modules as pseudo-plugins\n│   └── PluginHost.tsx        # iframe container + panel viewport\n├── components/               # Shared components\n│   ├── QxShell.tsx           # Core 3-layer shell layout\n│   ├── QxBottomIsland.tsx    # Dynamic Island component (status, progress, marquee)\n│   ├── ShellActionButton.tsx # Shell action bar button\n│   ├── HomeSystemIsland.tsx  # CPU/MEM/GPU sparkline island\n│   └── ui.tsx                # Toggle, Select, Slider, Modal, etc.\n├── hooks/\n│   └── useEscBack.ts         # 3-level cascading Esc hook\n├── search/\n│   └── calculator.ts         # Inline expression evaluator\n└── styles/                   # CSS files (base, shell, launcher, etc.)\n\nsrc-tauri/                    # Rust backend\n├── Cargo.toml                # Rust dependencies\n├── tauri.conf.json           # Window/config (680×500, transparent, no-decor)\n├── src/\n│   ├── main.rs               # Binary entry\n│   ├── lib.rs                # Tauri app setup (plugins, tray, shortcuts)\n│   ├── apps.rs               # App scanning + fuzzy search\n│   ├── clipboard.rs          # Clipboard listener + SQLite history\n│   ├── screencap.rs          # Screen recording to GIF (scrap + gifski)\n│   ├── g4f.rs                # AI provider abstraction (DuckDuckGo + custom BYOK)\n│   ├── plugin_api.rs         # Plugin AI runtime (bash, grep, memory, tasks)\n│   ├── rss/                  # RSS module (fetcher, storage, types)\n│   ├── settings/mod.rs       # TOML settings + global shortcuts + agent config\n│   ├── marketplace/mod.rs    # Plugin marketplace (index, download, verify)\n│   ├── system_stats.rs       # Mach kernel CPU/MEM/GPU stats\n│   ├── system_information.rs # Real system info (storage, network, processes)\n│   ├── macro_recorder.rs     # Keyboard/mouse macro record/replay\n│   ├── file_search.rs        # Native file search (vendored)\n│   ├── history.rs            # Launch + search history\n│   ├── display_monitor.rs    # External display monitor\n│   ├── ocr.rs                # OCR model management\n│   ├── github_calendar.rs    # GitHub contribution fetch\n│   ├── v2ex.rs               # V2EX topic fetch/search\n│   ├── storage.rs            # Plugin key-value storage\n│   └── permissions.rs        # macOS permission checks\n```\n\n---\n\n## Contributing\n\nContributions are welcome under the [Qx Source-Available License](#license).\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feat/my-feature`)\n3. Make your changes\n4. Run validation: `cargo check` (in `src-tauri/`) and `npx tsc --noEmit`\n5. Commit and push\n6. Open a Pull Request\n\n### Coding Guidelines\n\n- Read `UI_SPEC.md` and `AGENTS.md` before making UI changes — they contain comprehensive design rules and technical constraints.\n- Follow the **Esc Cascading Protocol**: all openable modules must use `useEscBack` for 3-level back navigation (inner state → query → launcher).\n- Use CSS custom properties (`var(--qx-*)`) — never hardcode color values.\n- File paths must use `convertFileSrc()` — no `file://` URLs.\n- Custom Slider component (`src/components/ui.tsx`) — no `\u003cinput type=\"range\"\u003e`.\n- System stats use Mach kernel APIs — no `sysinfo` crate.\n\n---\n\n## License\n\nSource-available — see [LICENSE](./LICENSE) for full terms.\n\n- ✅ View, study, and modify source for **personal / non-commercial** use\n- ❌ Commercial use, redistribution, or SaaS requires **written permission**\n- Contributions are under the same license\n\n---\n\n## Acknowledgments\n\n- [Vercel Geist Design System](https://vercel.com/geist) for design inspiration\n- [Tauri](https://tauri.app) for the desktop framework\n- [Raycast](https://raycast.com) for the product concept\n\n---\n\n# Qx — macOS 效率启动器\n\nQx 是一款常驻菜单栏的 macOS 桌面启动器，类 Raycast 风格，通过全局快捷键唤起。集搜索、剪贴板历史、GIF 录屏、RSS 阅读、AI 聊天、V2EX 浏览、宏录制等功能于一体。\n\n基于 **Tauri v2** + **React 19** + **TypeScript** + **Rust**，使用 macOS 原生毛玻璃效果、Mach 内核 API 获取系统状态。\n\n\u003e **版本**: v0.4.34 — 活跃开发中\n\n## 功能特性\n\n| 模块 | 说明 |\n|------|------|\n| **启动器** | 模糊搜索应用、文件、内置命令、插件动作和用户别名/标签 |\n| **剪贴板** | 持久化历史记录，支持文本/图片、置顶、筛选和内联预览 |\n| **录屏** | 选择区域录制为 GIF（15fps，gifski 编码），自动保存历史 |\n| **RSS 阅读器** | 添加订阅源、内联阅读、收藏、OPML 导入/导出、后台自动刷新 |\n| **QxAI** | 内置 AI 聊天助手，支持多 provider（DuckDuckGo、自定义 BYOK）、流式输出、持久记忆、会话内切换模型 |\n| **V2EX** | 浏览和搜索 v2ex.com 话题（最新/热门），内联阅读文章，节点过滤 |\n| **宏录制** | 录制和回放键盘/鼠标宏序列 |\n| **开发者工具** | 文本 / JSON / Markdown 实用工具 |\n| **GitHub 日历** | 内联查看 GitHub 贡献图 |\n| **插件系统** | 基于沙盒 iframe 的插件运行时，含 RPC 桥接、市场、压缩包导入、ed25519 签名验证和 `context.ai` AI SDK |\n| **AI Agent 设置** | 配置 AI Agent 模式、默认 provider/模型、工具开关（bash、grep、记忆、MCP、后台任务等） |\n| **设置** | 通用、外观（亮色/暗色/跟随系统，Geist 设计系统）、快捷键、macOS 权限、插件管理 |\n\n## 安装\n\n### Homebrew（推荐）\n\n```bash\nbrew tap mcxen/qx\nbrew install --cask qx\n```\n\n### 手动安装\n\n从 [Releases](https://github.com/mcxen/qx/releases) 下载并安装。\n\n## 权限\n\n打开「设置 → 权限」可以查看 macOS 屏幕录制、辅助功能和输入监听授权状态。绿灯表示已授权，红灯表示相关功能还需要系统批准。点击「请求」或「打开」会跳转到对应系统设置面板，授权完成后回到 Qx 刷新状态即可。\n\n## 插件\n\n打开「设置 → 扩展」可以管理已安装插件、浏览插件市场，或直接导入插件压缩包。Installed 支持搜索和 `All / Built-in / External / Enabled / Disabled` 筛选，右侧详情展示版本、路径、权限、preferences 和 SHA256；Browse 支持市场搜索、详情查看、权限/元数据展示和安装状态反馈。支持本地 `.zip` / `.qx-plugin` 文件，也支持 GitHub 仓库链接、Release 资源链接和源码压缩包链接，例如：\n\n```text\nhttps://github.com/\u003cowner\u003e/\u003crepo\u003e/archive/refs/heads/main.zip\n```\n\n直接粘贴 `https://github.com/\u003cowner\u003e/\u003crepo\u003e` 时，Qx 会下载该仓库 `main` 分支的源码压缩包。也可以粘贴 Raycast extension tree URL，Qx 会转换后安装为 Qx 插件。Qx 会在压缩包中定位 `manifest.json`，将对应插件根目录安装到 `~/.qx/plugins/\u003cplugin-id\u003e`。如果 manifest 中包含 `pubkey` 和 `signature`，安装时会进行 ed25519 签名校验。\n\n### 插件 AI SDK\n\n声明 `ai` 权限的插件可以使用 `context.ai` SDK，包括 AI 聊天（同步/流式）、多模态输入（文本+图片）、bash 执行、grep 搜索、持久记忆和后台任务等能力。工具调用受插件权限和 AI Agent 设置双重门控。\n\n## 开发\n\n```bash\ngit clone https://github.com/mcxen/qx.git\ncd qx\nnpm install\nnpm run tauri dev      # 开发模式\nnpm run tauri build -- --target aarch64-apple-darwin --bundles app  # 构建\n```\n\n## 许可证\n\n源码可用许可证 — 个人/非商业用途可阅读、学习、修改源代码。商业用途需书面授权。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcxen%2Fqx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmcxen%2Fqx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcxen%2Fqx/lists"}