Tab(ter)minal, the Cloud-Native, Proactive AI Integrated Terminal works in modern browsers. Seamlessly code from your desktop, tablet, or phone with an intelligent, persistent, and rich experience. This project was built using Gemini and Codex wich 80% vibe-coding, means
built for the vibe, with the vibe.
t> Tabminal bridges the gap between traditional CLI tools and modern AI capabilities, all while solving the UX challenges of coding on desktop and mobile devices.
As a long-time terminal user who frequently needs to step away from my computer while maintaining my workflow, and considering the various scalability issues of traditional terminals alongside the irreversible trend of vibe-coding, I reconsidered a solution that would first serve my own needs. Then, it would serve others whose workflows happen to be similar to mine. So, while waiting for AI to write code for the company, I tried to vibe a terminal from scratch that could meet my daily work needs and that I would enjoy using. As a result, I intermittently wrote this project. I believe this project is not for everyone. However, it is especially suitable for CLI and AI enthusiasts, which is the core motivation behind this project's creation.
Server-side session persistenceensures your sessions with the AI agent are maintained, allowing you to pick up where you left off at any time.Fast and stable connection managementdelivers a seamless, agile experience across platforms and devices, with native support for network roaming.- Enjoy a comprehensive
Progressive Web App (PWA) experienceanytime, anywhere; all you need is a modern browser to start working. Proactive AI integrationmeans your terminal becomes your work context. You can ask questions about your current session at any time, and the AI will automatically retrieve the context to accurately solve problems, even proactively offering assistance when commands fail.Cloud-native designenables access via Zero Trust or VPN, providing unprecedented convenience for managing cloud servers.
Powered by modern AI models (via OpenRouter or OpenAI), t> Tabminal understands your context.
(Defaults to Gemini 3 Flash for OpenRouter or GPT-5.2 for OpenAI if not configured)
- Context-Aware Chat: Type
# how do I...to ask questions. The AI knows your CWD, Environment, and Recent History. - Auto-Fix: Command failed?
t> Tabminalautomatically analyzes the exit code and error output to suggest fixes. No copy-pasting required. - Web Search: Enable Google Search integration to let the AI fetch real-time answers from the web.
- Provider Risk Notice: AI features may send terminal context to your selected model provider. You are responsible for choosing trusted providers/models and acceptable data boundaries.
Built from the ground up for iPadOS, iOS and Android.
- HHKB Virtual Keyboard: You can perform nearly all terminal operations on any device, without being frustrated by os limitations.
- Responsive Layout: Auto-adapts to landscape/portrait modes, respecting Safe Areas and Notches.
- PWA Ready: Install to Home Screen for a full-screen, native app feel.
- Persistent Sessions: Your terminal state lives on the server. Refresh or switch devices without losing your work.
- Built-in Editor: Integrated Monaco Editor (VS Code core) allows you to edit files directly on the server.
- Visual File Manager: Sidebar file tree for easy navigation.
- Network Heartbeat: Real-time latency visualization.
- Cluster Host Registry: Multi-host entries are stored on the main server at
~/.tabminal/cluster.json(including per-host auth hash). Entries that resolve to the current node are ignored at runtime to avoid self-loop duplicates. Non-main host tokens are restored from this server-side registry; main-host auth stays in browser local storage.
t> Tabminal can manage multiple backend nodes from one UI.
- Register hosts from the sidebar using
+ Add Host. - Open sessions on a specific host with
New Tab @ Host. - Each host maintains its own heartbeat, session list, and file/editor state.
- Authentication is host-scoped: the main host controls page login, while sub-host login state is shown per-host in the sidebar.
- Host registry is saved on the main host at
~/.tabminal/cluster.json, so added hosts can be restored after refresh and across browsers/devices.
- Node.js >= 22
- (Optional) An OpenRouter API Key or OpenAI API Key for AI features.
- (Optional) A pair of Google API Key and Search Engine ID (CX) for web search capabilities.
t> Tabminal provides full read/write access to the underlying file system.
- Do NOT expose this to the public internet without proper protection (VPN, etc).
- If AI features are enabled, terminal history/environment/context may be sent to your configured model provider. You are responsible for this risk and provider selection.
- The
--accept-termsflag is required to acknowledge that you understand these risks.
npx tabminal --openrouter-key "YOUR_API_KEY" --accept-terms
# Or use OpenAI:
npx tabminal --openai-key "YOUR_API_KEY" --accept-termsdocker run --rm -it -p 9846:9846 \
leask/tabminal \
--openrouter-key "YOUR_API_KEY" \
--accept-terms# Clone the repository
git clone https://github.com/leask/tabminal.git
cd tabminal
# Install dependencies
npm install
# Start the server
npm start -- --openrouter-key "YOUR_API_KEY" --accept-termsYou can configure t> Tabminal via command-line arguments, environment variables, or a config.json file.
| Argument | Env Variable | Description | Default |
|---|---|---|---|
-p, --port |
TABMINAL_PORT |
Server port | 9846 |
-h, --host |
TABMINAL_HOST |
Bind address | 127.0.0.1 |
-a, --password |
TABMINAL_PASSWORD |
Access password | (Randomly Generated) |
-k, --openrouter-key |
TABMINAL_OPENROUTER_KEY |
OpenRouter API Key (Mutually exclusive with OpenAI) | null |
-o, --openai-key |
TABMINAL_OPENAI_KEY |
OpenAI API Key (Mutually exclusive with OpenRouter) | null |
-u, --openai-api |
TABMINAL_OPENAI_API |
OpenAI Base API URL (Optional) | null |
-m, --model |
TABMINAL_MODEL |
AI Model ID | gpt-5.2 (OpenAI) / gemini-3-flash-preview (OpenRouter) |
-f, --cloudflare-key |
TABMINAL_CLOUDFLARE_KEY |
Cloudflare Tunnel Token | null |
-g, --google-key |
TABMINAL_GOOGLE_KEY |
Google Search API Key | null |
-c, --google-cx |
TABMINAL_GOOGLE_CX |
Google Search Engine ID (CX) | null |
-d, --debug |
TABMINAL_DEBUG |
Enable debug logs | false |
--heartbeat |
TABMINAL_HEARTBEAT |
WebSocket heartbeat interval (ms, minimum 1000) |
10000 |
--history |
TABMINAL_HISTORY |
Terminal history limit (characters) | 1048576 |
-y, --accept-terms |
TABMINAL_ACCEPT / TABMINAL_ACCEPT_TERMS |
Required: Accept security risks (Full FS Access) | false |
config.json also supports:
heartbeatIntervalorheartbeat-intervalhistoryLimitorhistory-limit
Ctrl + Shift + T: New TerminalCtrl + Shift + W: Close TerminalCtrl + Shift + E: Toggle Editor PaneCtrl + Up/Down: Focus Editor / TerminalCtrl + Shift + [/]: Switch TerminalCtrl + Alt + [/]: Switch Open File in EditorCtrl + Shift + ?: Show Shortcuts HelpCtrl/Cmd+F: Find in Terminal
- Virtual
SYM: Toggle HHKB keyboard overlay.
- Backend: Node.js, Koa, node-pty, WebSocket.
- Frontend: Vanilla JS π, xterm.js, Monaco Editor.
- AI: Integration via utilitas.
- On macOS, you may need to run
chmod +x node_modules/node-pty/prebuilds/darwin-*/spawn-helperto fix permission issues.




