Public beta · pre-1.0

A terminal
coding agent
that actually
listens.

Your intent is the starting point.
Your boundaries stay in place.

Read the documentation

Node.js 22+ / macOS · Linux · Windows

FIG. 001 / A listening instrument
Attentive. By construction.↗ 00.00 / IDLE
Built around the way you work.Scroll to see it listen
01 / The difference is in the turn

First, understand.
Then, act.

Follow one small fix from an ambiguous request to a verified change.

01 / listening

A small request. Two possible meanings.

“Fix the session picker” could mean the wrong ordering, or the wrong session. That difference is worth a question.

02 / ambiguity

One question changes the work.

Earshot asks at the point where an assumption would send the work in a different direction.

03 / scope

Agree on the boundary.

The intended files and behavior become an explicit scope before the first change.

04 / acting

Read before changing.

A tool batch has a reason. The existing code explains why timestamp ties produce an unstable order.

05 / permission

The diff is the permission.

Read the actual change. This replay waits for “Allow once” before showing the result.

06 / steering

Change direction. Keep context.

A message typed while Earshot works arrives at the next model call. No cancellation or re-explanation.

07 / verification

Verification has an output.

The test command and its result belong in the record. A green indicator is only useful when you know what it means.

08 / verification

Done has a precise meaning.

What changed, what passed, and what was not checked. The completion report keeps those distinctions visible.

Listening core

listening

1 / 8 · listening

A small request. Two possible meanings.

“Fix the session picker” could mean the wrong ordering, or the wrong session. That difference is worth a question.

earshot~/project · ask
Fix the session picker. It keeps opening the wrong one.
Not yet declared1 / 8

Illustrative replay · not a customer transcript

A small request. Two possible meanings. Fix the session picker. It keeps opening the wrong one.

Read the complete replay as text

A small request. Two possible meanings.

Fix the session picker. It keeps opening the wrong one.

One question changes the work.

Does the picker show sessions in the wrong order, or open a different session than the one you select? The order. The newest session should come first.

Agree on the boundary.

declare_scope I’ll fix newest-first ordering in src/sessions.ts and cover it in test/sessions.test.ts. No picker redesign or new dependencies.

Read before changing.

I’ll inspect the sort and the session-ordering tests. read src/sessions.ts read test/sessions.test.ts The list sorts oldest first. I’ll reverse the comparison and add a deterministic tie-break.

The diff is the permission.

Edit(src/sessions.ts) · no rule covers this

--- a/src/sessions.ts
+++ b/src/sessions.ts
@@ -18,1 +18,2 @@
-  return sessions.sort((a, b) => a.createdAt - b.createdAt);
+  return sessions.sort((a, b) =>
+    b.createdAt - a.createdAt || a.id.localeCompare(b.id));

Change direction. Keep context.

Keep equal timestamps ordered by id, too. That fits the declared scope. The tie-break uses id; I’ll cover equal timestamps in the test. edit test/sessions.test.ts · Allow once (illustrated)

Verification has an output.

bash · bun test test/sessions.test.ts Allow once (illustrated) 2 pass 0 fail Ran 2 tests across 1 file.

Done has a precise meaning.

Sessions now sort newest first, with an id tie-break for equal timestamps. Added both ordering tests; 2 passed. I did not run the full suite or manually check the terminal picker.

02 / Trust is a behavior

A boundary.
Not a suggestion.

Trust lives in what an agent can do—and what it cannot approve for itself.

01

Declare the scope

Name the intended files and behavior. A move outside the declared scope asks for confirmation.

Intent → allowed region
02

Deny comes first

Explicit deny rules win across every scope and every mode. An allow rule never cancels a deny.

Deny → stop
03

Show the actual action

The real command. The complete diff. You approve what will happen, with the detail needed to decide.

Review → allow once
04

Keep authority with you

Files, skills, hooks, and MCP servers cannot grant themselves permission. Instructions are not approval.

Your decision → execution
Read the permission model ↗
03 / Bring the model

Your model.
The same earshot.

Switch providers without leaving the conversation. The transcript, permission rules, and working context remain yours.

Illustrative interaction
/model anthropic/claude-opus-5

Model → anthropic/claude-opus-5

API key · cloud
Context retainedSame permission rulesSame session
19built-in providers
896catalogued models

Cloud APIs. Local runtimes. Your own OpenAI-compatible endpoint. Inspect model pricing and context windows with earshot models.

Explore providers ↗

Catalog snapshot 2026-09-03. Live model availability changes by provider. Broader live-API verification remains in progress.

04 / A continuous thread

Change direction.
Keep what matters.

One connected system, from a correction in the terminal to the next session in your editor.

See how it fits together ↗
05 / Within earshot

Start with
something real.

Open a project. Bring a task.
Let the first useful question set the direction.

01 earshot doctorCheck your setup02 earshotChoose a provider. Start a turn.

Node.js 22+ for npm · macOS, Linux, Windows
Windows requires Git Bash. Standalone binaries embed their runtime.