Skip to content

feat(onboarding): a "Send your data" step with a live ingest status strip #5680

Description

@vivekchand

Problem

Onboarding has no data step and the product has no "is my data arriving?" surface anywhere.

clawmetry/static/js/onboarding.js is: sign in → choose cloud or self-host → done. Its own header comment states the premise — "Runtime detection is 100% automatic (daemon-side); nothing here asks the user to name or configure a runtime."

That premise is right and it is a real advantage over every vendor that makes you wire an exporter. But it has two costs today:

  1. There is nowhere to put a second door for agents auto-detection cannot see (CI, containers, remote hosts) — the case the paired ingest-key issue opens up.
  2. There is no confirmation. A user who installs and sees an empty dashboard has no way to tell "nothing is running" from "it is broken". That question is what kills setup funnels, and we have prior evidence it kills ours: 285 launches → 13 choices in 14 days on the old gate.

Bronto's screen answers it with one persistent strip: Waiting for events — we'll let you know when data arrives hereConnected · 22 events received, with a progress bar toward the threshold where parsing kicks in. It is the cheapest trust-builder on their site.

Scope

A. GET /api/onboarding/ingest-status (new, in routes/overview.py alongside the existing /api/onboarding/state)

Returns, cheaply enough to poll every 2s:

{
  "connected": true,
  "events_total": 4127,
  "events_recent": 22,
  "first_event_at": 1757300000.0,
  "last_event_at": 1757300412.0,
  "sources": [
    {"kind": "filesystem", "runtime": "claude_code", "events": 4100, "last_at": 1757300412.0},
    {"kind": "otlp",       "runtime": "my_langchain_app", "events": 27, "last_at": 1757300390.0}
  ]
}

sources is what makes it more useful than Bronto's counter: it says which door the data came through, so "I configured OTLP and it isn't arriving" is answerable without a log dive. Read it through routes/local_query.py::_dispatch like every other handler — not from raw files, or it returns empty on cloud.

B. A "Send your data" onboarding step, after the hosting choice, with three doors:

Door Content Default
This machine What was auto-detected, listed by runtime. Nothing to configure. Pre-selected; for most users this is the whole answer
Somewhere else Ingest key + endpoint + a copy-paste curl that works
Ask your agent The setup prompt (paired issue)

C. The strip. Persistent under the step: Waiting for events…Connected · N events received. On an install where auto-detect already found sessions it lands on connected immediately, which turns the step from a chore into a confirmation. Skippable, and never blocking — the user can always reach the dashboard.

Non-goals

  • No "events needed to parse" progress bar. That threshold exists because Bronto has to learn a schema from unstructured lines; our events are typed on arrival. Copying the bar would be copying an artefact of their weakness.
  • No config-conversion door (paste a Vector/Fluent Bit config, get a rewrite). Only pays off for teams already running collectors, which is a minority of this audience.

Traps

  • Adding a step to a flow whose whole selling point is having no steps. It must be skippable in one click and must never gate the dashboard.
  • The onboarding overlay has bitten us before: a duplicate id=page-guard blanked switchTab. Check element ids before adding markup to templates/partials/overlays.html.
  • Poll the status endpoint, don't SSE it — this runs before the user has any reason to trust us with a long-lived connection.

Acceptance

  • A fresh install with existing local sessions shows a non-zero event count without the user clicking anything.
  • A remote push (paired ingest-key issue) flips the strip to connected within one poll interval, and sources names it as otlp, not as filesystem.
  • Skipping lands on the dashboard with no nag on next launch.
  • The endpoint answers in under 50 ms on a store with 100k+ events (it is polled).

Part of the ingest-gap plan (phase 1, item 3 of 5).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions