Entity
Timeline.
Why it exists
Before TIMELN, every piece of data about a person lived in its own section of the slide panel. Relationships in one box, cases in another, chats further down, tracker data somewhere else, the analysis tab a whole separate click away. If you wanted to figure out the sequence of events involving someone, you had to piece it together manually by jumping between sections.
That's the kind of friction that makes you miss things. TIMELN pulls everything into one chronological feed so you can scroll through a person's history without context-switching.
How It Works
When you open the slide panel for a human or entity, the app runs
buildEntityTimeline(id, type), which queries every data source that
has a timestamp and an association with that entity. Each source returns a list of events,
the function merges them all into one array, sorts descending by timestamp, and hands it to
renderEntityTimeline() to draw the feed.
The timeline lives at the bottom of the slide panel, after Cases. If there's nothing to show, it just says "No timeline events" — no empty containers wasting space.
Event Sources
Six data sources feed into the timeline, each with its own color and icon:
-
Relationships — every relationship involving the entity, pulled from
pazatorRelationships.getForEntity(). Uses the relationship type's native color and icon. Shows the direction with the other party's name. -
Cases — case creation events when the entity is linked to a case.
Also picks up case timeline entries that specifically mention the entity
(
entity-added,entity-removed, or notes that contain the entity's name or ID). -
Chats — each chat linked to a human via
human.chats[]appears with its source label and timestamp. Suspicious chats are flagged inline. -
Tracker — when a human has a linked LCTX tracker alias, the
trackerLinkedAttimestamp creates a single event marking when the alias was linked. Full location history would require querying the Supabaselocationstable, which isn't done yet. -
AI Analysis — entries in
analysesStorewhere the title or findings text contains the entity's name or ID. This is a loose match and can miss or over-catch depending on how the analysis was generated. -
Notes —
human.extraNotesorother.noteif present. Notes carry no timestamp, so they always appear at the bottom of the feed.
Click Behavior
Each event is clickable. What happens depends on the source:
- Case / Case Activity — switches to the Cases tab and selects that case.
- Chat — opens the chat's slide panel.
- Tracker — scrolls the slide panel to the LCTX Tracker section.
- Analysis — switches to the Analysis tab.
- Note — scrolls the slide panel to the bottom where notes are shown.
- Relationship — scrolls to the Relationships section.
What's Missing
No change tracking on entity fields. If someone's threat level changes or their credit score updates, there's no record of that in the current data model — it just overwrites. Field-level change history would need a formal audit log, which doesn't exist yet.
Tracker location history is also limited. Right now we only log when the alias was linked,
not the individual location pings. Showing actual GPS breadcrumbs would mean querying the
Supabase locations table for every alias and feeding those into
the timeline, which is doable but hasn't been built.
AI analysis matching is text-based and fragile. If an entity's name changes or the analysis uses a different reference to the same person, it won't match. The analyses store doesn't have a structured entity reference field, so we're stuck with substring search for now.
Future Plans
Bind the timeline to the pazatorStore change events so it auto-updates
when relationships are added or cases are modified without reopening the panel. Also want to
add inline location data from the tracker history and maybe a visual indicator for clusters of
activity around the same date.