Skip to content
🚧 These docs are a work in progress and may contain inaccuracies. Content is being actively reviewed and validated.

Parental Controls

Parental controls let you create restricted profiles for children with age-based content filtering, per-title overrides, PIN protection, and screen time tracking.

A user account can have multiple managed profiles — one for each child. Each profile has its own content restrictions that are enforced across the entire app.

  1. Go to Settings > Parental Controls
  2. Click Create Profile
  3. Set the profile name and configure restrictions:
    • Age limit — Maximum content age rating allowed
    • Block unrated content — Whether to hide content without a rating
    • Preferred rating country — Which country’s rating system to use (US, UK, etc.)
    • Kids UI — Simplified navigation for younger children
  4. Save the profile

Filtering is enforced at the database query level — restricted content never reaches the API response. This means:

  • Search results only show allowed content
  • Browse views are pre-filtered
  • Collections respect the active profile’s restrictions
  • Continue watching only shows allowed items
  • No client-side bypass is possible

Dubby supports multiple country-specific rating systems. Each maps ratings to a minimum age:

US (MPAA): G → 0, PG → 8, PG-13 → 13, R → 17, NC-17 → 18

US TV: TV-Y → 0, TV-Y7 → 7, TV-G → 0, TV-PG → 8, TV-14 → 14, TV-MA → 17

UK (BBFC): U → 0, PG → 8, 12A → 12, 15 → 15, 18 → 18

Set a preferred country on each profile to use that country’s ratings. If a title has ratings from multiple countries, the preferred country is checked first with fallback to the strictest rating.

For fine-grained control beyond age ratings:

  1. Go to Settings > Parental Controls > Title Restrictions
  2. Search for a specific movie or show
  3. Choose Allow (override age restriction) or Block (block regardless of rating)

Per-title overrides take precedence over age-based filtering. This is useful for:

  • Allowing a specific PG-13 movie for a profile with an age-10 limit
  • Blocking a specific show that’s technically within the age limit

Set a PIN to prevent children from switching back to the parent account:

  1. Go to Settings > Parental Controls > PIN Setup
  2. Set a 4-6 digit PIN

When switching from a managed profile back to the parent account, the PIN entry modal appears. The profile switch only completes after correct PIN entry.

A profile switcher appears in the navigation bar showing the current profile with an avatar and name.

To switch profiles:

  1. Click your profile avatar in the navigation
  2. Select a managed profile from the dropdown — switches immediately
  3. To switch back to the parent account — click the parent entry and enter your PIN

The active profile is tracked on the current session, so all API calls respect the active profile’s content restrictions.

Create reusable restriction templates to quickly configure new profiles:

  • Set age limits, screen time limits, and blocked genres
  • Apply a template when creating a managed profile
  • Templates can be edited and reused across profiles

Track and limit how much time each profile spends watching content:

Go to Settings > Parental Controls > Screen Time to see:

  • Total minutes watched for the selected period (today, this week, this month)
  • Daily average minutes
  • Daily breakdown table showing usage per day

Select a specific profile from the dropdown to view its individual screen time data.

The activity log shows what each managed profile has been doing:

  • Playback events — What was watched and when
  • Blocked attempts — Content that was blocked by restrictions
  • Time limit events — When screen time limits were reached

View the log from Settings > Parental Controls > Activity Log with a profile selector and pagination.

Terminal window
# Set up a PIN
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"pin": "1234"}' \
http://localhost:3000/v1/parental-controls/pin
# Create a managed profile
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Kids", "maxContentAge": 10, "blockUnrated": true, "preferredCountry": "US"}' \
http://localhost:3000/v1/parental-controls/profiles
# Switch to a profile
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"profileId": "profile-id"}' \
http://localhost:3000/v1/parental-controls/switch-profile
# List profiles
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:3000/v1/parental-controls/profiles