AGENTGLASS WhyWorkspaceDownload GitHub MODE · OBSERVE · 8 CONTACTS

Eight are flying.
You can see one.

The combiner is dark — no WebGL here, or no JavaScript. The argument stands either way: a terminal shows you one session. agentglass shows all of them — and holds a dangerous call until a human decides. Everything below this line works without a line of script.

Move the designator — lock any contact
Download v0.12.1 macOS · Linux · Windows · MIT · nothing phones home Live demo No install · it is already running behind this glass
1 open
Alerts
What needs you
Approve Bash? shop-api:3c9a1f52
kubectl delete deploy api --namespace prod
Sonnet · unattended 6m 12s
No answer approves it in 15s. Fail-open is the default.

0s

on the glass

0

tool calls meanwhile

$0.00

spent meanwhile

0k

context consumed

1

asked permission

Why this exists

A head-up display is a piece of glass. So is this.

A HUD puts the instruments in front of the pilot so they never look down. The point is not the numbers. It is not looking away from what is flying.

You run eight agents. Your instrument is a terminal — one session, and the history dies with the tab.

Recorded, not drawn

This is it, actually running.

Everything above this line is a simulation of the product. This is the product.

REC agentglass · live capture
agentglass running: the live cockpit with spend, sessions and the radar, then the workspace — source control, diff review, pull requests, tasks, Docker, chat and a file browser, each one keystroke away.
The cockpit, then the workspace — git, diff, PR, tasks, docker, chat, files, one keystroke each. No cuts, no speed-up.
The workspace

One glass. Eight modes. One key each.

A cockpit does not give you eight screens. It gives you one, and a way to change what it is. Press G, D, P, I, O, T, C or E — on your actual keyboard.

SRC acme/shop-api · main ↑2
SOURCE CONTROL · WRITE-GATED
Msrc/routes/checkout.ts+18 −4staged
Msrc/services/pricing.ts+7 −7staged
Mtest/checkout.test.ts+41 −03 hunks
?src/lib/retry.tsnew
COMMIT MESSAGE
fix(checkout): retry the charge before failing the order
SPACE stage H hunk C commit P push
DIFF · SHIKI · WORD-LEVEL
41 const order = await cart.close(id);
42− await charge(order);
42+ await retry(() => charge(order), 3);
43 return order;
44
45 // a 502 from the PSP is not a failed order
split / unified E explain C commit from review
PULL REQUESTS · FACETS + QUERY
is:ready review:required checks:red
review:requiredchecks:redis:draftauthor:…label:…base:main
#482retry the charge before failing3✓ 1✗1 review
#479cache pricing per request5✓ 2✗required
#468flaky checkout test under load2✓ 1✗required
#471otel spans for the gate8✓filtered out
#465bump bun to 1.1.386✓filtered out
J K move open M merge — OR inside a facet, AND across
TASKS · GITHUB ISSUES · START →
#214cart total is a cent low on 3-for-2bugpricing
#209idempotency keys on the webhookin progress
#198inventory drifts after a partial refundbuginventory
#187skeleton the product grid while it loadsgood first issue
open S Start → cuts a worktree, a branch, or a Claude window
DOCKER · COMPOSE PROJECT shop
apiup 4hcpu 12% · 340MB
workerup 4hcpu 3% · 128MB
postgresup 4hcpu 41% · 1.2GB
mailhogexited 1restarting
worker | processed job 8812 in 240ms
api | POST /checkout 200 61ms
R restart L logs S stop
TERMINAL · REAL PTY · TMUX
1 shell2 server3 logstmux · native tabs
~/code/acme/shop-api $ make test
bun test v1.1 · 61 pass · 0 fail · 812ms
MAKE TARGETS · DESCRIBED
make devserver + web, watch mode
make testunit + security suite
make desktopbuild the Electron app
CHAT · DRIVES A LOCAL CLAUDE SESSION
opus 5sonnet 5acceptEditsplanbypass
why is checkout flaky under load?
The PSP returns 502 on ~2% of calls. Read src/routes/checkout.ts, Grep charge( — there is no retry. Adding one
send ⇧↵ newline — the session joins the fleet on the radar
FILES · TREE + NAME / CONTENT SEARCH
src/3 dirs · 8 files
Msrc/routes/checkout.ts+18 −4
src/services/pricing.ts2.9 KB
package.json1.2 KB
README.md3.7 KB
/ find by name ⇧/ search contents open — edits in the app's own editor

Every contact

Every tool call, token and dollar. Every provider. Every project on the machine — history is there the moment you open it.

Range to compaction

Distance from centre is context used. A contact at the edge is about to forget half of what you told it. No terminal shows you that.

Weapons free

Not just a display. Diffs, commits, pull requests merged, issues to worktrees, docker, a real shell, chat, files. One key each.

On your airframe

SQLite on your disk. Loopback by default. Nothing phones home. The app ships its own server.

Away from the desk

Leave the desk. Keep the controls.

The cockpit stays where it is — a terminal and a hunk-level diff are not things anybody drives with a thumb. The link comes with you. Your machine keeps streaming: every tool call, every token, every dollar. Most of it you never need to see. The part that stops and waits for a person leaves the desk, crosses, and lands in your hand — and your answer crosses back.

The desk · localhost:4000
Spend · this window
$0.00
0 tokens · 0k cached
HealthAll nominal
Working
3
Live agents
Events / min
0
Throughput
Tools run
0
0 events
Failed
0
Waiting
0
Uptime 04:12:00 · 4 sessions tracked
Sessions
Every agent session
4 live · 4 projects
Throughput
How busy the fleet is
0.00
events / sec · peak 0/s
dashed = avg 0.00/s · last 60s
Tool mix
What the fleet is doing
0 runs
Live
Live events
⛶ Expand
Search events — type to filter (regex ok, e.g. tool.*fail) AllToolsAlerts
Link 0.0 ev/s · 0 today
In your hand

Press 16 or
Start-up

Three lines. One switch.

No clone. No Python. No terminal. You are reading history by line 2 — arming is only for the live layer.

START-UP CHECKLISTSAFE
  1. 1 DOWNLOAD & LAUNCH SERVER SHIPS INSIDE
  2. 2 HISTORY 18 SESSIONS · NO WIRING AT ALL
  3. 3 SETTINGS ▸ HOOKS SAFE — OPT-IN
Step 3 · turn on the live layer
Try it. It writes the three hooks shown here — nothing else on your machine changes.
~/.claude/settings.json
{ "hooks": {} }
PreToolUse gateLive streamCost per event

From a checkout instead? git clone then python3 hooks/install_hooks.py — the forwarder lives in the repo, so that path wants Python 3. The desktop app has nothing to clone.

Airframes · v0.12.1

Three airframes. One binary each.

The version and every link below are stamped from the latest release when this page deploys — never a hand-typed guess. The server ships inside the app; there is nothing else to install, and nothing to clone.

macOSyour machine
Apple silicon 145 MB Intel 151 MB

First run. The build is unsigned, so Gatekeeper quarantines it and reports the app as damaged. It is not. Right-click the app ▸ Open, or clear the flag:

xattr -dr com.apple.quarantine /Applications/agentglass.app
Linuxyour machine
AppImage 163 MB .deb 128 MB

First run. Mark the AppImage executable, or install the .deb:

chmod +x agentglass_*.AppImage && ./agentglass_*.AppImage sudo apt install ./agentglass_*.deb
Windowsyour machine
Installer 126 MB

First run. Unsigned, so SmartScreen warns: More infoRun anyway.

Known gap. The terminal panel is POSIX-only and does not work here yet (#98). Everything else runs.

Rather run it from source, or want the hooks wired for every project? git clone, bun install, bun run dev — see the quickstart. Local-first either way: SQLite on your own disk, nothing phones home, and the approval queue is persisted — a crash cannot silently auto-allow. Every installer is built by CI from a tagged commit, and every asset is on the release if you want a different one. Read SECURITY.md before you install — we mean it.

Cleared for takeoff

Eight were flying. Now you see all eight.

The same eight you met at the top — still going, further along than you found them.

Theme Graphite

Open source · MIT · Bun + SQLite · React + Vite · Electron · Dark + Light · macOS, Linux, Windows