Comparing two Instagram exports

A diff of two downloads is the only evidence that trades a single timestamp for a pair of them — unfollow radar, request intelligence, and multi-archive matrix, with one honest warning about what a diff cannot mean.

Most of what people want from an archive is a change, and a change is the one thing a
single export can never show. One export is a timestamp. Two exports are a before and an
after, and the shape of what changed is the only signal worth keeping — because an
unfollow that you never saw in the client and never proved in the file is the perfect
case of an event that seems impossible and is, until you have the two of them.

Compare is a diff, and a diff is the only honest evidence for unfollows. Import two
exports and the app produces the difference: accounts that left, accounts that joined,
changes to the places an interaction went, all carried as rows in a two-column shape. It
does not tell you when, in a meaningful sense — Meta snapshots each export at whatever
moment you requested it — and it does not invent a reason. What it gives you is proof
that a change happened, and where to start looking.

  1. 30sone archive, imported, is a timestamp.
  2. 4mina second archive turns it into a difference.
  3. afterwards — everything the Compare room reads, and the warning that a diff is a window,
  4. not a tape.

What a timestamp is, and why one answer cannot be a change

The archive is not a query log the system kept writing into. It is a snapshot Meta
assembled on request, from what it held that day. The record shows that account A was
in your list, and that account B was not. What it does not say is whether B left or
simply was added recently, absent one earlier copy to be measured against.

That is unavoidable from one file. With two — same account, two request dates — an
account can be partitioned under the gap itself: here on the later date, absent on the
earlier, the change is named by the two exports and lives in neither. Compare is the
function that does that sorting, on every category the two files share.

The Compare room, item by item

  • Unfollow radar. The smallest list, most often asked for, carries the most caution.

    The difference of the followers list, read against itself at two dates, names accounts
    that left. An account absent in one and present in the other is an unfollow only when
    the later window had a chance to record it correctly, which is why the pair sits next
    to the dates, not as a verdict.

  • Request intelligence. The pending lsit of people you asked to follow and the ones

    who asked you split when you read two exports, and a request that started and ended
    between them is a request gone quiet rather than a request you never had.

  • Conversation states. Each conversation holds one of ten classified states in each

    export; reading the pair across the two copies tells you which state it opened in and
    which it closed in, without a single interpretation attached.

  • Content and posting shifts. The months' worth of posts present at each timestamp,

    a shape, not a judgment. The gaps between months are now countable.

  • Account totals and growth. The headline number that invites the wrong comparison

    — two raw counts — measured against the same number a year apart is a different
    sentence, and the page only writes the second one when you give it both copies.

  • Audience, counted. Both exports' network totals placed by each other. It has no

    scoring; the totals carry the whole of the information.

  • Messages, activity, persona. The counts and categories that changed between the

    two copies, in the same privacy posture as the rest of the site: on-device, and a
    difference, nothing more.

When five is not a flex, but a necessity

Two exports can bound a change. They cannot trace a trajectory. Five imports, compared
as a set, stop producing verdicts and start producing a line: each row is an archive,
the difference of one to the next becomes a little step, and you can see whether an
account left once or has been flickering. The five-archive view is the maximum we accept
on one device because the memory cost of holding five complete parses at once is real and
the guessability of its answer beyond five stops earning the space.

What the compare is silent about

  • A reason. Two exports tell you a follower list lost someone; the archive stores no

    column for why. The question of why belongs to the two people involved, which is the
    one step the file was never built to take.

  • A certain date. Each timestamp is the moment Meta assembled the copy, not the

    moment a behaviour changed. The pair brackets the event; it does not say it happened
    on the day of the later file.

  • A direction for shared numbers. That a count went down is the record; whether that

    is evidence of abandonment is not. We count its gaps. We do not name its motives.

Where this was checked

The diff mechanics sit in packages/shared/src/analytics/compare.ts, the five-archive
set in compare-many.ts, and the ten-state classification the pair uses in
conv-states.ts. Everything the Compare view writes is derived from those — not from a
model, not from a saved template, and not from a roster of usernames written in anywhere.

Comparing two Instagram exports — LMKFR Blog