← Back to portfolio

01

RoAlert

Personal project · 2026 · Live

Sends alerts when selected Roblox players come online or join a game.

React · TypeScript · Convex · Cloudflare · Web Push · PWA

Overview

RoAlert makes it easier to know when selected Roblox players are active without repeatedly checking their profiles. It provides configurable presence alerts through a web app and installable PWA.

What it does

  • Online, offline, in-game, and Studio presence
  • Push notifications for presence changes
  • Current experience and place when available
  • Per-player notification preferences
  • Selected-game and optional place-change alerts
  • Quiet hours and notification snoozing

Interface

Engineering

RoAlert checks Roblox presence every 15 seconds using scheduled Convex jobs. Watched players are grouped into batches before being sent to Roblox's Presence API.

Each result is compared with the previously stored state so unchanged presence does not trigger another notification. The first result for a newly watched player is treated as a starting point rather than a new presence event.

If requests fail, polling temporarily backs off instead of treating the player as offline. This helps avoid false alerts and unnecessary requests.

Web Push and a service worker handle browser notifications on supported desktop browsers and installed PWAs.

The frontend is built with React and TypeScript and hosted through Cloudflare. Convex handles stored data, scheduled presence checks, authentication, and push delivery.

Challenges

Reliable presence polling

RoAlert checks presence every 15 seconds, so polling needs to stay responsive without making unnecessary requests. Players are checked in batches, and failed requests trigger temporary backoff instead of producing false offline states.

Handling teleports correctly

When a player moves between Roblox places, their presence can briefly appear as Online or Offline before returning to In Game. This originally caused false leave and join alerts. I added a short 30-second grace period that ignores these temporary states while still detecting genuine game and place changes quickly.

Cross-platform push notifications

Notification behavior was not identical across macOS and iOS. Reusing the same notification tag could cause newer alerts to replace older ones, so each event now gets its own notification tag. RoAlert also uses separate artwork for installed-app icons and notification icons.

Design decisions

  • RoAlert shows current presence rather than exposing a historical activity timeline.
  • Users can choose which presence changes should send notifications.
  • Quiet hours and per-player snoozing let users temporarily silence alerts without removing players from their watchlist.
  • Place-change alerts are optional because frequent place changes can become noisy.
  • Selected-game alerts let users receive notifications only for games they care about.