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.
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.
| 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 |
Your pick becomes the default for new sessions, and you can change it mid-session as often as you like.
--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.
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
--modelfor 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.
| Segment | What 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 }}
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 diffis the complete record of what it did, andgit 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.
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.
| Setting | What 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. |
--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.