Inspiration

A guy on a tech fellowship had his pay tied directly to the impressions on his LinkedIn posts. Every thousand views was real money in his pocket, and the difference between a quiet post and a viral one was the difference between a normal month and a great one. So he inflated. He inspected element on his own analytics page, edited the impression counts up, and submitted the screenshots as proof of reach. For a while it worked. The numbers got him paid.

Then on one screen-share, somebody asked him to refresh the page. The numbers reverted. Everyone watching figured out, in real time, what had happened, and what it implied about every other post he had ever submitted.

Mathify is a tribute to that moment. It is the tool he should have had.

The cruel insight underneath the joke is that he was almost right. The metrics he was lying about, private post analytics, really are unverifiable. Nobody outside his own dashboard could ever audit them. A real liar would have noticed that and stopped there. He did not. He lied on a surface that resets on refresh, and that is the part that got him. Mathify fixes both mistakes. It only touches numbers nobody else can verify, and it survives the refresh.

What it does

Mathify silently inflates LinkedIn numbers. The catch, the entire concept, is that Mathify only inflates numbers that nobody else can verify.

  • Public follower count? Untouched.
  • Reaction, comment, repost counts on your posts? Untouched.
  • The "View analytics" sheet on your own post (impressions, members reached, profile viewers from this post, followers gained, saves, sends)? Inflated.
  • The "Who viewed your profile" total? Inflated.
  • The post-impressions and search-appearances tiles on your private dashboard? Inflated.

The numbers persist across refresh and SPA navigation. That is the part most amateur lie tools fail at, and the part that has historically gotten people caught.

Multiplier presets:

  • Math Mode (1.5x). Just enough to be plausible.
  • Subtle Flex (10x). For when you need it on a call.
  • Thought Leader (100x). You write "thoughts" now.
  • Definitely Lying (1000x). Committed to the bit.
  • AI Decides. Gemini picks a brand voice and a multiplier set, calibrated to plausibility.

How I built it

A Manifest V3 Chrome extension. A content script with a MutationObserver watches document.body, debounced via requestAnimationFrame. On every tick, a TreeWalker walks all text nodes inside an allowlist of private-analytics surfaces. It regex-matches numbers near analytics-context keywords (impressions, members reached, profile viewers, search appearances) and rewrites them at the configured multiplier.

Each rewritten parent gets a data-mathify mark to prevent double-multiplication, plus a data-mathify-orig cache of the original text to enable a clean toggle-off restore. A data-mathify-inflated mark catches the case where LinkedIn re-renders inflated text back to its original. Mathify detects the mismatch and re-inflates.

A separate BLOCKED_KEYWORDS set covers public-mirror metrics (reactions, comments, reposts, follower count) so they are never touched, even if they happen to render near an analytics keyword.

For SPA navigation, Mathify injects a script into the page's main world that overrides history.pushState and history.replaceState to force a full page load via location.assign. A capture-phase click interceptor catches in-app anchor clicks before LinkedIn's router sees them. The trade-off is a slower nav (full HTTP round-trip), but it makes inflation rock-solid across the entire site without fighting the SPA.

The AI Decides preset calls Google's Gemini 3.1 Flash Lite via REST. The model picks a brand voice and a multiplier set per metric, calibrated to a level of plausibility, and returns structured JSON. A model fallback chain (3.1 Flash Lite, then 2.5 Flash Lite, then 2.5 Flash, then 2.0 Flash) handles rate limits or transient errors. The median multiplier becomes the slider value, applied uniformly across all metrics.

Challenges I ran into

LinkedIn ships hashed CSS class names that rotate frequently. Any selector-based approach breaks within a week. I keyed everything off text content with regex and keyword guards instead.

The harder problem was scope discipline. The first version of Mathify in my head inflated everything: followers, reactions, comments, badges. That version is funnier in the abstract and weaker in execution. The bit collapses the moment a viewer opens LinkedIn on their phone and disproves it. The actual project locked the scope to numbers that cannot be cross-checked, which made the build smaller, the punchline sharper, and the concept more committed. It is a bit about the difference between an amateur and a professional liar, and the bit only works if the project itself respects that line.

The third challenge was SPA navigation. LinkedIn's in-place route swaps left some surfaces partially un-inflated. Rather than fight the SPA, I forced every internal navigation to be a full page load. The cost is a slower nav, the benefit is that every page renders fresh and inflates cleanly.

What I learned

The version of a stupid idea that wins is the version that takes itself seriously enough to draw a line.

What's next for Mathify

Nothing. Mathify is finished. It does what it does. Adding more would be the amateur move.

In memory of the one who got caught.

Built With

Share this project:

Updates