selan.ai

Docs

Using Claude Code with Selan

One command to install, one to sign in, and Claude Code runs exactly as it always did, against your company's accounts instead of your own.

Get started

Get an account

If a colleague has already set your company up, ask them to invite you. Joining an existing workspace is by invitation unless an owner has switched that off. There is one alternative, off until somebody turns it on: an owner can let anyone signing in from a verified company domain join without an invitation. Somebody who joins that way lands as a read member, and a read member can still sign in on the CLI and spend against your limits, which is why the switch says so beside itself.

If nobody has yet, create the workspace yourself at auth.selan.ai/r. Sign in with Google or Microsoft; there is no invite code and no allowlist. Selan names the workspace after your domain and you can change that on the next screen.

Whoever creates it is its owner: the role that connects provider keys, switches models on, mints CLI tokens and sets spend limits.

If someone at your domain got there first, you will be told so and shown who to ask. Selan will not drop you into a second workspace beside theirs.

Install

macOS and Linux, Intel or ARM:

curl -fsSL https://dl.selan.ai/install.sh | sh

Windows, in PowerShell:

irm https://dl.selan.ai/install.ps1 | iex

It installs a single binary called selan, plus a second name, seland, that skips permission prompts. On macOS and Linux it lands in /usr/local/bin; on Windows in %LOCALAPPDATA%\Programs\selan. Set SELAN_INSTALL_DIR to put it somewhere else. If that directory is not on your PATH, the installer adds it, and prints the one-liner that fixes the shell you are already in, since the change only reaches shells started afterwards.

Claude Code is a prerequisite. Selan launches it; it does not bundle it:

curl -fsSL https://claude.ai/install.sh | bash

Either order works. Inside WSL, use the Linux installer. A WSL session is Linux, and it needs Claude Code installed inside WSL too.

Sign in

selan login

Opens your browser for Google or Microsoft sign-in. Over SSH, where there is no browser to open, it prints a URL to paste instead. What lands on your machine afterwards is a revocable Selan session token and nothing else: no Anthropic key, no OAuth account.

selan whoami tells you who you are signed in as and which company; selan logout revokes the session and forgets it.

Run Claude Code

selan claude

Every argument passes straight through, so anything you already type still works:

selan claude -p "explain this repo"
selan claude --resume
selan claude --permission-mode plan

You do not need to login first. selan claude signs you in when you have no session.

If Selan's own sign-in service is unreachable, selan claude warns and launches anyway on your cached session. Only a genuine rejection makes you sign in again.

Claude Desktop

How to use it

Claude Desktop runs on your company's account too, and setting it up is one settings file: download it, import it in Desktop, relaunch, sign in. The full walkthrough (seven steps, with a picture of every menu and button) is at Claude Desktop. In Selan control, the Claude Desktop item in the sidebar opens the same page.

What you get, and what you still do yourself

  • Connectors appear on their own. Whatever an owner has switched on under Connections reaches Desktop the next time you start it. There is nothing to paste per connector.
  • You sign in to each one yourself the first time you use it. See Connections.
  • Your sign-in is your credential. Desktop holds a session token from the browser sign-in, the same kind the CLI uses, so it spends against your own limit, shows up as you in Usage, and ends when your session does.
  • Nothing in the file is a secret. It names a URL and asks Desktop to sign in before reading it; the gateway and the key arrive from that URL at every launch. A file you export from Desktop is a different matter: that one carries a live key, so never pass one around.
  • Needs Claude Desktop 1.25927 or newer. The floor is set by Trust bootstrap-delivered settings; the OIDC block itself arrived earlier, in 1.10628, but the flow stops at the strip without the toggle.

Everyday use

Choosing a model

By default Claude Code runs on your company's Anthropic accounts, and you pick models exactly as usual, with /model or --model opus.

Anything else is reachable two ways: your company can put models into the picker for everyone, or you can name one on the command line.

Your company's models in the picker

Type /model in Claude Code and your company's own models are in the list, beside Anthropic's. Pick one the way you pick Opus, with no flag to pass.

Select model
Switch between models. Your pick becomes the default for new sessions.
1. Default (recommended) Use the default model (currently Opus 5)
>2. Opus (1M context) Opus 5 · Best for everyday, complex tasks
3. Sonnet Sonnet 5 · Efficient for routine tasks
4. Haiku Haiku 4.5 · Fastest for quick answers
5. MoonshotAI: Kimi K3 From gateway
6. OpenAI: GPT-5.6 Sol From gateway
↑/↓ to move · enter to select
Rows 5 and 6 came from Selan. They are marked From gateway and run on your company's own provider key; everything above them is Anthropic's, as usual.

Your pick becomes the default for new sessions, and you can change it mid-session as often as you like.

A model picked here gets a 1M context window or a 200k one, with nothing in between. Selan raises the ceiling only for models the provider reports at 1M or more; everything else runs at Claude Code's usual 200k, even where the provider offers 262k. When you need a mid-size window in full, name the model with --model instead. That path sets the exact figure.

If a model you expected is not there

  • Quit and relaunch first. The list is read at startup, so a model switched on while you were working shows up the next time you start Claude Code, not when you reopen /model.
  • Then ask an owner to switch it on. Models are off until someone turns them on, one at a time. Connecting a provider key does not put anything in anyone's picker by itself.
  • A model that disappears was switched off. If you had it selected, you will get model_not_allowed. Pick another and relaunch.

Want a model your company has not curated? Any model your provider serves can be named directly. See Run any model.

Run any model, not just Claude

Claude Code drives GPT, DeepSeek, Kimi and the rest. If your company has connected its own OpenRouter, nexos.ai, Ollama or ChatGPT account, name a provider and one of that provider's models. Providers and models is the full list:

selan claude --model openrouter:openai/gpt-5.6-sol
selan claude --model openrouter:deepseek/deepseek-v4-flash-0731
selan claude --model openrouter:moonshotai/kimi-k3
selan claude --model nexos:claude-opus-5

The part before the first colon is the provider; everything after it is that provider's own model id, passed through as-is, so any model they serve works without anything being added to Selan first. Capitals, dashes, dots and spaces do not change which model you get, so nexos:claude-sonnet-4-6 and nexos:"Claude Sonnet 4.6" are the same model.

The model appears in Claude Code's /model picker for the session, so you can switch back to it after changing models mid-session. A --model with no colon is Claude Code's own flag and is passed through untouched.

You get the model's real context window. Selan tells Claude Code how big it actually is, so a 262k model compacts at 262k and not at an assumed 200k.

Which one to reach for

  • Use the picker when you can. If a model is already in /model, pick it there: it survives a restart and you can switch mid-session.
  • Use --model for a one-off, for a model nobody has curated, or whenever the exact context window matters. It pins the whole session, so start a new one to change your mind.
  • Quote ids with spaces. Some nexos ids have them, as in nexos:"Claude Sonnet 4.6".

The statusline

Selan adds a line to the bottom of Claude Code showing who you are, what you are running, and how much room you have left. It installs itself: there is no file to write and no flag to pass.

◆ selan·SelanOpus 5 (1M context)⎇ main*5h▰▰▱▱▱▱32%7d▰▰▱▱▱▱39%day▱▱▱▱▱▱$0.00/$50
SegmentWhat it tells you
Selan The company you are signed in to and spending against.
Opus 5 (1M context) The model actually serving this session, after any /model change, not what you launched with.
⎇ main* Your branch. The * means uncommitted changes (the one to check before letting seland loose).
5h 32% How much of your company's 5-hour rate limit is used.
7d 39% The same over 7 days. The slower one to recover from.
day $0.00/$50 Your own spend against your own budget, in whichever period is tightest right now, so it may say week or month instead.

The meters are your company's headroom, not your own, because you do not have a personal rate-limit window. Selan picks the least-loaded account for each request. When they run hot, expect prompts to slow down, and start a long job later. Fleet numbers can sit a couple of minutes behind the dashboard; your own spend is always current.

Set SELAN_NO_STATUSLINE to turn it off, whatever value you give it. If you already have a statusline of your own, Selan leaves it alone.

The same numbers, without launching Claude Code:

selan usage

Limits and spend

Two kinds of limit can stop you. A key's limit caps everything spent through one of your company's keys, by anyone. Your own limit is set once and applies across every key in the company. It follows you, and does not start again on each key.

Both run on calendar periods in UTC (a day, a week or a month) and both bind the moment they are reached, not once they are passed. The refusal names which limit it was and when it resumes; if two are over at once, you are told the later of the two. Nothing you retry clears it sooner.

Spend is attributed to you personally, so one person running hot does not consume someone else's allowance. Your own budget is the bar on the statusline. Watch it, and do not wait for the refusal.

Going further

seland: running autonomously

Normally Claude Code stops and asks before it edits a file or runs a command, so it cannot finish a job while you are away from the terminal.

seland is the same binary under a second name, installed beside selan. Running it is selan claude --dangerously-skip-permissions. Claude Code works to the end without asking you anything.

seland claude … and seland … are the same launch. Launching Claude Code is the only thing seland does, so the command word is optional. Typed out of habit it is dropped, not passed on as your prompt. The examples below spell it out to match the rest of this page; leave it off if you prefer.

Hand it one job

The most common use. Give it a task, walk away, read the diff when it is done:

cd ~/work/api
seland claude -p "the auth middleware tests are failing. Find out why and fix it."

Everything after seland is Claude Code's, so anything you already pass still works: -p for a one-shot task, --resume to pick a session back up, --output-format to get JSON back out.

Or a whole session

seland

A normal interactive session with the prompts turned off. It first prints the directory it is about to work in and waits for one enter (the only confirmation you get, and the only one you need, because the flag then holds for the rest of the session in that directory).

Overnight, or in CI

Add a CLI token and nothing interactive is left: no browser, no prompts, no enter to press. In GitHub Actions:

- run: curl -fsSL https://claude.ai/install.sh | bash
- run: curl -fsSL https://dl.selan.ai/install.sh | sh
- run: seland claude -p "update every dependency with a patch release, run the tests, open a PR"
  env:
    SELAN_TOKEN: ${{ secrets.SELAN_TOKEN }}
Piped or in CI, the enter is skipped and it starts immediately. There is nobody to ask, and blocking on input nothing will ever write would hang the job without protecting anything. An unattended seland therefore runs with no confirmations, whatever access the job has, and whatever the runner checked out.

Plan it first

Plan mode is the opposite setting: Claude Code reads the code, works out an approach and tells you, changing nothing:

selan claude --permission-mode plan

Agree the plan there, then hand the work over to seland to carry out, so you review the approach before anything is written, not the diff afterwards.

Use selan for this one, not seland. seland always skips permissions, which is the opposite of what this flag asks for.

Where to run it

With the prompts off, nothing stops a bad edit as it happens, so what limits the damage is how much the session can reach:

  • Commit or stash first. A clean tree means git diff is the complete record of what it did, and git checkout . is the whole undo.
  • Start it in the directory you mean. It works from where the terminal was sitting, and it will not ask again.
  • Give a long job its own worktree with git worktree add ../job my-branch, so it cannot touch what you are editing.
  • In CI, scope the token the way you would any other: a runner with no production credentials cannot reach production, whatever it is asked to do.

There are no subcommands under the second name: every argument belongs to Claude Code. seland whoami, seland login and the rest are refused, and point you at selan.

Running unattended: CI, containers, cron

selan login needs a browser, which an unattended job does not have. For those, an owner mints a CLI token under Settings → CLI tokens, and the job carries it in the environment:

export SELAN_TOKEN=selanct_...
selan claude -p "review this diff"

With it set there is no sign-in, no browser, and nothing written to disk, so it is safe to hand to a container without baking a credential into the image.

A CLI token spends as itself, under an address of its own like ci-nightly@tokens.selan.ai. Use one in place of a person's login for exactly this reason: the nightly job's bill shows up as the nightly job in Usage and in Logs, instead of on whoever set it up. Give each job its own token and name it after the job.

Check which one a shell is using with selan whoami. It prints only the last four characters, so it is safe to leave in a CI log.

A token beats a stored login, unconditionally. If SELAN_TOKEN is set in your own shell, your own selan claude spends as the token, not as you, so a job started on a laptop bills the job and not the laptop's owner. A stray export is easy to miss, and selan whoami is the only place it surfaces.

Staying up to date

selan update

Updates in place, next to the binary you are actually running.

You rarely need to run it. selan claude checks once a day, and when there is a newer release it installs it before handing over the terminal.

If an update fails, you get a warning and Claude Code starts anyway. On a build machine where you want the version pinned, set SELAN_NO_AUTO_UPDATE (whatever value you give it) and update deliberately instead.

For admins

What an owner sets

Everything below happens in the Selan control app at control.selan.ai, not on the command line. How it works walks through the screens.

SettingWhat it does
Accounts and provider keys Add the Anthropic accounts Selan leases from, and connect your own OpenRouter, nexos.ai, Ollama, Google Vertex or ChatGPT account. The full list is in Providers and models. Credentials are verified with the provider when added, encrypted before they are stored, and never rendered back, not even to whoever added them.
Settings → Models One switch per model. On puts it in every developer's /model picker; off takes it out. Off by default: connecting a key alone changes nobody's picker.
Connections One switch per connector: Jira & Confluence, Sentry, Linear, Notion, GitHub and the rest of the catalog Selan curates. On offers it to every developer alongside the model; off takes it away. Off by default. Each developer signs in to a connector as themselves the first time they use it, so their own permissions apply and Selan never holds their account. For the same reason, the page shows you what is offered and never who has signed in. A few connectors cannot register a client automatically and need an OAuth client you create; the page says which, and asks for it there.
Settings → CLI tokens Mint a token for CI. Owner-only, capped at 20 live, expiring in 30/90/365 days or never. Shown once. Revoked from the same panel.
Spend limits Per key, and per person on a key, for a day, a week or a month.
Secret scanning Off by default. With it on, every request body is swept with gitleaks' rules and each match is replaced before a byte goes upstream. It redacts and forwards, and never blocks. Developers see nothing; owners get a Secrets feed in Logs. See Hiding secrets.
Commit attribution Turn off Claude Code's co-author line and session-URL trailer in commit messages, company-wide.
Repository attribution Lets usage be attributed to the repo it ran in, which is what Insights reads. Supported clients may supply a host-qualified repository slug consistently; Selan records it only after an owner turns this on. Off by default.
Passing your own --settings opts out of the settings half. Your flag wins, and Selan does not merge into it, so that launch gets no statusline and none of your company's settings, including attribution coming back on for a company that turned it off. It does not opt you out of the connectors: your company's MCP servers are still passed in, and still added to and removed from ~/.claude.json as the company switches them on and off. To own that half too, pass --mcp-config as well. With both, the CLI says so on launch.

More

  • Agents. Running an agent with nobody watching: the token, the agent file, GitHub Actions and GitLab CI.
  • Hiding secrets. How a credential in a prompt or a tool result is stripped before the model sees it, with a throwaway token you can run through it yourself in either client.
  • Reference. Every command, every environment variable, every error message, and what differs on Windows.
  • Claude Desktop. Running the desktop app on your company's account: one settings file, imported, with a picture per step.
  • Bring your claude.ai data over. Moving your chats, projects and attachments into Desktop, and the one command that carries the scheduled tasks the importer cannot.
  • Google Vertex. Run Claude on your own Google Cloud project, billed to your own Google account.