{"slug": "allclear-tool", "title": "Allclear Tool", "summary": "Developer m-peko released allclear, an open-source dashboard that consolidates every running Claude Code session into one browser tab and lets users approve all pending permission prompts with a single click. The tool requires Node 18 or newer, installs via `npx github:m-peko/allclear`, and adds its hooks to `~/.claude/settings.json`, backing that file up to `~/.claude/settings.json.allclear-backup-<timestamp>` before writing. An optional `--lan` flag serves the dashboard to other devices using a token stored in `~/.claude/allclear-token` at mode 600, while the default binds to 127.0.0.1 with no token.", "body_md": "One browser tab for every Claude Code session you have running —\n\n  see what they're doing, and clear every permission prompt with one click.\n\nIf you keep six terminals open and spend your day hunting for the one stuck on\n`Do you want to proceed?`, this is for you. allclear puts every session in one page,\nshows you the command, diff or URL each one is waiting on, and lets you answer\nthem all at once.\n\nNode 18 or newer. No dependencies, nothing to build.\n\n```\nnpx github:m-peko/allclear\n```\n\nThat's it. It adds its hooks to `~/.claude/settings.json`, starts a local server\nand opens the dashboard. Sessions you already have open pick it up within\nseconds — no restart needed.\n\nOr install it properly, so `allclear` is just a command you have:\n\n```\ncurl -fsSL https://raw.githubusercontent.com/m-peko/allclear/main/install.sh | sh\n```\n\nThat puts the source in `~/.local/lib/allclear` and links `~/.local/bin/allclear`.\nIt deliberately does **not** touch your Claude Code settings — running `allclear`\nafterwards does that — so piping it to a shell can't change how your sessions\nbehave. Read it first if you'd rather:\n[`install.sh`](https://github.com/m-peko/allclear/blob/main/install.sh).\nSet `ALLCLEAR_PREFIX` to install somewhere else.\n\n## Other ways to install\n\n**With npm**, globally:\n\n```\nnpm install -g github:m-peko/allclear\nallclear\n```\n\n**From a clone**, if you want to hack on it:\n\n```\ngit clone https://github.com/m-peko/allclear.git\ncd allclear\nnpm link\nallclear\n```\n\nTo remove it, run `allclear uninstall` (or `npx github:m-peko/allclear uninstall`).\nYour settings file is backed up to\n`~/.claude/settings.json.allclear-backup-<timestamp>` before anything is written to\nit, and only allclear's own hook entries are ever added or removed.\n\n**Every session in one place.** Active sessions fill the grid, each showing its\nrecent conversation — what you asked, what Claude replied, which tools it ran.\nIdle ones wait in the sidebar. Each card is titled with the name Claude Code gave\nthat session and tagged with the repository it's working in.\n\n**Requests you can actually judge.** A pending call is shown in full: the whole\nshell command, the real before/after of an edit, the URL being fetched. **Approve\nall** (or `A`) answers every one on screen — a bulk decision, not a blind\none.\n\n**Nothing silently stuck.** Each request shows how long allclear will hold it. Let it\nrun out, or quit allclear, and it falls back to the terminal prompt exactly as if\nallclear had never been there.\n\n| `allclear` | Set up if needed, then open the dashboard | \n| `allclear start` | Run the dashboard without touching your settings | \n| `allclear install` | Add the hooks to `~/.claude/settings.json` | \n| `allclear status` | Show hooks, live sessions, and whether the server is up | \n| `allclear uninstall` | Remove the hooks | \n\n`--lan` also serves it to your network, for a phone — see below. `--port N` runs\non a different port; pass it to `install` as well, so the hooks point at the right\nplace. `--no-open` skips opening a browser.\n\n```\nallclear --lan\n```\n\nIt prints a link for every address this machine has, and a QR code if you have\n`qrencode` installed. Open it on your phone and approve from the sofa.\n\nThe layout collapses to a single column, card titles get a line of their own, and the controls are sized for thumbs.\n\n**This one needs care.** Approving a tool call runs a command on your machine, so\na dashboard anyone on the café wifi can open is a remote shell with a nice UI. So:\n\n- The link carries a token, and every request without it is refused. The token is\ngenerated once and kept in `~/.claude/allclear-token` (mode`600` ) so a bookmark\nkeeps working; delete that file to invalidate it and issue a new one.\n- The hook endpoints only accept connections from this machine, so nothing on the network can fabricate a permission request.\n- Without `--lan` the server binds to`127.0.0.1` and no token is involved at all.\n\nTreat the link like a password. If your machine is on a Tailscale or similar\nnetwork, `--lan` will print that address too, which gets you to it from anywhere\nwithout exposing it to the local network you happen to be on.\n\n| Click a card header | Folds it shut, keeping its width and place | \n| Click the **×** | Takes it off the grid; it waits in the sidebar | \n| Click a sidebar row | Puts it back on the grid, open | \n| Drag a card's corner | Resizes it — sideways in columns, down for the conversation pane | \n| Double-click the corner | Resets that card's size | \n| `A` | Approves everything on screen | \n\nCard sizes are remembered per session, and the last size you chose becomes the default for cards that appear later. Dark and light themes are in the top bar, following your system setting until you pick one.\n\nClaude Code fires a [`PermissionRequest`](https://code.claude.com/docs/en/hooks)\nhook at the moment it is about to ask you to approve a tool call, and the hook's\nresponse decides the outcome. allclear registers an HTTP hook pointing at its own\nlocal server:\n\n1. A session wants to run something that needs permission.\n2. Claude Code POSTs the request to allclear and waits on the response.\n3. It appears in your browser, in full.\n4. You click. allclear answers the open request, and the session carries on.\n\nBecause the decision rides on the hook response, there is no polling and no keystroke injection — this is the interface Claude Code provides for exactly this purpose.\n\nTwo smaller hooks fill the gaps: `Notification` surfaces the few prompts that\nnever raise a `PermissionRequest`, such as a sandboxed command's network request,\nand `SessionEnd` clears a session's rows when it exits.\n\nA failed connection to the hook is a non-blocking error in Claude Code: it simply carries on with its normal permission flow and prompts in the terminal. Stopping allclear, or never starting it, changes nothing about how your sessions behave.\n\nThe same applies to anything allclear is still holding when you quit — every held request is handed back to the terminal prompt on shutdown.\n\nClaude Code shows its own prompt while the hook is still pending; whichever\nanswers first wins. If you answer in the terminal it does **not** close the hook's\nconnection, so allclear has no direct way to learn the request is settled.\n\nWhat gives it away is the session's own status. Claude Code reports `waiting`\nwhile a prompt is up and moves off it once the prompt is gone, so allclear drops a\nheld request when its session has stopped waiting — either because it watched the\nsession enter `waiting` and leave it, or because the session has gone fully idle.\nA five-second grace period covers the lag. Those appear as `answered` in the\nsidebar.\n\nallclear holds a request for 9 minutes (`ALLCLEAR_HOLD_MS`), just under the hook's\n10-minute timeout, then releases it to the terminal prompt. Each card shows the\ntime remaining, so nothing is left waiting on a browser tab you closed.\n\nLive sessions come from `~/.claude/sessions/*.json`, which Claude Code maintains\nper process. Those files are never cleaned up, so allclear filters them: a record\ncounts as live only if its pid exists **and** the process start time still matches\nthe `procStart` recorded in the file, which rules out a recycled pid. On a machine\nwith 131 session files, that typically leaves the 8 that are genuinely running.\n\nClaude Code names a session with an `ai-title` record in the transcript, rewritten\nas the conversation moves on, so the last one in the file is the current title.\nThe repository badge is resolved by walking up from the session's working\ndirectory to the nearest `.git`. A worktree under\n`<repo>/.claude/worktrees/<name>` has its own `.git` file pointing back at the\nreal repository, so that suffix is stripped first and the badge reads\n`repo/worktree`.\n\nExpanded cards show the tail of the session's transcript from\n`~/.claude/projects/<slug>/<id>.jsonl`. Those files routinely pass several\nmegabytes, so allclear never reads one whole — it seeks to the last 256KB, walks\nbackwards until it has enough turns, and caches the result against the file's size\nand mtime. Subagent chatter and tool-result plumbing are filtered out.\n\nTranscripts are read from disk and sent to your own browser over localhost. They are not written to, and nothing leaves your machine.\n\n**Approve all** grants every request currently on screen. They are all rendered in\nfull first, so it is a bulk decision rather than a blind one.\n\n**Auto-approve** is a different thing, and the toggle asks you to confirm before it\nturns on. While it is on, requests are granted the instant they arrive and you\nnever see them — including commands that delete files, rewrite history or reach\nthe network. It is the dashboard's equivalent of\n`--dangerously-skip-permissions`, applied to every session at once. Leave it off\nunless you know exactly what is running.\n\n**Always allow** writes a permanent rule into `.claude/settings.local.json`, using\nthe rule Claude Code itself suggested for that request — the same thing the\nterminal's \"Yes, and don't ask again\" does.\n\nBy default the server binds to `127.0.0.1` only. `--lan` opens it to the network\nand always requires a token — see [From your phone](#from-your-phone). Don't put\nit behind a public tunnel: the token is a reasonable guard on a home or office\nnetwork, not on the open internet.\n\nSession discovery reads `/proc` on Linux and falls back to a signal probe\nelsewhere; the rest is platform-independent.\n\nMIT", "url": "https://wpnews.pro/news/allclear-tool", "canonical_source": "https://github.com/m-peko/allclear", "published_at": "2026-10-08 09:11:25+00:00", "updated_at": "2026-10-08 09:19:13.852353+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "ai-tools"], "entities": ["allclear", "m-peko", "Claude Code", "Anthropic", "Node.js", "GitHub", "npm"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/allclear-tool", "markdown": "https://wpnews.pro/news/allclear-tool.md", "text": "https://wpnews.pro/news/allclear-tool.txt", "jsonld": "https://wpnews.pro/news/allclear-tool.jsonld"}}