Skip to the demo
interpretability, made tangible

Watch a language model think, layer by layer. Then steer it.

Steerscope reads out what a real instruct model predicts at every one of its layers, so you can see the moment it makes up its mind. Then drag a slider to push a behaviour, refusal, sentiment, formality, into its residual stream and watch the sentence rewrite itself. The logit lens and the steering vectors are built from scratch.

  • from-scratch logit lens
  • activation steering
  • runs on your GPU
  • zero server

Live demo

detecting
Continuation

The weather in Melbourne today is

Per-layer predictiontop layer = output, bottom = embeddings
decision layerlow to high confidence

Steering

0.0
complyoffrefuse
0.0
negativeoffpositive
0.0
bluntoffflattering
0.0
casualoffformal

Each slider adds a contrastive activation vector into the residual stream at a single mid-depth layer, scaled to the layer's natural norm. Zero is a provable no-op. Past the shaded band the output loses coherence.

Select a token above to inspect what the model predicted at each layer.

Not a wrapper. The interpretability is built from the ground up.

The logit lens

At every layer the model holds a running guess of the next token in its residual stream. We apply the model's final norm and unembedding to each layer's hidden state, so you read out that guess directly. The math is implemented from scratch and checked against a reference to the last decimal.

nostalgebraist, 2020

Activation steering

For each behaviour we compute a direction offline as the mean difference in activations between contrastive prompt pairs. At inference we add a scaled copy of that direction into the residual stream at one mid-depth layer, so a single slider nudges refusal, sentiment, or formality without touching a prompt.

Rimsky et al. 2023, Arditi et al. 2024

All in the browser

Generation, the per-layer read, and the steering injection run entirely on your GPU through WebGPU. There is no inference server and no per-visit cost, which is only possible because the model is small and the heavy work stays on the device.

Qwen2.5-0.5B-Instruct

Honest status

The load-bearing engineering, the logit-lens math and the steering composition, is real and tested now. The browser demo drives those same visualisations with a labelled preview while the instrumented model, built by the pipeline in this repo, is wired in. Nothing here claims to be measured that is not.

Proven and tested

  • From-scratch logit lens (RMSNorm, tied unembedding, softmax, top-k), checked against a numpy reference in CI
  • Contrastive activation steering composition with a provable zero no-op and norm-matched scaling
  • Colourblind-safe heatmap with a full text alternative and keyboard support

Live in this demo

  • Interactive per-layer prediction ladder with the decision layer marked
  • Four steering sliders with an incoherence zone, driving live re-generation
  • Runs client side with WebGPU detection and graceful fallback

Real artifacts, validated

  • Golden fixtures generated from the real Qwen model weights, and the browser math checked against them
  • Contrastive Activation Addition steering vectors computed offline, and a measured refusal and perplexity curve
  • Instrumented ONNX graph exported and validated (per-layer lens outputs, steering input, provable zero no-op), ready to wire into the worker