ConsoleLogServer
// browser console, captured

See your users' browser console. From anywhere.

ConsoleLogServer captures console.* output from real browsers, stores it in durable label-indexed storage, and makes it searchable by session, user, app, environment, and level — from a web UI or the terminal.

// what you get
[*]

One script tag

Drop cls.js into your page with an API key. No SDK, no build step — it hooks the console and streams logs.

[*]

Search by anything

Filter by session, user, app, environment, level, and time range. Click any label to pivot the whole view.

[*]

Built for AI agents

A companion CLI queries the same logs from the terminal — point Claude Code, Codex, or any coding agent at one user's session to investigate a bug. Ships with a drop-in agent skill.

[*]

Team & API keys

Invite your team into an organization, mint per-org API keys, and revoke them the moment they leak.

[*]

Durable storage

Logs land in Loki — durable, label-indexed, and fast to query over wide time windows.

[*]

Self-hostable

Ships as a single Go binary in one container. Run it on your own infrastructure, keep your data.

// how it works
  1. 1

    Drop in the snippet

    Add one script tag with your API key. It hooks the console and batches messages to the ingest endpoint.

  2. 2

    Logs stream in

    Every console.log/warn/error from your users' browsers arrives tagged with session, user, app, and environment labels.

  3. 3

    Search in the UI or CLI

    Filter by session, level, and time in the browser — or query the same logs from the terminal, built for AI agents debugging a specific session.

index.html
<script src="/static/cls.js" defer></script>
<script>
  CLS.init({
    endpoint: '/ingest',
    apiKey:   'ak_live_…',
    defaultLabels: { app: 'web', env: 'prod' },
  });
  CLS.identify({ userId: 'u123' });
  CLS.hookConsole();
</script>
terminal
$ cls -labels session=s_92fa -level error -start -1h

Stop guessing what broke in the browser.

Capture the console once, then search every session. Self-hostable as a single Go binary.

Get started