Skip to content

Repository files navigation

AIShot icon

AIShot

One hotkey: screenshot → straight into the AI app you're talking to.
No Finder digging · no drag & drop · quick destinations in the menu bar

한국어


Press a hotkey → drag a region (or hit Space for a window, Esc to cancel) → the PNG is saved into your usual screenshot folder and handed to the destination you chose from the menu bar or Settings:

Destination setting Where every capture goes What gets pasted
A specific app — Claude, Antigravity, ChatGPT, Codex, or any other app that app, regardless of what was frontmost; AIShot opens it when needed by default configurable: Automatic, PNG image, or File path
Destination Automatic + a frontmost terminal or IDE — Ghostty, Terminal, iTerm2, kitty, WezTerm, Warp, VS Code, Antigravity, Cursor the frontmost app with Paste as Automatic: escaped file path + auto ⌘V
Destination Automatic + a frontmost AI app or browser — Claude, Codex, ChatGPT, Gemini, Safari, Chrome the frontmost app with Paste as Automatic: the PNG itself + auto ⌘V
Destination Automatic + anything else clipboard only; no ⌘V is sent with Paste as Automatic: the PNG itself, ready to paste manually

Every capture is also saved as a file with the native macOS naming (Screenshot 2026-07-08 at 11.09.27 AM.png), so pasting and archiving happen in one motion.

No save-location setup needed: AIShot saves to the same folder macOS uses for ⌘⇧3/4/5 screenshots. If you've moved that folder (System Settings / defaults write com.apple.screencapture location), AIShot follows automatically. You only need to configure the save location if you want AIShot captures in a different folder than regular screenshots — run the built-in folder chooser once:

open -nb space.techjuicelab.aishot --args --choose-dir

Full resolution order: --out DIR flag → the app's own folder (set by --choose-dir, or defaults write space.techjuicelab.aishot saveDir ...) → the system screenshot folder → ~/Desktop (the macOS stock default).

AIShot separates control from capture: one lightweight menu bar host stays available for destination changes, while every capture runs in its own short-lived process and exits as soon as the save/paste handoff is complete.

Menu bar

build.sh installs and starts a single menu bar host, then registers it as a per-user LaunchAgent so it comes back after login. Click the viewfinder icon for:

  • Capture Screenshot… — starts the same one-shot interactive capture as the hotkey.
  • Destination: current app — quickly switch between Automatic (Frontmost App) and installed presets. The current choice has a checkmark; More Destinations in Settings… opens the full picker.
  • Settings… — the normal entry point for choosing any app and configuring paste format, destination auto-open, and focus return.
  • Open Screenshot Folder — opens the folder AIShot currently saves into.
  • Quit AIShot — stops the menu host for this session. The LaunchAgent starts it again after the next login.

If the menu icon is not running, start the singleton host manually:

open -gnb space.techjuicelab.aishot --args --menubar

Destination app — every shot lands in one place

Open AIShot menu bar → Settings…. Choose a preset such as Claude, Antigravity, ChatGPT, Codex, or Gemini, or pick any installed .app with Choose Other…. Once a destination is set, every capture goes there regardless of which app was frontmost.

The same panel lets you choose:

  • Paste as: Automatic picks a file path for known terminal/IDE apps and a PNG for other destinations; choose PNG image or File path to force that format, including while the destination is Automatic.
  • Open the destination app when it is not running: on by default. AIShot launches the configured app, brings it forward, and pastes. If the app cannot be opened or activated, no ⌘V is sent and the capture remains on the clipboard (the PNG file is still saved).
  • Return to the previous app after pasting: off by default, so focus stays in the destination and you can immediately type your prompt.
  • Automatic (frontmost app) as the destination: keeps the original routing behavior. With Paste as Automatic, known terminals/IDEs receive a path, known AI apps/browsers receive the PNG, and unsupported apps get clipboard-only.

Advanced: CLI and defaults

The menu bar is the normal way to configure AIShot. For scripts or dotfiles, the settings panel and the same values remain available from the CLI:

# open the same settings panel without the menu
open -nb space.techjuicelab.aishot --args --settings

# select a destination
defaults write space.techjuicelab.aishot targetApp claude

# auto | image | path
defaults write space.techjuicelab.aishot targetPasteMode image

# optional: do not open a stopped destination; return after pasting
defaults write space.techjuicelab.aishot autoLaunchTarget -bool false
defaults write space.techjuicelab.aishot returnFocus -bool true

# restore Automatic destination routing
defaults delete space.techjuicelab.aishot targetApp

Destination aliases: claude · codex · chatgpt · gemini · antigravity · antigravity-ide · cursor · vscode · safari · chrome. Any other app can be selected in the picker or specified by bundle ID (osascript -e 'id of app "SomeApp"').

You can also bind a hotkey that sends that run to one specific app regardless of focus. --target beats the stored destination for that run:

open -gnb space.techjuicelab.aishot --args --target codex

Preview what your current setup would do with --self-test.

Install

Requires macOS 14 or later (Apple Silicon or Intel).

Build from source (requires Xcode Command Line Tools) — recommended, no Gatekeeper friction:

git clone https://github.com/techjuicelab/aishot.git
cd aishot && ./build.sh   # builds, signs, installs, and starts the menu bar host

The build installs AIShot into /Applications like any other Mac app, writes ~/Library/LaunchAgents/space.techjuicelab.aishot.menubar.plist, and starts the menu host immediately. The host starts automatically on later logins; captures remain separate one-shot processes. /Applications is group-writable for admin users, so no sudo is involved; on a managed Mac where it is locked down the build falls back to ~/Applications, and the location can be set explicitly with AISHOT_INSTALL_DIR=~/Applications ./build.sh. Either way, a copy left at the other location is removed — two bundles sharing a bundle ID make open -a, the TCC identity and the menu bar item resolve ambiguously.

Upgrading from an earlier install: the bundle ID changed from com.techjuicelab.aishot to space.techjuicelab.aishot. macOS can wedge a bundle ID so its status item is created but never placed in the menu bar, and that state survives reboots and LaunchServices re-registration. Saved settings migrate to the new domain on first launch and build.sh retires the old LaunchAgent, but macOS sees a new app — Screen Recording and Accessibility have to be granted once more.

Or download AIShot.app.zip from Releases and unzip into /Applications. The app is not notarized, so macOS quarantines the download — clear it with

xattr -dr com.apple.quarantine /Applications/AIShot.app

or launch it once and approve it under System Settings → Privacy & Security → "Open Anyway" (on macOS 15+ right-click → Open no longer bypasses this). Downloaded app bundles do not run build.sh; after approval, start their menu host for the current session with --menubar as shown above.

Automatic updates

From 1.4 AIShot updates itself through Sparkle. The menu bar host checks once a day and offers the update when there is one; to check on demand, use Check for Updates… in the menu bar.

A download is installed only after its EdDSA signature verifies, so a compromised distribution path cannot get arbitrary code installed. The public key used for that check ships inside the app bundle.

If you had been building from source, the first automatic update switches the signing identity from your local ad-hoc signature to the distribution certificate. macOS ties permissions to that identity, so you will have to grant Screen Recording and Accessibility once more. The certificate is stable afterwards, so later updates will not ask again.

To opt out:

defaults write space.techjuicelab.aishot SUEnableAutomaticChecks -bool false

Hotkey

Bind any launcher you already use to:

open -gnb space.techjuicelab.aishot --args --capture

No arguments still means the same one-shot capture, so existing launcher and Karabiner rules continue to work unchanged.

  • Karabiner-Elements:

    mkdir -p ~/.config/karabiner/assets/complex_modifications
    cp karabiner/aishot.json ~/.config/karabiner/assets/complex_modifications/

    then enable the "AIShot" rule in Karabiner-Elements → Complex Modifications → Add predefined rule. Ships as ⌘⇧2 — right next to the system's ⌘⇧3/4/5 screenshot family. A both--keys-at-once rule (Codex-style) is included too — enable it as well if you like.

  • Alfred / Raycast / Shortcuts.app: point a hotkey at the same open command.

First-run permissions (one-time)

  1. First hotkey press → Screen Recording prompt appears and the app exits (System Settings → Privacy & Security → Screen & System Audio Recording → allow AIShot).
  2. Press again → capture UI appears. On save, a Files and Folders prompt may appear for your screenshot folder (iCloud Drive / Desktop) — allow it, or nothing can be saved.
  3. After the first completed capture → Accessibility prompt (for the synthesized ⌘V). Until granted, AIShot still copies to the clipboard; once granted, pasting is automatic from the next shot on.

Signing and permission persistence: build.sh automatically uses a valid Keychain code-signing identity named TechJuice Local Code Signing when one is available. Its stable designated requirement lets Screen Recording and Accessibility grants survive later rebuilds; no script edit is needed.

Without that certificate, the build falls back to ad-hoc signing and an update may require permission approval again. The installer compares the new and previously installed designated requirements: it preserves TCC grants when they match, and runs tccutil reset All space.techjuicelab.aishot only when the signing identity changed so the next capture re-prompts cleanly.

Flags

open -gnb space.techjuicelab.aishot --args --mode image
Flag Description Default
--capture run one interactive capture and exit (explicit alias for no arguments) no-argument behavior
--menubar run the singleton resident menu host until Quit AIShot installed LaunchAgent uses this
--mode auto|path|image force the paste format instead of auto-detecting auto
--target alias|bundle-id send this run's shot to that app unconditionally (beats the stored destination)
--out DIR destination folder (this run only) see save-location order above
--choose-dir open a folder picker and save the choice as the app's default
--settings open the destination, paste-format, auto-launch, and focus settings
--no-paste copy to clipboard only, never synthesize ⌘V
--timeout SEC how long the selection UI may wait 300
--self-test print folder / frontmost app / permission state and exit

Customize

Add apps to either category without rebuilding — AIShot reads two defaults arrays at launch:

# find an app's bundle ID
osascript -e 'id of app "SomeTerm"'

defaults write space.techjuicelab.aishot extraPathApps  -array-add "com.example.someterm"
defaults write space.techjuicelab.aishot extraImageApps -array-add "com.example.chatapp"

Or edit pathPasteIDs / imagePasteIDs at the top of main.swift and re-run ./build.sh.

Uninstall

launchctl bootout "gui/$UID/space.techjuicelab.aishot.menubar" 2>/dev/null || true
rm -f ~/Library/LaunchAgents/space.techjuicelab.aishot.menubar.plist
rm -rf /Applications/AIShot.app
tccutil reset All space.techjuicelab.aishot
defaults delete space.techjuicelab.aishot 2>/dev/null
# and remove the hotkey rule from your launcher / Karabiner

Log: /tmp/aishot.log

License

MIT © TechJuiceLab

About

One hotkey: screenshot straight into the AI app you're talking to (Claude Code, Codex CLI, Claude, ChatGPT, Gemini) — tiny macOS helper, no resident process

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages