Inspiration

In April 2017, Netflix's then CEO Reed Hastings told investors that Netflix was competing with sleep. Feeds win that fight because they know your taste and they never end.

In 423 adults aged 18 to 25, more binge viewing went with poorer sleep and more insomnia symptoms, and cognitive pre-sleep arousal explained the link (Exelmans and Van den Bulck, 2017). Staying up later than you meant to has a name too, bedtime procrastination (Kroese and colleagues, 2014). The usual advice is "read a book". Which book? Advice that is not yours is easy to ignore.

I'm a psychology student in Boston. I'm a long sleeper and I dream almost every night, so sleep and dreams are what I want to study. This semester I'm designing a small survey on anxiety and nightmares for one of my psychology classes, and I also made Drift Off, a falling-asleep game for Snapchat. Offramp started from one question. If taste data can keep people up, can it also help them stop?

What it does

Name a few things you love, what keeps you up and when you want to be asleep, or click an example night.

  1. Taste translation. You love a film and a TV show. The agent asks Qloo for podcasts, artists and books that match that taste, and each pick says which favorite it came from.
  2. Timed lanes. Up to four steps, each with a time. A last screen at least 45 minutes before sleep, a podcast with the lights low, an artist in bed with a sleep timer, and a plan for when you are still awake after 20 minutes (stimulus control from CBT-I). When the night starts with a show, Tavily names one episode, so it has an end.
  3. Trap radar. Qloo's strongest predictions that are also high in arousal go to "Skip tonight, save for daytime".
  4. Mornings. A browser-only sleep log. After a few nights, Nemotron 3 Ultra reads the week and suggests changes you apply with one click.

Compare with a plan made without Qloo asks the same model for a plan with no taste graph and counts what each side did. Try to break the checks sends three broken drafts to the validator and shows why each fails.

How Qloo makes it work

  • /search resolves what you typed into entities.
  • /v2/tags finds real tag ids for calm words, because invalid parameters can be ignored without an error.
  • /v2/insights with your entities as signals (signal.interests.entities), calm tags (filter.tags), exclusions (filter.exclude.entities), explainability (feature.explainability) and a low trend bias (bias.trends). Here taste crosses domains, from film and TV into the podcasts, artists and books a night needs.
  • /v2/insights without the calm filter is the trap radar.

Why not rewatch a favorite? Many favorites are what keeps people up, and most have no audio-only form for the last half hour in bed. Qloo fills that gap with real entities. Every step must carry an entity id Qloo returned in the same run, and the step text is scanned for titles Qloo did not return. When Qloo answers a 400, the client retries once with a fix (for example dropping an optional parameter) and writes the fix into the trace. Every item on screen is labeled Qloo live, Qloo recorded or offline sample, so you can always see where it came from.

How NVIDIA Nemotron on Nebius Token Factory powers it

Each job goes to the smallest Nemotron model that handles it.

  • Nemotron 3.5 Lightning (nvidia/Nemotron-3_5-Lightning) reads the input, rates up to 30 candidates per call for pre-sleep arousal, and picks the episode.
  • Nemotron 3 Super (nvidia/nemotron-3-super-120b-a12b) runs the tool-calling loop, chooses the Qloo calls, drafts the plan and fixes it when the validator says no.
  • Nemotron 3 Ultra (nvidia/Nemotron-3-Ultra-550b-a55b) reads a week of mornings.

The Agent at work panel shows each call's model id, latency and tokens. The agent falls back to a JSON tool protocol, retries once when reasoning uses up the token budget, and says so on screen when Token Factory cannot be reached.

How I built it

Plain Node.js on Vercel. The agent is a stateless step function, one planner turn per request inside a time budget. 35 offline tests run against fake Token Factory, Qloo and Tavily servers. I worked with an AI coding assistant (Claude Code) on the code and the tests.

Challenges I ran into

Making "every title comes from Qloo" a rule in code, and keeping Qloo's response data out of the public repository. If Qloo rejects the key (for example after hackathon keys are switched off), the example nights fall back to a private server-side cache of real Qloo responses, labeled "Qloo recorded".

Accomplishments that I'm proud of

The taste translation, the compare panel that counts what each side did, and labels that say where every item came from.

What I learned

Taste data is usually used to keep people watching. Building this, I learned it can also help them stop. I also learned that a rule I can check in code is easier to trust than a rule I can only ask for in a prompt.

Who it's for

Young adults who lose the last hour to one more episode. The natural buyers would be sleep apps, meditation apps and sleep wearables, which reach people at bedtime but hold no taste data. Streaming apps fit less well, because they gain when people keep watching.

Privacy and safety

Nothing is stored on the server. Crisis language pauses the run and shows the 988 Lifeline. Offramp is a wellness tool, not medical care.

What's next for Offramp

  • Wearable data in the morning log.
  • A simple dream check in the morning log, since dreams and nightmares are what I want to research.

Try it

Open https://offramp-green.vercel.app (no login) and click the example night "One more episode". The badges at the top should read Nemotron live, Qloo live and Tavily live. A live plan can take up to a minute. The code is at https://github.com/sese0318/offramp under the MIT license.

Built With

Share this project:

Updates

Submission history