Relationship analytics

example · 2025-10-16→2026-08-01 · kai ↔ sam · smoothing: 28-day average

Health

Scorecard

an at-a-glance board of the relationship's current metrics

Records Board

the relationship's all-time bests, with dates and holders
see also: Lasts Board
10mo of history · 3 set this month
all-time records within the loaded span · colored = which side holds it · ● = set in the last 30 days · click a tile → that day

Lasts Board

when each good thing last happened - the records board's recency twin; ● = still lit (within the last month)
see also: Records Board
16/16 lights still on
the most recent occurrence of each signal · colored = who it came from · ● = still lit (within the last 30 days) · click a tile → that moment

Chapters

the relationship's eras
see also: Momentum
6 chapters · current: 2mo at 39 msgs/day (+695% vs previous) · 1 shift beyond volume (tone/balance/friction)
cuts = sustained changepoints on RAW weeklies - volume (grey), warmth (orange), msg-share balance (purple), conversation friction (red, from the model's summaries) · pace/warmth cut dates are refined to the best DAY near the pivot week; balance/friction resolve to the week · ≥4wk eras, ≥20-msg weeks · the smoothing dropdowns move the line, never the cuts

Era Report Card

the relationship's eras graded: one column per chapter, one row per metric
6 eras · current: 2mo at 40 msgs/day · grades B
columns = the changepoint eras chapters detects (RAW weeklies - the smoothing dropdowns don't move them) · color = how the era ranks against the couple's other eras (green better) · balance rows (kai initiates / labor / expressed emotion) red the further from 50/50, whoever leans · warm closes / vulnerability / friction / labor read the model's conversation summaries and blank when an era has <5 of them · era grade = the column's average standing on this couple's own curve · reply/positivity definitions as on their own charts

Health Index

the composite relationship-health index and its components over time
now 35 · peak 38 Jun 2026 · last 30d -9 vs prior · drag: positivity ratio -1.9 · lift: style alignment (lsm) +3.3
composite = weighted mean of the component rows below, rescaled 0–100 · red <40 · amber 40–60 · green >60 · rows red→green = 0→1, heaviest weight on top (hover for weights) · drag/lift = the component that moved the composite most over the last 28d, in composite points · ▼ = a rupture conversation, deep red = unrepaired (hover for the model's summary, click → Discord)

Reciprocity Index

the composite reciprocity balance index and its components over time
now +0.16 · kai more invested · last 30d +0.16 vs prior · shift → kai: initiations +0.03
composite = weighted mean of the 13 balance signals below, −1…+1 · 0 = even · beyond ±0.25 = entrenched imbalance · above 0 = kai more invested · rows lean sam ← even → kai in their colors (who CARRIES the signal, not good/bad), heaviest weight on top (hover for weights) · shift → = the signal that moved the composite most toward that side over the last 28d · ▼ = a rupture conversation (hover for the model's summary, click → Discord)

Momentum

whether the conversation is warming up or cooling down
see also: Chapters
louder & warmer · pace warming (+5 msgs/day vs baseline) · warmth +0.03/msg vs baseline · 4d since last pace flip (Jul 28)
momentum = fast pace − slow baseline · fast window = ¼ of the smoothing window (≥3d) · a pace flip only counts once momentum escapes the grey noise band (±10% of baseline) - in-band wiggles keep the regime · warmth lane = the same fast−slow read on per-message net sentiment, so "louder" and "warmer" are separate claims · ▼ = a rupture conversation (hover for the model's summary, click → Discord)

Sentiment Timeline

emotional tone over time, with the positivity ratio
see also: Warmth Gap
positivity now 1.3 · lifetime 1.4 · last 30d +5% vs prior
positivity ratio = positive ÷ negative emotion mass (mass = mean score × messages), capped 10× · green ≥3.5 healthy (Gottman), yellow 1–3.5, red <1 · peak skips sparse stretches where the ratio only pegs the cap · tracked = top emotions by count-weighted score · ▼ = a rupture conversation (hover for the model's summary, click → Discord)

Streak Timeline

talking and silence streaks over time, by length
streak = consecutive calendar days with (talk lanes) / without (silence lanes) a message · color depth ∝ length within its lane · outlined bar + → = still running · click a bar → its boundary message (talk: the streak's first; silence: the one that broke it) · ★ = a new longest-daily-contact record (hover for what it beat)

Conflict & Repair

Flashpoints

the conflicts: heated stretches, who soothes them, what they cost
see also: Conflict Ladder
1 conflict · sam turns negative first 100% · 1 led to a rupture
negative = below this chat's own 10th-pct valence (-0.72) · flashpoint = ≥9 negative within 30 scored messages, both sides, ≥12 total · ✕ = chained into a 20h+ silence

Conflict Ladder

conflict severity over time - calm, tension, and ruptures (repaired or not) as a stacked share
106 conversations read · 20% carry friction (+4pts last 30d) · 10% of friction ruptures · 1/2 repaired
stacked share of conversations on the model's conflict-severity ladder, 28-day average - filled = friction, the gap to 100% = calm · tension = friction that held · rupture = a real break, repaired (it mended in-conversation) or not · ▼ = one rupture conversation (hover for the model's summary, click → Discord) · faded = few conversations in window · dotted verticals = chapter cuts

Conflict Repair

conflicts the model read in the text, and whether each got repaired
2 conflicts · 1/2 repaired (50%) · 1 left hanging
conflict = the model read tension/criticism in the conversation (not just negative words) · green = repaired (acknowledged or smoothed over before the end) · red = left hanging · line = share of the last 5 conflicts that got repaired

Repair Latency

how long warmth takes to come back after each rupture, and whether that's slowing
see also: Rupture Repair

Repair Initiative

after friction, who moves first - the rolling repair-burden share plus every reopening's wait and whether it stuck
kai makes 70% of 20 reopenings · sticks: kai 86%
reopening = the first message of the conversation after one the model read as tension/rupture · left: share of reopenings made, count-weighted rolling · right: one dot per reopening (log wait), green = the next conversation read calm, gold = friction carried over, bar = median · hover for the friction's summary, click → the reopening message · faded = few events in window · dotted verticals = chapter cuts

Rupture Repair

long silences, who ends them, and how fast things recover
53 ruptures · kai repairs 68% · kai's land 50% · sam's 76%
rupture = no messages for ≥20h · marker = whoever spoke first after · hollow = no reply within 8h · recovery = 7-day pace back at 70% of the pre-rupture month

Reunion Quality

what comes back after time away - share of reunions that run warm vs carry friction, by the length of the silence before them
see also: Topic Afterglow
105 reunions · sweet spot: 1-3 days away → 25% warm
each summarized conversation bucketed by the silence since the previous one's end · warm = warm_close ending or a bonding connection move · friction = a tension or rupture read (the two can co-occur) · faded = thin buckets (<10 reunions) · outside labels = the rate, n under the axis

Conversation Weather

does the weather carry? lift of each conflict tier for the NEXT conversation given this one's - calm is sticky, ruptures cluster
105 consecutive pairs · calm holds at 1.0× chance
cell = how much more (red) or less (blue) likely than its base rate that tier is for the NEXT conversation, given this one's read (lift, log-colored) · outlined diagonal = the weather persisting · · = never observed where chance predicted under 3 anyway · rows need ≥5 occurrences · consecutive summarized conversations only

Relationship Texture

rupture, tension, support, vulnerability and closeness as rolling rates over time
106 conversations read · support 53% · high vulnerability 30% · closeness (bonding) 23%
each line = share of conversations the model read as carrying that mode, 28-day average (modes overlap - not a stacked share) · title arrows = lifetime → this era share · this era = since Jun 04 2026 (58d, “intimacy, substance, and self”) · rupture = a real break in the bond · tension = friction that held · support = comfort sought/given · closeness = pulled them closer · faded = few conversations in window · dotted verticals = chapter cuts

Conversation Closure

whether conversations resolve, end warm, and leave nothing hanging, over time
106 conversations read · deepened 40% · left hanging 27% · resolved 24%
each line = share of summarized conversations the model read that way, 28-day average (independent rates, not a stacked share) · resolved = thread settled · warm = warm last stretch · deepened = went deeper than it opened · left hanging (dashed, the counter-signal) = unfinished business (open loops) · faded = few conversations in window · dotted verticals = chapter cuts · this era = since Jun 04 2026 (58d, “intimacy, substance, and self”)

Warmth Resolution Gap

warm on the surface but unresolved underneath - the gap over time
106 conversations · warmth 55% · resolved 24% · gap +35pt
warmth = smoothed conversation sentiment rescaled to 0-100 · resolved = count-weighted resolved rate · 28-day average · the shaded band is the gap: warm-but-unresolved when it widens · faded = few conversations in window

Relational Dynamics

Labor Handoff

who carries the emotional labor of the relationship, and how it changes hands over time
see also: Emotional Labor
105 conversations read · last 90d: kai carries it more · 63% of decided vs 80% lifetime
share of conversations the model read as each person carrying the emotional labor - repair, soothing, checking-in, 28-day average (the tooltip's balanced/unclear = the model named no side) · band = the leader's color · lines crossing = a handoff, ◆ = a confirmed one (the new leader opened a ≥10pp lead) · note: the call partly tracks who wrote more · faded = few conversations in window · dotted verticals = chapter cuts

Victimhood Drift

who leans on a victim stance over time, and how it changes hands
105 conversations read · last 90d: kai leans victim more · 95% of decided vs 76% lifetime
share of conversations the model read as each person leaning on a victim stance - aggrieved, blaming, hard-done-by, 28-day average (the tooltip's balanced/unclear = the model named no side) · band = the leader's color · lines crossing = the victim role changing hands, ◆ = a confirmed one (the new leader opened a ≥10pp lead) · note: the call partly tracks who wrote more · faded = few conversations in window · dotted verticals = chapter cuts

Maturity Drift

who comes across as the more mature one over time (sparse - the model rarely decides it)

Pursue Withdraw

who chases and who pulls away - the demand-withdraw dynamic over time
kai does 65% of the chasing · sam owns 88% of the silence (242.4d)
pursuit = double-texts (re-messaging before a reply) · withdrawal = dead-air hours (leaving the other waiting ≥3h) · each normalized to its cross-user p95 · above 0 = chasing, below = pulling away · lines cross when the roles flip · smoothed 28-day average

Phase Space

the relationship's path through reciprocity vs health space
now: health 35/100 · reciprocity +0.16 (kai more invested)
each dot = a checkpoint sampled every 28d · size ∝ msgs/day · color faint→solid = early→recent · green corner = balanced & healthy · grey shading = where it lived (density of days) · ◇ = a chapter cut (hover: what shifted)

Conversation

Session Clock

every conversation as a strip on a day vs time-of-day plane
106 sessions · median 1.7h · longest 10.4h (Nov 11) · 15% start 22:00–04:00
strip = one conversation, midnight wraps to the next day · led = ≥60% of its messages · labeled marathons by message count

Conversation Ledger

every conversation ever, one tile each - calm/tension/rupture texture with the model's summary on hover and chapter openings outlined
106 conversations · 80% calm · 2 ruptures (1 repaired)
one tile per conversation, reading like text (oldest top-left) · pale = calm · gold = tension · orange = rupture repaired · red = unrepaired · □ = a chapter opens · row label = that row's first conversation · hover for the model's summary, click → Discord

Conversation Flow

every reach-out's lifecycle: who opens, what converts, who ends it
kai opens 64% · 48% convert · 35% end warm
opener = first message after >=2h quiet · ignored = one ping, no reply · monologue = kept talking, still no reply · converted = both spoke · tone = last message's net sentiment (warm >=+0.3 / cold <=-0.3) · click a ribbon → most recent example

Session Anatomy

conversations as ribbons: who opens, when, how long, who ends
106 conversations · kai opens 61% · 35% end warm
each converted conversation (both spoke) flows open -> time-of-day -> length -> end -> after · after = a >=20h silence followed · length short <10 / medium <30 / marathon 30+ · category counts in parentheses · ribbon colour = how it ended (green warm / grey neutral / red cold)

Opener Conversion

how often a reach-out actually becomes a conversation
sam's reach-outs convert 51% (81 openers) · kai's 46% (141)
opener = first message after ≥2h of quiet · converted = the other side joined that run (≥2 msgs, both spoke) · unanswered pings and monologues count as fizzles · blank stretches = too few openers to rate

Opener Efficiency

reach-out volume vs landing rate per person, the efficiency frontier
kai 0.49/day @ 46% · sam 0.28/day @ 51%
trail = chapter eras in order, dot size ∝ openers in the era (≥5); faint dots = single months · diamond = lifetime · converted = the other side joined (≥2 msgs, both spoke)

Wasted Reachouts

fizzled reach-outs per day per person, and when they spike
kai wastes most (76 = 54% of opens) · sam 40 (49%)
fizzle = a run-opener the other side never joined (>=2 msgs, both spoke = converted) · daily count smoothed · grey = multi-day silences

Conversation Depth

how messages-per-session and session length trend over time
avg session 44 msgs / 2.1h · msgs/session +84% vs prior 28d
bars cover every month (explicit zeros) · the duration line only exists where conversations do

Conversation Depth Distribution

the spread of messages and minutes per conversation, by month
p50 26 msgs / 1.7h · p95 155 msgs
fan = monthly p25–p75 band + median · monthly p95 spikes toggle on via the legend · session = one gap-split conversation · dashed refs = lifetime medians

Conversation Half Life

how conversations burn down, split by who started them
kai-started last 1.8h median · sam's 1.3h · half the messages land in the first 45%
conversation = messages <2h apart, both sides spoke · burn uses chats with ≥8 msgs · dotted diagonal = perfectly even burn · t½ = half the messages sent

Marathon Conversations

the biggest conversations and how often marathons happen
longest 10.4h · 140 msgs · 47 marathons lifetime
marathon = 100+ messages or 2h+ · top: the 20 biggest conversations - dot size = duration, color = who dominated · hover for the model's summary, click → that conversation in Discord

Reply Chain Depth

how deep quoted-reply chains run over time
deepest chain 6 · 8% of chains run 4+ deep
chain depth = links in one consecutive quoted-reply thread (4+ bucketed) · bars = monthly replies by depth, black = deepest chain that month · line = daily-smoothed mean depth

Simultaneous Messages

how often messages land within seconds of each other
now 30.6/1000 · -15% vs prior 28d
moment = two messages ≤10s apart · rate per 1,000 msgs discounts volume · ref = mean of the drawn daily-rate series

Bid Outcomes

how each side's bids for connection land: engaged, ignored, or rebuffed
see also: Reply Reflexes
kai's bids land 61% · sam's bids land 72% · sam ignores 34% of kai's
bid = a question, share, affection phrase, or conversation reach-out · toward = reply within 2h that isn't negative · ignored = no reply in 2h · against = reply whose dominant emotion is negative · line colored by the BIDDER

Alternation Index

how conversational the channel is - share of adjacent messages that switch speaker (ping-pong vs monologue blocks), and each side's typical run length
see also: Message Ratio
now 21% · lifetime 30% alternating · kai runs longest (5.6 msgs/turn)
alternation = share of adjacent messages (within 1h) where the speaker changes · dotted 50% = even ping-pong dialogue · low = block monologues · run = consecutive messages before the other replies (or an hour passes) · days with <5 adjacent messages excluded

Conversation Enders

who tends to start vs end conversations over time
kai ends 69% · starts 64% lifetime
ender = last word before ≥2h of quiet · solid = ending, dashed = starting · green 40–60% balanced · red ≤25% / ≥75% pursuer–distancer · % lines faded/blank = few conversations in window

Dead Air

one-sided silences and who leaves the other on read
35% of 144 silences blamed on kai · now 42%
silence = one side quiet ≥3h, merged until the silent side speaks · colored by who went quiet · ▼ = a rupture conversation (hover for the model's summary, click → Discord) · pre-spans caches fall back to raw per-gap events

Dead Air Hours

total hours of silence per day per user over time
lifetime kai 32.9d · sam 242.4d · sam 7.4× more
a long silence spreads across the days it spans (~24h each, no spike) · monthly bars = per-calendar-day mean (zeros included) - same scale as the daily line · green ≤3h · red ≥8h

Response & Reciprocity

Response Time Asymmetry

the gap between the two users' reply speeds, and who's slower
last 30d sam 1.8× slower (median gap −11s)
gap = kai's − sam's daily median reply time · fill colored by the slower side · green |gap| ≤10m · red ≥30m entrenched

Reply Reflexes

what makes each side pause - median in-flow reply time by what the message being answered was, as a multiple of their own baseline
media / gif stalls kai 4×
median time to answer a partner message INSIDE a conversation (within the 2h gap), by what that message was · ×1 = that side's own all-reply median · red ≥1.15× slower, green ≤0.87× faster, grey ≈ baseline · mood = net GoEmotions valence of the message answered - flat mood rows mean latency is processing cost, not feeling · levers need ≥50 replies

Response Time Distribution

the spread of each user's reply times, not just the median
sam's floor slowed (p50 1.2m→1.8m)
reply times capped at the 2h conversation gap · lifetime stats = median of the raw daily percentiles · shifts = this era vs lifetime · green ≤5m · red ≥60m · this era = since Jun 04 2026 (58d, “intimacy, substance, and self”)

Return Consistency

how predictable each side's comeback is after going quiet
see also: Dead Air
current silence 14.2h vs sam's median 14.2h · kai returns in 11.9h (spread 1.2×) · sam returns in 16.9h (spread 1.2×)
each dot = a one-sided silence and how long until that person broke it · line + band = trailing-90d median and p25-p75 (n≥8 comebacks) - WIDE band = erratic/unpredictable · solid rule = lifetime median · ○ = ongoing silence, not yet broken · log scale

Length vs Response

whether longer messages get answered faster, per replier
see also: Reply Reflexes
reply = adjacent cross-author message within the 2h conversation gap · each length column normalised to 100% (conditional reply-time mix) · columns with <10 replies hidden · x tick counts = total pairs (both repliers) · marker = column median

Reply Time Ridgeline

how the reply-time distribution shifts month to month
in-flow median 20s · pickups 7.5m · median 55s (Oct 25) → 24s now (Jul 26)
each ridge = that month's reply-latency distribution (both people, capped at the 2h gap, log x) · ink overlay = session pickups (first reply of a conversation session) - the conversation-restart share of the tail · dot = month median · height normalised per month · months with <15 replies stay as tagged empty rows · newest on top

Reply Latency Coupling

whether the two people's reply-speed distributions track each other
kai usually faster (23s vs 23s) · gap 1.0× lifetime → 1.2× last month
per month: kai latency density up, sam down (mirrored, log x, capped at the 2h gap) · dotted lines join each side's monthly median, shaded band = the gap between them · months where either side has <10 replies stay as tagged empty rows · newest on top

Summoning Time

how fast each side shows up when the other opens a conversation
kai answers the call 1.2× faster · 106 answered calls
counted only when the opener got an answer (the run became a conversation) · latency = opening message → the other side's first · dots = individual answered calls (sub-15s drawn at the 15s line) · response_time measures in-conversation replies; this is arrival to a fresh thread

Message Ratio

who talks more, by message and word share over time
kai 69% of messages · 73% of words · kai msg share last 30d +9.4pp vs prior
panels 2–3 = share of messages / words by kai (28-day average) around the 50% line · green 40–60% balanced, red one-sided · dashed = lifetime share (raw Σ) · peaks skip near-silent stretches (<25% of typical volume) · ▼ = a rupture conversation (hover for the model's summary, click → Discord) · faded = little volume in window

Who Said It More

who says each affection phrase more, side by side
most sam: 'kekw' · most kai: 'lol'
7 phrases (≥20 uses) compared · 346 total uses

Self Silence

average hours between a user's own consecutive messages, per user
sam 2.3× longer gaps between own posts
cadence = mean hours between a side's OWN consecutive posts, uncapped - each gap lands on the day they RETURN · days with no posts carry no value (not zero) · log scale

Language & Emotion

LSM

how similarly the two people use function words (style matching)
see also: Register Drift
now 75 · lifetime mean 71 (dashed) · negations slipping 54→47 (this era)
LSM = 1 − |a−b|/(a+b) per function-word class, averaged over 9 classes, from per-user per-day rates · <60 distress · >80 aligned · dots = raw scored days (both sides ≥20 words) · ▼ = a rupture conversation (hover for the model's summary, click → Discord) · class panel colors drift ≥3pts vs lifetime, needs ≥8 scored days (this era) · this era = since Jun 04 2026 (58d, “intimacy, substance, and self”)

Pronoun Drift

how "we"/"I"/"you" pronoun use shifts over time
lifetime joint "we" 4.1%
all panels 28-day average · we/I/you = share of that side's personal pronouns · blame index = "you"/"I" ratio · green/red bands = calibrated healthy/distress ranges

Register Drift

the typing register - exclamation energy and lowercase casualness per user over time
see also: LSM
kai lowercase 28%→16%
typed register from raw message text · lowercase = first letter after stripping :emotes:, links & leading markdown · rates per 100 of that user's own messages in the window · faded/blank = that stretch holds too few messages · title compares lifetime vs this era · this era = since Jun 04 2026 (58d, “intimacy, substance, and self”)

Voice Eras

the months clustered by how you sounded in them - eras of the same you
closest months: 2025-11 × 2026-01 (0.36) · most unlike the rest: 2025-10 · her drift tracks his r=+0.63
each month = sam's word distribution that month, TF-IDF cosine (words he uses EVERY month don't count as identity) · leaf color = the month's chapter · dot size = his words that month · leaf hover = the month's distinctive words · months with under 300 of his words omitted

Our Vocabulary

the top words both users use a lot, side by side
top 30 shared words · most one-sided: “bad” 85% kai
words both sides use a lot, ranked by combined use, common conversational filler dropped · click a bar → that side's first use of the word

Vocabulary Convergence

whether the two talk more alike, plus shared-word birth rate
talking 24% alike · 6.3 new shared words/mo lately · sam adopts 2.1× more of kai's words · 392 shared words total
shared word = ≥3 lifetime uses by EACH side, stamped when the second side adopts it · adopter = the side whose first use came SECOND (completing the share) · faded bars = warm-up (first 90d of the loaded span or the first ~3 months of real two-sided text - mostly older vocabulary resurfacing) · overlap months need ≥200 content words from both sides - washed-out months had some text but too little to rate (dotted bridge)

New Shared Words

the new shared words adopted each month, and who drove them
392 shared words total · last new word: “soda” (Jul 2026)
each panel = one month's newly shared words (≥3 lifetime uses by EACH side), top 6 by total use · bars = lifetime uses per side · the shaded rollup pools the warm-up (first 90d or first ~3 months of real two-sided text - mostly older vocabulary resurfacing) · months minting nothing are skipped (“after N quiet mo”) · a quoted title = the chapter that month opened (hover it for the summary) · click a bar → that side's first use (the later side's first use is what made the word shared)

Vocabulary Obituary

the words the couple lost and the ones just born
newest fixture: “yah” (22× since May 2026)
obituary = ≥25 uses across ≥90d & ≥3 months, then 56d silent (2× the smoothing window) · each bar spans the word's life, first→last use; dotted verticals = chapter cuts, ▾ = died within 14d of one · nursery = first seen in the last 150d, after a 90d burn-in · bar color = heavier user, grey = shared

Wordcloud

word clouds of the chat: combined, distinctive, and per user
kai: 14k words · sam: 5.1k · 60 words both use 10+ times

Emotion River

the changing mix of expressed emotion, month by month
lately anger 24% · appreciation 23%
share of each month's emotional mass (sum of GoEmotions score x messages, both people) · neutral excluded · the 27 emotions folded into seven families · fog = thin months (vivid from 200 msgs) · ▼ = a rupture conversation, deep red = unrepaired (hover for the model's summary, click → Discord)

Emotion Fingerprint

what's emotionally distinctive about this chat vs the corpus
runs hot: love 1.0× (kai) · runs cold: love 1.0× (kai)
each side vs its own baseline across 1 chats - sam vs their median elsewhere · kai vs the median partner · lifetime count-weighted means, bars clipped at 8× · faded bars = corpus-median mass under 0.5% (ratios built from trace amounts, skipped in the title)

Emotion Modes

the relationship's emotional modes of relating and how their mix shifted
5 emotional modes · 105 conversations · this era mostly “gratitude · amusement” (was “remorse · pride”)
conversations clustered by their emotion profile relative to the couple's baseline (what stands out, not raw levels), auto-labelled by signature emotions · top: monthly volume · middle: each mode's share at daily grain, 28-day average (raw daily is too sparse to read) · spans the full history via per-conversation emotion · bottom: among the 25 resolved vs 80 unresolved summarized conversations, which emotions lean each way · this era = since Jun 04 2026 (58d, “intimacy, substance, and self”)

Warmth Gap

net sentiment over time, you vs partner, with the warmth gap
sam warmer 71% of days both spoke · gap now +0.23 · last 30d +0.07 vs prior
net warmth = (Σpos − Σneg) GoEmotions mass over the day's messages, per side · gap panel = sam − kai, colored by the warmer side · dots = raw daily gaps · lines gap where a side sent nothing, fog = under 25 msgs/window · warmer-share counts only days both sent messages (n=87)

Empathy Matrix

how each side answers the other's emotional states
kai mirrors 37% (chance 37%), sharpest love→neutral -7pp · sam mirrors 38% (chance 38%), sharpest sadness→neutral -11pp
adjacent replies within 2h, dominant GoEmotions label folded to 8 buckets · text = % of answers · color = vs that side's usual answer mix · diagonal = mirroring · y counts = stimuli answered, rows with <20 blank · outlined cell = sharpest coupling (n≥10) · click a cell → a representative reply

Emotional Labor

who carries which emotion, and how the emotional work shifts hands over time
105 conversations · kai carries amusement · sam carries curiosity · this era love → kai (19pp)
top: how much more of each emotion kai (red) or sam (blue) brings than their overall share of the emotional expression (pp = percentage points) · ◆ = this era only (since Jun 4, 58 conversations) · mass = summed GoEmotions score behind a split - small mass reads thin · bottom: each side's share of the expressed (non-neutral) emotion over time, 28-day average - the lines crossing = a handoff of the emotional work · faded = few conversations in window · ▼ = a rupture conversation (hover for the model's summary + labor read, click → Discord)

Topics & People

Topic Cloud

the themes the couple talks about, sized by how often they come up
411 themes · 106 conversations
themes auto-extracted per conversation; sized by conversations they recur in · single-mention themes trimmed from the cloud

Topic Landscape

themes mapped by how they felt and who raises them, sized by how often
23 themes (15 live) · warmest: gaming plan · tensest: physical discomfort · kai drives “substance use” 85%
recurring themes (≥3 conversations) · bubble size = conversations · valence = mean session sentiment · y = share of those conversations each side opened · ring = still live (raised ≤30d before the latest summarized conversation)

Topic Afterglow

what each theme costs (or earns) in the silence that follows it
usual gap 18.7h lifetime · mental health → 1.7× the usual silence · relationship advice → back 1.4× quicker
recurring themes (≥5 conversations) · x = median of (gap to next contact ÷ the couple's median gap within ±15 conversations of that moment) - immune to which era the topic lived in · red = slower than their pace then (withdrawal), green = quicker · band = q25–q75 · dot colour = next conversation's sentiment · size = conversations

Conversation Galaxy

every conversation as a star, placed by topic similarity
77 conversations mapped · 3 regions · largest: coping mechanism (29) · 1 ruptures
each star = one conversation, placed by topic similarity (t-SNE) · near = talked about similar things · labels = each region's signature theme · colour = when it happened · size = conversation length · red ring = rupture (repaired or not) · click a star → that conversation in Discord

Social Cast

the third parties this relationship talks about - who recurs, and when
8 people named · 3 recur (≥2) · top: Elin ×4 · 10 conversations name someone
third parties the two talk ABOUT, from the model's per-conversation people read · counted once per conversation, names case-folded · the two speakers and generic non-names (someone, friends) dropped · quiet Nd = no mention in the last N days up to the latest summarized conversation (shown past 30d) · click a timeline dot → that conversation in Discord

Flashpoint People

which third parties show up when conversations turn tense
3 recurring names · no frequent name clears the baseline · couple baseline 20%
each bar = share of the conversations naming that person that carried friction · red = a real rupture, gold = tension that held · dashed = the couple's baseline over all summarized conversations · names recurring in >=3 conversations · faded/italic = not mentioned in the last 6 months of the data · small n: read as a flag, not a verdict · click a bar → that person's latest friction conversation in Discord

Topic Outcomes

where conversations about each theme end up: resolved or not, warm or cold
106 conversations read · gaming & hobbies resolves 54% vs feelings & wellbeing 13% · 0% end warm
each conversation flows from its dominant theme -> whether the model read the thread as resolved -> how its last stretch felt (warm / neutral / cold) · themes under 5 conversations pool into 'other themes'

Theme River

what the couple talks about over time, as a shifting mix of themes
106 conversations read · mostly feelings & wellbeing · Oct 2025–Jul 2026
each conversation placed in its month and assigned its dominant theme (band = that month's count) · 'other' = the long-tail of themes that don't fold into the named buckets · spans only the summarized window, widening as the topic cache backfills · the newest month is month-to-date · ▼ = a rupture conversation (hover for the model's summary, click → Discord)

Topic Lifespan

the birth and death of each theme, from first mention to last
11 recurring themes · 8 still active · newest: humor
each row = one theme's lifespan (first to last conversation), dot per conversation, coloured by coarse theme · ordered by when first raised · × = went quiet >30d before the dashed frontier · click a dot → that conversation in Discord

Topic Emotion Map

which themes carry which emotions, clustered into feeling-blocks
6 themes × 24 emotions · mental health → nervousness (3.1×)
cell = how much more (red) or less (blue) an emotion shows up in conversations about a theme vs the couple's baseline · rows and columns clustered so similar profiles sit together · per-message GoEmotion scores summed over each conversation · 'neutral' omitted

Emotion Gravity

a map of which topics gravitate toward which emotions
6 themes · 14 emotion poles · most charged: emotional distress → nervousness
each emotion is an anchor on the rim; a theme is pulled toward the emotions it expresses most above the couple's baseline, with pull scaled by how far its top emotion runs over it · near the centre = weak or mixed emotional signature · colour = positive (green) / negative (red) dominant feeling · size = conversations

Rhythm

Typical Week Heatmap

the average week's message pattern by hour and day
busiest day Fri (avg 29 msgs) · quietest Mon (9)
cell = avg msgs for that hour × weekday across the whole span · per-user panels share one color scale; combined has its own

Time of Day Heatmap

each user's share of messages by hour and month
kai peak 15:00 (12% of msgs) · sam peak 12:00 (15% of msgs)
each column = how that month's messages spread over the day (sums to 100%) · months with <20 msgs or <7 days of data blanked - hour shares of a sliver of a month are noise · both panels share one color scale

Intraday Activity

messages per hour across the full history, per user
kai sends 2.2× more lifetime · last 30d +9% vs prior
smoothing runs in hours here - a 7d window = 168 hourly points · peak callouts = raw unsmoothed days · lifetime rates count every elapsed hour, silent ones included · this era = since Jun 04 2026 (58d, “intimacy, substance, and self”)

Hourly Clock

each person's day as a 24-hour clock face, with wake and sleep marks
kai offline ~20:15-06:31 · sam offline ~22:33-07:05 · both online ~07:05-20:15 (13.2h)
petal = share of that person's messages in each hour (midnight top, clockwise) · shaded wedge = typical offline window (each day's longest 4-16h silence) · up triangle wakes / down triangle sleeps · rim band = hours both typically online · dotted ring = weekend-only share

Day Parts

the couple's hours clustered into behaviorally interchangeable day parts
3 day parts · tightest hours: 20h × 22h · most unlike the rest: 05h
each active hour profiled by share of all messages, words per message, who sends more, and its emotional palette (GoEmotions score per message, neutral dropped), then clustered · branch color = day part (tree cut at 0.7 of the deepest merge), named by the traits that set it apart · dot size = the hour's share of all messages · dot color = who leads it · hours with under 20 messages omitted

Both Online Heatmap

how often both people are active in the same hour, by month
both active in 187 hour-slots · 5.2× what independent schedules predict · peak 13:00 in 2026-06 · 6 days
cell = days that month when both sent a message in the same clock-hour · blank = never · baseline per cell = kai-active days × sam-active days ÷ days in month, so the ×-lift measures schedule alignment beyond chance

Reciprocal Day Heatmap

calendar of how balanced each day's exchange was
both sides on 74% of active days (last 90d 82%) · median balance 0.40
balance = min/max of the two sides' daily counts · most-mutual = highest min(a,b), not highest ratio · median over days both spoke

Activity Heatmap

calendar of total daily message volume
peak 2025-11-08 · 336 msgs · 5,210 total · last 30d +9% vs prior
active on 41% of days (120/290) · color capped at the 95th-percentile day (151 msgs) · current streak 5d active

Activity Contour

topographic contour map of message volume by hour-of-day vs date
peak ridge 2025-11-09 15:00 · 11.5 msgs/h · last 30d +9% vs prior
messages per hour-of-day × date, gaussian-smoothed (≈1.5h × 3d) · color capped at the 97th-percentile smoothed hour (6 msgs/h)

Chronotype Drift

whether the two clocks are converging or drifting apart
see also: Hourly Clock
now 0.9h apart (kai runs later) · at the start 1.0h · steady
line = circular mean send time, unwrapped across midnight · masked where messages spread too thin around the clock (resultant < 0.25) · gap = circular distance

% of Days Talking

share of the day's hours with messages, and hours both are active
now 14% · -4pp vs prior 30d · together now 6% (-2pp) · together on 43% of talk-hours (30d) vs 43% lifetime
active hour = ≥1 message · together = both sent in the same clock hour · talk-hour share = hours both spoke ÷ hours either spoke · lifetime avg counts silent days · ▼ = a rupture conversation (hover for the model's summary, click → Discord)

Message Tempo

conversation tempo in messages and words per minute, per user
kai 2.5× faster tempo · sam 0.9 wpm this era vs 0.8 lifetime (↑1.2×)
tempo = messages (top) / words (bottom) per minute within a session - in-session pace on session days only, not volume · gray bars = monthly median, that month's peak in the hover · dashed refs = lifetime medians · ▼ = a rupture conversation (hover for the model's summary, click → Discord) · faded = few sessions in window · this era = since Jun 04 2026 (58d, “intimacy, substance, and self”)

Calendar & Media

Activity Heatmap Yearly

one row per year, days colored by daily message volume
peak 2025-11-08 · 336 msgs · 5,210 total
each row = one calendar year, columns Jan–Dec · color capped at the 95th-percentile day (151 msgs) · right ledger = year total over its days of data

Message Length

average words per message over time, per user
kai writes 1.2× longer messages · last 30d +14% vs prior
band = the gap, shaded in the longer writer's color · dashed = lifetime average (raw Σwords/Σmsgs) · faded = few messages in window · peaks = each side's record window, gated on the fog's evidence bar · dotted verticals = chapter cuts

Reaction Rate

emoji reactions per day plus each side's rate per 100 partner messages
sam reacts 36× more · last 30d -0.4/d vs prior
monthly bars = per-calendar-day mean (zeros included) - same scale as the daily line · rate = reactions given per 100 of the partner's messages in the window · faded/blank = partner barely messaging

Reaction Economy

what the reactions say - affection/laughter/agreement/distress mix over time plus each side's top emotes, lifetime vs last 90d
see also: Reaction Rate
183 reactions · sam gives 36× more reactions · laughter-reacts up 49%→61% (this era)
emotes classified by name: pat/hug/heart→affection · kek/lol→laughter · nod→agreement · sob/😭→distress (sob-laugh compounds like kekwsob count as distress) · top: share of each month's reactions, both people, fog = thin months (<30) · ▼ = a rupture conversation (hover for the model's summary, click → Discord) · bottom: share of that user's own reactions, ● colored when moved ≥2pp vs lifetime over the this era · this era = since Jun 04 2026 (58d, “intimacy, substance, and self”)

Message Edits

how often and how quickly each user edits messages
kai edits 1.3× more · kai edits 2.1× slower
edit delay = message sent → last edit, capped at 2h upstream, log scale: <30s typo fix · 30s–10m rethink · >10m revisit · fog = few edits in the window (daily medians there rest on 2-3 edits) · rate = edited share of that day's messages