Inspiration

Hate goes viral before platforms delete it. Most moderation happens after a comment is posted: someone reports it, it waits in a queue, and eventually it's taken down. By then a cruel comment under a popular post has collected likes and replies, been screenshotted, and been shared somewhere no takedown can reach. The person it was aimed at has already seen it. Deleting it later removes the post, not the harm.

Moderation also fails most people who don't write in English. In India, people comment in Hindi, Tamil, Telugu, Bengali, Marathi, Kannada, Malayalam and many more, often typed in English letters and mixed freely with English. Most moderation tools either miss abuse in these languages or wrongly flag harmless comments.

And even when moderation works, it only tells people what they can't say. A blocked comment teaches nothing: the writer gets angry, tries different words, or leaves. Yet most rude comments have a real point buried in them, like "I didn't like this."

So we built Argus, named after the hundred-eyed watchman of Greek myth. It sees every comment before it's posted, in the language it's written in, explains what's wrong, and shows a better way to say it.

What it does

The writer types What Argus does
A normal comment, in any language Posts it
Something rude, like "i hate you" on a post about singing Holds it, explains why, and suggests "I'm not a fan of your singing." The writer can Use this, Edit, or Ask a moderator
A rude comment in a regional language or mixed script (Hinglish, Tanglish, Manglish…) Same as above. The reason and the suggestion come back in the writer's own language and script, never forced into English
Something harmful: a threat, hate, doxxing, self-harm encouragement Never posts it. Explains what's wrong and why, the writer edits it themselves, and a moderator is notified. No AI rewrite of harmful content
A regional-language comment the AI can't read with confidence Doesn't guess. A person decides
Anything, while the AI is down Nothing posts unchecked. It fails closed

Argus ships in three forms:

  • a zero-dependency plugin any website can drop in (engine, server routes and widget)
  • a browser extension that holds the Post button on YouTube, Reddit and Instagram until a comment is allowed
  • a demo site with a live moderator queue

How we built it

Every AI decision runs on NVIDIA Nemotron 3 Ultra (nvidia/Nemotron-3-Ultra-550b-a55b), served by Nebius Token Factory through its OpenAI-compatible API, with reasoning off and temperature 0.

1. Scoring. Nemotron reads the comment's words alone and returns strict JSON: a harm score from 0 to 1, a category, a plain-language reason in the writer's own language, and, for any non-English comment, its own English reading of what the comment means. Scoring that reading instead of a guess is what makes regional languages work. Code turns the score into a verdict:

Harm score Verdict What happens
below 0.40 Clean Posts
0.40 – 0.85 Rude Not posted yet: a reason and a better way to say it
0.85 and above Severe Never posted: explained, and sent to a moderator

A non-English comment scoring just under the line (0.25 – 0.40), or one the model says it can't read confidently, goes to a person instead.

2. Rewrite. For rude comments, Nemotron writes a version that keeps the writer's point and drops the attack, in the same language and script as the original. It can use the post being replied to (so "i hate you" on a singing post becomes "I'm not a fan of your singing"), but that context only shapes the suggestion. It never changes the verdict.

3. Checks before a suggestion is shown. A rewrite is shown only if it passes all four checks:

  • Same language and script as the original, checked in code across Devanagari, Bengali, Gurmukhi, Gujarati, Tamil, Telugu, Kannada, Malayalam and more. A comment typed in English letters (like Hinglish or Tanglish) must get a suggestion in the same mix, not plain English.
  • Keeps the writer's meaning, confirmed by a second Nemotron call.
  • Scores clean itself (below 0.40).
  • No swearing.

Two attempts; if neither passes, the writer gets the reason without a suggestion.

Split of work. Nemotron judges meaning: is this harmful, what's a better way to say it, does the rewrite say the same thing. Code handles everything that must always hold: thresholds, the script check, masking emails and phone numbers before text reaches the model, rate limits, and the moderator queue with a 10-minute timeout that keeps comments unposted if nobody answers.

Stack: Node.js (plugin, zero dependencies), Next.js + Tailwind (demo site), Supabase (data and the live moderator queue), Chrome Manifest V3 (extension), deployed on Vercel.

Challenges we ran into

  • Choosing the model on evidence. We built an 85-comment hand-labelled test set: sarcasm, profanity used for emphasis, reports of abuse, prompt-injection attempts, threats, doxxing, Spanish, Tamil, Tanglish, Hindi and Hinglish. We ran it against all five Nemotron models on Token Factory. Nemotron 3 Ultra was the most accurate and wrote the best rewrites.
  • Reasoning mode made it worse. With reasoning on, accuracy dropped to 82.5%, because the model sometimes replied to the comment instead of judging it. Turning it off fixed that.
  • Indian languages typed in English letters. "nee oru alagu" (you're beautiful) is a compliment; "nee oru loosu" (you're crazy) is an insult. The model needed explicit examples to read Tanglish correctly, and to answer in Tanglish instead of switching to English.
  • Rewrites that drift. Early rewrites changed what people meant, quietly kept the insult, or pulled in the post's topic when the comment was about something else. The meaning check and re-scoring every suggestion fixed most of this.
  • Real websites fight extensions. YouTube, Reddit and Instagram each build their comment boxes differently and change them often. When the extension can't read a comment box, it blocks the post rather than letting an unchecked comment through.

Accomplishments that we're proud of

  • It stops harm before it spreads. Every comment is checked before it's posted, not reported and removed after the damage is done.
  • It explains instead of silencing. Rude comments get a reason and a better way to say it; harmful ones get a clear explanation of what's wrong and why. Nothing is refused without a reason the writer can read.
  • It works in the languages people actually write in. Tamil and Hindi in their own scripts, and typed in English letters (Tanglish, Hinglish), with suggestions in the writer's own language. When it isn't sure, it asks a person instead of guessing.
  • It's tested, not guessed. An 85-comment hand-labelled test set, run against all five Nemotron models on Token Factory, and every severe comment in it caught.
  • It's safe by design. If the AI is down or returns nonsense, nothing posts. Private details like emails and phone numbers are masked before text reaches the model. A writer can never approve their own comment.
  • One engine, three products. The same core powers a drop-in website plugin, a browser extension for YouTube, Reddit and Instagram, and a demo site with a live moderator queue.

What we learned

  • Prevention beats removal. Once a harmful comment is posted, it can be seen, screenshotted and shared within minutes. Taking it down later is cleanup, not protection. The only moment that truly protects people is before it's posted.
  • People respond to explanations, not walls. A silent block makes people angry or makes them try again with different words. A clear reason, plus a ready-made better way to say it, actually changes what gets posted.
  • Large models need clear boundaries. Nemotron was at its best when we asked it narrow questions with strict JSON answers. With reasoning switched on, it sometimes started replying to angry comments instead of judging them.
  • Some things should never be left to a model. Whether a comment can post, what happens when the AI is down, and who can approve a comment are rules, not judgements. Keeping them in plain code means no prompt and no clever comment can talk the system out of them.
  • A rewrite is a promise to the writer. Suggesting different words means speaking for someone, so every suggestion had to keep their meaning, stay in their language, and pass the same safety check as any other comment. Showing nothing is better than showing something they didn't mean.
  • Honest testing beats assumptions. Writing tricky comments by hand (sarcasm, banter, threats, slang, prompt-injection attempts) and labelling them ourselves showed us exactly where the system worked and where it still fell short.
  • The real web is messy. Every platform builds its comment box differently and changes it without warning. We learned to plan for being wrong: when Argus can't read a comment box, it blocks the post rather than letting an unchecked comment slip through.

What's next for Argus

  • Every regional language, tested properly. Building labelled test sets for Telugu, Bengali, Marathi, Kannada, Malayalam, Gujarati, Punjabi, Odia and more, in their own scripts and typed in English letters, so each one is measured, not assumed.
  • Images and video. Extending the same check-before-posting idea to memes, images with text, and video. Using NVIDIA's vision-language Nemotron models, Argus would read what's actually shown and said, in any language, and catch harmful content before it's uploaded, with a plain explanation of why.
  • Detecting AI-generated content. Helping viewers tell whether an image, video or post may be AI-generated:
    • reading the AI labels some tools write into image files (C2PA Content Credentials), which are certain when present
    • adding a careful AI assessment, shown as likely AI-generated, likely authentic or can't tell, with reasons
    • never presenting a guess as fact, never labelling a person, and never treating AI-made content as misinformation by default
  • Built into platforms. Publishing the extension on the Chrome Web Store, and offering the plugin to communities and platforms that want to stop harm before it spreads, not just clean it up afterwards.

Built With

Share this project:

Updates

Submission history