muffintui
muffintui is the crates.io package for a Rust terminal workspace that runs as the muffin command.
It is designed to keep file navigation, shell work, and AI-assisted workflows in one terminal UI.

It gives you four panes inside a project directory:
- Files
- File Viewer / Diff Viewer
- Terminal
- Shell / Codex / Claude
The right pane can also enter a dedicated focus mode that expands that live session to the full terminal while keeping the same embedded shell, Codex, or Claude process.
It starts in the current working directory and uses that directory as:
- the root of the file tree
- the working directory for shell commands
- the working directory for the right-hand interactive session
Requirements
- Rust and Cargo
codexonPATHif you want--codexclaudeonPATHif you want--claudengrokonPATHif you want remote share
Setup Prerequisites
1. Install Rust and Cargo
If rustc and cargo are not installed yet, install them with rustup:
|
After installation, restart your shell or load Cargo's environment:
Verify the installation:
2. Install optional right-pane CLIs
By default, muffin starts a shell in the right pane.
If you want to start directly in Codex mode, verify that codex is available:
If needed, authenticate it:
If you want to start directly in Claude mode, verify that claude is available:
3. Set up ngrok for remote share
Remote share uses ngrok to publish a temporary HTTPS URL for the local remote-control page.
Install ngrok first. On macOS with Homebrew:
Then authenticate it with your ngrok account authtoken:
Verify that the CLI is installed and the config is valid:
Notes:
muffinstartsngrok http 127.0.0.1:<port>when you enable remote share.- The app also reads the local ngrok API on
127.0.0.1:4040to discover the public URL. - If
ngrokis installed but not authenticated, remote share will fail to start.
4. Sanity check
Before installing or running muffin, this should work:
Install
Install from crates.io:
This installs the executable as:
Install from the local checkout:
That local install also provides the muffin executable.
Run
Launch in the current directory:
Use muffin --help to list available startup flags.
Launch with Codex in the right pane:
Launch with Claude in the right pane:
Launch against another project:
Run without installing during local development:
Pass startup flags through Cargo with an extra --:
What It Does
- Shows a navigable file tree rooted at the current directory
- Highlights updated files and changed directories in the Files pane using the active theme
- Opens the selected file in a read-only file viewer
- Highlights source code in normal file view with theme-aware colors
- Toggles a diff viewer against
HEAD~1 - Runs shell commands inside the built-in terminal pane with
sh -lc - Starts the right pane as a shell by default
- Can start the right pane with
codexorclaude - Can toggle the right pane into a full-screen focus mode with
Ctrl+F - Can expose the right pane through a temporary ngrok URL for phone viewing and limited remote control
- Cycles between three built-in themes
- Ships with integration tests under
tests/
Notes:
.gitandtargetare intentionally hidden from the file tree- The built-in terminal pane starts empty
- Diff mode falls back to a message when the repository has no
HEAD~1 - If the initial right-pane launch fails, pressing
Enterin that pane retries the same mode - If a
codexorclaudesession exits, the app automatically switches that pane back to a shell - If
codexorclaudeis not installed, the rest of the TUI still works and the right pane shows the startup error - Remote share mirrors only the right pane session, not the full TUI
- Focus mode only changes the layout; it does not start a separate session
- Remote share depends on
ngrokbeing installed, logged in, and able to publish a tunnel
Remote Share
Remote share lets you open the active right pane on your phone through a temporary ngrok URL. It is intended for lightweight approval and interruption flows while a shell, Codex, or Claude session is running.
How to start it
- Launch
muffin. - Move focus to the right pane.
- Press
Ctrl+R. - Scan the QR code overlay, or open the printed ngrok URL manually.
When remote share starts, muffin:
- starts a local HTTP server on an ephemeral port
- starts
ngrok http 127.0.0.1:<port> - prints the public URL in the terminal pane
- shows a QR overlay in the TUI
- writes a QR SVG to your temp directory
The overlay can be dismissed with Esc. This only closes the overlay. The remote share session keeps running until you press Ctrl+R again in the right pane.
What the phone page can do
The mobile page polls the active right pane and shows:
- the current session mode
- the current right-pane status line
- a recent text snapshot of the right pane output
It also exposes four actions:
Approve / Enter: sendsEnterSend y: sendsySend n: sendsnCtrl+C: interrupts the active right-pane session
This is enough for common remote approval prompts, continuing a command, rejecting a prompt, or interrupting a long-running session.
Limits and behavior
- Remote share only works while there is a live right-pane session to control.
- If no live session exists, remote actions are ignored.
- The shared page is text-only and optimized for phone-sized screens.
- The page refreshes automatically on an interval, so it is a near-live mirror rather than a full interactive terminal.
- The shared URL includes a random token and is scoped to the current app session.
- Stopping remote share kills the ngrok tunnel.
Troubleshooting
If Ctrl+R fails to start remote share, check the terminal pane for the exact error. Common causes:
ngrokis not installedngrokis installed but not authenticatedngrokcould not publish a public URL within the startup timeout- local access to the ngrok API on
127.0.0.1:4040is unavailable
Keybindings
Global
Tab: move focus to the next paneShift+Tab: cycle the themeEsc: quitCtrl+C: quit when focus is not in the Codex pane
Files Pane
Upork: move selection upDownorj: move selection downEnteron a directory: expand or collapse itEnteron a file: open it in the file viewer
Notes:
- Files with git changes are highlighted
- Directories are highlighted when they contain changed files
File Viewer / Diff Viewer
Ctrl+D: toggle between file view and diff viewPageUp: scroll upPageDown: scroll down
Terminal Pane
- Type directly into the prompt
Enter: run the current commandBackspace: delete one characterPageUp: scroll backPageDown: scroll forwardHome: jump to the oldest visible terminal historyEnd: jump back to the live prompt
Right Pane
- Regular typing: send input to the active shell, Codex, or Claude session
Enter: submit input, or retry the session if startup failedCtrl+C: send interrupt to the active right-pane sessionCtrl+F: toggle right-pane focus modeCtrl+R: start or stop remote shareArrow keys,PageUp,PageDown,Home,End,Tab,Backspace: forwarded to the embedded session
Notes:
- While focus mode is off,
Tableaves the right pane and moves focus to the next pane - While focus mode is on,
Tabis sent directly to the embedded session and the right pane fills the screen
Publish
Before publishing:
Push the release commit first:
Then publish the crate:
Contributions and issue reports are welcome.
Test
Run the integration test suite with: