No description
  • Swift 99.6%
  • Shell 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
xicv 262d6db64c fix: push to talk keeps the first words by opening the microphone as the key goes down
The microphone went live 0.2–0.66 s after a dictation started, on top of
the 250 ms hold, so a quick first word was cut. It now opens as the
push-to-talk key goes down on its own; what it hears waits and the
dictation takes it over, in order, as its engine starts. A tap, a
shortcut, the dictation ending or 5 s unused closes it.

Only when the microphone is already allowed, and only for built-in and
wired inputs: a Bluetooth headset would switch to call audio on every
shortcut with the key.
2026-10-28 07:49:20 +10:30
App fix: push to talk keeps the first words by opening the microphone as the key goes down 2026-10-28 07:49:20 +10:30
CLI chore: scaffold XcodeGen project with Direct, App Store and CLI targets 2026-10-13 14:05:03 +10:30
docs fix: push to talk keeps the first words by opening the microphone as the key goes down 2026-10-28 07:49:20 +10:30
Packages/EaSnippetKit fix: push to talk keeps the first words by opening the microphone as the key goes down 2026-10-28 07:49:20 +10:30
scripts chore: say what tidy-up did; release script retries Apple's timestamp service 2026-10-14 11:46:44 +10:30
Tests/AppTests fix: quality round across dictation, snippets, clipboard, popup and launcher 2026-10-23 10:12:51 +10:30
.gitignore chore: ignore the local .claude folder 2026-10-21 15:21:12 +10:30
.swiftlint.yml feat(popup): centre the primary button right above the pointer 2026-10-13 14:21:19 +10:30
AGENTS.md feat: the CLI and agents drive the running app: easnippet app status, show, dictate, insert and action, and MCP app tools behind --allow-app 2026-10-22 10:18:53 +10:30
CLAUDE.md docs: add README and agent guide; document primary button and copy-on-select 2026-10-13 14:05:26 +10:30
LICENSE chore: MIT licence; release script writes the .sha256 file 2026-10-14 08:44:29 +10:30
project.yml fix: push to talk keeps the first words by opening the microphone as the key goes down 2026-10-28 07:49:20 +10:30
README.md chore: version 0.4.1 2026-10-22 15:45:12 +10:30
THIRD_PARTY_NOTICES.md feat(qwen3-asr): a 1.7B size to switch to (voice.qwenModel), kept beside 0.6B 2026-10-15 09:18:28 +10:30

eaSnippet

The everyday toolbox for your Mac: six small tools in one menu-bar app. It's free, open source and stays on your Mac. You, or your AI agent, can change any setting with one command.

Tool How you use it What it does
Launcher ⌥Space, then a few letters Opens apps by name, initials (vsc) or a word you choose, and System Settings pages (“sound”, “privacy”, “microphone”). The same box locks the screen, sleeps, restarts, shuts down or logs out, takes screenshots, and copies the text in any area of the screen.
Clipboard history ⇧⌘V Keeps what you copy (text, links, images, files) in a searchable list. Leaves out what apps mark as a password and anything from password managers.
Snippets type a keyword, e.g. ;ty Turns a short keyword into text you saved, with the date, your clipboard or a name filled in. ⌃⌥V lists them all.
Selection actions select some text Shows a small bar of buttons above the words: copy, paste, save as a snippet, dictate, open a link in your browser, or actions you add as plugins.
Dictation hold the right ⌘ key Turns your speech into text on your Mac and types it where you were. English, Chinese and dozens more languages.
Keep awake right-click the menu bar icon Keeps the Mac awake, screen on, until you right-click again. The icon turns green and the slot in its middle fills in. Closing the lid or choosing Sleep still sleeps the Mac.

Your snippets, history and settings stay in one folder on your Mac. Speech is turned into text on the Mac, and recordings are never saved. AI features use Apple's on-device model by default; a cloud model is used only with your own key, and eaSnippet asks before sending it any text.

Install

brew tap x/tap https://x.vibewait.ing/x/homebrew-tap.git
brew install --cask x/tap/easnippet

Or download eaSnippet-<version>.zip from the releases and move eaSnippet to Applications. Open it once and allow Accessibility (on macOS 27, System Settings calls it Device Control and Data Access). Update with brew upgrade --cask x/tap/easnippet; the app has no updater of its own.

Needs a Mac with Apple silicon and macOS 26 or later.

Command line and AI agents

Every setting lives in one JSON file, and the easnippet command covers your snippets, settings, clipboard history, plugins, the launcher's search and screenshots, so an agent such as Claude Code or Codex can make a change for you.

/Applications/eaSnippet.app/Contents/Helpers/easnippet install   # links into ~/.local/bin, no sudo
echo 'Hi {input name="Name"},' | easnippet add --title Greeting --keyword ";hi"
easnippet config set shortcuts.dictate ctrl+opt+d   # change any setting
easnippet config set general.keepAwake true         # keep the Mac awake until set to false
easnippet history search invoice                   # clipboard history
easnippet export --include-settings -o backup.json # snippets, added plugins and settings, for another Mac
codex mcp add easnippet -- easnippet mcp
claude mcp add --scope user easnippet -- easnippet mcp
easnippet docs all            # the formats, for agents

Over MCP, agents can't see your clipboard history unless you start the server with --allow-clipboard, or your screen unless you add --allow-screen.

Editions

Two editions from one codebase: Direct (everything above; signed and notarized) and App Store (sandboxed: the popup opens from a hotkey or the Services menu, because Apple doesn't allow the Accessibility API in sandboxed apps, and it has no command line). See docs/APP_STORE.md.

Status (22 Oct 2026, v0.4.1)

Both editions build cleanly; 457 package tests and 58 app logic tests pass; SwiftLint is clean. In daily use on the developer's Mac: the popup (terminals included, with drag-to-rearrange), keyword expansion, the ⌥Space launcher, push-to-talk dictation with Qwen3-ASR in English and Chinese, the settings file and Privacy & Data. See docs/FEATURES.md for each feature's status and docs/REVIEW.md for the latest review.

Build

Requirements: macOS 26+ on Apple silicon (developed on 27.0.1), Xcode 27, brew install xcodegen swiftlint.

xcodegen generate                                   # creates eaSnippet.xcodeproj (not committed)
xcodebuild -project eaSnippet.xcodeproj -scheme eaSnippet -derivedDataPath build build        # Direct
xcodebuild -project eaSnippet.xcodeproj -scheme "eaSnippet MAS" -derivedDataPath build build  # App Store
open build/Build/Products/Debug/eaSnippet.app

App logic tests: xcodebuild test -project eaSnippet.xcodeproj -scheme eaSnippet -derivedDataPath build.

Package tests and the CLI without Xcode:

cd Packages/EaSnippetKit && swift test
swift run easnippet --help

Lint (our files only): swiftlint lint from the repo root.

Release (Direct edition): bump MARKETING_VERSION in project.yml, then EASNIPPET_SIGN_IDENTITY="Developer ID Application: …" EASNIPPET_NOTARY_PROFILE=<profile> scripts/release.sh. It builds the Apple silicon app, checks the signatures, notarizes and staples it, writes dist/eaSnippet-<version>.zip, updates the Homebrew cask and prints the remaining steps. Release notes live in docs/releases/.

The app icon is an Icon Composer file (App/Resources/AppIcon.icon): Pocket, a tray holding a snippet, with a strip lifting out of it. The menu bar icon (MenuBarIcon, and MenuBarIconAwake while keeping the Mac awake) is the same drawing as a template image.

Licence

MIT; see LICENSE.

Docs

UI design canvas · docs/DESIGN.md screens, feedback states, dark mode
docs/APP_STORE.md Mac App Store feasibility and the two-edition plan
docs/FEATURES.md · docs/PLAN.md feature list and task list
docs/ARCHITECTURE.md modules, data, flows
docs/spec/ template syntax, plugin format, exchange format (normative)
docs/research/ the research behind the decisions, with sources