·
Last changedVersion:
This version passed the hardening gate. Hardening applied 1 targeted change and preserved all other text. Classified findings before hardening: 1. Classified findings closed: 0. Classified findings remaining: 1. Unclassified scanner findings remaining: 0. Review findings closed: 1. Review findings remaining: 14.
1
1
Expand | File | Group | Subtype | Severity | Status |
|---|---|---|---|---|---|
SKILL.md | Prompt Injection | Direct prompt injection | Medium | Open |
1 finding
The Web analytics Live tab (/web/live) shows real-time activity over a 30-minute sliding
window plus a 60-second "users online" count. It is the place to answer "what is happening
on my site right now?" — pageviews, named bots, devices, geo, top paths, top referrers, and
a live event feed.
This skill teaches you (the agent) how to:
The Live tab is not a HogQL playground — its data comes from a livestream backed by short HogQL backfills. When the user wants to query "right now" data with HogQL, point them at the tab; when they want historical breakdowns, build an insight with the patterns below.
Use this skill when the user:
/web/live)Do not use this skill for non-realtime web analytics work — for that, use the standard
Web analytics tab (/web).
URL: /web/live
The tab has a grid of tiles. Date range is fixed: 30 minutes sliding window for everything except "Users online" (last 60 seconds).
There is only one filter on the live tab: the host (domain) selector.
webAnalyticsFilterLogic.selectedHost./web propagates to
/web/live and vice-versa.WEB_ANALYTICS_LIVE_DOMAIN_FILTER. If the flag is off, no
host filter UI is rendered and all tiles show data across every domain.When the user asks "filter live traffic by domain <host>", direct them to the Domain
selector at the top of the Live tab. There is no URL param to set it directly — it
persists in localStorage via webAnalyticsFilterLogic.
| Card | What | Window |
|---|---|---|
Users online | Distinct device IDs seen in the last 60 seconds | 60s |
Unique visitors | Distinct device IDs in the last 30 min | 30m |
Pageviews |
| 30m |
| Card | What | Notes |
|---|---|---|
Active users per minute | Bar chart, new vs returning visitors | last 30 min |
Top pages | Animated leaderboard, | top 10, 30 min |
Top referrers | Animated leaderboard, | top 10, 30 min |
Devices | Breakdown bars, | top 6 + Other |
Browsers | Breakdown bars with logos, | top 6 + Other |
Top countries | Breakdown bars, | top 6 + Other; replaced by a Country/City tab card if |
Bot requests per minute | Bar chart, bot events / minute | flag |
Bot traffic | Named bots ranked by event share, with category tag | flag |
Countries (world map) | SVG world map heat | flag |
Live events | Streamed event feed (event, person, URL, timestamp) | last 50 events |
Every tile (except the live event feed and world map) has an "Open as new insight" button that opens a 7-day Trends query in product analytics. The bot traffic tile rows are also individually clickable — clicking a bot row opens a single-bot trend.
Bots are detected server-side. Three virtual properties are attached to the event before it lands in ClickHouse:
$virt_is_bot — boolean, true if classified as a bot$virt_bot_name — string, the bot's display name (e.g. Googlebot, GPTBot,
Claude, Lighthouse, HeadlessChrome)$virt_traffic_category — string, the category key:
ai_crawler, ai_search, ai_assistant, search_crawler, seo_crawler,
social_crawler, monitoring, http_client, headless_browser, no_user_agent,
regularThe Live bot tiles count "bot-eligible" events: $pageview, $pageleave, $screen,
$http_log, $autocapture. $http_log is included because most bots emit server-side
HTTP logs rather than JS pageviews.
When the user wants a longer window, a saved insight, a dashboard tile, or to share a view of what's on the Live tab, build a Trends insight. The "Open as new insight" buttons in the UI use exactly these recipes:
A single chart of all bots over time, broken down by name. This is the canonical "who's crawling me?" view.
The category filter is optional — include it when the user asks about a specific
bot+category combo (Lighthouse · headless_browser is a different signal from
Lighthouse · monitoring).
Use breakdown by $virt_traffic_category instead of $virt_bot_name when the user
wants "AI crawlers vs SEO crawlers vs everything else" rather than per-bot rows.
For non-bot tiles, use $pageview with math: unique_users, breakdown by the
underlying property:
| Tile | breakdown property | display |
|---|---|---|
Top pages |
|
|
Top referrers |
|
|
Devices |
|
|
Browsers |
|
|
Countries |
|
|
Always inherit the live tab's host filter when the user is asking about a specific
domain — add { "key": "$host", "value": ["<host>"], "operator": "exact", "type": "event" }
to properties.
dateRange.date_from: -7d unless the user names a window — the live view itself
is 30 min, but the user is almost always asking about a longer window when they
request an insight version.interval: hour for 7-day windows, minute only for windows under a day,
day for windows beyond 14 days.| User says | Right move |
|---|---|
"What's happening on the site right now?" | Send them to |
"Filter live traffic to | Use the Domain selector at top of |
"Show me bots crawling us in the last 30 min" |
|
"Show me bots crawling us this week" | Build the "Bot traffic breakdown" insight above with |
"How much is GPTBot hitting us?" | Build the "Single bot drill-down" insight, set |
"Why is the live tab showing X but my dashboard shows Y?" | The live tab is a 30-min sliding window over events; dashboards aggregate over the picked range. They are not directly comparable beyond the last 30 min. |
"Add a date range to the live tab" | The Live tab has no date picker — for ranges, build a Trends insight using the patterns above |
"Filter live traffic by browser / device / country" | Not supported — only the host filter exists. Build a Trends insight with the relevant breakdown + filter instead |
$virt_*) only exist on events processed by the bot
classification step. They are not retroactive — events from before the classifier
shipped will not have them. Keep dateRange.date_from within the last few months
for reliable bot results.$http_log events come from server-side log capture, not from posthog-js. If a
project does not emit $http_log, bots that don't run JS (most crawlers) will be
invisible to the bot tiles.example.com, not https://example.com.localStorage (under feature flag
WEB_ANALYTICS_LIVE_EDIT_LAYOUT). If a user's layout looks different from yours,
it is not a bug.Get started with chainctlchainctl skill install public/posthog/exploring-live-traffic:latest
Bring Chainguard's hardening pipeline to your first-party skills — custom rulesets, automated remediation, full audit trail.
skills.cgr.dev/public/github.com/posthog/skills/omnibus/exploring-live-traffic:latest
MIT
HARDENING.md
LICENSE
SKILL.md