Claudes Code, terminals, and other CLI friends in your browser. Speak with the dead, jump to your phone, and lots more
Run multiple terminals in tabs | Detach & reattach sessions | Browse Claude Code history | What if tmux and Claude fell in love?
- Multi-tab terminal sessions β Run shell, Claude Code, and Codex in parallel tabs
- Split panes β Divide any tab into independent terminal panes (horizontal/vertical)
- Detach/reattach β Background terminals persist across browser sessions
- Search & browse β Filter Claude sessions by project, date, or content
- Speak with the dead β Invoke the spirits of ancient Claudes and ask them what they were thinking
- Keep it tidy β AI (or your pedantic self) names, summarizes, and organizes
- Dark/light themes β Are we savages?
- Keyboard-driven β tmux-style prefix shortcuts for power users
# Clone the repository
git clone https://github.com/danshapiro/freshell.git
cd freshell
# Install dependencies
npm install
# Configure environment
cp .env.example .env
# Edit .env and set AUTH_TOKEN to a secure random value
# Build and run
npm run serveOpen http://localhost:3001/?token=YOUR_AUTH_TOKEN
| Platform | Requirements |
|---|---|
| All | Node.js 18+ (20+ recommended), npm |
| Windows | Build tools for native modules (see below) |
| macOS | Xcode Command Line Tools |
| Linux | build-essential, python3 |
Note: WSL is optional on Windows. The app defaults to
cmd.exefor terminals. SetWINDOWS_SHELL=wslorWINDOWS_SHELL=powershellto change. WSL is only needed if your Claude sessions live inside the Linux filesystem.
Windows
macOS
- Install Xcode Command Line Tools:
xcode-select --install
- Install Node.js via Homebrew:
brew install node
Linux (Debian/Ubuntu)
# Install build dependencies
sudo apt update
sudo apt install -y build-essential python3
# Install Node.js (via NodeSource)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs# Clone
git clone https://github.com/yourusername/freshell.git
cd freshell
# Install dependencies
npm install
# Create environment file
cp .env.example .envEdit .env with your configuration:
# Required: secure random token (min 16 characters)
AUTH_TOKEN=your-secure-random-token-here
# Optional: server port (default 3001)
PORT=3001
# Windows only: shell type (cmd, powershell, or wsl). Default: cmd
# WINDOWS_SHELL=cmd
# Windows/WSL: path to Claude home (use WSL path if using WSL)
CLAUDE_HOME=\\wsl$\Ubuntu\home\your-user\.claude
WSL_DISTRO=Ubuntu
# Optional: Gemini API key for AI summaries
GOOGLE_GENERATIVE_AI_API_KEY=your-api-keyRun the client and server with hot reload:
npm run devOr run them separately:
# Terminal 1 - Server
npm run dev:server
# Terminal 2 - Client
npm run dev:client# Build and run (recommended)
npm run serveOr build and run separately:
npm run build
npm startAccess the app at http://localhost:3001/?token=YOUR_AUTH_TOKEN
freshell uses a tmux-style prefix system. Press Ctrl+B followed by a command key:
| Shortcut | Action |
|---|---|
Ctrl+B T |
New terminal tab |
Ctrl+B W |
Close current tab |
Ctrl+B S |
Sessions view |
Ctrl+B O |
Overview view |
Ctrl+B , |
Settings |
| Variable | Required | Description |
|---|---|---|
AUTH_TOKEN |
Yes | Authentication token for API and WebSocket |
PORT |
No | Server port (default: 3001) |
ALLOWED_ORIGINS |
No | Comma-separated allowed CORS origins |
CLAUDE_HOME |
No | Path to Claude config directory |
WINDOWS_SHELL |
No | Windows shell: cmd (default), powershell, or wsl |
WSL_DISTRO |
No | WSL distribution name (Windows only) |
CLAUDE_CMD |
No | Claude CLI command override |
CODEX_CMD |
No | Codex CLI command override |
GOOGLE_GENERATIVE_AI_API_KEY |
No | Gemini API key for AI summaries |
If your Claude Code sessions live inside WSL at ~/.claude, configure access from Windows:
WINDOWS_SHELL=wsl
CLAUDE_HOME=\\wsl$\Ubuntu\home\your-username\.claude
WSL_DISTRO=UbuntuThe server will watch CLAUDE_HOME/projects/**/sessions/*.jsonl for new sessions.
- AUTH_TOKEN is mandatory β The server refuses to start without it
- API authentication β All
/api/*routes requirex-auth-tokenheader - WebSocket handshake β Connections must send a valid token in the
hellomessage - Origin restriction β WebSocket connections limited to allowed origins
# Run all tests
npm test
# Run with UI
npm run test:ui
# Run specific test suites
npm run test:unit # Unit tests only
npm run test:server # Server tests only
npm run test:client # Client tests only
npm run test:coverage # With coverage report- Frontend: React 18, Redux Toolkit, Tailwind CSS, xterm.js
- Backend: Express, WebSocket (ws), node-pty
- Build: Vite, TypeScript
- AI: Vercel AI SDK with Google Gemini
freshell/
βββ src/ # Frontend source
β βββ components/ # React components
β βββ store/ # Redux store & slices
β βββ lib/ # Utilities & API client
β βββ hooks/ # Custom React hooks
βββ server/ # Backend source
β βββ index.ts # Server entry point
β βββ ws-handler.ts # WebSocket handling
β βββ claude-session.ts # Session indexer
βββ test/ # Test suites
βββ dist/ # Build output
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License β see LICENSE for details.
Made with terminals and caffeine
