Documentation · v0.2
JNT, documented.
An AI-first terminal for Windows. Everything below reflects what actually ships today.
#Introduction
JNT ("Just a normal terminal") is an AI-first terminal for Windows, built in Rust on gpui (Zed's GPU UI framework), with alacritty_terminal for VT parsing and ConPTY for the shell. It keeps a fast, correct terminal grid and adds the things you normally leave the terminal to do - read git status, search your project, watch a coding agent work, get pinged when a long task finishes - so you stay in one window.
Windows only (Windows 10 1809+, x64).
#Install
Download JNT-Setup-<version>.exe from the GitHub Releases page and run it. Installs per-user (no admin), adds JNT to your PATH, and creates a Start Menu shortcut. Re-running upgrades in place.
A one-line PowerShell install is coming soon:
irm justanormal.sh/jnt | iex # not yet availableBuild from source
Needs a recent Rust toolchain (see rust-toolchain.toml).
git clone https://github.com/Topurrra/JNTcd JNTcargo run --release# binary lands at target\release\jnt.exe#First run
New terminals open in your home directory. Split the pane or open groups to lay out your workspace; the focused pane always shows a clear accent frame.
#Panes & groups
Split the active pane right or down with draggable dividers. Move focus between panes, and organize panes into groups you can jump to or cycle through. Layout, dock widths, and each pane's working directory are restored on relaunch.
Groups are collapsible: click the chevron on a group's header in the terminals sidebar to hide its panes (the header stays).
New terminals are named Terminal 1, Terminal 2, … by default; double-click a pane in the sidebar to give it a custom name.
#Git panel
A git panel that follows the focused pane's directory: branch, ahead/behind, checkbox staging, commit + amend, pull/push, stash, history, and a GitHub PR-status row. cd into another repo and the panel switches with you.
#Search
- Project-wide search (Ctrl+Shift+F): a Tantivy index with ripgrep live-grep.
- In-terminal search (Ctrl+F): finds inside the terminal scrollback with highlighting and F3 / Shift+F3 to move between matches.
#How indexing works
- On demand. Project search (Ctrl+Shift+F) builds a local full-text index of your project the first time you open the panel. Indexing runs in the background - it never blocks the UI.
- What's indexed. Every file's name, path, and size, plus the contents of code, config, and text files (Rust, TS/JS, Python, Go, C/C++, Markdown, JSON, YAML, TOML, shell scripts, and many more). Binaries, PDFs, Office documents, images, audio, video, and archives are indexed by name only - their bytes are never read.
- Pruned walk. Heavy directories are skipped automatically -
.git,node_modules,target,dist,build,vendor, caches - on top of your.gitignore, so a large repository doesn't stall the walk. - Incremental & cached. The index is stored on disk per project. Reopening search reuses it: if nothing changed since the last build there's no rebuild at all, and when files do change only the added, changed, and removed files are re-indexed - never the whole tree.
- Light on memory. File contents are full-text indexed but not duplicated inside the index; result snippets are read back from the file on demand for just the handful of hits shown, so the index stays small.
- Ranking. Name and path matches rank above incidental content matches, and recency plus how often you open a file (frecency) nudge results toward what you're likely after.
- Two search modes. Ctrl+Shift+F is project-wide indexed search; Ctrl+F finds within the current terminal's scrollback.
#Selecting & copying
Drag-select and copy text from any panel, not just the terminal; double-click selects a word, triple-click a line. Right-click a terminal to copy the selection, or paste if there's no selection (Windows Terminal style).
#Notifications
Pane rings, a sidebar dot, a jump-to-unread key, and native Windows toasts when a background pane needs attention. Agents can ping the focused pane with jnt notify.
#Settings
Ctrl+Shift+P edits font, theme, and ANSI colors with instant apply and save.
#AI agent panel
Ctrl+Shift+A runs a live ACP (Agent Client Protocol) coding agent in a side panel: streaming transcript, approve/reject permission prompts, a context-usage meter, and tool-call cards.
#Connecting an agent
Point JNT at an ACP-speaking agent CLI in your config, then open the panel with Ctrl+Shift+A. Set agent_command in %APPDATA%\JNT\config.toml:
# an ACP coding-agent command; exact args depend on your agentagent_command = ["claude", "--acp"]The panel launches that command and gives you a streaming transcript, approve/reject permission prompts, a context-usage meter, and tool-call cards.
To make agents ping you when they finish or need attention, run:
jnt hooks setupThat writes a jnt-notify function into your PowerShell profile and prints a Claude Code hooks block to paste into ~/.claude/settings.json:
{ "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "jnt notify \"Claude finished\"" } ] } ], "Notification": [ { "hooks": [ { "type": "command", "command": "jnt notify \"Claude needs attention\"" } ] } ] }}Now a background pane pings you (and raises a Windows toast) when the agent finishes or needs input. jnt hooks show prints everything without writing any files.
#Crew board
Ctrl+Shift+B opens a 5-seat multi-agent kanban - Architect, Builder, QA, Security, Summarizer - persisted per project.
#Keybindings
| Key | Action |
|---|---|
| Ctrl+\ / Ctrl+Shift+\ | split right / down |
| Ctrl+B | toggle sidebar |
| Ctrl+F | find in terminal (F3 / Shift+F3 next / prev) |
| Ctrl+Shift+F | project search |
| Ctrl+Shift+A | agent panel |
| Ctrl+Shift+B | crew board |
| Ctrl+Shift+P | settings |
| Ctrl+Shift+I / U / N | notifications / jump-unread / toggle-unread |
| Ctrl+Shift+K | clear scrollback |
| Ctrl+Shift+W | close pane |
| Ctrl+Alt+Arrows | move focus between panes |
| Ctrl+1..8 / Ctrl+Alt+[ ] | jump / cycle groups |
| Ctrl+= / Ctrl+- / Ctrl+0 | font size up / down / reset |
#CLI
The running app listens on a localhost port; any jnt command with a control verb talks to it.
jnt split --right [--cwd <dir>] # split the active pane (also --down)jnt new-group [--cwd <dir>]jnt close-groupjnt focus --next | --prev | --group <n>jnt send-keys "text"jnt run <name> # run a [[commands]] entry in the focused panejnt notify "message" # ping the focused pane (agents call this)jnt hooks setup | show # print agent-integration snippets#Configuration
Config lives at %APPDATA%\JNT\config.toml (versioned TOML; invalid input never blocks startup). Here's an annotated example with the real keys and default values:
version = 1 # config schema versiondefault_profile = "default"history_days = 30 # days of encrypted scrollback history to keepagent_command = [] # e.g. ["claude", "--acp"] to power the agent panel [theme]dark = truefont_size = 14.0font_family = "Consolas" [theme.colors] # terminal palette (hex)background = "#101216"foreground = "#E0E2E7"cursor = "#E6E8EC"scrollbar = "#B93240"black = "#0C0C0C"red = "#C50F1F"green = "#13A10E"yellow = "#C19C00"blue = "#0037DA"magenta = "#881798"cyan = "#3A96DD"white = "#CCCCCC"bright_black = "#767676"bright_red = "#E74856"bright_green = "#16C60C"bright_yellow = "#F9F1A5"bright_blue = "#3B78FF"bright_magenta = "#B4009E"bright_cyan = "#61D6D6"bright_white = "#F2F2F2" [accessibility]reduced_motion = falsehigh_contrast = false [notifications]desktop_toasts = true # Windows toast when an unfocused pane pings [[commands]] # custom commands, runnable from the ⚡ menu or `jnt run <name>`name = "build"command = "cargo build" [[commands]]name = "test"command = "cargo test"There is also a [keybindings] table (keys: command_palette, new_tab, split_right, split_down, find, focus_next_pane) if you want to rebind the defaults.
Per-project commands
Drop a jnt.json in a project root to add commands just for that project. A project command whose name matches a config command overrides it; new names are added. Run them from the ⚡ menu or jnt run <name>.
{ "commands": [ { "name": "dev", "command": "npm run dev" }, { "name": "build", "command": "npm run build" } ]}#Security
AppContainer agent sandbox, DPAPI-protected storage key, kill-on-close job objects, and XChaCha20-Poly1305 encrypted history.
#Troubleshooting
- SmartScreen blocks the installer. It's unsigned - choose More info → Run anyway, or build from source.
- My
config.tomlhas a typo. JNT never fails to start on a bad config - it falls back to defaults and shows a diagnostic with the line and column. Your previous file is backed up next to it asconfig.toml.bak. jnt hooks setupand PowerShell 7. Setup targets Windows PowerShell 5.1's profile (Documents\WindowsPowerShell\). On PowerShell 7 the profile lives inDocuments\PowerShell\- copy thejnt-notifyfunction there, or add the hook manually.- Something renders wrong or a key doesn't work. Open a GitHub issue with your Windows version and steps to reproduce.
#License
Dual-licensed under either MIT or Apache-2.0, at your option.

