Live · Chrome extension

YouTube Profiles

I built separate YouTube viewing identities so temporary curiosity does not rewrite a carefully trained feed.

Role
Product design + engineering
Surface
Extension, content script, popup, options
Stack
React, TypeScript, Vite, MV3
State
Live on Chrome Web Store
Product film

The full walkthrough

My Chrome Web Store demo: create profiles and switch context without leaving YouTube.

01 / Why this problem

YouTube treats every curiosity as identity.

I wanted people to explore freely without worrying that one research sprint, news cycle, or music rabbit hole would take over their main feed.

The algorithm pollution problem

Every search and watch session teaches YouTube. A short-term interest can keep showing up long after the intent is gone.

The workaround problem

Incognito loses account benefits, multiple Google accounts add friction, and cleanup happens only after the feed has shifted.

The trust problem

Because the extension touches identity, I had to be precise about what it does, what it cannot guarantee, and where data lives.

02 / Product details

Setup and switching, up close

A picker that meets you on YouTube

No new tab and no settings detour. The picker appears over the feed, so switching context is one clear choice.

Creating a profile

A new profile is just a name, an icon, and a color. The setup stays lightweight.

Lightweight switching

The toolbar popup keeps switching close, shows the active profile, and gives a quick path to another mode.

Profiles and preferences

Options lists linked profiles, explains what switching does, and handles the recovery work.

03 / Constraints

No backend

I kept the extension client-side, with profile metadata in browser storage and no data collection.

YouTube is not a stable platform

I had to work around content scripts, DOM changes, native account flows, and unusual YouTube channel states.

Identity must be exact

The promise only holds when each profile maps to the right YouTube channel. If that mapping is wrong, the UI has to stop and recover.

Product principles

Trust through transparency

I used direct language for setup, active modes, and limits instead of pretending to control the algorithm.

Netflix, not Chrome Settings

I made profile choice visual and familiar, with named cards, color, and personality instead of a hidden settings dropdown.

Invisible until needed

Once a profile is active, I wanted the extension to recede into small indicators, popup access, and lightweight overlays.

Local-first by default

No product accounts, no server, no telemetry, and no unnecessary permissions. That keeps the privacy story simple.

04 / Iterations

How the product sharpened through shipping

  1. Positioning
    Git history: AlgoGuard to YT Profiles

    Moved from defensive utility to clear product metaphor

    I moved from an abstract algorithm guard to a clearer metaphor: profiles for YouTube viewing.

  2. Core UX
    Design docs + profile selector commits

    Made profile selection a deliberate entry moment

    I turned switching into a visual entry choice before the user starts watching.

  3. Onboarding
    Git history: onboarding redesign and linking flows

    Turned setup into guided identity mapping

    I made onboarding explain the model, link Main Feed, and guide secondary profile setup without exposing too much YouTube channel complexity.

  4. Everyday switching
    Git history: popup, shortcuts, cross-profile actions

    Reduced friction after setup

    Popup switching, shortcut hints, active banners, and cross-profile watch actions made the extension feel usable day to day.

  5. Launch QA
    Live extension E2E report, 2026-05-29

    Found the invariants that matter most

    Live QA showed the visual experience worked, but setup preconditions and channel matching needed stricter handling.

04 / Product system

The shipped surfaces

YouTube Profiles onboarding explainer

A clear first-run explanation

I explain the model before asking users to create or link profiles.

The first job is trust: explain what is happening before touching account or channel state.
Launch and learning

The launch QA made the trust boundary sharper

My live Chrome Web Store E2E test showed that the extension installed cleanly and the visual experience worked, but first-run channel setup needed tighter guardrails.

What worked

Install, onboarding, profile selection, popup switching, and the visual return to Main Feed all worked once a YouTube channel existed.

What broke

Signed-out setup could start too early, accounts without a YouTube channel could stall, and a secondary profile could link to the wrong channel id.

What changed in the product thinking

I tightened the invariant: never imply feed separation unless channel identity is exact and setup preconditions are safe.

What YouTube Profiles shows about my product practice

This product shows how I think about small tools with real trust boundaries. The interface matters, but the harder work is deciding when to stay invisible, when to interrupt, and when to block progress.

The launch QA made the product sharper. Trust is not a visual layer; it is an invariant. If profile identity is not exact, the product has to stop, explain, and recover.

YT Profiles is a small consumer tool with a real trust boundary underneath. I am proud of the polish, but the important lesson is sharper: if a product touches identity, it has to be honest before it is clever.