Skip to content
JNT

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.

Note
The installer is currently unsigned, so Windows SmartScreen warns on first launch - choose More info → Run anyway.

A one-line PowerShell install is coming soon:

text
irm justanormal.sh/jnt | iex # not yet available

Build from source

Needs a recent Rust toolchain (see rust-toolchain.toml).

text
git clone https://github.com/Topurrra/JNT
cd JNT
cargo 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.

#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:

toml
# an ACP coding-agent command; exact args depend on your agent
agent_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:

text
jnt hooks setup

That writes a jnt-notify function into your PowerShell profile and prints a Claude Code hooks block to paste into ~/.claude/settings.json:

text
{
"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.

Note
Writing your Claude settings is intentionally out of scope - JNT prints the snippet and you place it.

#Crew board

Ctrl+Shift+B opens a 5-seat multi-agent kanban - Architect, Builder, QA, Security, Summarizer - persisted per project.

#Keybindings

KeyAction
Ctrl+\ / Ctrl+Shift+\split right / down
Ctrl+Btoggle sidebar
Ctrl+Ffind in terminal (F3 / Shift+F3 next / prev)
Ctrl+Shift+Fproject search
Ctrl+Shift+Aagent panel
Ctrl+Shift+Bcrew board
Ctrl+Shift+Psettings
Ctrl+Shift+I / U / Nnotifications / jump-unread / toggle-unread
Ctrl+Shift+Kclear scrollback
Ctrl+Shift+Wclose pane
Ctrl+Alt+Arrowsmove focus between panes
Ctrl+1..8 / Ctrl+Alt+[ ]jump / cycle groups
Ctrl+= / Ctrl+- / Ctrl+0font size up / down / reset

#CLI

The running app listens on a localhost port; any jnt command with a control verb talks to it.

text
jnt split --right [--cwd <dir>] # split the active pane (also --down)
jnt new-group [--cwd <dir>]
jnt close-group
jnt focus --next | --prev | --group <n>
jnt send-keys "text"
jnt run <name> # run a [[commands]] entry in the focused pane
jnt 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:

toml
version = 1 # config schema version
default_profile = "default"
history_days = 30 # days of encrypted scrollback history to keep
agent_command = [] # e.g. ["claude", "--acp"] to power the agent panel
 
[theme]
dark = true
font_size = 14.0
font_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 = false
high_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>.

text
{
"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.toml has 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 as config.toml.bak.
  • jnt hooks setup and PowerShell 7. Setup targets Windows PowerShell 5.1's profile (Documents\WindowsPowerShell\). On PowerShell 7 the profile lives in Documents\PowerShell\ - copy the jnt-notify function 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.