vTilt
Why vTiltHow It WorksFeaturesFAQDocs
Docs / Debug logging
Quick startEvent forwarding
MCP server
Guides
OverviewAuthenticationOAuthAgent skills (prompts)AI intelligenceGoogle Ads
Client setup
CursorClaude DesktopVS CodeCodex
Realtime
Debug ViewRealtime Dashboard
Integration guides
Frontend frameworks
Next.jsNuxt.jsVue.jsReactReact RouterRemixGatsbySvelte / SvelteKitAstroAngularTanStack StartDocusaurus
Backend frameworks
NestJSHonoCloudflare WorkersDjangoFlaskLaravelPhoenixRuby on Rails
Backend languages
PythonPHPRubyElixirGoJava.NET / C#Rust
Stack guides
Vue + PHP
SDK
Browser SDK
InstallScript bundlesEvent trackingAutocaptureIdentify & aliasWeb VitalsSession recordingChat widgetFeature readinessRemote configurationReverse proxyDebug logging
Node SDK
Install & setupCapture, identify & aliasContext & shutdown

Documentation

vTilt
Quick startEvent forwarding

MCP server

Realtime

Debug ViewRealtime Dashboard

Integration guides

SDK

InstallScript bundlesEvent trackingAutocaptureIdentify & aliasWeb VitalsSession recordingChat widgetFeature readinessRemote configurationReverse proxyDebug logging
DocsBrowser SDKDebug logging

Debug logging

Configurable console log levels prefixed with [vTilt] for filtering. The default is warn — errors and warnings always reach you. Two ways to set the level.

When troubleshooting initialisation, identity, or event delivery, the browser SDK emits level-gated messages prefixed with [vTilt] so you can filter them in the browser DevTools console.

The default level is warn — the SDK will surface errors and warnings out of the box, with no opt-in required. Production consoles stay quiet because the level taxonomy reserves info and debug for things you only want while wiring up or live-debugging.

Note

Note: Console debug logging (this page) is different from the $debug event property used by the Debug View on the dashboard. Console debug controls what the SDK prints to console.* in the browser. $debug is a flag attached to events on the wire so they show up in the realtime Debug View — set it with ?vtilt_debug=1 in the URL or debug: true in vt.init().

#Two ways to set the level

You can control the SDK's console verbosity from two independent places. Init-time configuration always wins when both are set.

#1. In the snippet (build-time)

Pass log_level (or debug: true) to vt.init(). This locks the level for that page load and ignores the dashboard setting.

vt.init('YOUR_PROJECT_TOKEN', {
  api_host: 'https://www.vtilt.com',
  log_level: 'debug', // or `debug: true` for the same effect
})
typescript

You can also generate a snippet with the level baked in from Project Settings → Integration Script in the dashboard — pick a level in the Console log level dropdown and copy the generated snippet.

#2. In the dashboard (runtime, all visitors)

Open Project Settings → Default Configuration → Diagnostics and pick a level. The SDK fetches this on boot via /api/decide (cached for 60 seconds) and applies it to every visitor whose snippet did not hard-code log_level / debug.

Typical use case: support is helping a customer reproduce a bug. Flip Diagnostics to debug for a few minutes, ask the customer to reload the page, then revert it.

Warning

Warning: When set to info or debug in Default Configuration, every visitor with the SDK loaded will see verbose console output. Revert when debugging is complete.

#Log levels

Each level includes the levels above it (e.g. info shows info, warn, and error). Scopes after the colon (e.g. :autocapture) name the SDK module that emitted the message — useful for filtering in DevTools.

LevelWhat it surfacesExample output
noneNothing. Hard mute for shared kiosk consoles or when third-party tooling is noisy already.(no output)
errorThe SDK or your input is broken in a way that prevents work.[vTilt]:request transport unavailable<br />[vTilt]:identify invalid input
warnDegraded but recovering — fallback paths, retries, deprecated APIs, missing browser features.[vTilt]:storage localStorage disabled, falling back to memory
infoOne-time lifecycle events you want while wiring the SDK up.[vTilt]:autocapture started<br />[vTilt]:replay session started
debugPer-event trace useful when filing a bug — every captured event, every autocapture skip, queue flushes, request URLs.[vTilt]:capture $autocapture { distinct_id, $current_url, ... }<br />[vTilt]:autocapture skip class_blocked

#Filtering in DevTools

All output starts with [vTilt], so you can filter to just the SDK:

[vTilt]
text

Or narrow to a single module by including the scope:

[vTilt]:autocapture
text

#Going completely silent

For environments where any console output is unacceptable (shared kiosk consoles, embedded webviews you don't own), set:

vt.init('YOUR_PROJECT_TOKEN', {
  api_host: 'https://www.vtilt.com',
  log_level: 'none',
})
typescript

This is the only way to suppress errors as well — the default warn floor will still let error and warn through.

PreviousReverse proxyBrowser SDKNextInstall & setupNode SDK

On this page

  • Two ways to set the level
  • 1. In the snippet (build-time)
  • 2. In the dashboard (runtime, all visitors)
  • Log levels
  • Filtering in DevTools
  • Going completely silent