Uchit Vyas

Work

A safety app that can’t read messages.

Screen time for AI companion apps, without reading a single chat.

Type
My own product
Year
2026
My role
Everything: design, code, billing, App Store
Runs on
iOS, browser extension, web
0

Messages stored, sent or readable

1day

The finest detail kept

1person

Built it, schema to App Store

This is what happens on the phone.

This is all that leaves it.

child     "Sam"
day       2026-03-14
category  AI companion
minutes   47

Example data. No message text, no app name, no session times. The finest detail kept is one day.

The problem

Every monitoring app reads the chats.

The move

Make reading impossible, and let the platform enforce it.

The result

Parents see minutes per day. Nothing else leaves the phone.

  1. 1The browser extension sees only the address
  2. 2Apple’s sandbox enforces it on iPhone
  3. 3Daily totals only, so it can’t get more detailed later
  4. 4The teenager sees exactly what the parent sees

Swift, Next.js and Postgres.

iPhone
Swift, Screen Time (DeviceActivity)
Browser
Chrome extension
Web
Next.js
Database
Postgres with row-level security
The full story

Every monitoring app reads the chats.

AI companion apps (character chat, roleplay, synthetic partners) are a new kind of screen time for teenagers. They are private, conversational and hard to put down.

Parents mostly want to know two things: how much, and is it going up. Monitoring products answer by reading the conversations. That breaks trust between parent and child, and it creates a store of a minor’s private messages that is a liability from the moment it exists.

Four choices that make reading impossible.

The browser extension only sees the website’s address. It maps the address to a category of app and throws the rest away. It has no permission to read pages on any monitored site, and anyone can confirm that from its manifest in a few seconds.

On iPhone, Apple’s sandbox does the enforcing. Usage data comes from Apple’s Screen Time framework, which runs in a sandbox with no network access. The app never sees exact sessions. What leaves the phone is only “this child crossed this many minutes at this time”.

The data can’t get more detailed later. Everything is stored per child, per day, per kind of app. A future request to “show the actual chats” would need a rebuild, not a settings change.

The teenager gets their own login. They see exactly what their parent sees and can add notes to a day. Products that skip this get worked around within a week.

A shortcut I didn’t take.

The teenager’s login could have been built in a day with the database’s admin key. That key bypasses every row-level security rule, so the codebase would hold one credential able to read every family’s data.

I used locked-down database functions instead, so no such key exists anywhere in the code. The trade-off is written down too: a family code and PIN is not strong proof of identity. Eight wrong attempts lock the code for fifteen minutes, which is what makes it safe enough.