SightLift

The always-on nudge

Your team's proven skills are only worth having if someone reaches for them. The nudge makes Claude Code check on every prompt, and speak up only when something genuinely fits.

← How capabilities work
This is an addition to connecting your own agent, not a replacement for it. Connecting with a personal sign-in adds capabilities as tools — the assistant calls one when it judges it relevant, which means a capability nobody thinks to look for is a capability nobody uses. The nudge closes that gap from the other side: it asks on every prompt, so finding out never depends on remembering — and it reaches people who have no SightLift login at all. Most teams want both.

What a shared token can do, and where it stops. The token on this page consults your team's skills on every prompt and records what got used — that is the nudge, and it is the whole of it. It cannot browse your capability library, read a capability in full, or run an automation: those answer to a person and need a sign-in, so no shared credential reaches them.

What it actually does

It's a Claude Code hook — something the tool runs itself, on an event, rather than something the assistant decides to call. This one runs on UserPromptSubmit: every time someone presses enter, before the prompt reaches the model.

Claude Code posts the prompt to SightLift, which ranks it against your team's live skills. If the best match clears the fit threshold, it's added to the prompt — the title, who proved it and when, and the recipe to follow. If nothing clears the bar, nothing is added and nobody knows it ran.

Nothing gets installed

There's no script to download and no file to keep up to date on anyone's machine. The hook is a URL: Claude Code posts to it and uses the reply. That's the whole mechanism, and it's the reason this can reach people who have no SightLift login at all — configuration can be pushed to a fleet, files cannot.

It can never block a prompt. A slow reply, an expired token, our server being down: Claude Code treats every failure as "no nudge this time" and sends the prompt unchanged. That's the platform's behavior, not something we implement carefully. A reply that takes longer than the timeout also leaves a notice in the transcript saying the hook timed out.

Set it up

Open Configuration → Connect → Roll it out to your team. What you see there depends on whether your team has ever issued a token, so the steps below are written as the two states you can land in rather than as a fixed sequence.

Claude Code is the only client this targets. Hooks are a Claude Code feature and there is no equivalent elsewhere to point at, so unlike the other setup guides here this one has no per-client variants.

If you've never issued a token

The card shows a single button: Generate your first token. Click it, give the token a name — Managed settings — company-wide, CI — build agent; the name is what lets you revoke this one later without touching the others — and press Issue token.

The block below then appears with your token already in it, flagged and ready to copy. That is the only time the token is shown in full: we keep only a hash afterwards and cannot show it again. Copy the whole block — not the token on its own — and press I've copied it.

If your team already has one

The same block is there, with <YOUR_TOKEN> where the token goes — a token is shown once, at issuance, and we keep only a hash afterwards, so there is nothing for us to fill in. Copy the block and put the token you saved in place of that placeholder. If nobody saved it, issue a new one from the row at the bottom of the card and the block comes back filled in; the old token keeps working until you revoke it.

Where the block goes

For one person, ~/.claude/settings.json. For a team, use managed settings — see below, which is the case this is really for. Either way, copy the block from the card rather than transcribing this one:

{
  "env": { "SIGHTLIFT_TOKEN": "<YOUR_TOKEN>" },
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "http",
            "url": "https://app.sightlift.ai/api/consult",
            "headers": { "Authorization": "Bearer $SIGHTLIFT_TOKEN" },
            "allowedEnvVars": ["SIGHTLIFT_TOKEN"],
            "timeout": 5
          }
        ]
      }
    ]
  }
}

Restart Claude Code, then submit a prompt about work one of your skills covers. You won't see the nudge itself. Claude Code hands it to Claude as context, not as a chat message, so the sign it worked is an answer that follows the skill's recipe. To see the hook fire, start Claude Code with claude --debug-file hook.log and look for a Hook UserPromptSubmit entry in that file. A prompt about something unrelated gets no nudge, by design.

allowedEnvVars is not optional. Without it Claude Code interpolates $SIGHTLIFT_TOKEN to an empty string and the request is refused. Claude Code carries on without the nudge and shows nothing on screen to explain why.

Rolling it out to a team

This is the case the connection token was built for. One token, set once in your company's Claude managed settings — the people who get the nudge never sign into SightLift, never hold a credential of their own, and do none of the setup above. Because the hook is a URL rather than a file, there is nothing else to distribute.

In claude.ai → Organization settings → Claude Code → Managed settings, the same place you'd configure telemetry. Merge the env and hooks blocks into the existing file rather than replacing it. Managed settings take the highest precedence. Claude Code fetches them when it starts and checks for changes hourly while a session runs.

Everyone sees an approval prompt. Any hook in managed settings makes Claude Code show each person a security dialog describing it before it applies the settings in an interactive session. They have to approve it to continue. If they decline, Claude Code exits. Claude Code remembers the approval, so tell people before you roll it out rather than after.

What you'll see afterward: adoption from a shared token is counted for the team as a whole and never attributed to individuals — the capability pages show that a skill was used and how often, not who used it. That's deliberate.

What gets sent, and what we keep

Being precise, because this fires on every prompt.

Sent: the prompt text, to your own organization's SightLift, so it can be matched against your skills. Claude Code also sends a session ID and a prompt ID, which we keep to link a nudge to its use. It sends the working directory, a transcript path, the permission mode, and the session's title if you named it. We discard all of those at the edge, so they never reach matching, logging or storage. Your files, the rest of the conversation and the model's reply are not sent.

Kept: normally nothing from the prompt. Matching happens in memory and the text is discarded. The one exception is when nothing fit, where up to 12 keywords are recorded so your team can see what people needed and didn't have. Those are lowercased, de-duplicated, stripped of common words, and stored in alphabetical order, so the original wording and sentence order can't be reconstructed. They're tied to the session so an erasure request can reach them.

Separately, when the nudge does fire, it records that the skill was used — that's what the adoption numbers count. That record carries the size of the prompt, never its content.

Tuning it

The threshold is the server's, and deliberately not a per-machine knob: a team should see the same behavior. If the nudge is too chatty or too quiet for your capabilities, tell us and we'll tune it with you rather than have everyone edit a file.

The one local knob is timeout: how long Claude Code waits before giving up on the reply. Five seconds is generous; the matching is a lexical lookup, not a model call.

If it doesn't fire

What you seeUsually
No sign it ever firesThe nudge is never shown as a message, so check the debug log first (see "Where the block goes" above). Then check the token is set and not revoked: Configuration → Connect shows last-used. A refused token shows nothing on screen, so a bad token looks the same as no match.
The hook fires, and the token is fineCheck allowedEnvVars is present. Without it the header goes out empty.
It fires but nothing is ever relevantYou may have no skills in the live state yet. The nudge can only offer what's already served to your team.
Adoption stays at zeroShouldn't happen — use is recorded in the same request that returns the nudge. Tell us if you see it.

← Back to the dashboard