The native Windows admin workspace the AI-tools era forgot to build — terminals, SSH, SFTP, RDP/VNC, dashboards, and an AI that builds your own tool widgets.
Because your taskbar shouldn't look like a Vegas slot machine.
Named after 乖乖 (Kuāi Kuāi), the green coconut snack Taiwanese sysadmins place on servers to keep them well-behaved. We hope this app earns its place on the rack.
English ·
繁體中文 ·
简体中文 ·
日本語 ·
한국어 ·
Français ·
Deutsch ·
Español ·
Español (MX) ·
Italiano ·
Português (BR) ·
ไทย ·
Bahasa Indonesia ·
Tiếng Việt
You're a sysadmin / DevOps / homelab / vibe-coder person. Right now you have:
- A terminal emulator
- A separate SSH client (with a profile list it took you a weekend to build)
- An SFTP client from 2007 that somehow still ships
- Remote Desktop in a window you keep losing on the wrong monitor
- A VNC viewer for that one Linux box
- A browser tab for the router admin UI
- An
aider/claude/codexsession running on a remote dev box that drops every time your Wi-Fi sneezes - A sticky note with passwords (don't worry, we won't tell)
KKTerm is one window for all of that. Native on Windows — on purpose, while the rest of the dev tools world ships mac-first and treats your OS like a footnote — written in Rust + Tauri v2, ships as a single installer, and refuses to phone home.
Plus a few things you didn't know you wanted:
- A Dashboard where you tell an AI "build me a widget that pings my router every 30 seconds" and it appears, sandboxed, on your grid.
- SSH panes that auto-attach to named tmux sessions so your remote
claude/codex/aidersession survives every Wi-Fi tantrum your laptop throws. - Twenty-one animated canvas backgrounds (yes, including
matrix) for the dashboard, because we are not above it.
Oh, and the AI assistant can turn a sentence into a tiny dashboard tool you actually keep using.
⭐ If this sounds like the app you've been meaning to build for the last six years — star the repo so we know someone's watching. It genuinely helps.
Walk into any Taiwanese data center and look at the top of the racks. Past TSMC fabs, Taipei Metro control rooms, Cathay Bank server halls, Chunghwa Telecom switching gear — you will spot a small green bag of 乖乖 (Kuāi Kuāi), a coconut-flavored corn snack from the 1960s.
The name literally means "be good", "behave". The IT tradition is straightforward and absolutely serious:
- Must be green flavor (coconut). Yellow (curry) means stay home from work; red (spicy) makes the server angry. Green only.
- Must be unexpired. A stale Kuai Kuai works against you. Engineers diligently swap them out.
- Must be visible. The server has to know it's there.
- Do not eat it. That bag is on duty.
Some of the largest, most boring, most uptime-obsessed systems in Asia run with a bag of corn puffs taped to the chassis. It works because the people who maintain them believe it works, which is a remarkably honest description of most IT culture.
KKTerm is Kuai Kuai Term — an admin workspace that aspires to the same job as the snack: to sit quietly next to your important machines and help them behave. Local-first. No telemetry. Approval-gated AI. The boring, dependable kind of software.
We have not yet been able to ship an actual bag of Kuai Kuai with the installer. That's a v2 item.
(Demo GIF goes here. A picture is worth a thousand bullet points, and we ran out of bullet points.)
Look around the 2026 dev tooling landscape. Claude Code: ships mac/linux first, Windows is "use WSL." Codex CLI: same. aider, gemini-cli, half of Homebrew, every shiny new TUI: mac/linux first, Windows users get a # Windows: contributions welcome comment in the README and a fish-completion script that doesn't run.
Meanwhile, the people who actually keep companies online — corporate IT, MSPs, anyone running Hyper-V or AD or SCCM or IIS or a domain controller older than some interns — are sitting at Windows boxes wondering why every new tool acts like their OS is an inconvenience.
KKTerm is the opposite trade. We build native Windows first, and macOS / Linux ports follow. That means we get to use the Windows APIs that actually matter, instead of papering over them with a portability layer:
- ConPTY for local shells — the real Windows pseudo-console, not a translation shim. PowerShell,
cmd.exe, WSL distros, all hosted as proper PTYs with focus, resize, and VT sequence handling that match the platform's behavior. - WebView2 for the entire UI and embedded URL Connections — in-process Chromium using the system runtime, which is one of the reasons the installer is small and starts fast.
- Microsoft RDP ActiveX (
mstscax.dll) for RDP — the actual one Microsoft ships. Same control as Remote Desktop Connection (mstsc.exe). Not a third-party reimplementation, not FreeRDP-in-a-wrapper. RDP people will notice the difference in five seconds. - Windows Credential Manager for all secrets. SSH passwords, FTP passwords, API keys, URL Connection credentials — they live in the OS keychain and
credwiz.execan audit them. - NSIS current-user installer with a matching SHA-256, native tray menu, Don't-Sleep power assertion, host CPU/RAM/network sampling, native Tauri context menus with real PNG icons, native Open/Save dialogs. Not a single one of these is mocked.
- WSL is a first-class shell, not a workaround. Spin up Ubuntu next to a PowerShell pane next to an SSH session next to an RDP Tab in the same window.
The macOS and Linux builds are on the roadmap and will get the same care. But if you've been waiting for someone to build the good Windows admin tool first instead of last — that's the deal.
Your saved Connections live in a SQLite file on your machine. Passwords live in the Windows Credential Manager, not in a JSON next to the binary. The app does not ship analytics, does not call home on startup, and does not need a cloud account to launch. There is no "sign in to sync" because there is no sync.
If your network cable catches fire, KKTerm still opens.
| You wanted to… | KKTerm has |
|---|---|
| Open a local PowerShell / cmd / WSL shell | ConPTY-backed local terminal Sessions |
| SSH into a server | Native russh with agent / key / password auth, host-key trust flow, ProxyJump, port forwarding |
| Browse files on that server | SFTP launched from the SSH Connection, dual-pane, recursive transfers, chmod/chown |
| FTP to a NAS from 2012 | FTP / FTPS Connections in the same SFTP-style browser |
| Telnet to ancient gear | Yes, fine, Telnet is in there too |
| Talk to a serial port | Serial Connection kind, COM port + baud, no extra tooling |
| Remote into a Windows box | Native RDP via the Microsoft ActiveX control (the real one, not a clone) |
| VNC into a Pi | Rust vnc-rs framebuffer rendered straight into the workspace |
| Open the router's web UI | Embedded WebView2 URL Connection with credential fill |
| Watch CPU on the host | Live status bar + a Dashboard module with drag/resize widgets |
It's all the same app. Same window. Same hotkeys. Same hopefully-not-eye-bleeding theme.
- Split panes inside a Tab.
- WebGL-accelerated xterm.js rendering, falling back gracefully when it can't.
- Scrollback search.
- tmux-backed SSH panes that can attach to stable per-pane sessions, so reconnecting actually means reconnecting, not "starting over and pretending the last hour didn't happen."
- Switching Tabs does not kill the Session. Closing the Tab does. This distinction was a religious war internally; we won.
Most "AI in your terminal" demos stop at chat. KKTerm's assistant can also build small, durable dashboard widgets for the way you actually work. It still keeps the dangerous stuff behind two switches:
- Tool families (Dashboard / Connections / Live Sessions) — toggle them on or off per category.
- Permission mode in the composer —
Prompt(default, asks every time) orAllow All(you're an adult, you signed the waiver).
Talk to OpenAI, Anthropic, OpenRouter, DeepSeek, Grok, Azure OpenAI, LiteLLM, GitHub Copilot, Ollama, NVIDIA, or anything OpenAI-compatible. API keys go to the OS keychain. Models that propose rm -rf get classified as dangerous and require explicit human approval. The AI cannot quietly run a destructive command because somebody got clever with a prompt injection in a man page.
The Dashboard module is a 12-column drag/resize grid of widget instances. It's not for petabyte observability — it's for "I want a button to launch my five favorite apps and a panel showing my SSH host's uptime, next to my chat."
This is the part we are genuinely excited about. You don't pick from a marketplace and you don't write JavaScript. You tell the AI assistant what you want, and it builds the widget right there on your dashboard:
"Add a widget showing the last 5 commits on my main repo as a list." "Make me a sticky-note widget that holds my on-call cheat sheet." "Build a widget that pings my home router every 30 seconds and shows green/red." "I need a stopwatch. Surprise me on the styling."
Two flavors:
- Content widgets — declarative JSON: markdown, kv lists, checklists, single big stat. Safe by construction, no script. Most "I just need this on my dashboard" requests land here.
- Script widgets — JavaScript hosted inside an isolated
iframe srcdocsandbox with explicit, declared permissions (networkallowlist,pollSecondsbudget). The AI writes the script, you approve the permissions, the widget runs in a box that cannot reach the rest of the app.
Every widget you keep is yours. They persist in SQLite next to your Connections, with their own visual preset (panel / ambient / hero), accent color, icon, and title. Multiple instances of the same widget can coexist with totally different sizes and styling. Delete them with a right-click when the magic wears off.
The dashboard has twenty-one canvas-animated backgrounds you can pick per Dashboard View:
| Mood | Backgrounds |
|---|---|
| Calm | aurora, clouds, ocean, raindrops, snow, sakura, fireflies, bubbles, ricefield, lanterns |
| Spacey | starfield, nebula |
| Warm | embers, lava |
| Geeky | matrix, topo, synthwave |
| Erratic | cyberpunk, taipei101, thunderstorm, confetti |
They run on a single shared requestAnimationFrame and respect window focus, so they cost roughly nothing when you're elsewhere. Pair matrix with your AI assistant for a vibe that says "I am extremely productive and also possibly in a Wachowski film." Or pick mist and look like a serious person. We do not judge either choice.
This is the second feature people fall in love with. KKTerm's SSH terminals can launch directly into a named tmux session on the remote host — by default, an auto-generated friendly id like kkterm-cockpit001 that survives reconnect:
- Open an SSH Connection with tmux enabled.
- Inside the pane, start
claude,codex,aider,gemini-cli,cursor-agent, or whatever long-running coding agent you prefer. They are full-screen TUI apps; tmux is exactly where they want to live. - Close the laptop. Open it again. The pane silently re-attaches to the same tmux session. The agent is still running, still has its scrollback, still in the middle of whatever it was doing.
- Network blip on the SSH transport? KKTerm makes a bounded silent reattach attempt to the same tmux id without bothering you.
- Want the AI assistant to see what the agent is doing? "Add terminal buffer to context" calls
capture_tmux_paneover SSH and pulls the full tmux scrollback — not just what's on-screen, the whole session — into the conversation. Your local assistant can now reason about your remote agent's work.
If you have ever lost a six-hour aider session to a flaky hotel Wi-Fi, this single feature pays for the app. The app is free. The feature is still worth it.
flowchart LR
User([You]) --> Shell[KKTerm Window<br/>Tauri v2 + React 19]
Shell --> Rail[Activity Rail]
Rail --> WS[Workspace Module]
Rail --> Dash[Dashboard Module]
Rail --> FE[File Explorer]
Rail --> Set[Settings]
WS --> Tabs[Tabs & Panes]
Tabs --> Term[Terminal<br/>ConPTY / russh]
Tabs --> SFTP[SFTP / FTP]
Tabs --> Web[WebView2 URL]
Tabs --> RD[RDP / VNC]
Shell -.calls.-> Rust[Rust Backend]
Rust --> SQLite[(SQLite<br/>Connections)]
Rust --> Keychain[(OS Keychain<br/>Secrets)]
Rust --> AI[AI Providers<br/>OpenAI-compat]
AI -. approval gate .-> Tabs
classDef local fill:#1f6feb,stroke:#1f6feb,color:#fff
classDef ai fill:#8a63d2,stroke:#8a63d2,color:#fff
class SQLite,Keychain local
class AI ai
The shape that matters: durable saved data (Connection) is separate from live runtime state (Session), which is separate from the UI container (Tab). Closing a Tab ends the Session. Switching Tabs does not. This is the rule that keeps the app sane.
| Area | Implemented today |
|---|---|
| Connections | SQLite-backed tree, folders/subfolders, search, drag/drop order, rename, duplicate, delete, Quick Connect, custom icons, pinned/active rail shortcuts |
| Terminal | Local shells, SSH, Telnet, Serial, split panes, xterm.js + opportunistic WebGL, scrollback search, local startup directory/script |
| SSH | Native russh, agent/key/password auth, host-key trust flow, optional system SSH fallback, ProxyJump, port forwarding, auto-named tmux sessions (kkterm-<scifi-name><n>) with silent reattach on transport blip — perfect for long-running remote coding agents (Claude Code, Codex, aider, etc.) |
| SFTP / FTP | SSH-launched SFTP plus FTP/FTPS Connections, dual-pane browser, recursive transfers, queue/cancel/clear history, conflicts, properties, chmod/chown where supported |
| URL WebView | Embedded WebView2 URL Sessions, navigation toolbar, favicon capture, stored website credential metadata/fill, data partition metadata |
| Remote Desktop | RDP through Windows ActiveX with geometry-scoped overlay parking; VNC through vnc-rs framebuffer rendered in the workspace canvas |
| Dashboard | Durable views, widget instances, edit mode, drag/resize, App Launcher, AI-authored content/script widgets (declarative JSON or sandboxed iframe JS with permissions), per-widget presets / accent / icon / title, 9 animated canvas backgrounds (aurora, raindrops, starfield, nebula, embers, lava, matrix, synthwave, confetti) |
| AI Assistant | Streaming chat, OpenAI-compatible runtime, provider registry, command proposal safety classification, screenshot/context attachments, Dashboard widget authoring (content + sandboxed script), tmux pane capture as conversation context for remote sessions, Connection management tools, and live Session tools for terminal, RDP/VNC, and SFTP/FTP |
| Settings | General, Appearance, Credentials, AI, SSH, Terminal, URL, RDP, VNC, Dashboard, About; custom UI fonts; minimize-to-tray; Don't Sleep; backup/import |
| Localization | i18next UI with English source and dynamic locale bundles: zh-TW, zh-CN, ja, ko, fr, de, es, es-MX, it, pt-BR, th, id, vi |
OpenAI · Anthropic · OpenRouter · DeepSeek · Grok · Azure OpenAI · LiteLLM · GitHub Copilot · Ollama · NVIDIA · any OpenAI-compatible endpoint.
Provider metadata lives in src/ai/providerRegistry/; Rust adapters in src-tauri/src/ai/providers/. API keys go through the OS keychain, never SQLite.
You need:
- Windows (primary supported platform)
- Node.js + npm
- Rust toolchain
- Tauri v2 prerequisites for Windows including WebView2
npm install
npm run tauri devThat should produce a real native window. If it produces a stack trace instead, please file an issue — we love a good repro.
npm run check # TypeScript
npm run build # Vite build
cargo check --manifest-path src-tauri/Cargo.toml # Rust
cargo test --manifest-path src-tauri/Cargo.toml # Rust testsnpm run package:installerThe installer script writes artifacts/kkterm-<version>-windows-x64-setup.exe and a matching .sha256 file. It is currently unsigned — release signing is on the roadmap, but until then your antivirus may give you a stern look. That's normal.
A short list, because honesty earns trust:
- Not a cloud product. No sync, no team accounts, no SaaS tier. If you ever see a "Sign in to KKTerm" dialog, something has gone catastrophically wrong.
- Not pretending to be cross-platform. We are Windows-first on purpose; macOS and Linux are on the roadmap and will use the same Tauri v2 shell. If you need a mac-first tool today, you have hundreds of options. We're building the one Windows admins have been quietly waiting for.
- Not an autonomous AI agent. The assistant proposes; the human disposes.
Allow Allis a choice you make, not a default. - Not a Grafana / Datadog replacement. The Dashboard is for personal control surfaces, not 10k-host observability.
- Not a Kubernetes IDE. It is a terminal-first admin workspace. Please don't ask it to render a Helm chart.
If any of those was a dealbreaker — fair enough, we'll see you in v2.
Use the real Tauri runtime for validation:
npm run tauri devA Vite browser preview is useful for some frontend inspection, but it does not host a real WebView2, ConPTY, RDP ActiveX, VNC framebuffer, keychain, or native menu surface. If a feature touches any of those, validate it in the actual desktop runtime.
VS Code users: the Run KKTerm exe launch config starts src-tauri/target/debug/kkterm.exe with RUST_BACKTRACE=1. The paired Attach KKTerm WebView2 config gives you DevTools inside the real WebView2 host.
- The installer is currently unsigned. Update checks are disabled until release signing is configured.
- SFTP over ProxyJump is not yet supported in the native SFTP path.
- File transfer resume, folder sync/diff, archive/extract, and remote editing are deferred.
- SSH config import is implemented but the user-facing entry in Settings is not yet exposed.
- RDP and VNC are shipping; richer clipboard/device sync and quality controls are still evolving.
- macOS and Linux builds are on the roadmap. They are coming, and they will be done properly — not rushed out as a "we also kinda work over there" port.
- The AI assistant proposes and can operate enabled tools within the configured permission boundary — please do not treat it as an unattended robot. It does not, in fact, know what your CEO wants.
- macOS + Linux builds
- Signed installer + auto-update
- SFTP over ProxyJump in the native path
- File transfer resume, folder sync, archive/extract
- Richer RDP clipboard/device redirection
- More built-in Dashboard widgets (and a public schema for AI-authored ones)
Full and frequently-updated version: docs/ROADMAP.md.
We would love a hand. Genuinely. Even small things matter:
- Try the dev build and file an issue when something feels off. "It felt off" is a legitimate bug report; we'll dig with you.
- Translate a locale. English is the source of truth at
src/i18n/locales/en.json; 12 other locales live next to it and load on demand. Pending strings are tracked per-key underdocs/localization_todo/— pick one, translate it, delete the file. - Add a Dashboard widget. Built-in widgets live in
src/dashboard/widgets/. Pick a small idea, ship it, learn the pattern. - Tighten the AI tool surface. Provider adapters live in
src-tauri/src/ai/providers/; the frontend registry is insrc/ai/providerRegistry/. - Improve the manual. End-user docs live in
docs/manual/. One chapter per UI module. If you used a feature and the docs didn't help, a PR fixing that is gold.
Full setup, project layout, PR checklist, and the list of "please do not break these" rules live in CONTRIBUTING.md. The 30-second highlights:
- Read
CONTEXT.mdbefore renaming user-facing terms. Connection, Session, Tab, and Quick Connect mean specific things; please don't drift. - Every user-visible string goes through
t(). No bare English text in JSX. - No frontend close hooks. Tauri v2's title-bar close has been broken by
onCloseRequestedpatterns a half-dozen times. We finally have a working shape; please don't reintroduce them. - Run the checks (
npm run check && npm run build && cargo check && cargo test) before opening a PR.
Looking for an entry point? Filter open issues by good first issue or help wanted. If there aren't any tagged yet, open an issue describing what you'd like to work on and we'll help scope it.
- Product context — the domain language you should match
- Architecture — module map, where to put new code
- Roadmap
- Dashboard architecture
- AI provider guide
- Performance notes
- Release notes and gates
Rust · Tauri v2 · React 19 · TypeScript · Vite · Tailwind CSS · Zustand · xterm.js · SQLite · WebView2 · russh · russh-sftp · vnc-rs · suppaftp · OS keychain storage.
If you got this far and you haven't starred it yet — what are you waiting for, a personal invitation? Consider this the personal invitation.
⭐ Star KKTerm on GitHub — it costs one click and makes the maintainer's whole week. Think of it as a digital 乖乖 on the rack.
MIT. See LICENSE. Use it, fork it, ship it, put it in a homelab nobody else can find — that's the deal.