Droidtty: your coding agents, on your phone

· Droidtty

5 min read Original article ↗

Leave the desk.
Keep the agents running.

See what your coding agents are doing, answer when they need you, and open a terminal only when you have to.

Version 0.6.0 · APK · 9.1 MB · Native Android · Herdr-first · Powered by Ghostty

Droidtty tells you what matters now.

Agents spend minutes reading, editing and testing. Almost none of it needs you, so Droidtty only notifies you when something does.

1 needs you

2 working3 done

paymentsnow

GPT-5.5 Codex · checkout-redesign

Waiting for approval

$ pnpm prisma migrate deploy

Your judgment should not require a shell.

Questions and permission requests arrive as decisions you can make in a tap.

payments Waiting for approval

Approvals show the exact command and its risk. Allowing takes a deliberate hold.

agent-deck Has a question · 2m

Questions show the agent’s options, plus room for your own.

Review the result where you are.

Changed files and diffs get a native view, so you can check the work before it moves on.

  • ui/model/Status.kt +14
  • ui/home/HomeScreen.kt +16 −9
  • ui/programs/ProgramUi.kt +10 −6
  • UI/Home/HomeScreen.swift +11 −6
  • UI/Programs/ProgramViews.swift +4 −4
  • UI/Theme.swift +13

droidtty Diff · Done

KT Status.kt+14 −0 ui/model

Mark reviewed Wrap Open file

-98,6 +98,20Status.kt

98 }

99}

100

101+/**

102+ * The home card's status line, or null when it would

103+ * only repeat what the section title, the avatar badge,

104+ * the corner time or the chips already say.

105+ */

106+fun Workspace.cardLine(): String? {

107+ val a = primaryAgent

108+ return when (bucket()) {

109+ Bucket.Working -> a?.task?.activity

110+ Bucket.Done -> a?.task?.result

111+ Bucket.Idle -> if (a == null) "No agents"

112+ else a.execution.label()

113+ else -> statusLine(withElapsed = false)

114+ }

115+}

116+

117/** Contextual default tab (SPEC §8) */

-551,14 +559,13HomeScreen.kt

559 }

551− Spacer(Modifier.height(8.dp))

552− Row(verticalAlignment = CenterVertically) {

553− StatusIcon(kind, size = 13.dp)

554− Spacer(Modifier.width(7.dp))

560+ // The avatar badge carries the state

561+ // icon; this line only adds what it

562+ // doesn't say.

563+ ws.cardLine()?.let { line ->

564+ Spacer(Modifier.height(8.dp))

565 Text(

556− status,

566+ line,

567 style = Herdr.type.label,

568 maxLines = 2,

569 )

570 }

And when you need the terminal, it is a real terminal.

Open the agent’s pane or a shell in the project, drawn by Ghostty’s engine, with sticky modifiers and a draggable arrow pad.

Powered by Ghostty

droidtty Terminal · Done · 38m

Claude Code Shell

d in ~/code/droidtty λ cargo test --test integration

Compiling droidtty v0.1.0 (bridge)

Finished `test` profile in 4.21s

Running tests/integration.rs

running 3 tests

test end_to_end_demo ... ok

test program_status_end_to_end ... ok

test revoke_from_cli_closes_socket ... ok

test result: ok. 3 passed; 0 failed; in 6.87s

d in ~/code/droidtty λ git status --short

M website/src/pages/index.astro

d in ~/code/droidtty λ

Built around Herdr, rather than bolted onto it.

Droidtty doesn’t scrape terminal text. The bridge reads Herdr’s agent state, session logs and git, and sends the phone structured events.

Agent semantics

Claude Code · Codexyour agents, running on the host

Herdrworkspaces and agent status

droidtty-cliadds session logs and git

HMP v1 · pinned TLS

Droidttyon your phone

approvals and answers go back through Herdr's API, never typed into a terminal

Every agent Herdr knows, Droidtty knows by name.

All twenty-one agents Herdr detects show up with their own mark. Claude Code and Codex also get full timelines and exact approvals.

  • Claude Code
  • Codex
  • Gemini CLI
  • Cursor
  • Copilot
  • opencode
  • Amp
  • Pi
  • Droid
  • Antigravity
  • Cline
  • Devin
  • Grok
  • Hermes
  • Kilo Code
  • Kimi
  • Kiro
  • Letta
  • Mastra
  • Qoder
  • Qwen Code

Get Droidtty

Early access. The bridge runs next to Herdr, and your phone pairs with it by scanning a code.

  1. 1

    On your Mac or Linux machine, install the bridge and start it.

    npm install -g @droidtty/cli
    droidtty-cli tui

    macOS on Apple Silicon, Linux on x64 and arm64. It shows the pairing code; add --demo for a simulated herd.On a Mac, you can use the Droidtty Bridge app instead, with the pairing code, your devices and open at login:

    brew install --cask jagenaujagenau/tap/droidtty
  2. 2

    Install the app and scan the code.

Questions

Is Droidtty free?

Yes. The apps and the bridge are free and MIT licensed, and there's no account to create.

Do I need Herdr?

Yes. Droidtty is built around Herdr: the bridge reads its workspaces and agent states. To look around first, run droidtty-cli tui --demo for a simulated herd, or tap "Try the demo host" in the app.

Which agents does it work with?

Every agent Herdr detects (21 of them) shows up with its state. Claude Code and Codex also get full timelines and exact approvals, and Pi, omp and OpenCode chats show too.

Does my code go through a server?

No. There's no cloud relay: the phone connects straight to the bridge on your computer, over TLS pinned to the bridge's certificate. Push notifications, if you set them up, are the only thing that goes through a third party. See Security.

Can I use it away from home?

Yes, with Tailscale on the computer and the phone: the phone reaches the bridge at its Tailscale address, wherever you are. To keep the bridge off your local network entirely, bind it to that address.

What do I need to run it?

The bridge runs on macOS (Apple Silicon) and Linux (x64 and arm64). The Android app needs Android 9 or later; the iPhone app needs iOS 26 or later.

Is the iPhone app on the App Store?

Not yet. It's a public beta on TestFlight.

What if I lose my phone?

Run droidtty-cli revoke <device> on the computer. The phone's token stops working and its open connections close at once.

How do I hear about new versions?

Follow the changelog or its RSS feed. The bridge also tells the app when a newer version is out.