Jantar
Source Install

for people who run many Claude Code sessions in Terminal on a Mac

Every Claude Code session on your Mac, on your phone.

A small daemon on your Mac and a web app on your phone. See which session is waiting on you, then approve, answer or send the next prompt from wherever you are.

Free · source-available, FSL-1.1-MIT · v0.5.2, early
Runs on your Mac · no Jantar server or account · macOS and Terminal.app

infra · terraform plan · waiting 4m

A plan waiting in the terminal, answered from the phone: Yes and use auto mode (hold), Yes and approve edits by hand, Tell Claude what to change.

Same dialog, as buttonstyped only while the Mac shows it

Terminal.app · infra

Example: a Terraform plan waiting in Terminal on the Mac, and the same plan on the phone with its three options as buttons.

Example data

Example datajantar doctor's output, written out for a synthetic Mac: 7 of its 15 checks

jantar doctor

  • okmacOSmacOS (launchd, Terminal.app)
  • okDaemonjantard 0.5.2 answers on /Users/you/.jantar/run/ctl.sock; LaunchAgent at /Users/you/Library/LaunchAgents/com.jantar.daemon.plist
  • okPort127.0.0.1:7420 (jantard)
  • okcswap0.26.4 (/Users/you/.local/bin/cswap --version); 11 profile dirs, usage cache 2m old
  • okClaude Code/Users/you/.local/bin/claude (2.1.314)
  • okClaude hooksinstalled (/Users/you/.jantar/bin/jantar-hook)
  • okTailscaleServe: https://mac.example.ts.net -> 127.0.0.1:7420 (tailnet only)
  • 13 ok, 0 warnings, 0 failures, 2 notes

why it exists

Claude stops to ask. The tab it is waiting in sits behind eleven others.

twelve tabs in Terminal.app

Three of these are waiting on you.

Example data

  1. 01

    A dozen sessions in a dozen tabs. Which are working, which are done, and which are waiting on you?

  2. 02

    A permission prompt, a plan or a question stops a session until you answer it. If you are away from the Mac, it waits.

  3. 03

    With several Claude accounts, each 5-hour window fills at its own pace. You find out when a session stalls.

Jantar puts every session on one board, on the Mac and on your phone, and lets you answer from either.

jantar open

See every session. Answer the ones waiting on you.

The board lists every Claude Code session in Terminal.app, the ones that need you first. Each row says what it waits on: the question, the plan or the command. Open one and answer with the same options the Mac shows.

Every screen on this page is synthetic example data.

jantar open · 15 sessions · 3 need you

The Board on the phone: 3 need you (a question in web-app, a plan in infra, a Bash command in api-server), then your turn and working.
The Board on a Mac: three sessions need you, then your turn and working; the Desk shows a question, a plan and a Bash command to answer, and the next resets.
A permission card on the phone: run pnpm prisma migrate reset --force in api-server? Yes, Always allow (a 2-second hold that saves the rule), No, and No and stop Claude.

2 s holdto save a rule

Example data

cards
With Claude Code's hooks installed (opt-in: jantar hooks install --apply), a permission prompt, a question or a plan becomes a card that answers through Claude Code itself. The hooks fail open: with Jantar stopped, Claude behaves as usual.
hold
Rows that save a rule or switch to a mode that doesn't ask need a 2-second hold.
send
A prompt counts as sent only when the session's transcript shows it arrived. If it doesn't, the phone says Not delivered and offers Retry.
attach
Photos and files from the phone go to the Mac, and Claude reads them from there. Photos are drawn again as JPEG, which drops their location data. Up to 10 files a prompt.
start
Start a new session in any folder you allow, or resume the last one. The sheet shows the exact command line before you hold to start. It needs both jantar launch on at the Mac and a phone granted launch: jantar devices grant <device> launch.

More: The app, screen by screen

jantar controls · on by default

Without the hooks, Jantar reads the dialog off the screen. It types only while that dialog is still there.

api-server · Bash command

Terminal.app · api-server

A Bash prompt read off the terminal: Yes, two rows that need a hold and say what they change, and No.

Typed only if unchangedchecked in the run that types

Example: a Bash permission prompt in Terminal on the Mac, and the same prompt on the phone as buttons.

Example data

A session that started before the hooks, or a subagent asking, still waits on a dialog in Terminal. The phone shows that dialog's question and Claude's own options as buttons.

Before and after it types

  1. Reads the screen again, under the session's lock, and compares it with what you tapped.
  2. Checks the dialog once more in the same AppleScript run that types, and types nothing if it changed.
  3. Sends only arrow keys; Terminal adds the one Return. Never a digit, Tab or Shift+Tab.
  4. Reads the screen until the dialog has closed or changed.
The keypad under Claude's model list, which Jantar can't turn into buttons: the screen's lines, two moves down counted, and Enter.

A screen Jantar can't turn into buttons gets a keypad: ↓, ↑ and Enter, sent in one write and only while the lines you counted on are unchanged. Rows it can't answer safely stay greyed, with one line saying why. Show on Mac is on every dock.

More: Every dialog, and what each button types

jantar accounts · cswap optional

One Claude login is enough. With cswap, every account's 5-hour window on one screen.

Jantar decides at start. On one login it runs on that login. With cswap and several accounts it shows each one's 5-hour and weekly use, when it resets, and which sessions run on it.

What Jantar does with accounts in v0.5.2
WhatStatus
Each account's 5-hour and weekly use, against the ceilingwith cswap
When each 5-hour window resets, and the sessions on each accountwith cswap
New sessions on Auto start on the account with the most 5-hour roomyes
Accounts kept for other work: Auto, Rewrite and Ask Claude never pick themjantar accounts keep
Start an idle account's 5-hour window early with one tiny messageopt-in: jantar accounts prime on
Move a running session to another account when one fills up (autoswitch)not yet · on the roadmap

More: One account or many · The primer

11 accounts · next resets

Accounts with cswap: each account's 5-hour use against the ceiling, and when its window resets.

When each window resetsread from cswap's cache

Example data

Jantar shows each account's use. It does not move a session from one account to another.

jantar meetings on · Chrome extension

Your Meet and Teams calls, kept on your Mac. Captions and a summary. No recording.

launch review · 38 min

A meeting: its summary, decisions and action items, one already in the project's todos.

No audio · no botthe call's own captions

Example data

A Chrome extension keeps the call's live captions, the words Google or Microsoft already show you. After the call, one Claude run writes the summary, the decisions and the action items.

Keeps

  • Caption lines with the speaker and the time, from when you press Start notes.
  • A summary, decisions and action items. One tap puts an item in a project's todos.
  • The screenshots you click: the camera button, Option+Shift+S or the toolbar. Not yet seen working on a real call.

Never

  • Audio or video, or a bot in the call.
  • Anything before you press Start notes, beyond whether you are in a call and the page title.
  • Your screenshots, off the Mac. Only the transcript text goes to Claude, for the summary, through Claude Code on your account.

Chrome 120 or newer, Meet and Teams on the web. Loaded unpacked for now; it is not in the Chrome Web Store yet. Screenshots have not yet reached Jantar on a real call; captions and the summary have (the Meetings checks). Captions show only on your screen, so say at the start of the call that you keep notes.

More: The extension guide · Extension privacy

jantar life on <module>

A small life list beside the board. Each part stays off until you switch it on.

Today puts medicines due, todos, bills and calories on one screen, next to the sessions that need you. Turn on only the parts you want, at the Mac.

five screens · Life and the Intel shelf

Today: two medicines due at 13:00, then the todos due.

Today

Medicines: the day's doses and each medicine's supply.

Medicines

Food: 1,240 of 2,000 kcal and the weight line.

Food

Finance: spending by category against budgets, and bills.

Finance

The Intel shelf: saved links with type filters.

Intel

Example data

todos
Reminders that ping your phone, daily to monthly repeats, and small projects linked to a folder. The board shows a project on that folder's sessions.
medicines
Dose times, Taken or Skip, a pill count with a refill warning. The lock screen says Medicine due, without the name, by default.
food
Calories and saved foods. Ask Claude estimates a meal you type, and you edit it before it is saved.
places
Cafés and their best dishes.
finance
Spending by category against budgets, and bills that remind you.
intel
A read-only shelf over JSONL files your scripts append to. jantar intel on.

Pings need the Mac awake. Keep your phone's own alarm for a dose you must not miss.

More: Life · Intel shelf

127.0.0.1 only

Your Mac, your tunnel, your phone. Nothing goes to a server of ours. There isn't one.

Your machines

Your Mac

jantard, a small daemon under launchd, listening on 127.0.0.1 only. It reads Claude Code's session files and transcripts and Terminal's text, and types only what you send or answer.

  • Claude Code hooks (optional)a local socket
  • the jantar CLIa local socket
  • the Chrome extension127.0.0.1, with its own key

Your front door

Tailscale Serve, private to your tailnet (recommended), or a Cloudflare Tunnel on your own domain with Access in front.

Your phone

The web app on your Home Screen, paired once with a QR code that works once, for 10 minutes. Every write carries the device's secret.

Leaves your machines

Anthropic
What Claude Code sends anyway, plus the text of Jantar's own Claude runs when you turn them on: Rewrite, Ask Claude, meeting summaries and the primer's one-line message. All on your account. When Jantar is the cswap list --json poller, cswap asks Anthropic for usage on Jantar's schedule.
Apple or Google
Push notifications, encrypted to your device.
Cloudflare, if you pick it
Your traffic to the phone. TLS ends at Cloudflare, so Cloudflare can read it.

No telemetry, and no account with this project.

More: What leaves the Mac · How it is put together

privacy and security

A phone that can approve can run commands. So Jantar is reachable by as little as possible.

A paired phone can

  • See the board, the transcripts and what each session waits on.
  • Answer cards and terminal dialogs, and send prompts and files.
  • Start sessions, once the Mac turns launching on and grants it that (jantar devices grant).

No phone can

  • Turn a feature on, add a folder or grant itself a scope. Every switch is set at the Mac.
  • Start a session with a flag that isn't on a fixed list. There is no free-text flag.
  • Read or write a session without being paired. Over the network, every /v1 route but the pairing claim needs a paired device.
  • A dialog answer is typed only if the dialog is still exactly what you tapped, checked in the same AppleScript run that types it. A key pressed at the Mac in those few milliseconds can still come first: what compare-and-type can't close.
  • Treat a paired phone like your Mac's keyboard. Anything running as you on the Mac can reach Jantar's local sockets too, and could pair itself as a device; SECURITY.md says what that means.
  • Logs carry no prompt text by default. Life, Intel and Meetings text never goes into events, logs or audit rows.
  • Every test runs against a synthetic Mac: a fake Terminal, claude and cswap. The dialog and privacy suites record every keystroke Jantar would type. What has been tried on a real Mac is listed, with dates.

In the cloned, built repo, try it read-only first, with a throwaway state folder:

export JANTAR_HOME=/tmp/jantar-try
node packages/daemon/bin/jantard.mjs \
  --read-only --no-terminal --port 7491

Try it without touching anything

Found a problem? Report it privately through GitHub's private vulnerability reporting, not in a public issue. How to report · The threat model

v0.5.2 · early

What doesn't work yet.

An early release, tested on a synthetic Mac and tried on a real one. These are the limits today.

terminals
Terminal.app only today. Linux servers with tmux come next (v0.6, being built now); iTerm2 and Ghostty after.
sleep
Medicine and reminder pings come from the daemon, so they need the Mac awake.
dialogs
Some dialog rows stay at the Mac until their real-Mac check passes.
meetings
Screenshots from the extension have not yet worked on a real call, and the extension is loaded unpacked: it is not in the Chrome Web Store.
accounts
Jantar does not move sessions between accounts, and sends no Telegram messages or Mac banners.
safari
Safari may refuse the daemon's cookie on plain http://127.0.0.1. On the Mac, use Chrome for jantar open, or your front door's HTTPS address.

More: Real-Mac checks · Roadmap · Known limits

macOS · Terminal.app · Node 22.13 or newer

Clone, build, install, pair.

You need

  • A Mac with Terminal.app (the only terminal so far)
  • Node.js 22.13 or newer, and pnpm 10
  • Claude Code, signed in (one account is enough)
  • For the phone: Tailscale (recommended) or a Cloudflare Tunnel
  • Optional: cswap for several Claude accounts; Chrome 120 or newer for Meetings
git clone https://github.com/Namanjain-share/jantar.git && cd jantar
pnpm install && pnpm -r build
alias jantar="node $PWD/packages/cli/bin/jantar.mjs"
jantar init            # asks a few questions, writes ~/.jantar/config.json
jantar install         # the LaunchAgent, then a health check
jantar open            # the dashboard on this Mac
jantar remote setup    # how to reach it from your phone (Tailscale or Cloudflare)
jantar pair            # a QR code for your phone, good once, for 10 minutes

The alias lasts for this Terminal window. To keep the jantar command, put the CLI on your PATH, for example with cd packages/cli && pnpm link --global.

More: Install, step by step · Reach it from your phone

FSL-1.1-MIT

Free to use, read and change.

Jantar is free: there is no paid plan and no account with this project. Claude Code runs on your own Claude login, as it does without Jantar, and so do the parts that run Claude for you.

It is source-available (fair source), under the Functional Source License with the MIT future license. You may use it, change it, self-host it and share it for any purpose except offering it to others as a competing commercial product or service. Your own use, at home or at work, is fine.

Two years after each version is released, that version is also available under the MIT license.

This is a summary, not legal advice. The LICENSE file is what counts.

license
FSL-1.1-MIT, in LICENSE
contributions
Under CLA.md; a bot asks you to sign it on your first pull request. Contributing
this site
Archivo and JetBrains Mono, SIL Open Font License 1.1 (font licences)

before you install

Questions worth asking first.

Do I need cswap?

No. One Claude login is enough, and Jantar finds it. cswap adds usage bars, several accounts and the primer.

Can I run it on my server?

Not yet, and it is next. v0.6 runs Jantar on a Linux server with Claude Code in tmux, as a systemd service, so you can run everything there and control it entirely from your phone. It is being built now; see the roadmap. iTerm2 and Ghostty come after.

Do I need an API key?

No. Jantar uses Claude Code's own login. Its own Claude runs (Rewrite, Ask Claude, the primer, meeting summaries) run claude, or cswap run, with any API key or token taken out of the environment, so they use your subscription login.

Is my data sent anywhere?

Not to us: there is no Jantar server and no telemetry. Your phone reaches your Mac through your own tailnet or tunnel. What goes to Anthropic is what Claude Code sends anyway, plus the text of Jantar's own Claude runs when you turn them on. Notifications go through Apple's or Google's push service, encrypted to your device. A meeting's screenshots never leave the Mac.

Can a phone turn a feature on or widen its own reach?

No. If a lost or borrowed phone could turn on Files or starting sessions, pairing would protect much less. Every switch, folder, scope grant and the programs the daemon runs are set with the jantar command on the Mac. While a part is off, the phone shows the command that turns it on.

What does Jantar type into my terminal?

Only what you send or answer, and the control keys you press (Shift+Tab, Interrupt, Clear draft, Escape). A prompt counts as sent only when the transcript shows it. Inside a dialog it never sends a digit, Tab or Shift+Tab.

What happens to Claude when Jantar is not running?

Nothing changes. The hooks fail open: with the daemon down, Claude behaves as if they were not there. JANTAR_SKIP_HOOKS=1 turns them off for one session.

Does Meetings record the call?

No audio, no video and no bot. After you press Start notes it keeps the call's live captions, the words Google or Microsoft already show you, and the screenshots you click. Those screenshots have not yet reached Jantar on a real call.

What if my Mac is asleep?

Then the phone can't reach it, and medicine and reminder pings wait. Keep your phone's own alarm for anything you must not miss.

Is it made by Anthropic?

No. Jantar is independent, and not affiliated with or endorsed by Anthropic. It works with the files and hooks Claude Code exposes.

More: All questions and known limits

Leave the desk. The board comes with you.

v0.5.2 · macOS and Terminal.app · FSL-1.1-MIT · not affiliated with Anthropic