Inspiration

Lots of bullied kids never tell anyone. Some freeze. Some don't have the words. Some arrived in Germany a few months ago and don't speak German yet. In Germany, 40% of bullied 12-to-17-year-olds asked nobody for help (Grüne & Willems 2024, n = 453).

When a child does try, a classmate or a translation app usually does the translating, and both guess. Take "He said he would get me after school." That's either a threat or a lift home. A translator picks one and nobody finds out it had to choose.

We wanted the child to have the words, the adult to read what the child actually meant, and the child to decide who hears it. That's Vividia. It runs on NVIDIA Nemotron through Nebius Token Factory.

What it does

A child can start without typing anything. They tap a face for how they feel, and the app answers. After a hard feeling it offers a breathing bubble, the 5-4-3-2-1 grounding steps, or more exact feeling words. Nothing gets scored.

To say what happened, there are two ways in:

  • Tap pictures: what happened, what was taken, where, who, how often. Every question can be skipped, and "Is this right?" shows exactly what the card will say before anything is saved. A child who can't write can get to a German card this way in about a minute, without a single model call.
  • Write it in their own words, in English, Hindi (including Hinglish, which is how kids actually type it) or German. A listening chat answers each message with a short line that people wrote and reviewed; the model only picks which line fits. If the child writes something to keep, the German version appears next to it.

If a sentence can honestly be read two ways, the app asks the child which one they meant, and "something else" is always an option. A child who already writes German isn't translated at all. Their words stay exactly as typed, and the app still asks when something is ambiguous.

Everything the child saves goes into My notes, in both languages, behind a PIN. Deleted entries can be undone.

The child picks who sees it. Nobody is pre-selected; they tap one adult. That adult gets the child's words on a card the child holds up, which flips between the child's language and German, plus a short sourced guide called "For the grown-up: what to do first".

Help is on every screen behind the red headphones button: 110, 112, 116 111 and krisenchat, checked against official sources and built into the app so they work offline. Each one says which languages it speaks and when we checked it. That matters more than it sounds. These services answer in German (krisenchat also in Ukrainian), and none of them confirms Hindi or English.

If the child's words or taps point to danger, 110 and 112 come up straight away. Fixed rules read every message alongside the model, so a plain threat still gets help if the model misses it or is down. Nothing is sent to anyone.

On a shared phone, Leave now (the door icon, or Esc three times) closes the app and wipes unsent drafts. It can't delete browser history, and the app tells the child that.

What we deliberately left out: monitoring, automatic alerts, an AI "friend", diagnosis, risk scores. Every word that reaches an adult was written and confirmed by the child.

How we built it

Every model call goes to NVIDIA Nemotron on Nebius Token Factory, from a FastAPI backend.

  • nvidia/Nemotron-3.5-Super-VL translates a risky sentence five times in parallel at different temperatures, then translates each version back.
  • nvidia/nemotron-3-super-120b-a12b judges. It compares the candidates and their back-translations with what the child wrote, and repairs anything that got lost. We made the judge a different model on purpose, so it doesn't share the translator's blind spots.
  • A separate check reads only the original sentence and looks for meanings only the child can settle. A reviewed word list backs it up (Hindi "kal" means both "tomorrow" and "yesterday", which matters a lot in a threat).
  • Safety: the model only classifies. What a child in crisis reads is fixed text that people wrote and checked.

Most sentences don't need all of that. Two cheap passes run first, and the full check only kicks in when a sentence looks risky (negation, coercion, threats, slang, in English, German, Hinglish and Devanagari), when the passes disagree, or when a number the child wrote goes missing from the German. A sentence that needs no checking takes 2 calls and about 1–2 seconds. Full verification with a repair takes 15 calls. Our tests assert both numbers.

Safety runs twice. The model classifies each message and fixed rules read it too. Either one can raise the help prompt, and the rules can never lower it.

Tavily: the backend can look up the school psychology service for a German state, limited to one hand-checked official site per state, and it sends only the state name. That's live at /api/resources?state=…, but no screen sends a state yet, so the help screen shows our curated list.

Privacy: Nebius Zero Data Retention is on, so prompts and outputs aren't stored. Our backend keeps nothing and doesn't log message text. Notes, the PIN (as a salted hash) and drafts stay in the child's browser. Translation is cloud inference, though, so the words being translated do leave the phone, and we say so.

The frontend is React, Vite, TypeScript and Tailwind on Vercel; the backend runs on Render. CI runs 889 backend and 530 frontend tests on every pull request, with no live model calls.

Challenges we ran into

Agreement isn't correctness. On Nemotron 3.5 Lightning, all five passes agreed that "my friend hits me" was "Mein Freund trifft mich", which means "my friend meets me". Only the back-translation gave it away. So we added the repair step and lower the confidence whenever a repair runs. Funny thing: after we moved to Super-VL, one pass gets that sentence right 5 times out of 5, so we can't show the failure anymore. We kept the step anyway, because when it does happen it's silent.

Our verification doesn't beat a single pass on overall accuracy. On our benchmark (50 English and 30 Hindi sentences, scored by string matching against an answer key we wrote, no model grading another model) the two come out level. The extra calls earn their keep somewhere narrower: when the child's own words mean two things, we ask instead of guessing. These results are preliminary. The team drafted the sentences and the native-speaker review isn't finished.

The fastest model failed our languages. Lightning won our English bake-off, then handed Ukrainian input back untranslated in 5 of 12 runs. We switched models and now reject any output that just echoes the input.

We couldn't trust machine-made test data. 17 of 18 sentences we pivoted through another language had already lost their meaning before our pipeline ever saw them, so we only ship languages someone on the team reads.

False alarms cost something too. Throwing a crisis screen at "my mum will kill me when she sees my marks" tells a kid the app doesn't get them, so we test that everyday exaggeration stays quiet.

Help couldn't depend on the model. With the model switched off, "he said he would kill me after school" once got no help prompt at all. That's why fixed rules now read every message, and why the help numbers are built into the app.

Accomplishments that we're proud of

The app never asks a child to fix our mistakes. A translation error is ours to repair quietly. Only sentences that genuinely mean two things go back to the child.

Every contact, every step in the adult guide and every school site has a source and a check date, and the help screen says which language each line speaks.

A child can go from a feeling to a German card they can hold up in about a minute, just by tapping pictures.

What we learned

Measure before you trust a model's name. Our model choice changed twice because of measurements.

For safety-critical text, a second model only helps if it doesn't share the first one's blind spots.

Being upfront about limits (the words do leave the phone; Leave now can't erase history) turned out to be part of the product.

What's next

  • More languages, each one only after native speakers write and check its test set. Nothing in the architecture is tied to a language.
  • School social workers reviewing the adult guide and the flows, and a native read of every Hindi and Hinglish line.
  • The local school psychology service on the help screen. The Tavily lookup exists; the screen that asks the child for their state doesn't yet.
  • An encrypted, expiring link for the trusted adult, and a printable report.

Try it at https://vividia-swarupgaikwad1801-ux.vercel.app. You don't need an account or an API key, but the free server can take about 30 seconds to wake up. The code is at https://github.com/swarupgaikwad1801-ux/vividia (MIT).

Built With

Share this project:

Updates

Submission history