First run¶
From launch to first reply: point kin at a model, read the welcome screen, and send a message.
Point kin at a model¶
kin is a client, so the one thing it needs before it can reply is a model
endpoint. Pick the recipe that matches where your model lives. Each shows the
environment variables; every variable also has a CLI flag (--base-url,
--model, --provider) if you prefer to pass it at launch.
A server on your machine or tailnet (vLLM, llama.cpp, LM Studio, …). Point
KIN_BASE_URL at it and name the model:
When KIN_BASE_URL is set but no provider is, kin defaults to the
Anthropic Messages wire (/v1/messages). If your server only speaks
OpenAI-compatible Chat Completions, force the OpenAI-compat wire with
KIN_PROVIDER=openai. The full heuristic is in
Models & providers.
Tip — if your server registers a stable alias (e.g. vLLM's
--served-model-name default …) for "whatever model is currently loaded",
hardcode that alias and let kin surface the real name live in the banner
+ the top bar (left cell, beside ⭘ kin):
No base URL — talk to Anthropic directly. Opt into the Anthropic wire and supply your key:
Without KIN_BASE_URL, kin defaults to the OpenAI-compat wire, so
KIN_PROVIDER=anthropic is required here.
Direct OpenAI is the default wire — just supply a key and a model:
For OpenRouter (or any other OpenAI-compat host), set the base URL and force the OpenAI wire, since a base URL alone would route to Anthropic:
Skip the URL and model id with a curated preset. Set KIN_PRESET to
minimax or zai and supply your key:
KIN_PRESET=minimax KIN_API_KEY=<your-minimax-key> uv run kin
KIN_PRESET=zai KIN_API_KEY=<your-zai-key> uv run kin
The preset bundles the wire (anthropic), the URL
(https://api.minimax.io/anthropic or https://api.z.ai/api/anthropic),
the default model (MiniMax-M3 or glm-5.2), and the auth style
(Authorization: Bearer). To save the choice interactively, run
/providers in the TUI. The full catalogue + custom endpoints are in
Provider presets.
Make it stick
Setting these every launch gets old. Move them into
~/.kin/settings.toml once and kin reads them for every new session — see
Configuration.
The welcome screen¶
On a cold start with an empty transcript, kin shows a framed welcome banner: the
kin wordmark, a small metadata block (model, workspace, session), in
auto mode a dim posture line describing the shell containment, and a
control-hint row reading type a message to begin · enter sends · shift+enter
newline · / commands · @ files · f1 help (one voice with the composer
placeholder). The banner is responsive — it stacks or shrinks
on narrow terminals — and falls back to pure ASCII box-drawing when you set
KIN_ASCII. It disappears as soon as the conversation starts.
Glance at the model and workspace lines to confirm kin picked up the
endpoint and directory you expected before you send anything.
kin starts in auto mode
By default kin launches in auto mode — safe autonomy, where edits and
shell run without per-call prompts (shell inside an OS sandbox). On launch the
welcome banner shows a dim one-line posture (e.g. "auto · shell sandboxed
(Seatbelt)"); when no OS sandbox is available it says so ("auto · shell asks
for anything not provably safe" — edits still auto-apply, confined to the
workspace). Press Shift+Tab to switch to strict (ask-first) at any time,
or use /plan for a read-only planning pass. See
Modes & permissions.
Sending a message¶
Type into the composer at the bottom and send:
| Key | Action |
|---|---|
| Enter | Send the message |
| Shift+Enter | Insert a newline (multi-line editing) |
| Ctrl+S | Send (alias for Enter) |
While a turn is running you can keep typing. kin holds one queued message (latest-wins, shown as the composer's border title) and sends it automatically when the current turn finishes. To stop a running turn instead, press Esc.
What you're seeing¶
As kin replies, the visual language tells you what each stream is:
- kin's replies are cyan — the live signal, streamed as markdown.
- Reasoning is periwinkle and collapsed by default — the private thinking channel, kept out of the way. Expand it with Ctrl+N (or per-item in cursor mode).
- The status bar shows activity and mode — a spinner glyph (the vibe is
yours to pick:
/spinner, see Spinner vibes) plus a cosine-swept cyan shimmer over the active phase word while a turn runs (verbatim labels likerunning shell…for a known tool, or a rotating flavor likethinking,mulling,tracingfor the generic no-info state; adrafting <name>…label appears for in-flight tool arguments, with the char count appended only past the thresholds — bare under 256 chars,… 312 charsfrom 256-999,… 1.2k charsfrom 1000+), with planning / ultracode badges on the left and the current mode badge on the right. Once a turn passes ten seconds a dimesc interruptsclause names the escape hatch. While idle, the same cell quietly rotates a key-hint line (one per turn end —f1 help · esc esc rewind · ctrl+o agentsand friends). Context-window usage lives in the top bar (right side), beside the model name (left) and the clock. HonorsTEXTUAL_ANIMATIONS=none— the spinner holds its rest glyph and the shimmer collapses to a solid cyan label, byte-identical to the pre-shimmer render.
The two cool hues are deliberate; the reasoning behind them is in The Graphite+ identity.
From here, First session is a scripted 10-minute TUI tour (the welcome banner, the composer, slash history, cursor mode, the planning freeze, sessions) — the fastest way to get muscle memory for the keys and shapes. Configuration makes your model setup permanent, and the Guide covers modes, tools, slash commands, and sessions.