Inspiration

I was born and raised in Pakistan — a country rich in culture, food, and warmth, but one where a girl is still, in many households, a decision people think twice about. I was privileged: good schools, supportive parents, and a circle of genuinely brilliant, ambitious women around me.

One of them became an influencer. She grew fast — Instagram, TikTok, real fame. Then came a minor scandal, and her comment sections turned into something else entirely: slurs, harassment, coordinated pile-ons. We reported hundreds of comments; Instagram removed a handful of the most obvious ones. Her mental health deteriorated to the point that she deleted her accounts and eventually left the country.

That was the moment I understood how much power an unmoderated comment section has over a real person's life — and how far behind the platforms' own tools were. I remember wishing there was something that could just delete the toxicity the instant it appeared, in whatever language it was written in. I couldn't build that for her in time. toxoff is me building it anyway, so the next person doesn't have to leave the country to feel safe online.

What it does

toxoff is an iPhone app that removes abusive Instagram comments, usually before the creator ever reads them.

  • Connects to an Instagram Business or Creator account and checks every new comment within about a minute (every 30 seconds on a fresh post).
  • Understands any language and any spelling: English, Roman Urdu, Hindi, Arabic script, mixed-language comments and disguised words, the abuse that keyword filters miss.
  • Deletes flagged comments by default, or hides them, or deletes only what it is at least 80% sure of. The creator chooses.
  • Protects your peace: the Log shows why a comment was removed and in which language, never the words, unless you tap "Read it anyway". Deleted comments can be erased forever, unread.
  • Filters: sensitivity, categories (hate speech, harassment, slurs, spam, self-harm promotion), a keyword blocklist and blocked users.

How it uses RevenueCat

Subscriptions are the business model, so RevenueCat sits at the centre of billing, and the server, not the phone, decides what a user can do.

  • Plans: Free (50 checks a month), Solo (1 account), Plus (5 accounts) and Studio (15 accounts), each monthly or yearly, in one App Store subscription group ordered Studio > Plus > Solo, so moving up is an instant upgrade.
  • In the app: react-native-purchases is configured with the user's own account id, so a purchase belongs to the account, not the phone. The paywall loads the current Offering, shows Apple's real price in the user's currency and a yearly saving worked out from the store's own prices, and includes Restore and Manage Subscription.
  • On the server: after every purchase or restore, and on every RevenueCat webhook (renewal, cancellation, billing issue, refund, transfer), a Supabase Edge Function re-reads the subscriber from RevenueCat's REST API and updates the user's plan. The app can never unlock a plan by itself.
  • Enforced in the database: Postgres functions and row-level security apply the plan: how many Instagram accounts can connect, whether a comment may be checked, and how far back the Log reaches.
  • Tested end to end on a TestFlight build on a real iPhone: Apple → RevenueCat → server → database → app, in seconds.
  • Ads, ready for later: rewarded ads report every impression and its revenue to RevenueCat's ad tracker. They're switched off in version 1 until the AdMob account is approved.

How I built it

  • App: Expo SDK 52 (React Native, New Architecture) and TypeScript, built with EAS on Xcode 26 and tested through TestFlight.
  • Backend: Supabase: Postgres with row-level security, Auth (email, Google, Apple), Realtime, scheduled jobs and one Deno Edge Function.
  • Meta's Instagram API (Instagram Login) to read and delete comments on the creator's own posts.
  • AI moderation, cheapest answer first: rules settle emoji, obvious spam and a built-in list of known slurs with spelling variants (no API call); plain English goes to OpenAI's free moderation endpoint; only the unsure and non-English comments reach GPT-5.4 Nano. That costs about 0.05 USD per 1,000 comments, rate-limited per user.
  • Tested: strict TypeScript, 36 app tests, 57 backend tests, 17 database tests and a security review with regression tests.

Challenges I ran into

  • Meta only sends instant comment notifications to verified businesses. As a student without a registered company, I built a polling engine instead that checks fresh posts every 30 seconds while staying inside Meta's rate limits.
  • Roman Urdu has no fixed spelling. The AI alone scored one common slur at only 45%, so I added a rule layer for known slurs and their variants that answers instantly, consistently and for free.
  • My AdMob account was rejected before launch, so version 1 ships without ads behind a single switch, rather than showing a "watch an ad" button that would always fail.
  • Polish bugs that only showed in real builds: iOS 26 switches drawn at the wrong size, and a launch image my own asset script had silently corrupted. Both were fixed and checked frame by frame.

Accomplishments that I'm proud of

  • It works on a real Instagram account: abusive comments are deleted in under a minute, and the creator never has to read them.
  • A complete subscription flow through RevenueCat, verified end to end.
  • A design that respects the person on the other end: it shows that abuse was removed and why, never the abuse itself.

What I learned

Most of a "simple" moderation app is plumbing: entitlements belong on the server, platform rules shape the architecture, and the cheapest reliable answer should always come before the expensive one. Above all, I learned that the best feature for someone being harassed is not seeing it at all.

What's next for toxoff

  • Launch on the App Store (coming soon).
  • Meta Business Verification, so every creator can connect their account.
  • TikTok support, and ads on the Free plan once AdMob approves.

Built With

Share this project:

Updates

Submission history