Claude Code,
the thinnest UI wrapper.

Run the real Claude Code, Codex, and Gemini CLI agent loop in a native Mac app, on your own Claude Pro or Max account. Sessions survive restarts, fork any chat in one click, nothing gets auto-compacted. Free and open source.

Bring your own Claude accountUp to 40 parallel chatsSessions survive restartNo auto-compactingFree & open source
View on GitHub

Why I stopped running it raw

Three things that drove me to wrap it

I use CLI agents every day. These three problems made me build Fazm around them.

Persistence

Your coding sessions survive a Mac restart.

Raw CLI

Raw CLI: restart your Mac, every active session is gone. No history, no branch state, nothing to resume.

Fazm

Fazm: every chat window comes back automatically with the full conversation history intact. Pick up mid-task after a reboot.

Raw Claude Codein Terminal.app
claude — 80x24
Claude Code v2.1.152Opus 4.7 · Claude Max~/fazm
> Refactor the auth middleware
fazm.
Fazmfloating chat window
fazm.Sonnet 4.6
Refactor the auth middleware
Reading auth.ts and middleware.ts. Found 3 functions to migrate to JWT.
Should I keep session cookies for the rollback path?
Yes, keep them.
Ask anything...
Your coding sessions survive a Mac restart. No resume command, no lost state.
Forking

One button to fork any chat.

Raw CLI

Raw CLI: exit the session, find the session ID, resume on a branch, hope you copied the right state.

Fazm

Fazm: click fork. New window opens with the full prior context. The original chat stays untouched. Run parallel approaches.

Fork chat
live
fazm
Refactor the auth middleware
I'll start by reading auth.ts. Two approaches: keep it stateful or move to JWT.
Try both, I want to compare.
Ask anything...

Original stays put. New window opens with full prior context.

Context

Never lose context to a compact again.

Raw CLI

Raw CLI: long sessions get auto-compacted near the context limit. Earlier turns summarized away, detail dropped.

Fazm

Fazm: full chat history stays live in context for the window's lifetime. No silent summarization. What you said is what the agent sees.

Raw CLI
30%
Refactor the auth flow, keep the JWT_SECRET env var, do not change session cookies.
Got it. I'll start by reading auth.ts and middleware.ts, then propose a plan that preserves JWT_SECRET and the cookie shape.
Also make sure the rate limiter on /login keeps the 5 req/min cap.
Confirmed. I see the limiter in rate-limit.ts. Five per minute, sliding window. I'll leave it untouched.
What does verifyAccessToken currently do?
It decodes the bearer token with JWT_SECRET, validates exp + iss, and returns the userId or throws AuthError.
Good. Extract that into a shared helper.
Extracted into lib/auth/verify.ts. Both /api/* and middleware.ts now import from there. JWT_SECRET path is unchanged.
Run the tests.
47 / 47 passing. auth.spec.ts and middleware.spec.ts both green.
Add a test that proves the cookie name didn't change.
Added cookie-shape.spec.ts asserting the Set-Cookie header still uses fazm_session as the name.
12 messages compacted to a summary. Detail dropped.
Fazm
Full history preserved
30%
Refactor the auth flow, keep the JWT_SECRET env var, do not change session cookies.
Got it. I'll start by reading auth.ts and middleware.ts, then propose a plan that preserves JWT_SECRET and the cookie shape.
Also make sure the rate limiter on /login keeps the 5 req/min cap.
Confirmed. I see the limiter in rate-limit.ts. Five per minute, sliding window. I'll leave it untouched.
What does verifyAccessToken currently do?
It decodes the bearer token with JWT_SECRET, validates exp + iss, and returns the userId or throws AuthError.
Good. Extract that into a shared helper.
Extracted into lib/auth/verify.ts. Both /api/* and middleware.ts now import from there. JWT_SECRET path is unchanged.
Run the tests.
47 / 47 passing. auth.spec.ts and middleware.spec.ts both green.
Add a test that proves the cookie name didn't change.
Added cookie-shape.spec.ts asserting the Set-Cookie header still uses fazm_session as the name.
All 18 turns still in context. Nothing summarized.

Run wide, not deep

Up to 40 parallel chat windows

One Mac. Forty independent agents working at the same time. Each window keeps its own context, model, and workspace.

fazm desktop
1 / 40parallel chats
FL
Fix login bug
DS
Draft Sarah's email
RA
Refactor auth
PD
Postmortem doc
SP
Ship the PR
CR
Code review
TD
Translate doc
GI
Generate icons
MD
Migrate database
IS
Investigate Sentry alert
RI
Reply to investor
SS
Schedule standup
SM
Summarize meeting
RV
Rename variables
WC
Write changelog
AL
Audit landing page
TG
Triage GitHub issues
GT
Generate test cases
RI
Reconcile invoices

Swap brains mid-chat

Rotate model providers without leaving the session

Start on Claude, hand off to GPT, finish with Gemini. Same chat, same context, different brains, one click.

F
Fazm
AClaude Sonnet 4.6
Refactor the auth middleware

Same session. Same context. Different brains.

Better than Wispr Flow

Push-to-talk, built into the agent

Hold Left Control, talk, release. The transcript goes straight to the chat, no second app, no clipboard, no subscription.

Push to talk that lives inside the chat.

Wispr Flow
Subscription required
menubar
waiting for speech...
  1. 1Open Wispr Flow
  2. 2Hold hotkey
  3. 3Speak transcript
  4. 4Copied to clipboard
  5. 5Switch to terminal
  6. 6Paste manually

Six steps. Two apps. One context switch.

fazm
One step
Hold Left Control
Ask anything...

Same key. Same bar. Zero context switch.

No more slash commands

Compact UI with one-tap actions

Fork, copy, pop out, switch model, mute voice. Every action you used to type a slash command for is one click away.

Raw terminal CLI
$ claude
claude> /resume session-abc123
Loading session history...
- reading 4823 tokens
- reading 12911 tokens
claude> /fork session-abc123
Fazm floating bar
live
Refactor the auth flow
I'll start by reading auth.ts and middleware.ts to map the current flow, then propose a plan.
Switch model

Bonus

Reach beyond the terminal

The same Claude agent loop, but it can also touch your browser, your Mac apps, and your phone.

Voice in

Hold Left Control, talk. Same agent, no typing.

Browser control

Drives Chrome via the extension. DOM, cookies, forms, scraping.

Native Mac apps

Finder, Mail, Slack, Settings, anything with accessibility APIs.

Three providers in one UI

Claude, GPT, Gemini. Switch per chat or mid-session, same window.

MCP servers

Full MCP support, your existing tools work as-is.

Phone remote

Scan a QR, drive your Mac from chat.fazm.ai on your phone.

From real users

People love it

I run my entire workday through Fazm - Jira tickets, Slack announcements, postmortems, even checking my vacation days. All in Russian. It just works.
D

DevOps Engineer

Frankfurt

There are things I literally couldn't get myself to do (hello, procrastination), and now I just get them done through Fazm.
D

Dmytro S.

Software Engineer

Your demo videos were genuinely excellent - seeing you walk through it yourself made me download Fazm immediately.
Y

Yong

South Korea

How it works

1

Install Fazm

Enter your email, get the download link. Floating bar appears, hotkey ready.

2

Connect your Claude account

Settings, Claude Account. Your Pro or Max plan, your usage.

3

Use it like a CLI agent

Same agent loop, plus 40 parallel chats, one-click fork, mid-session model switch, push-to-talk, voice and Mac control.

Common questions

Claude Code, Codex, and Gemini CLI in one Mac app

Get Fazm on your Mac

The Claude agent loop you already use, with persistent sessions and one-click fork.

View on GitHub