Skip to content

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:

KIN_BASE_URL=http://localhost:8000/v1 \
  KIN_MODEL=Qwen/Qwen3.6-35B-A3B \
  uv run kin

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

KIN_BASE_URL=http://localhost:8000/v1 \
  KIN_MODEL=default \
  uv run kin

No base URL — talk to Anthropic directly. Opt into the Anthropic wire and supply your key:

KIN_PROVIDER=anthropic \
  ANTHROPIC_API_KEY=sk-ant-... \
  KIN_MODEL=claude-opus-4-8 \
  uv run kin

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:

OPENAI_API_KEY=sk-... KIN_MODEL=gpt-4o-mini uv run kin

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:

KIN_BASE_URL=https://openrouter.ai/api/v1 \
  KIN_PROVIDER=openai \
  KIN_API_KEY=sk-or-... \
  KIN_MODEL=anthropic/claude-3.5-sonnet \
  uv run kin

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 like running shell… for a known tool, or a rotating flavor like thinking, mulling, tracing for the generic no-info state; a drafting <name>… label appears for in-flight tool arguments, with the char count appended only past the thresholds — bare under 256 chars, … 312 chars from 256-999, … 1.2k chars from 1000+), with planning / ultracode badges on the left and the current mode badge on the right. Once a turn passes ten seconds a dim esc interrupts clause 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 agents and friends). Context-window usage lives in the top bar (right side), beside the model name (left) and the clock. Honors TEXTUAL_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.