Profile Trail
Profile Trail is the sixth view in the dashboard. It tracks profile changes: follower counts moving, friends counts moving, bios being edited, avatars swapped, verification status flipping. The Live Feed shows what people post. Profile Trail shows what they change about themselves.
Open it from the sidebar. The view splits into two columns.
Left column: one row per account
The dense table on the left has one row per tracked account that's had at least one change in the active window. For every row:
- Profile: avatar, display name, handle, blue-check status.
- Tags: the five Patera tags assigned to that account's bio (e.g.
BITCOIN,AI,TRADER,FOUNDER,RESEARCHER). If analysis is in flight the cell readsanalysing…; if classification failed it readsfailed, retrying(Patera re-attempts on the next observation); if the bio is empty it readsno bio. Each label is honest about the current state. See the tags section below. - Followers Δ and Following Δ: net change over the window, signed. Positive numbers in green; losses in red.
- Latest event: the most recent change's relative time.
The Profile, Followers Δ, Following Δ and Latest event column headers are all clickable to sort the table; click the same header again to flip direction. The default is Latest event, descending (newest activity on top).
Click any row to expand an inline accordion showing the latest five changes for that account plus its live follower and following counts and tag pills. Inside that accordion, a View full history button opens a detail modal with the complete per-account trail (up to 2,000 events over the last 30 days) with its own Field filter and a Sort selector: Newest first, Oldest first, Biggest gain, Biggest drop. The modal also shows the account's live post count alongside its follower and following counts.
Right column: one card per event
A scrolling list of recent changes across every tracked account, newest first. The feed shows up to the 200 most recent events in the active window. Each card carries the account, the field that changed (bio, avatar_url, is_blue_verified, followers_count, friends_count, location), the old value, the new value, the time. Cards include a view-on-X anchor so you can jump to the account in one click.
Each card has a colour-coded left stripe by change type: green for follower gains, the warning colour for losses, purple for an avatar swap and accent blue for a blue-verification flip. Follower or following swings of 1,000 or more get a thicker stripe and a spike badge so large moves stand out at a glance.
The right column is global; it does not group by account. That's the left column's job.
Filters
Three filters sit in the header strip:
- Window: 1h, 24h or 3d (default 24h). Restricts both columns to events whose
changed_atis inside the chosen rolling window. The header stats numbers stay scoped to the last hour regardless of this selector (see Header stats strip). - All tags (Patera vocabulary): filter to accounts carrying one or more tags. The ANY/ALL combinator decides whether a row needs any of the picked tags or all of them.
- All fields: limit to a single change type (e.g. only
bioedits, onlyis_blue_verifiedflips).
Clear-filter pill appears as soon as any filter is non-default.
A separate 1.2K / 1,234 segmented toggle in the header switches every number in the view between compact (1.2K) and absolute (1,234) formatting. It covers the Followers Δ and Following Δ columns, the expanded-row counts and the header stats totals. The choice is global to the view.
Header stats strip
The strip carries live numbers from the /profile_trail_stats endpoint:
- N profiles: distinct accounts with activity in the last hour.
- N events (1h): total recorded changes in the last hour.
- pulse Ns ago: relative time of the most recent recorded event.
- total N profiles · N events: all-time aggregates across every account Patera has ever observed.
All four are skeleton-loaded; you'll see a shimmer bar before the values arrive. The strip refetches every 10 seconds while the view is active; the pulse pill ticks every second locally between fetches so the displayed age stays live. The counts are always scoped to the last hour regardless of the column Window selector; the Window selector only affects the table below.
Patera tags
Every profile gets classified into five tags drawn from a fixed vocabulary of fifty-five labels. The classifier reads only the bio; it does not search the web. Five distinct tags per account. The most specific tag in the vocabulary wins (so BITCOIN beats FINANCE when the bio names a specific topic).
Tags appear:
- In the left-column row.
- On every tweet card across the dashboard (so a Live Feed tweet from the same account shows its tags inline).
- As a filterable dimension in the header strip and in the Dashboard filter row.
If a profile has no bio Patera does not call the classifier; the row reads no bio. If a classification attempt fails the cell reads failed, retrying and Patera re-attempts on the next observation. If the bio later changes the next observation triggers a fresh analysis. No permanent block, no stale state.
Real-time updates
Both columns update over the same WebSocket stream as the Live Feed. New events stream in; the left-column row floats up if its Latest event becomes the newest; the right column prepends the card. No refresh needed.
When the WebSocket reconnects after a drop, Patera replays missed events on hydration so you don't lose the gap. The header pulse pill ticks every second between polls so you can tell at a glance whether the stream is fresh.
Where the data comes from
Profile Trail is sourced from twitter_profile_temporal, an append-only log of every detected field change. Patera writes one row whenever any field on a tracked account moves between snapshots; a baseline cold-start row goes in the first time we see a profile. See How real-time tracking works for the wider architecture.