All projects03 / 08

ONE·WAY

An Instagram follow-graph analyzer that runs entirely in your browser.

live2026

03live

  • network requests during analysis0
  • build steps: plain files, nginx0
  • bytes per account in a saved snapshot20
  • anonymous event names, demo8

01 / Problem

Free, and without handing over your data

Sites that show who does not follow you back put the useful views behind a paywall and ask for a login or an upload of personal data. I wanted every view free, with no account, and with a privacy claim the visitor can check instead of trusting me.

ONE·WAY landing screen in dark mode: a drop zone for the Instagram export, a note that it runs in this tab with no upload, and four steps to request the export

02 / How it works

The browser does all the work

You drop Instagram's export zip on the page. The browser unpacks it with its built-in decompression API, plain JavaScript analyzes the JSON, and the app shows non-followers, fans, mutuals, requests, blocked accounts and changes between two exports. The server only ever sends static files.

ONE·WAY dashboard: follower and following counts, a followers-over-time chart and a breakdown of mutuals, non-followers and fans,

03 / The hard part

Privacy the browser enforces, and honest limits

The server sends a content security policy with connect-src 'none', so the browser blocks every outgoing request from the page, and you can confirm it in the network tab. The export has no stable account IDs, so 'unfollowed you' is a guess: I flag likely renames by matching follow timestamps and label the result as probable. Contact matching shows its confidence and reasons and defaults to high-confidence matches only.

04 / Result

A public demo that keeps the promise

A public demo runs the same app files with a relaxed policy that allows only an analytics beacon and an error tunnel. It records eight event names, bucketed counts and no usernames, file names or cookies, and the self-hosted image keeps the strict policy. The parser has an in-browser test suite, and I checked counts against a real export.

ONE·WAY non-followers list in light mode: a searchable table of accounts with the date each was followed, using scrambled sample names

How it works

Your export never leaves the tab

Every step runs in the browser. The page's content security policy blocks outgoing requests, so the server only ever sends static files.

The same flow as a list, in order.

  1. Drop: Instagram export. The zip, dropped on the page. Goes to Decompress.
  2. Drop: Earlier export. Optional, for changes over time. Goes to Decompress.
  3. Unpack: Decompress. Built-in browser decompression. Goes to Read the JSON.
  4. Parse: Read the JSON. Plain JavaScript, checked by an in-browser test suite. Goes to Follow graph.
  5. Analyse: Follow graph. Who follows whom, plus likely renames. Goes to Non-followers, Fans and mutuals, Requests and blocked, Changes between exports.
  6. Read: Non-followers. End of the path.
  7. Read: Fans and mutuals. End of the path.
  8. Read: Requests and blocked. End of the path.
  9. Read: Changes between exports. End of the path.

Stack, by layer

Frontend
Vanilla JS (ES modules)CSSBuilt-in browser decompression
Delivery
nginxDockerCloudflare Pages (public demo)
Quality
In-browser test runnerStrict CSP

Live from the ONE·WAY repoOffline

Commits
n/a
Last commit
n/a
Service
n/a