# Install (/docs/pounce/install)



Pounce is a prebuilt, Developer-ID-signed and notarized `Pounce.app`: no
compile step, no Xcode command-line tools to fetch, no Gatekeeper prompt.

## Homebrew [#homebrew]

```sh
brew install hausfold/tap/pounce
brew services start pounce        # start the daemon
pounce --request-accessibility    # one-time, the daemon raises the dialog
```

Because that signing identity is stable, the Accessibility grant &#x2A;*survives
`brew upgrade`**: approve it once, not once per release.

## Or a download [#or-a-download]

The [latest release](https://hausfold.co/download/pounce) is the same build as
a DMG: drag it to Applications and open it. First launch registers a login item
and starts the daemon; approve the login item in System Settings if macOS
asks.

With Nix, without installing anything:
`nix run github:hausfold/pounce -- --help`.

<Callout title="Building it yourself needs Xcode Command Line Tools 16">
  Only `brew install --build-from-source` and `nix build` take that path; the
  ordinary install is a prebuilt binary. Pounce overrides two `NSResponder`
  methods that the macOS 15 SDK is the first to declare, and an older SDK fails
  with `method does not override any method from its superclass`, which does not
  otherwise explain itself. `xcode-select --install` is the fix. That is the SDK
  you *build* with; the app still runs on macOS 14.
</Callout>

## What it needs [#what-it-needs]

|                   |                                                  |
| ----------------- | ------------------------------------------------ |
| **macOS 14**      | Sonoma or newer, on Apple Silicon                |
| **Accessibility** | One permission (see below)                       |
| **Nothing else**  | No account, no key, no sign-in, no Xcode, no Nix |

## One key to free up [#one-key-to-free-up]

Pounce wants **⌘Space**, and on a stock Mac that key belongs to Spotlight.

<Callout type="warn" title="If ⌘Space does nothing on a stock Mac">
  Spotlight wins **silently**: registration *succeeds*, so Pounce can't tell,
  and macOS just routes the key elsewhere. The daemon checks for this at startup
  and names the shortcut that beat it in its log.

  Free the key in **System Settings → Keyboard → Keyboard Shortcuts →
  Spotlight**, then restart the daemon.
</Callout>

Would you rather keep Spotlight where it is? The hotkey is one line of
[config](/docs/pounce/config#config-file):

```jsonc
{ "hotkey": { "key": "space", "modifiers": ["opt"] } }   // ⌥Space instead
```

On a haus machine you write `haus.keys.palette = "alt-space"` instead, and
[⌘Space is handed over for you](/docs/haus/rooms/launcher) either way, because
haus turns Spotlight's binding off.

## Grant Accessibility [#grant-accessibility]

Clipboard auto-paste, emoji paste, and modifier-only bindings like Fn/Globe all
synthesize keystrokes; the [window switcher and
auto-quit](/docs/pounce/beyond-launching) read a live window snapshot. macOS
gates all of it behind one grant:

```sh
pounce --request-accessibility    # the daemon raises the dialog
pounce --check-accessibility      # true, false, or unknown with no daemon
```

Both ask the running daemon, which is the process macOS grants, so start it
before you ask: with no daemon answering they print `unknown` instead of a guess
that could read as granted.

A global hotkey that works over every app can't be had without it. Three things
ask for their own the first time you use them: the camera peek, the Bluetooth
plugin, and Lock Screen or Force Quit, which drive System Events and make macOS
ask for Automation. A command of your own that tells an app through AppleScript
gets an Automation prompt of its own, one per app. Nothing else out of the box:
no Input Monitoring, no Screen Recording, no Full Disk Access. (Inside haus, Copy
Text from Screen adds Screen Recording; see [the Launcher
room](/docs/haus/rooms/launcher).)

<Callout title="Nix rebuilds and Accessibility">
  Inside haus, the desktop installs the CI-built release app, signed with the
  hausfold Developer ID and notarized. macOS ties the grant to that stable
  signature, not to a per-build hash, so one approval persists across every
  rebuild. See [the Launcher room](/docs/haus/rooms/launcher).
</Callout>

## Check it landed [#check-it-landed]

```sh
pounce doctor
```

It reports whether the daemon is up, whether Accessibility is granted, every
binding it actually armed, and what beat it to a hotkey if something did.

## Remove it [#remove-it]

Installed with Homebrew:

```sh
brew services stop pounce
brew uninstall pounce
```

From the DMG instead: quit Pounce and drag `Pounce.app` to the Trash. First
launch registered a login item, so check **System Settings ▸ General ▸ Login
Items & Extensions** afterwards.

Your own commands and config live in `~/.config/pounce` and are left where they
are: keep or archive that directory separately. Remove Pounce from **System
Settings ▸ Privacy & Security ▸ Accessibility** if it is still listed. Inside
[haus](/docs/haus/rooms/launcher) the room owns the app instead, so the way out
there is `haus.launcher.enable = false`.
