Squish Watch your coding agents from the notch
See what every Codex and Claude Code session costs, get a heads-up before its context compacts, and answer Claude Code's prompts without hunting for the right terminal. Everything is read locally, on your Mac.
macOS 14 Sonoma or later, Apple silicon
What it does
- Finds your agent sessions. Pick a folder once. Squish discovers Codex and Claude Code sessions, and Gemini CLI sessions on a best-effort basis, whose working directory is inside it, including nested projects.
- Shows what each session costs. Tokens and API-equivalent cost per session, split into input, cache reads, cache writes and output, with long-context pricing tiers where providers charge them.
- Keeps the totals. A durable cost ledger preserves your spend after the agents delete their old logs. Completed days are frozen; today updates live.
- Warns before context compacts. When a session's context passes your threshold (80% by default, adjustable from 50% to 95%), a dark Dynamic-Island-style alert drops from the top of the screen. It re-arms once the session compacts below the threshold.
- Puts live chats in the notch. Optionally, active sessions grow the notch sideways, and a Claude Code permission request or question drops it open so you can allow, deny or answer right there.
- Stays out of the way. Filesystem events wake Squish only when a log changes; growing logs are parsed from the new bytes only, large ones are streamed in bounded chunks, and parsed summaries persist between launches.
Usage
- Choose a folder. On first launch, pick the folder that holds your projects (later: ⇧⌘O, Choose Project Folder…). Squish remembers it.
- Read the costs. Sessions appear newest first while older history indexes in the background. Each one shows its tokens, its estimated cost and how full its context is.
- Set the alert threshold. Under Compact alerts, choose when the notch alert fires, or preview it.
- Turn on Live chats if you want to answer Claude Code from the notch. Squish installs its hook (see below); a preview button shows what a request looks like.
Live chats and the Claude Code hook
With Live chats on, Claude Code permission prompts and AskUserQuestion questions open the notch
with one tab per waiting session. Approve or deny a tool, pick one of the offered answers, or type your own.
What turning it on does, and why it is safe to leave on:
- One hook, nothing else. Squish adds a single
PermissionRequesthook to~/.claude/settings.jsonthat runssquish-hook, a small program bundled inside the app. It backs up the original file once (settings.json.squish-backup), leaves your other hooks alone, and removes the entry when you turn Live chats off. - Only real prompts.
PermissionRequestfires only when Claude Code would actually ask you, so tools your permission mode already allows never reach the notch. - Never hangs a session. The hook passes straight through to Claude Code's own prompt unless Squish is running and watching the folder the session is in, and it falls back to that prompt after five minutes without an answer.
- No surprise permissions. Allow and deny need nothing from macOS. Accessibility is requested only the first time you send an answer to a question, so Squish can type it into the terminal; without it, the answer is copied to the clipboard.
Codex and Gemini CLI sessions appear as active chats too, but are answered in their own terminal. Turn Live chats off before deleting Squish, so the hook entry is removed.
Where it looks
| Agent | Session logs | Support |
|---|---|---|
| Codex | ~/.codex/sessions | Full |
| Claude Code | ~/.claude/projects | Full, plus answering from the notch |
| Gemini CLI | ~/.gemini/tmp | Best effort |
Squish also picks up matching local .codex, .claude and .gemini folders below the
folder you chose. It is not sandboxed, because these logs live in hidden folders in your home directory.
Costs are estimates. They use the providers' published API prices (the catalog lives in
PricingCatalog.swift).
Codex, Claude and Gemini subscriptions bill differently, and models without a known price are shown but left out
of the totals.
Questions
- Is Squish free?
- Yes. Squish is free and open source under the Apache License 2.0.
- Does it upload my sessions anywhere?
- No. Squish reads the session logs your coding agents already write to disk and parses them on your Mac. No session content is uploaded, and it works offline. The only network use is checking for app updates.
- Which coding agents does it support?
- Codex (from ~/.codex/sessions) and Claude Code (from ~/.claude/projects) are fully supported. Gemini CLI (from ~/.gemini/tmp) is supported on a best-effort basis. Answering prompts from the notch works for Claude Code only; Codex and Gemini CLI sessions show up as active chats but are answered in their own terminal.
- Which Macs does it run on?
- macOS 14 (Sonoma) or later on Apple silicon. The notch popups appear at the top of the screen on any Mac, with or without a camera notch.
- Are the costs what I actually pay?
- They are API-equivalent estimates: what the same tokens would cost at the providers' published API prices, split into input, cache-read, cache-write and output, with long-context tiers where providers use them. Subscription plans for Codex, Claude or Gemini bill differently. Models without a known price stay visible but are left out of the totals.
- What happens to my cost history when an agent deletes old logs?
- Squish keeps a durable cost ledger for each project folder, so totals survive after the source session logs are gone. Completed days are frozen; only the current day updates live.
- What does the Claude Code hook install?
- Only when you turn on Live chats, Squish adds one PermissionRequest hook to ~/.claude/settings.json that runs the squish-hook program bundled inside the app, after backing up the original file once to settings.json.squish-backup. Your other hooks are left untouched, and turning Live chats off removes the entry again. The hook does nothing unless Squish is running and watching the folder the Claude Code session is in; otherwise Claude Code shows its usual prompt. If you do not answer in the notch within five minutes, the hook also falls back to Claude Code's own prompt.
- Does Squish need Accessibility access?
- Not for approving or denying permissions, and turning on Live chats triggers no system prompts. macOS asks for Accessibility only the first time you send an answer to a Claude Code question, because Squish types that answer into the session's terminal. Without it, the answer is copied to the clipboard instead.
- How do updates work?
- Squish checks for updates automatically through Sparkle and installs them after asking; you can also choose Check for Updates in the Squish menu. Every release is a signed, notarized build published on GitHub Releases, and each update is verified against Squish's signing key before it is installed.
- Can I request a feature or report a bug?
- Ideas and questions go to GitHub Discussions; reproduced bugs go to Issues using the template. Pull requests aren't accepted.
Build from source
Requires macOS 14 or later and Xcode with the Swift 6 toolchain.
git clone https://github.com/bring-shrubbery/squish.git && cd squish && ./scripts/build-app.sh
The app bundle is written to dist/Squish.app (ad-hoc signed). During development, run
swift run Squish, and swift test for the tests. The
README has the details.
Contributing
Squish is developed by a small team working with AI coding agents that we run and supervise ourselves. Because of that:
- Feature requests, ideas and questions go to Discussions. The most requested and best argued ideas are what we build next.
- Bug reports go to Issues, using the template, for bugs you have reproduced yourself.
- Pull requests are not accepted and are closed automatically.
License
Squish is licensed under the Apache License 2.0. It is published by Quassum and made by Antoni Silvestrovic, built with Claude Code.